@greatapps/common 1.1.517 → 1.1.519

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 (413) 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 +7 -1
  18. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  19. package/dist/components/embeds/ClarityEmbed.mjs +55 -0
  20. package/dist/components/embeds/ClarityEmbed.mjs.map +1 -0
  21. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  22. package/dist/components/embeds/EmbedWidgets.mjs +3 -1
  23. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  24. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  25. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  26. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  27. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  28. package/dist/components/layouts/NavBar.mjs.map +1 -1
  29. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  30. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  31. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  32. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  33. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  34. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  35. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  36. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  37. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  38. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  39. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  40. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  41. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  42. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  43. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  44. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  45. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  46. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  47. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  48. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  49. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  50. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  51. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  52. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  53. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  54. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  55. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  56. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  57. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  58. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  59. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  60. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  61. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  62. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  63. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  64. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  65. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  66. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  67. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  68. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  69. package/dist/components/ui/form/DatePicker.mjs +2 -2
  70. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  71. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  72. package/dist/components/ui/form/FormField.mjs.map +1 -1
  73. package/dist/components/ui/form/Input.mjs.map +1 -1
  74. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  75. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  76. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  77. package/dist/components/ui/form/Select.mjs +1 -1
  78. package/dist/components/ui/form/Select.mjs.map +1 -1
  79. package/dist/components/ui/form/Switch.mjs.map +1 -1
  80. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  81. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  82. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  83. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  84. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  85. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  86. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  87. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  88. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  89. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  90. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  91. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  92. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  93. package/dist/index.mjs +2 -0
  94. package/dist/index.mjs.map +1 -1
  95. package/dist/infra/utils/array.mjs.map +1 -1
  96. package/dist/infra/utils/date.mjs.map +1 -1
  97. package/dist/middleware.mjs.map +1 -1
  98. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  99. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  100. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  101. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  102. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  103. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  104. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  105. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  106. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  107. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  108. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  109. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  110. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  111. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  112. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  113. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  114. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  115. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  116. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  117. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  118. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  119. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  120. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  121. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  122. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  123. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  124. package/dist/modules/cards/actions/find-card-by-id.action.mjs.map +1 -1
  125. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  126. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  127. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  128. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  129. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  130. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  131. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  132. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  133. package/dist/modules/cards/types.mjs.map +1 -1
  134. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  135. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  136. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  137. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  138. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  139. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  140. package/dist/modules/images/utils/base64.mjs.map +1 -1
  141. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  142. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  143. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  144. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  145. package/dist/modules/plans/actions/list-plans.action.mjs.map +1 -1
  146. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  147. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  148. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  149. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  150. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  151. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  152. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  153. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  154. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  155. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  156. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  157. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  158. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  159. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  160. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  161. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  162. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  163. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  164. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  165. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  166. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  167. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  168. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  169. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  170. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  171. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  172. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  173. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  174. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  175. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  176. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  177. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  178. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  179. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  180. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  181. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  182. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  183. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  184. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  185. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  186. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  187. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  188. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  189. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  190. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  191. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  192. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  193. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  194. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  195. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  196. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  197. package/dist/providers/auth.provider.mjs.map +1 -1
  198. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  199. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  200. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  201. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  202. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  203. package/dist/utils/constants/br-states.mjs.map +1 -1
  204. package/dist/utils/countries.mjs.map +1 -1
  205. package/dist/utils/format/currency.mjs.map +1 -1
  206. package/dist/utils/safeServerAction.mjs.map +1 -1
  207. package/dist/utils/withAction.mjs.map +1 -1
  208. package/package.json +92 -92
  209. package/src/components/account/ConfigurationsMyAccountModal.tsx +161 -161
  210. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  211. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  212. package/src/components/account/DeleteAccountModal.tsx +130 -130
  213. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  214. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  215. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  216. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  217. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  218. package/src/components/account/sections/ChangeEmailModal.tsx +227 -227
  219. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  220. package/src/components/account/sections/ChangePhoneModal.tsx +247 -247
  221. package/src/components/account/sections/MyProfileSection.tsx +328 -328
  222. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  223. package/src/components/account/sections/SecuritySection.tsx +46 -46
  224. package/src/components/account/sections/TokenSection.tsx +73 -64
  225. package/src/components/embeds/ClarityEmbed.tsx +70 -0
  226. package/src/components/embeds/CrispEmbed.tsx +156 -156
  227. package/src/components/embeds/EmbedWidgets.tsx +52 -50
  228. package/src/components/embeds/FrillEmbed.tsx +129 -129
  229. package/src/components/layouts/AppMobileNavBar.tsx +80 -80
  230. package/src/components/layouts/AppNavBar.tsx +40 -40
  231. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  232. package/src/components/layouts/NavBar.tsx +175 -175
  233. package/src/components/layouts/NotificationsPopover.tsx +118 -118
  234. package/src/components/layouts/ProfilePopover.tsx +176 -176
  235. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  236. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  237. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  238. package/src/components/modals/BuyCreditsModal.tsx +354 -354
  239. package/src/components/modals/PaidPlanRequiredModal.tsx +57 -57
  240. package/src/components/modals/cards/AddCardModal.tsx +265 -265
  241. package/src/components/modals/cards/CardFormFields.tsx +348 -348
  242. package/src/components/navigation/CancelledSubscriptionBanner.tsx +64 -64
  243. package/src/components/navigation/NavItemsContext.ts +20 -20
  244. package/src/components/navigation/ProjectSelectorPopover.tsx +178 -178
  245. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  246. package/src/components/navigation/subcomponents/BottomLinks.tsx +37 -37
  247. package/src/components/navigation/subcomponents/ProjectSelector.tsx +182 -182
  248. package/src/components/pages/NotFoundPage.tsx +67 -67
  249. package/src/components/pages/notifications/Notifications.tsx +187 -187
  250. package/src/components/ui/buttons/Button.tsx +62 -62
  251. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  252. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  253. package/src/components/ui/data-display/Accordion.tsx +81 -81
  254. package/src/components/ui/data-display/Badge.tsx +47 -47
  255. package/src/components/ui/data-display/Card.tsx +93 -93
  256. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  257. package/src/components/ui/data-display/CardItem.tsx +75 -75
  258. package/src/components/ui/data-display/Pagination.tsx +126 -126
  259. package/src/components/ui/data-display/PaymentInfoCard.tsx +192 -192
  260. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  261. package/src/components/ui/data-display/Separator.tsx +29 -29
  262. package/src/components/ui/data-display/Table.tsx +117 -117
  263. package/src/components/ui/data-display/Tabs.tsx +67 -67
  264. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  265. package/src/components/ui/feedback/DefaultCircularProgress.tsx +65 -65
  266. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  267. package/src/components/ui/feedback/Progress.tsx +40 -40
  268. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  269. package/src/components/ui/feedback/Toast.tsx +104 -104
  270. package/src/components/ui/form/Calendar.tsx +228 -228
  271. package/src/components/ui/form/Checkbox.tsx +31 -31
  272. package/src/components/ui/form/ComboboxField.tsx +154 -154
  273. package/src/components/ui/form/DatePicker.tsx +97 -98
  274. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  275. package/src/components/ui/form/FormField.tsx +133 -133
  276. package/src/components/ui/form/Input.tsx +20 -20
  277. package/src/components/ui/form/InputOtp.tsx +80 -80
  278. package/src/components/ui/form/PhoneInput.tsx +208 -208
  279. package/src/components/ui/form/RadioGroup.tsx +45 -45
  280. package/src/components/ui/form/Select.tsx +200 -200
  281. package/src/components/ui/form/Switch.tsx +32 -32
  282. package/src/components/ui/form/Textarea.tsx +19 -19
  283. package/src/components/ui/overlay/Command.tsx +185 -185
  284. package/src/components/ui/overlay/Dialog.tsx +153 -153
  285. package/src/components/ui/overlay/Popover.tsx +49 -49
  286. package/src/components/ui/overlay/Sheet.tsx +170 -170
  287. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  288. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +254 -254
  289. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +61 -61
  290. package/src/components/widgets/ImageUpload/ImageUpload.tsx +126 -126
  291. package/src/components/widgets/ImageUpload/index.ts +3 -3
  292. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  293. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  294. package/src/hooks/useAuthQueryKey.ts +32 -32
  295. package/src/index.ts +507 -506
  296. package/src/infra/utils/array.ts +54 -54
  297. package/src/infra/utils/date.ts +18 -18
  298. package/src/middleware.ts +4 -4
  299. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  300. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  301. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  302. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  303. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  304. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  305. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  306. package/src/modules/accounts/hooks/useAccountManagement.ts +94 -94
  307. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  308. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  309. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  310. package/src/modules/accounts/services/account-token.service.ts +52 -52
  311. package/src/modules/accounts/services/account.service.ts +239 -239
  312. package/src/modules/accounts/types.ts +225 -225
  313. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  314. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  315. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  316. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  317. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  318. package/src/modules/auth/hooks/useUserQuery.ts +75 -75
  319. package/src/modules/auth/types/management-permission.type.ts +7 -7
  320. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  321. package/src/modules/auth/utils/assert-management-subscription.ts +35 -35
  322. package/src/modules/auth/utils/assert-paid-subscription.ts +43 -43
  323. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  324. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  325. package/src/modules/cards/actions/create-card.action.ts +9 -9
  326. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  327. package/src/modules/cards/actions/find-card-by-id.action.ts +8 -8
  328. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  329. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  330. package/src/modules/cards/hooks/card-by-id.hook.ts +21 -21
  331. package/src/modules/cards/hooks/cards.hook.ts +23 -23
  332. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  333. package/src/modules/cards/hooks/delete-card.hook.ts +54 -54
  334. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  335. package/src/modules/cards/services/cards.service.ts +108 -108
  336. package/src/modules/cards/types.ts +42 -42
  337. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  338. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +99 -99
  339. package/src/modules/images/actions/process-image.action.ts +40 -40
  340. package/src/modules/images/constants/image.constants.ts +11 -11
  341. package/src/modules/images/hooks/use-image-upload.hook.ts +172 -172
  342. package/src/modules/images/services/image-processing.service.ts +75 -75
  343. package/src/modules/images/types/image.type.ts +54 -54
  344. package/src/modules/images/utils/base64.ts +26 -26
  345. package/src/modules/images/utils/compress-image.ts +20 -20
  346. package/src/modules/images/utils/crop-image.ts +51 -51
  347. package/src/modules/images/utils/validate-image.ts +71 -71
  348. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  349. package/src/modules/plans/actions/list-plans.action.ts +17 -17
  350. package/src/modules/plans/hooks/list-plans.hook.ts +24 -24
  351. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  352. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +38 -38
  353. package/src/modules/plans/services/plans.service.ts +133 -133
  354. package/src/modules/plans/types/plan.type.ts +67 -67
  355. package/src/modules/plans/utils/map-api-plan-to-ui.ts +98 -98
  356. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  357. package/src/modules/projects/actions/create-project.action.ts +9 -9
  358. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  359. package/src/modules/projects/actions/find-project.action.ts +8 -8
  360. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  361. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  362. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  363. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  364. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  365. package/src/modules/projects/actions/update-project.action.ts +9 -9
  366. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  367. package/src/modules/projects/hooks/create-project.hook.ts +88 -88
  368. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  369. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  370. package/src/modules/projects/hooks/list-all-account-users.hook.ts +39 -39
  371. package/src/modules/projects/hooks/list-available-users.hook.ts +38 -38
  372. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +43 -43
  373. package/src/modules/projects/hooks/list-project-users.hook.ts +38 -38
  374. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  375. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  376. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  377. package/src/modules/projects/services/projects.service.ts +144 -144
  378. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  379. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  380. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  381. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  382. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  383. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +18 -18
  384. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +19 -19
  385. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  386. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  387. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  388. package/src/modules/subscriptions/types/calculate-subscription.type.ts +113 -113
  389. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  390. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  391. package/src/modules/subscriptions/utils/periodicity.ts +62 -62
  392. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  393. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  394. package/src/modules/users/action/list-messages.action.ts +26 -26
  395. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  396. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  397. package/src/modules/users/hooks/messages.hook.ts +67 -67
  398. package/src/modules/users/services/messages.service.ts +49 -49
  399. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  400. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  401. package/src/modules/whitelabel/schema.ts +84 -84
  402. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  403. package/src/providers/auth.provider.tsx +162 -162
  404. package/src/providers/whitelabel.provider.tsx +59 -59
  405. package/src/store/useBuyCreditsModal.ts +21 -21
  406. package/src/store/useDesktopSidebarStore.ts +47 -47
  407. package/src/store/useMdSidebarStore.ts +34 -34
  408. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  409. package/src/utils/constants/br-states.ts +29 -29
  410. package/src/utils/countries.ts +224 -224
  411. package/src/utils/format/currency.ts +15 -15
  412. package/src/utils/safeServerAction.ts +21 -21
  413. 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
+ }