ProfilePage.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <!-- eslint-disable @intlify/vue-i18n/no-raw-text -->
  2. <template>
  3. <q-page class="bg-page q-pb-xl">
  4. <div class="row items-center q-px-md q-pt-md q-pb-sm bg-white shadow-profile">
  5. <q-space />
  6. <span class="text-subtitle1 text-weight-bold text-primary">{{ $t('profile.title') }}</span>
  7. <q-space />
  8. </div>
  9. <div class="q-px-md q-mt-md">
  10. <q-card class="profile-card bg-surface shadow-card card-border" :flat="false">
  11. <q-btn flat round dense icon="mdi-share-variant-outline" color="grey-6" class="absolute-top-right q-ma-sm" />
  12. <q-card-section class="column items-center q-pb-md">
  13. <q-avatar size="70px" class="shadow-card">
  14. <img src="https://cdn.quasar.dev/img/avatar.png">
  15. </q-avatar>
  16. <div class="fonte-nome-profile text-weight-bold q-mt-md text-dark">{{ user.name || '—' }}</div>
  17. <div class="fonte-email-profile text-grey-6 q-my-sm">{{ user.email || '—' }}</div>
  18. <div class="fonte-telefone-profile text-grey-7">{{ user.phone || '—' }}</div>
  19. <q-btn
  20. outline
  21. no-caps
  22. padding="6px 16px"
  23. class="full-width q-mt-sm btn-edit-profile text-text"
  24. @click="openEditProfile"
  25. >
  26. <div class="row items-center q-gutter-x-sm">
  27. <q-icon name="mdi-account-outline" size="18px" />
  28. <span class="text-weight-medium">{{ $t('profile.edit_profile') }}</span>
  29. </div>
  30. </q-btn>
  31. </q-card-section>
  32. </q-card>
  33. </div>
  34. <div class="q-mt-md q-px-md column">
  35. <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openBankDataDialog">
  36. <div class="column">
  37. <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.bank_data.title') }}</span>
  38. <span class="menu-description text-text">{{ $t('profile.bank_data.description') }}</span>
  39. </div>
  40. <q-space/>
  41. <q-icon name="mdi-chevron-right" color="primary" size="md" />
  42. </div>
  43. <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openAvailabilityDialog">
  44. <div class="column">
  45. <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.availability.title') }}</span>
  46. <span class="menu-description text-text">{{ $t('profile.availability.description') }}</span>
  47. </div>
  48. <q-space/>
  49. <q-icon name="mdi-chevron-right" color="primary" size="md" />
  50. </div>
  51. <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openServiceDataDialog">
  52. <div class="column">
  53. <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.service_data.title') }}</span>
  54. <span class="menu-description text-text">{{ $t('profile.service_data.description') }}</span>
  55. </div>
  56. <q-space/>
  57. <q-icon name="mdi-chevron-right" color="primary" size="md" />
  58. </div>
  59. <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openAddressDialog">
  60. <div class="column">
  61. <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.address.title') }}</span>
  62. <span class="menu-description text-text">{{ $t('profile.address.description') }}</span>
  63. </div>
  64. <q-space/>
  65. <q-icon name="mdi-chevron-right" color="primary" size="md" />
  66. </div>
  67. <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openHelpDialog">
  68. <div class="column">
  69. <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.help.title') }}</span>
  70. <span class="menu-description text-text">{{ $t('profile.help.description') }}</span>
  71. </div>
  72. <q-space/>
  73. <q-icon name="mdi-chevron-right" color="primary" size="md" />
  74. </div>
  75. <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openPrivacyDialog">
  76. <div class="column">
  77. <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.privacy.title') }}</span>
  78. <span class="menu-description text-text">{{ $t('profile.privacy.description') }}</span>
  79. </div>
  80. <q-space/>
  81. <q-icon name="mdi-chevron-right" color="primary" size="md" />
  82. </div>
  83. <q-separator class="q-my-sm bg-grey-3" inset />
  84. <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="logOutPrestador">
  85. <div class="column">
  86. <span class="menu-title text-weight-bold text-text">{{ $t('profile.logout.title') }}</span>
  87. <span class="menu-description text-text">{{ $t('profile.logout.description') }}</span>
  88. </div>
  89. <q-space/>
  90. <q-icon name="mdi-chevron-right" color="primary" size="md" />
  91. </div>
  92. </div>
  93. </q-page>
  94. </template>
  95. <script setup>
  96. import { ref, onMounted } from 'vue';
  97. import { useQuasar } from 'quasar';
  98. import { useAuth } from 'src/composables/useAuth';
  99. import { getUser } from 'src/api/user';
  100. import ProfileEditDialog from './ProfileEditDialog.vue';
  101. import ProfileAddressDialog from 'src/components/profile/ProfileAddressDialog.vue';
  102. import ProfileBankDataDialog from 'src/components/profile/ProfileBankDataDialog.vue';
  103. import ProfileAvailabilityDialog from 'src/components/profile/ProfileAvailabilityDialog.vue';
  104. import ProfileServiceDataDialog from 'src/components/profile/ProfileServiceDataDialog.vue';
  105. import ProfileHelpDialog from 'src/components/profile/ProfileHelpDialog.vue';
  106. import ProfilePrivacyDialog from 'src/components/profile/ProfilePrivacyDialog.vue';
  107. import { useRouter } from 'vue-router';
  108. const $q = useQuasar();
  109. const { logout } = useAuth();
  110. const router = useRouter();
  111. const user = ref({
  112. name: '',
  113. email: '',
  114. phone: ''
  115. });
  116. const openEditProfile = () => {
  117. $q.dialog({
  118. component: ProfileEditDialog,
  119. componentProps: {
  120. userData: user.value
  121. }
  122. }).onOk((updatedUser) => {
  123. user.value = { ...user.value, ...updatedUser };
  124. });
  125. };
  126. const openAvailabilityDialog = () => {
  127. $q.dialog({
  128. component: ProfileAvailabilityDialog
  129. });
  130. };
  131. const openBankDataDialog = () => {
  132. $q.dialog({
  133. component: ProfileBankDataDialog
  134. });
  135. };
  136. const openAddressDialog = () => {
  137. $q.dialog({
  138. component: ProfileAddressDialog
  139. });
  140. };
  141. const openServiceDataDialog = () => {
  142. $q.dialog({
  143. component: ProfileServiceDataDialog
  144. });
  145. };
  146. const openHelpDialog = () => {
  147. $q.dialog({
  148. component: ProfileHelpDialog
  149. });
  150. };
  151. const openPrivacyDialog = () => {
  152. $q.dialog({
  153. component: ProfilePrivacyDialog
  154. });
  155. };
  156. const logOutPrestador = async () => {
  157. await logout();
  158. router.push('/login');
  159. };
  160. onMounted(async () => {
  161. try {
  162. const data = await getUser();
  163. user.value = data;
  164. } catch (error) {
  165. console.error('Erro ao carregar perfil:', error);
  166. }
  167. });
  168. </script>
  169. <style scoped lang="scss">
  170. .profile-card {
  171. position: relative;
  172. }
  173. .btn-edit-profile {
  174. border-radius: 6px;
  175. }
  176. .menu-item {
  177. transition: background 0.3s;
  178. &:active {
  179. background: rgba(0,0,0,0.05);
  180. }
  181. }
  182. .menu-title {
  183. font-size: 18px;
  184. line-height: 1.4;
  185. }
  186. .menu-description {
  187. font-size: 14px;
  188. }
  189. .flex-1 {
  190. flex: 1;
  191. }
  192. .text-dark {
  193. color: #2c3e50;
  194. }
  195. .fonte-email-profile {
  196. font-family: Inter;
  197. font-weight: 500;
  198. font-style: Medium;
  199. font-size: 12px;
  200. line-height: 100%;
  201. letter-spacing: 0%;
  202. }
  203. .fonte-telefone-profile {
  204. font-family: Inter;
  205. font-weight: 500;
  206. font-style: Medium;
  207. font-size: 12px;
  208. line-height: 100%;
  209. letter-spacing: 0%;
  210. }
  211. .fonte-nome-profile {
  212. font-family: Inter;
  213. font-weight: 700;
  214. font-style: Bold;
  215. font-size: 18px;
  216. line-height: 100%;
  217. letter-spacing: 0%;
  218. text-align: center;
  219. }
  220. .shadow-profile {
  221. box-shadow: 0px 1px 8px rgba(0, 0, 0, 0.1);
  222. }
  223. </style>