@greatapps/common 1.1.516 → 1.1.517

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  3. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  4. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  5. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  6. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  7. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  8. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  9. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  10. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  11. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  12. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  13. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  14. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  15. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  16. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  17. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  18. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  19. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  20. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  21. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  22. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  23. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  24. package/dist/components/layouts/NavBar.mjs.map +1 -1
  25. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  26. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  27. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  28. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  29. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  30. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  31. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  32. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  33. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  34. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  35. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  36. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  37. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  38. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  39. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  40. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  41. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  42. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  43. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  44. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  45. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  46. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  47. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  48. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  49. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  50. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  51. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  52. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  53. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  54. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  55. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  56. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  57. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  58. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  59. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  60. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  61. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  62. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  63. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  64. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  65. package/dist/components/ui/form/DatePicker.mjs +2 -2
  66. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  67. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  68. package/dist/components/ui/form/FormField.mjs.map +1 -1
  69. package/dist/components/ui/form/Input.mjs.map +1 -1
  70. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  71. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  72. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  73. package/dist/components/ui/form/Select.mjs +1 -1
  74. package/dist/components/ui/form/Select.mjs.map +1 -1
  75. package/dist/components/ui/form/Switch.mjs.map +1 -1
  76. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  77. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  78. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  79. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  80. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  81. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  82. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  83. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  84. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  85. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  86. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  87. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  88. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  89. package/dist/index.mjs.map +1 -1
  90. package/dist/infra/utils/array.mjs.map +1 -1
  91. package/dist/infra/utils/date.mjs.map +1 -1
  92. package/dist/middleware.mjs.map +1 -1
  93. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  94. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  95. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  96. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  97. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  98. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  99. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  100. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  101. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  102. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  103. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  104. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  105. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  106. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  107. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  108. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  109. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  110. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  111. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  112. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  113. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  114. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  115. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  116. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  117. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  118. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  119. package/dist/modules/cards/actions/find-card-by-id.action.mjs.map +1 -1
  120. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  121. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  122. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  123. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  124. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  125. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  126. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  127. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  128. package/dist/modules/cards/types.mjs.map +1 -1
  129. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  130. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  131. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  132. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  133. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  134. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  135. package/dist/modules/images/utils/base64.mjs.map +1 -1
  136. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  137. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  138. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  139. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  140. package/dist/modules/plans/actions/list-plans.action.mjs.map +1 -1
  141. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  142. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  143. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  144. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  145. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  146. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  147. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  148. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  149. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  150. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  151. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  152. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  153. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  154. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  155. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  156. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  157. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  158. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  159. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  160. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  161. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  162. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  163. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  164. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  165. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  166. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  167. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  168. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  169. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  170. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  171. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  172. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  173. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  174. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  175. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  176. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  177. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  178. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  179. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  180. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  181. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  182. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  183. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  184. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  185. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  186. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  187. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  188. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  189. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  190. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  191. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  192. package/dist/providers/auth.provider.mjs.map +1 -1
  193. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  194. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  195. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  196. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  197. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  198. package/dist/utils/constants/br-states.mjs.map +1 -1
  199. package/dist/utils/countries.mjs.map +1 -1
  200. package/dist/utils/format/currency.mjs.map +1 -1
  201. package/dist/utils/safeServerAction.mjs.map +1 -1
  202. package/dist/utils/withAction.mjs.map +1 -1
  203. package/package.json +92 -92
  204. package/src/components/account/ConfigurationsMyAccountModal.tsx +161 -161
  205. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  206. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  207. package/src/components/account/DeleteAccountModal.tsx +130 -130
  208. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  209. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  210. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  211. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  212. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  213. package/src/components/account/sections/ChangeEmailModal.tsx +227 -227
  214. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  215. package/src/components/account/sections/ChangePhoneModal.tsx +247 -247
  216. package/src/components/account/sections/MyProfileSection.tsx +328 -328
  217. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  218. package/src/components/account/sections/SecuritySection.tsx +46 -46
  219. package/src/components/account/sections/TokenSection.tsx +64 -64
  220. package/src/components/embeds/CrispEmbed.tsx +156 -156
  221. package/src/components/embeds/EmbedWidgets.tsx +50 -50
  222. package/src/components/embeds/FrillEmbed.tsx +129 -129
  223. package/src/components/layouts/AppMobileNavBar.tsx +80 -80
  224. package/src/components/layouts/AppNavBar.tsx +40 -40
  225. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  226. package/src/components/layouts/NavBar.tsx +175 -175
  227. package/src/components/layouts/NotificationsPopover.tsx +118 -118
  228. package/src/components/layouts/ProfilePopover.tsx +176 -176
  229. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  230. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  231. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  232. package/src/components/modals/BuyCreditsModal.tsx +354 -354
  233. package/src/components/modals/PaidPlanRequiredModal.tsx +57 -57
  234. package/src/components/modals/cards/AddCardModal.tsx +265 -265
  235. package/src/components/modals/cards/CardFormFields.tsx +348 -348
  236. package/src/components/navigation/CancelledSubscriptionBanner.tsx +64 -64
  237. package/src/components/navigation/NavItemsContext.ts +20 -20
  238. package/src/components/navigation/ProjectSelectorPopover.tsx +178 -178
  239. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  240. package/src/components/navigation/subcomponents/BottomLinks.tsx +37 -37
  241. package/src/components/navigation/subcomponents/ProjectSelector.tsx +182 -182
  242. package/src/components/pages/NotFoundPage.tsx +67 -67
  243. package/src/components/pages/notifications/Notifications.tsx +187 -187
  244. package/src/components/ui/buttons/Button.tsx +62 -62
  245. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  246. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  247. package/src/components/ui/data-display/Accordion.tsx +81 -81
  248. package/src/components/ui/data-display/Badge.tsx +47 -47
  249. package/src/components/ui/data-display/Card.tsx +93 -93
  250. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  251. package/src/components/ui/data-display/CardItem.tsx +75 -75
  252. package/src/components/ui/data-display/Pagination.tsx +126 -126
  253. package/src/components/ui/data-display/PaymentInfoCard.tsx +192 -192
  254. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  255. package/src/components/ui/data-display/Separator.tsx +29 -29
  256. package/src/components/ui/data-display/Table.tsx +117 -117
  257. package/src/components/ui/data-display/Tabs.tsx +67 -67
  258. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  259. package/src/components/ui/feedback/DefaultCircularProgress.tsx +65 -65
  260. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  261. package/src/components/ui/feedback/Progress.tsx +40 -40
  262. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  263. package/src/components/ui/feedback/Toast.tsx +104 -104
  264. package/src/components/ui/form/Calendar.tsx +228 -228
  265. package/src/components/ui/form/Checkbox.tsx +31 -31
  266. package/src/components/ui/form/ComboboxField.tsx +154 -154
  267. package/src/components/ui/form/DatePicker.tsx +98 -97
  268. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  269. package/src/components/ui/form/FormField.tsx +133 -133
  270. package/src/components/ui/form/Input.tsx +20 -20
  271. package/src/components/ui/form/InputOtp.tsx +80 -80
  272. package/src/components/ui/form/PhoneInput.tsx +208 -208
  273. package/src/components/ui/form/RadioGroup.tsx +45 -45
  274. package/src/components/ui/form/Select.tsx +200 -200
  275. package/src/components/ui/form/Switch.tsx +32 -32
  276. package/src/components/ui/form/Textarea.tsx +19 -19
  277. package/src/components/ui/overlay/Command.tsx +185 -185
  278. package/src/components/ui/overlay/Dialog.tsx +153 -153
  279. package/src/components/ui/overlay/Popover.tsx +49 -49
  280. package/src/components/ui/overlay/Sheet.tsx +170 -170
  281. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  282. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +254 -254
  283. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +61 -61
  284. package/src/components/widgets/ImageUpload/ImageUpload.tsx +126 -126
  285. package/src/components/widgets/ImageUpload/index.ts +3 -3
  286. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  287. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  288. package/src/hooks/useAuthQueryKey.ts +32 -32
  289. package/src/index.ts +506 -506
  290. package/src/infra/utils/array.ts +54 -54
  291. package/src/infra/utils/date.ts +18 -18
  292. package/src/middleware.ts +4 -4
  293. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  294. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  295. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  296. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  297. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  298. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  299. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  300. package/src/modules/accounts/hooks/useAccountManagement.ts +94 -94
  301. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  302. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  303. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  304. package/src/modules/accounts/services/account-token.service.ts +52 -52
  305. package/src/modules/accounts/services/account.service.ts +239 -239
  306. package/src/modules/accounts/types.ts +225 -225
  307. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  308. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  309. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  310. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  311. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  312. package/src/modules/auth/hooks/useUserQuery.ts +75 -75
  313. package/src/modules/auth/types/management-permission.type.ts +7 -7
  314. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  315. package/src/modules/auth/utils/assert-management-subscription.ts +35 -35
  316. package/src/modules/auth/utils/assert-paid-subscription.ts +43 -43
  317. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  318. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  319. package/src/modules/cards/actions/create-card.action.ts +9 -9
  320. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  321. package/src/modules/cards/actions/find-card-by-id.action.ts +8 -8
  322. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  323. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  324. package/src/modules/cards/hooks/card-by-id.hook.ts +21 -21
  325. package/src/modules/cards/hooks/cards.hook.ts +23 -23
  326. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  327. package/src/modules/cards/hooks/delete-card.hook.ts +54 -54
  328. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  329. package/src/modules/cards/services/cards.service.ts +108 -108
  330. package/src/modules/cards/types.ts +42 -42
  331. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  332. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +99 -99
  333. package/src/modules/images/actions/process-image.action.ts +40 -40
  334. package/src/modules/images/constants/image.constants.ts +11 -11
  335. package/src/modules/images/hooks/use-image-upload.hook.ts +172 -172
  336. package/src/modules/images/services/image-processing.service.ts +75 -75
  337. package/src/modules/images/types/image.type.ts +54 -54
  338. package/src/modules/images/utils/base64.ts +26 -26
  339. package/src/modules/images/utils/compress-image.ts +20 -20
  340. package/src/modules/images/utils/crop-image.ts +51 -51
  341. package/src/modules/images/utils/validate-image.ts +71 -71
  342. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  343. package/src/modules/plans/actions/list-plans.action.ts +17 -17
  344. package/src/modules/plans/hooks/list-plans.hook.ts +24 -24
  345. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  346. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +38 -38
  347. package/src/modules/plans/services/plans.service.ts +133 -133
  348. package/src/modules/plans/types/plan.type.ts +67 -67
  349. package/src/modules/plans/utils/map-api-plan-to-ui.ts +98 -98
  350. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  351. package/src/modules/projects/actions/create-project.action.ts +9 -9
  352. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  353. package/src/modules/projects/actions/find-project.action.ts +8 -8
  354. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  355. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  356. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  357. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  358. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  359. package/src/modules/projects/actions/update-project.action.ts +9 -9
  360. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  361. package/src/modules/projects/hooks/create-project.hook.ts +88 -88
  362. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  363. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  364. package/src/modules/projects/hooks/list-all-account-users.hook.ts +39 -39
  365. package/src/modules/projects/hooks/list-available-users.hook.ts +38 -38
  366. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +43 -43
  367. package/src/modules/projects/hooks/list-project-users.hook.ts +38 -38
  368. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  369. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  370. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  371. package/src/modules/projects/services/projects.service.ts +144 -144
  372. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  373. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  374. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  375. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  376. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  377. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +18 -18
  378. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +19 -19
  379. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  380. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  381. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  382. package/src/modules/subscriptions/types/calculate-subscription.type.ts +113 -113
  383. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  384. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  385. package/src/modules/subscriptions/utils/periodicity.ts +62 -62
  386. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  387. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  388. package/src/modules/users/action/list-messages.action.ts +26 -26
  389. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  390. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  391. package/src/modules/users/hooks/messages.hook.ts +67 -67
  392. package/src/modules/users/services/messages.service.ts +49 -49
  393. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  394. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  395. package/src/modules/whitelabel/schema.ts +84 -84
  396. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  397. package/src/providers/auth.provider.tsx +162 -162
  398. package/src/providers/whitelabel.provider.tsx +59 -59
  399. package/src/store/useBuyCreditsModal.ts +21 -21
  400. package/src/store/useDesktopSidebarStore.ts +47 -47
  401. package/src/store/useMdSidebarStore.ts +34 -34
  402. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  403. package/src/utils/constants/br-states.ts +29 -29
  404. package/src/utils/countries.ts +224 -224
  405. package/src/utils/format/currency.ts +15 -15
  406. package/src/utils/safeServerAction.ts +21 -21
  407. package/src/utils/withAction.ts +13 -13
@@ -1,328 +1,328 @@
1
- 'use client';
2
-
3
- import { useState, useRef } from 'react';
4
- import Image from 'next/image';
5
- import { useForm } from 'react-hook-form';
6
- import { zodResolver } from '@hookform/resolvers/zod';
7
- import { toast } from 'sonner';
8
- import { IconUpload, IconTrash } from '@tabler/icons-react';
9
- import { ACCEPTED_IMAGE_FORMATS_STRING } from '../../../modules/images/constants/image.constants';
10
- import { Button } from '../../ui/buttons/Button';
11
- import { Separator } from '../../ui/data-display/Separator';
12
- import { Toast } from '../../ui/feedback/Toast';
13
- import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';
14
- import { FormField } from '../../ui/form/FormField';
15
- import { SelectField } from '../../ui/form/SelectField';
16
- import PhoneInput from '../../ui/form/PhoneInput';
17
- import { useAuth } from '../../../providers/auth.provider';
18
- import { UserProfile } from '../../../modules/users/schema';
19
- import { myProfileSchema, type MyProfileFormData } from '../../../utils/validators/account';
20
- import {
21
- useUpdateAccountUser,
22
- useDeleteAccount,
23
- useDeleteAccountUser,
24
- } from '../../../modules/accounts/hooks/useAccountManagement';
25
- import { GENDER_OPTIONS } from '../constants';
26
- import { ChangePhoneModal } from './ChangePhoneModal';
27
- import { ChangeEmailModal } from './ChangeEmailModal';
28
-
29
- interface MyProfileSectionProps {
30
- onClose: () => void;
31
- storageUrl?: string;
32
- }
33
-
34
- export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps) {
35
- const { user, logout } = useAuth();
36
- const updateAccountUser = useUpdateAccountUser();
37
- const deleteAccount = useDeleteAccount();
38
- const deleteAccountUser = useDeleteAccountUser();
39
- const fileInputRef = useRef<HTMLInputElement>(null);
40
- const [selectedPhoto, setSelectedPhoto] = useState<File | null>(null);
41
- const [photoRemoved, setPhotoRemoved] = useState(false);
42
- const [changePhoneOpen, setChangePhoneOpen] = useState(false);
43
- const [changeEmailOpen, setChangeEmailOpen] = useState(false);
44
- const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false);
45
-
46
- const isOwner = user?.profile === UserProfile.owner;
47
- const isDeleting = deleteAccount.isPending || deleteAccountUser.isPending;
48
-
49
- const form = useForm<MyProfileFormData>({
50
- resolver: zodResolver(myProfileSchema),
51
- mode: 'onChange',
52
- defaultValues: {
53
- name: user?.name ?? '',
54
- last_name: user?.last_name ?? '',
55
- gender: GENDER_OPTIONS.find((g) => g.apiValue === user?.gender)?.value ?? '',
56
- },
57
- });
58
-
59
- const {
60
- register,
61
- handleSubmit,
62
- watch,
63
- setValue,
64
- formState: { errors, isSubmitting },
65
- } = form;
66
-
67
- const baseStorageUrl = storageUrl ?? process.env.NEXT_PUBLIC_STORAGE_URL ?? '';
68
-
69
- const avatarPreview = selectedPhoto
70
- ? URL.createObjectURL(selectedPhoto)
71
- : !photoRemoved && user?.photo
72
- ? `${baseStorageUrl}/${user.photo}`
73
- : null;
74
-
75
- const handlePhotoChange = (e: React.ChangeEvent<HTMLInputElement>) => {
76
- const file = e.target.files?.[0] ?? null;
77
- if (file) {
78
- setSelectedPhoto(file);
79
- setPhotoRemoved(false);
80
- }
81
- };
82
-
83
- const handleRemovePhoto = () => {
84
- setSelectedPhoto(null);
85
- setPhotoRemoved(true);
86
- };
87
-
88
- const handleDelete = async () => {
89
- try {
90
- if (isOwner) {
91
- await deleteAccount.mutateAsync();
92
- } else {
93
- await deleteAccountUser.mutateAsync(user!.id);
94
- }
95
- await logout();
96
- } catch (error) {
97
- toast.custom((t) => (
98
- <Toast
99
- variant="error"
100
- message={error instanceof Error ? error.message : 'Erro ao excluir. Tente novamente.'}
101
- toastId={t}
102
- />
103
- ));
104
- setDeleteConfirmOpen(false);
105
- }
106
- };
107
-
108
- const onSubmit = async (data: MyProfileFormData) => {
109
- try {
110
- await updateAccountUser.mutateAsync({
111
- name: data.name,
112
- last_name: data.last_name,
113
- gender: GENDER_OPTIONS.find((g) => g.value === data.gender)?.apiValue,
114
- ...(selectedPhoto ? { photo: selectedPhoto } : {}),
115
- ...(photoRemoved ? { photo: '' } : {}),
116
- });
117
-
118
- form.reset(data);
119
- setSelectedPhoto(null);
120
- setPhotoRemoved(false);
121
- toast.custom((t) => (
122
- <Toast variant="success" message="Perfil atualizado com sucesso" toastId={t} />
123
- ));
124
- onClose();
125
- } catch (error) {
126
- toast.custom((t) => (
127
- <Toast
128
- variant="error"
129
- message={error instanceof Error ? error.message : 'Erro ao atualizar perfil'}
130
- toastId={t}
131
- />
132
- ));
133
- }
134
- };
135
-
136
- return (
137
- <>
138
- <form onSubmit={handleSubmit(onSubmit)} className="lg:h-full lg:flex lg:flex-col">
139
- <input
140
- ref={fileInputRef}
141
- type="file"
142
- accept={ACCEPTED_IMAGE_FORMATS_STRING}
143
- className="hidden"
144
- onChange={handlePhotoChange}
145
- />
146
- <div className="absolute inset-0 overflow-y-auto overscroll-contain px-4 pb-20 lg:p-5 lg:static lg:flex-1 lg:min-h-0 lg:overscroll-auto flex flex-col gap-5 lg:gap-6">
147
- <span className="paragraph-medium-semibold text-gray-950 hidden lg:block">
148
- Meu perfil
149
- </span>
150
- <div className="flex flex-col gap-5">
151
- <div className="flex items-center gap-4">
152
- {avatarPreview ? (
153
- <Image
154
- src={avatarPreview}
155
- alt="Foto do usuário"
156
- width={48}
157
- height={48}
158
- className="size-12 rounded-full object-cover cursor-pointer"
159
- onClick={() => fileInputRef.current?.click()}
160
- />
161
- ) : (
162
- <div
163
- className="size-12 rounded-full bg-gray-50 border border-dashed border-gray-200 flex items-center justify-center cursor-pointer"
164
- onClick={() => fileInputRef.current?.click()}
165
- >
166
- <IconUpload size={20} className="text-gray-400" />
167
- </div>
168
- )}
169
- {avatarPreview ? (
170
- <div className="flex items-center gap-2">
171
- <Button
172
- variant="secondary"
173
- className="w-fit h-8!"
174
- type="button"
175
- onClick={() => fileInputRef.current?.click()}
176
- >
177
- Alterar foto
178
- </Button>
179
- <Button
180
- type="button"
181
- variant="ghost"
182
- className="h-8!"
183
- onClick={handleRemovePhoto}
184
- >
185
- <IconTrash size={16} className="text-gray-500" />
186
- </Button>
187
- </div>
188
- ) : (
189
- <Button
190
- variant="secondary"
191
- className="w-fit h-8!"
192
- type="button"
193
- onClick={() => fileInputRef.current?.click()}
194
- >
195
- Alterar foto
196
- </Button>
197
- )}
198
- </div>
199
-
200
- <div className="flex flex-col gap-8">
201
- <div className="flex flex-col gap-4">
202
- <div className="flex gap-4">
203
- <FormField
204
- label="Nome"
205
- placeholder="Digite seu nome"
206
- error={!!errors.name}
207
- errorMessage={errors.name?.message}
208
- {...register('name')}
209
- />
210
- <FormField
211
- label="Sobrenome"
212
- placeholder="Digite seu sobrenome"
213
- error={!!errors.last_name}
214
- errorMessage={errors.last_name?.message}
215
- {...register('last_name')}
216
- />
217
- </div>
218
- <SelectField
219
- label="Gênero"
220
- placeholder="Selecione seu gênero"
221
- options={GENDER_OPTIONS}
222
- value={watch('gender')}
223
- className="h-10!"
224
- onChange={(value) => setValue('gender', value as string)}
225
- />
226
- <div className="relative">
227
- <PhoneInput
228
- label="Telefone"
229
- value={user?.phone ?? ''}
230
- disabled
231
- classnameContainer="bg-gray-50 border-0!"
232
- />
233
- <button
234
- type="button"
235
- className="absolute right-3 top-5.5 h-10 flex items-center paragraph-xsmall-semibold text-gray-950 underline cursor-pointer"
236
- onClick={() => setChangePhoneOpen(true)}
237
- >
238
- Alterar
239
- </button>
240
- </div>
241
- </div>
242
-
243
- <Separator />
244
-
245
- <div className="flex flex-col gap-4">
246
- <span className="paragraph-medium-semibold text-gray-600">Dados de acesso</span>
247
- <div className="relative">
248
- <div className='cursor-not-allowed'>
249
- <FormField
250
- label="E-mail"
251
- value={user?.email ?? ''}
252
- disabled
253
- classnameContainer="bg-gray-50 border-0!"
254
- />
255
- </div>
256
- <button
257
- type="button"
258
- className="absolute right-3 top-5.5 h-10 flex items-center paragraph-xsmall-semibold text-gray-950 underline cursor-pointer"
259
- onClick={() => setChangeEmailOpen(true)}
260
- >
261
- Alterar
262
- </button>
263
- </div>
264
- </div>
265
- </div>
266
- </div>
267
- </div>
268
-
269
- <div className="fixed bottom-0 left-0 right-0 lg:static flex items-center h-20 px-4 lg:px-5 border-t border-gray-200 justify-between bg-white z-10">
270
- <Button
271
- variant="secondary"
272
- className="h-10!"
273
- type="button"
274
- disabled={isSubmitting}
275
- onClick={() => {
276
- form.reset();
277
- setSelectedPhoto(null);
278
- setPhotoRemoved(false);
279
- onClose();
280
- }}
281
- >
282
- Cancelar
283
- </Button>
284
- <Button className="h-10! cursor-pointer" type="submit" disabled={isSubmitting}>
285
- {isSubmitting ? 'Salvando...' : 'Salvar alterações'}
286
- </Button>
287
- </div>
288
- </form>
289
-
290
- <ChangePhoneModal open={changePhoneOpen} onClose={() => setChangePhoneOpen(false)} />
291
- <ChangeEmailModal open={changeEmailOpen} onClose={() => setChangeEmailOpen(false)} />
292
-
293
- <Dialog open={deleteConfirmOpen} onOpenChange={setDeleteConfirmOpen}>
294
- <DialogContent className="max-w-sm! gap-5">
295
- <DialogHeader>
296
- <DialogTitle className="paragraph-large-semibold text-gray-950">
297
- {isOwner ? 'Excluir conta' : 'Excluir usuário'}
298
- </DialogTitle>
299
- </DialogHeader>
300
- <p className="paragraph-small-regular text-gray-600">
301
- {isOwner
302
- ? 'Tem certeza que deseja excluir sua conta? Todos os dados serão apagados permanentemente e essa ação não pode ser desfeita.'
303
- : 'Tem certeza que deseja excluir seu usuário? Você perderá acesso a esta conta permanentemente.'}
304
- </p>
305
- <div className="flex items-center gap-3 justify-end">
306
- <Button
307
- type="button"
308
- variant="secondary"
309
- className="h-10!"
310
- disabled={isDeleting}
311
- onClick={() => setDeleteConfirmOpen(false)}
312
- >
313
- Cancelar
314
- </Button>
315
- <Button
316
- type="button"
317
- className="h-10! bg-red-600 hover:bg-red-700 text-white border-0!"
318
- disabled={isDeleting}
319
- onClick={handleDelete}
320
- >
321
- {isDeleting ? 'Excluindo...' : 'Confirmar exclusão'}
322
- </Button>
323
- </div>
324
- </DialogContent>
325
- </Dialog>
326
- </>
327
- );
328
- }
1
+ 'use client';
2
+
3
+ import { useState, useRef } from 'react';
4
+ import Image from 'next/image';
5
+ import { useForm } from 'react-hook-form';
6
+ import { zodResolver } from '@hookform/resolvers/zod';
7
+ import { toast } from 'sonner';
8
+ import { IconUpload, IconTrash } from '@tabler/icons-react';
9
+ import { ACCEPTED_IMAGE_FORMATS_STRING } from '../../../modules/images/constants/image.constants';
10
+ import { Button } from '../../ui/buttons/Button';
11
+ import { Separator } from '../../ui/data-display/Separator';
12
+ import { Toast } from '../../ui/feedback/Toast';
13
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';
14
+ import { FormField } from '../../ui/form/FormField';
15
+ import { SelectField } from '../../ui/form/SelectField';
16
+ import PhoneInput from '../../ui/form/PhoneInput';
17
+ import { useAuth } from '../../../providers/auth.provider';
18
+ import { UserProfile } from '../../../modules/users/schema';
19
+ import { myProfileSchema, type MyProfileFormData } from '../../../utils/validators/account';
20
+ import {
21
+ useUpdateAccountUser,
22
+ useDeleteAccount,
23
+ useDeleteAccountUser,
24
+ } from '../../../modules/accounts/hooks/useAccountManagement';
25
+ import { GENDER_OPTIONS } from '../constants';
26
+ import { ChangePhoneModal } from './ChangePhoneModal';
27
+ import { ChangeEmailModal } from './ChangeEmailModal';
28
+
29
+ interface MyProfileSectionProps {
30
+ onClose: () => void;
31
+ storageUrl?: string;
32
+ }
33
+
34
+ export function MyProfileSection({ onClose, storageUrl }: MyProfileSectionProps) {
35
+ const { user, logout } = useAuth();
36
+ const updateAccountUser = useUpdateAccountUser();
37
+ const deleteAccount = useDeleteAccount();
38
+ const deleteAccountUser = useDeleteAccountUser();
39
+ const fileInputRef = useRef<HTMLInputElement>(null);
40
+ const [selectedPhoto, setSelectedPhoto] = useState<File | null>(null);
41
+ const [photoRemoved, setPhotoRemoved] = useState(false);
42
+ const [changePhoneOpen, setChangePhoneOpen] = useState(false);
43
+ const [changeEmailOpen, setChangeEmailOpen] = useState(false);
44
+ const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false);
45
+
46
+ const isOwner = user?.profile === UserProfile.owner;
47
+ const isDeleting = deleteAccount.isPending || deleteAccountUser.isPending;
48
+
49
+ const form = useForm<MyProfileFormData>({
50
+ resolver: zodResolver(myProfileSchema),
51
+ mode: 'onChange',
52
+ defaultValues: {
53
+ name: user?.name ?? '',
54
+ last_name: user?.last_name ?? '',
55
+ gender: GENDER_OPTIONS.find((g) => g.apiValue === user?.gender)?.value ?? '',
56
+ },
57
+ });
58
+
59
+ const {
60
+ register,
61
+ handleSubmit,
62
+ watch,
63
+ setValue,
64
+ formState: { errors, isSubmitting },
65
+ } = form;
66
+
67
+ const baseStorageUrl = storageUrl ?? process.env.NEXT_PUBLIC_STORAGE_URL ?? '';
68
+
69
+ const avatarPreview = selectedPhoto
70
+ ? URL.createObjectURL(selectedPhoto)
71
+ : !photoRemoved && user?.photo
72
+ ? `${baseStorageUrl}/${user.photo}`
73
+ : null;
74
+
75
+ const handlePhotoChange = (e: React.ChangeEvent<HTMLInputElement>) => {
76
+ const file = e.target.files?.[0] ?? null;
77
+ if (file) {
78
+ setSelectedPhoto(file);
79
+ setPhotoRemoved(false);
80
+ }
81
+ };
82
+
83
+ const handleRemovePhoto = () => {
84
+ setSelectedPhoto(null);
85
+ setPhotoRemoved(true);
86
+ };
87
+
88
+ const handleDelete = async () => {
89
+ try {
90
+ if (isOwner) {
91
+ await deleteAccount.mutateAsync();
92
+ } else {
93
+ await deleteAccountUser.mutateAsync(user!.id);
94
+ }
95
+ await logout();
96
+ } catch (error) {
97
+ toast.custom((t) => (
98
+ <Toast
99
+ variant="error"
100
+ message={error instanceof Error ? error.message : 'Erro ao excluir. Tente novamente.'}
101
+ toastId={t}
102
+ />
103
+ ));
104
+ setDeleteConfirmOpen(false);
105
+ }
106
+ };
107
+
108
+ const onSubmit = async (data: MyProfileFormData) => {
109
+ try {
110
+ await updateAccountUser.mutateAsync({
111
+ name: data.name,
112
+ last_name: data.last_name,
113
+ gender: GENDER_OPTIONS.find((g) => g.value === data.gender)?.apiValue,
114
+ ...(selectedPhoto ? { photo: selectedPhoto } : {}),
115
+ ...(photoRemoved ? { photo: '' } : {}),
116
+ });
117
+
118
+ form.reset(data);
119
+ setSelectedPhoto(null);
120
+ setPhotoRemoved(false);
121
+ toast.custom((t) => (
122
+ <Toast variant="success" message="Perfil atualizado com sucesso" toastId={t} />
123
+ ));
124
+ onClose();
125
+ } catch (error) {
126
+ toast.custom((t) => (
127
+ <Toast
128
+ variant="error"
129
+ message={error instanceof Error ? error.message : 'Erro ao atualizar perfil'}
130
+ toastId={t}
131
+ />
132
+ ));
133
+ }
134
+ };
135
+
136
+ return (
137
+ <>
138
+ <form onSubmit={handleSubmit(onSubmit)} className="lg:h-full lg:flex lg:flex-col">
139
+ <input
140
+ ref={fileInputRef}
141
+ type="file"
142
+ accept={ACCEPTED_IMAGE_FORMATS_STRING}
143
+ className="hidden"
144
+ onChange={handlePhotoChange}
145
+ />
146
+ <div className="absolute inset-0 overflow-y-auto overscroll-contain px-4 pb-20 lg:p-5 lg:static lg:flex-1 lg:min-h-0 lg:overscroll-auto flex flex-col gap-5 lg:gap-6">
147
+ <span className="paragraph-medium-semibold text-gray-950 hidden lg:block">
148
+ Meu perfil
149
+ </span>
150
+ <div className="flex flex-col gap-5">
151
+ <div className="flex items-center gap-4">
152
+ {avatarPreview ? (
153
+ <Image
154
+ src={avatarPreview}
155
+ alt="Foto do usuário"
156
+ width={48}
157
+ height={48}
158
+ className="size-12 rounded-full object-cover cursor-pointer"
159
+ onClick={() => fileInputRef.current?.click()}
160
+ />
161
+ ) : (
162
+ <div
163
+ className="size-12 rounded-full bg-gray-50 border border-dashed border-gray-200 flex items-center justify-center cursor-pointer"
164
+ onClick={() => fileInputRef.current?.click()}
165
+ >
166
+ <IconUpload size={20} className="text-gray-400" />
167
+ </div>
168
+ )}
169
+ {avatarPreview ? (
170
+ <div className="flex items-center gap-2">
171
+ <Button
172
+ variant="secondary"
173
+ className="w-fit h-8!"
174
+ type="button"
175
+ onClick={() => fileInputRef.current?.click()}
176
+ >
177
+ Alterar foto
178
+ </Button>
179
+ <Button
180
+ type="button"
181
+ variant="ghost"
182
+ className="h-8!"
183
+ onClick={handleRemovePhoto}
184
+ >
185
+ <IconTrash size={16} className="text-gray-500" />
186
+ </Button>
187
+ </div>
188
+ ) : (
189
+ <Button
190
+ variant="secondary"
191
+ className="w-fit h-8!"
192
+ type="button"
193
+ onClick={() => fileInputRef.current?.click()}
194
+ >
195
+ Alterar foto
196
+ </Button>
197
+ )}
198
+ </div>
199
+
200
+ <div className="flex flex-col gap-8">
201
+ <div className="flex flex-col gap-4">
202
+ <div className="flex gap-4">
203
+ <FormField
204
+ label="Nome"
205
+ placeholder="Digite seu nome"
206
+ error={!!errors.name}
207
+ errorMessage={errors.name?.message}
208
+ {...register('name')}
209
+ />
210
+ <FormField
211
+ label="Sobrenome"
212
+ placeholder="Digite seu sobrenome"
213
+ error={!!errors.last_name}
214
+ errorMessage={errors.last_name?.message}
215
+ {...register('last_name')}
216
+ />
217
+ </div>
218
+ <SelectField
219
+ label="Gênero"
220
+ placeholder="Selecione seu gênero"
221
+ options={GENDER_OPTIONS}
222
+ value={watch('gender')}
223
+ className="h-10!"
224
+ onChange={(value) => setValue('gender', value as string)}
225
+ />
226
+ <div className="relative">
227
+ <PhoneInput
228
+ label="Telefone"
229
+ value={user?.phone ?? ''}
230
+ disabled
231
+ classnameContainer="bg-gray-50 border-0!"
232
+ />
233
+ <button
234
+ type="button"
235
+ className="absolute right-3 top-5.5 h-10 flex items-center paragraph-xsmall-semibold text-gray-950 underline cursor-pointer"
236
+ onClick={() => setChangePhoneOpen(true)}
237
+ >
238
+ Alterar
239
+ </button>
240
+ </div>
241
+ </div>
242
+
243
+ <Separator />
244
+
245
+ <div className="flex flex-col gap-4">
246
+ <span className="paragraph-medium-semibold text-gray-600">Dados de acesso</span>
247
+ <div className="relative">
248
+ <div className='cursor-not-allowed'>
249
+ <FormField
250
+ label="E-mail"
251
+ value={user?.email ?? ''}
252
+ disabled
253
+ classnameContainer="bg-gray-50 border-0!"
254
+ />
255
+ </div>
256
+ <button
257
+ type="button"
258
+ className="absolute right-3 top-5.5 h-10 flex items-center paragraph-xsmall-semibold text-gray-950 underline cursor-pointer"
259
+ onClick={() => setChangeEmailOpen(true)}
260
+ >
261
+ Alterar
262
+ </button>
263
+ </div>
264
+ </div>
265
+ </div>
266
+ </div>
267
+ </div>
268
+
269
+ <div className="fixed bottom-0 left-0 right-0 lg:static flex items-center h-20 px-4 lg:px-5 border-t border-gray-200 justify-between bg-white z-10">
270
+ <Button
271
+ variant="secondary"
272
+ className="h-10!"
273
+ type="button"
274
+ disabled={isSubmitting}
275
+ onClick={() => {
276
+ form.reset();
277
+ setSelectedPhoto(null);
278
+ setPhotoRemoved(false);
279
+ onClose();
280
+ }}
281
+ >
282
+ Cancelar
283
+ </Button>
284
+ <Button className="h-10! cursor-pointer" type="submit" disabled={isSubmitting}>
285
+ {isSubmitting ? 'Salvando...' : 'Salvar alterações'}
286
+ </Button>
287
+ </div>
288
+ </form>
289
+
290
+ <ChangePhoneModal open={changePhoneOpen} onClose={() => setChangePhoneOpen(false)} />
291
+ <ChangeEmailModal open={changeEmailOpen} onClose={() => setChangeEmailOpen(false)} />
292
+
293
+ <Dialog open={deleteConfirmOpen} onOpenChange={setDeleteConfirmOpen}>
294
+ <DialogContent className="max-w-sm! gap-5">
295
+ <DialogHeader>
296
+ <DialogTitle className="paragraph-large-semibold text-gray-950">
297
+ {isOwner ? 'Excluir conta' : 'Excluir usuário'}
298
+ </DialogTitle>
299
+ </DialogHeader>
300
+ <p className="paragraph-small-regular text-gray-600">
301
+ {isOwner
302
+ ? 'Tem certeza que deseja excluir sua conta? Todos os dados serão apagados permanentemente e essa ação não pode ser desfeita.'
303
+ : 'Tem certeza que deseja excluir seu usuário? Você perderá acesso a esta conta permanentemente.'}
304
+ </p>
305
+ <div className="flex items-center gap-3 justify-end">
306
+ <Button
307
+ type="button"
308
+ variant="secondary"
309
+ className="h-10!"
310
+ disabled={isDeleting}
311
+ onClick={() => setDeleteConfirmOpen(false)}
312
+ >
313
+ Cancelar
314
+ </Button>
315
+ <Button
316
+ type="button"
317
+ className="h-10! bg-red-600 hover:bg-red-700 text-white border-0!"
318
+ disabled={isDeleting}
319
+ onClick={handleDelete}
320
+ >
321
+ {isDeleting ? 'Excluindo...' : 'Confirmar exclusão'}
322
+ </Button>
323
+ </div>
324
+ </DialogContent>
325
+ </Dialog>
326
+ </>
327
+ );
328
+ }