@greatapps/common 1.1.517 → 1.1.518

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 (412) 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/ClarityEmbed.mjs +55 -0
  19. package/dist/components/embeds/ClarityEmbed.mjs.map +1 -0
  20. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  21. package/dist/components/embeds/EmbedWidgets.mjs +3 -1
  22. package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
  23. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  24. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  25. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  26. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  27. package/dist/components/layouts/NavBar.mjs.map +1 -1
  28. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  29. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  30. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  31. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  32. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  33. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  34. package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
  35. package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
  36. package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
  37. package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
  38. package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
  39. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  40. package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
  41. package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
  42. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  43. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  44. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  45. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  46. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  47. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  48. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  49. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  50. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  51. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  52. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  53. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  54. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  55. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  56. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  57. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  58. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  59. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  60. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  61. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  62. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  63. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  64. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  65. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  66. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  67. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  68. package/dist/components/ui/form/DatePicker.mjs +2 -2
  69. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  70. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  71. package/dist/components/ui/form/FormField.mjs.map +1 -1
  72. package/dist/components/ui/form/Input.mjs.map +1 -1
  73. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  74. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  75. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  76. package/dist/components/ui/form/Select.mjs +1 -1
  77. package/dist/components/ui/form/Select.mjs.map +1 -1
  78. package/dist/components/ui/form/Switch.mjs.map +1 -1
  79. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  80. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  81. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  82. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  83. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  84. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  85. package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
  86. package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
  87. package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
  88. package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
  89. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  90. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  91. package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
  92. package/dist/index.mjs +2 -0
  93. package/dist/index.mjs.map +1 -1
  94. package/dist/infra/utils/array.mjs.map +1 -1
  95. package/dist/infra/utils/date.mjs.map +1 -1
  96. package/dist/middleware.mjs.map +1 -1
  97. package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
  98. package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
  99. package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
  100. package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
  101. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  102. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  103. package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
  104. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  105. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  106. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  107. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  108. package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
  109. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  110. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  111. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  112. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  113. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  114. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  115. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  116. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  117. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  118. package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
  119. package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
  120. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  121. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  122. package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
  123. package/dist/modules/cards/actions/find-card-by-id.action.mjs.map +1 -1
  124. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  125. package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
  126. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  127. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  128. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  129. package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
  130. package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
  131. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  132. package/dist/modules/cards/types.mjs.map +1 -1
  133. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  134. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  135. package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
  136. package/dist/modules/images/constants/image.constants.mjs.map +1 -1
  137. package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
  138. package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
  139. package/dist/modules/images/utils/base64.mjs.map +1 -1
  140. package/dist/modules/images/utils/compress-image.mjs.map +1 -1
  141. package/dist/modules/images/utils/crop-image.mjs.map +1 -1
  142. package/dist/modules/images/utils/validate-image.mjs.map +1 -1
  143. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  144. package/dist/modules/plans/actions/list-plans.action.mjs.map +1 -1
  145. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  146. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  147. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  148. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  149. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  150. package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
  151. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  152. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
  153. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
  154. package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
  155. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  156. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  157. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  158. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
  159. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  160. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
  161. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  162. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
  163. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
  164. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  165. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  166. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  167. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  168. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  169. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  170. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  171. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
  172. package/dist/modules/projects/services/projects.service.mjs.map +1 -1
  173. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  174. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  175. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  176. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  177. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  178. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  179. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  180. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  181. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  182. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  183. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  184. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  185. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  186. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  187. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  188. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  189. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  190. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  191. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  192. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  193. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  194. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  195. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  196. package/dist/providers/auth.provider.mjs.map +1 -1
  197. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  198. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  199. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  200. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  201. package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
  202. package/dist/utils/constants/br-states.mjs.map +1 -1
  203. package/dist/utils/countries.mjs.map +1 -1
  204. package/dist/utils/format/currency.mjs.map +1 -1
  205. package/dist/utils/safeServerAction.mjs.map +1 -1
  206. package/dist/utils/withAction.mjs.map +1 -1
  207. package/package.json +92 -92
  208. package/src/components/account/ConfigurationsMyAccountModal.tsx +161 -161
  209. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  210. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  211. package/src/components/account/DeleteAccountModal.tsx +130 -130
  212. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  213. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  214. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  215. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  216. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  217. package/src/components/account/sections/ChangeEmailModal.tsx +227 -227
  218. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  219. package/src/components/account/sections/ChangePhoneModal.tsx +247 -247
  220. package/src/components/account/sections/MyProfileSection.tsx +328 -328
  221. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  222. package/src/components/account/sections/SecuritySection.tsx +46 -46
  223. package/src/components/account/sections/TokenSection.tsx +64 -64
  224. package/src/components/embeds/ClarityEmbed.tsx +70 -0
  225. package/src/components/embeds/CrispEmbed.tsx +156 -156
  226. package/src/components/embeds/EmbedWidgets.tsx +52 -50
  227. package/src/components/embeds/FrillEmbed.tsx +129 -129
  228. package/src/components/layouts/AppMobileNavBar.tsx +80 -80
  229. package/src/components/layouts/AppNavBar.tsx +40 -40
  230. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  231. package/src/components/layouts/NavBar.tsx +175 -175
  232. package/src/components/layouts/NotificationsPopover.tsx +118 -118
  233. package/src/components/layouts/ProfilePopover.tsx +176 -176
  234. package/src/components/layouts/SideBarNavigation.tsx +65 -65
  235. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  236. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  237. package/src/components/modals/BuyCreditsModal.tsx +354 -354
  238. package/src/components/modals/PaidPlanRequiredModal.tsx +57 -57
  239. package/src/components/modals/cards/AddCardModal.tsx +265 -265
  240. package/src/components/modals/cards/CardFormFields.tsx +348 -348
  241. package/src/components/navigation/CancelledSubscriptionBanner.tsx +64 -64
  242. package/src/components/navigation/NavItemsContext.ts +20 -20
  243. package/src/components/navigation/ProjectSelectorPopover.tsx +178 -178
  244. package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
  245. package/src/components/navigation/subcomponents/BottomLinks.tsx +37 -37
  246. package/src/components/navigation/subcomponents/ProjectSelector.tsx +182 -182
  247. package/src/components/pages/NotFoundPage.tsx +67 -67
  248. package/src/components/pages/notifications/Notifications.tsx +187 -187
  249. package/src/components/ui/buttons/Button.tsx +62 -62
  250. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  251. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  252. package/src/components/ui/data-display/Accordion.tsx +81 -81
  253. package/src/components/ui/data-display/Badge.tsx +47 -47
  254. package/src/components/ui/data-display/Card.tsx +93 -93
  255. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  256. package/src/components/ui/data-display/CardItem.tsx +75 -75
  257. package/src/components/ui/data-display/Pagination.tsx +126 -126
  258. package/src/components/ui/data-display/PaymentInfoCard.tsx +192 -192
  259. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  260. package/src/components/ui/data-display/Separator.tsx +29 -29
  261. package/src/components/ui/data-display/Table.tsx +117 -117
  262. package/src/components/ui/data-display/Tabs.tsx +67 -67
  263. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  264. package/src/components/ui/feedback/DefaultCircularProgress.tsx +65 -65
  265. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  266. package/src/components/ui/feedback/Progress.tsx +40 -40
  267. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  268. package/src/components/ui/feedback/Toast.tsx +104 -104
  269. package/src/components/ui/form/Calendar.tsx +228 -228
  270. package/src/components/ui/form/Checkbox.tsx +31 -31
  271. package/src/components/ui/form/ComboboxField.tsx +154 -154
  272. package/src/components/ui/form/DatePicker.tsx +97 -98
  273. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  274. package/src/components/ui/form/FormField.tsx +133 -133
  275. package/src/components/ui/form/Input.tsx +20 -20
  276. package/src/components/ui/form/InputOtp.tsx +80 -80
  277. package/src/components/ui/form/PhoneInput.tsx +208 -208
  278. package/src/components/ui/form/RadioGroup.tsx +45 -45
  279. package/src/components/ui/form/Select.tsx +200 -200
  280. package/src/components/ui/form/Switch.tsx +32 -32
  281. package/src/components/ui/form/Textarea.tsx +19 -19
  282. package/src/components/ui/overlay/Command.tsx +185 -185
  283. package/src/components/ui/overlay/Dialog.tsx +153 -153
  284. package/src/components/ui/overlay/Popover.tsx +49 -49
  285. package/src/components/ui/overlay/Sheet.tsx +170 -170
  286. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  287. package/src/components/widgets/ImageUpload/ImageCropModal.tsx +254 -254
  288. package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +61 -61
  289. package/src/components/widgets/ImageUpload/ImageUpload.tsx +126 -126
  290. package/src/components/widgets/ImageUpload/index.ts +3 -3
  291. package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
  292. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  293. package/src/hooks/useAuthQueryKey.ts +32 -32
  294. package/src/index.ts +507 -506
  295. package/src/infra/utils/array.ts +54 -54
  296. package/src/infra/utils/date.ts +18 -18
  297. package/src/middleware.ts +4 -4
  298. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  299. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  300. package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
  301. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  302. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  303. package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
  304. package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
  305. package/src/modules/accounts/hooks/useAccountManagement.ts +94 -94
  306. package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
  307. package/src/modules/accounts/hooks/useTimezones.ts +18 -18
  308. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  309. package/src/modules/accounts/services/account-token.service.ts +52 -52
  310. package/src/modules/accounts/services/account.service.ts +239 -239
  311. package/src/modules/accounts/types.ts +225 -225
  312. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  313. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  314. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  315. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  316. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  317. package/src/modules/auth/hooks/useUserQuery.ts +75 -75
  318. package/src/modules/auth/types/management-permission.type.ts +7 -7
  319. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  320. package/src/modules/auth/utils/assert-management-subscription.ts +35 -35
  321. package/src/modules/auth/utils/assert-paid-subscription.ts +43 -43
  322. package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
  323. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  324. package/src/modules/cards/actions/create-card.action.ts +9 -9
  325. package/src/modules/cards/actions/delete-card.action.ts +8 -8
  326. package/src/modules/cards/actions/find-card-by-id.action.ts +8 -8
  327. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  328. package/src/modules/cards/actions/set-default-card.action.ts +8 -8
  329. package/src/modules/cards/hooks/card-by-id.hook.ts +21 -21
  330. package/src/modules/cards/hooks/cards.hook.ts +23 -23
  331. package/src/modules/cards/hooks/create-card.hook.ts +30 -30
  332. package/src/modules/cards/hooks/delete-card.hook.ts +54 -54
  333. package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
  334. package/src/modules/cards/services/cards.service.ts +108 -108
  335. package/src/modules/cards/types.ts +42 -42
  336. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  337. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +99 -99
  338. package/src/modules/images/actions/process-image.action.ts +40 -40
  339. package/src/modules/images/constants/image.constants.ts +11 -11
  340. package/src/modules/images/hooks/use-image-upload.hook.ts +172 -172
  341. package/src/modules/images/services/image-processing.service.ts +75 -75
  342. package/src/modules/images/types/image.type.ts +54 -54
  343. package/src/modules/images/utils/base64.ts +26 -26
  344. package/src/modules/images/utils/compress-image.ts +20 -20
  345. package/src/modules/images/utils/crop-image.ts +51 -51
  346. package/src/modules/images/utils/validate-image.ts +71 -71
  347. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  348. package/src/modules/plans/actions/list-plans.action.ts +17 -17
  349. package/src/modules/plans/hooks/list-plans.hook.ts +24 -24
  350. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
  351. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +38 -38
  352. package/src/modules/plans/services/plans.service.ts +133 -133
  353. package/src/modules/plans/types/plan.type.ts +67 -67
  354. package/src/modules/plans/utils/map-api-plan-to-ui.ts +98 -98
  355. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  356. package/src/modules/projects/actions/create-project.action.ts +9 -9
  357. package/src/modules/projects/actions/delete-project.action.ts +8 -8
  358. package/src/modules/projects/actions/find-project.action.ts +8 -8
  359. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  360. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  361. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  362. package/src/modules/projects/actions/list-projects.action.ts +16 -16
  363. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  364. package/src/modules/projects/actions/update-project.action.ts +9 -9
  365. package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
  366. package/src/modules/projects/hooks/create-project.hook.ts +88 -88
  367. package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
  368. package/src/modules/projects/hooks/find-project.hook.ts +18 -18
  369. package/src/modules/projects/hooks/list-all-account-users.hook.ts +39 -39
  370. package/src/modules/projects/hooks/list-available-users.hook.ts +38 -38
  371. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +43 -43
  372. package/src/modules/projects/hooks/list-project-users.hook.ts +38 -38
  373. package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
  374. package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
  375. package/src/modules/projects/hooks/update-project.hook.ts +86 -86
  376. package/src/modules/projects/services/projects.service.ts +144 -144
  377. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  378. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  379. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  380. package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
  381. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  382. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +18 -18
  383. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +19 -19
  384. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
  385. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  386. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  387. package/src/modules/subscriptions/types/calculate-subscription.type.ts +113 -113
  388. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  389. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  390. package/src/modules/subscriptions/utils/periodicity.ts +62 -62
  391. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  392. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  393. package/src/modules/users/action/list-messages.action.ts +26 -26
  394. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  395. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  396. package/src/modules/users/hooks/messages.hook.ts +67 -67
  397. package/src/modules/users/services/messages.service.ts +49 -49
  398. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  399. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  400. package/src/modules/whitelabel/schema.ts +84 -84
  401. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  402. package/src/providers/auth.provider.tsx +162 -162
  403. package/src/providers/whitelabel.provider.tsx +59 -59
  404. package/src/store/useBuyCreditsModal.ts +21 -21
  405. package/src/store/useDesktopSidebarStore.ts +47 -47
  406. package/src/store/useMdSidebarStore.ts +34 -34
  407. package/src/store/usePaidPlanRequiredModal.ts +19 -19
  408. package/src/utils/constants/br-states.ts +29 -29
  409. package/src/utils/countries.ts +224 -224
  410. package/src/utils/format/currency.ts +15 -15
  411. package/src/utils/safeServerAction.ts +21 -21
  412. package/src/utils/withAction.ts +13 -13
@@ -1,64 +1,64 @@
1
- 'use client';
2
-
3
- import { IconLock, IconX } from '@tabler/icons-react';
4
- import { Button } from '../../ui/buttons/Button';
5
- import { FormField } from '../../ui/form/FormField';
6
- import useChangePasswordForm from '../hooks/useChangePasswordForm';
7
- import usePasswordVisibility from '../../../hooks/usePasswordVisibility';
8
-
9
- interface ChangePasswordSectionProps {
10
- onBack: () => void;
11
- }
12
-
13
- export function ChangePasswordSection({ onBack }: ChangePasswordSectionProps) {
14
- const { register, handleSubmit, errors } = useChangePasswordForm({
15
- onSuccess: onBack,
16
- });
17
- const { showPassword: showCurrentPw, togglePassword: toggleCurrentPw } = usePasswordVisibility();
18
- const { showPassword: showNewPw, togglePassword: toggleNewPw } = usePasswordVisibility();
19
-
20
- return (
21
- <form
22
- onSubmit={handleSubmit}
23
- className="flex-1 overflow-y-auto px-4 pb-5 lg:p-5 flex flex-col h-full lg:h-full gap-5 lg:gap-6"
24
- >
25
- <div className="flex items-center justify-between">
26
- <span className="paragraph-medium-semibold text-gray-950">Alterar senha</span>
27
- <Button type="button" variant="ghost" className="size-8! p-0" onClick={onBack}>
28
- <IconX size={18} />
29
- </Button>
30
- </div>
31
-
32
- <div className="flex flex-col gap-4">
33
- <FormField
34
- label="Senha atual"
35
- type="password"
36
- placeholder="Digite sua senha atual"
37
- leftIcon={IconLock}
38
- error={!!errors.currentPassword}
39
- errorMessage={errors.currentPassword?.message}
40
- classnameContainer="h-10!"
41
- showPassword={showCurrentPw}
42
- onTogglePassword={toggleCurrentPw}
43
- {...register('currentPassword')}
44
- />
45
- <FormField
46
- label="Nova senha"
47
- type="password"
48
- placeholder="Digite sua nova senha"
49
- leftIcon={IconLock}
50
- error={!!errors.newPassword}
51
- errorMessage={errors.newPassword?.message}
52
- classnameContainer="h-10!"
53
- showPassword={showNewPw}
54
- onTogglePassword={toggleNewPw}
55
- {...register('newPassword')}
56
- />
57
- </div>
58
-
59
- <Button type="submit" className="w-fit h-10!">
60
- Salvar nova senha
61
- </Button>
62
- </form>
63
- );
64
- }
1
+ 'use client';
2
+
3
+ import { IconLock, IconX } from '@tabler/icons-react';
4
+ import { Button } from '../../ui/buttons/Button';
5
+ import { FormField } from '../../ui/form/FormField';
6
+ import useChangePasswordForm from '../hooks/useChangePasswordForm';
7
+ import usePasswordVisibility from '../../../hooks/usePasswordVisibility';
8
+
9
+ interface ChangePasswordSectionProps {
10
+ onBack: () => void;
11
+ }
12
+
13
+ export function ChangePasswordSection({ onBack }: ChangePasswordSectionProps) {
14
+ const { register, handleSubmit, errors } = useChangePasswordForm({
15
+ onSuccess: onBack,
16
+ });
17
+ const { showPassword: showCurrentPw, togglePassword: toggleCurrentPw } = usePasswordVisibility();
18
+ const { showPassword: showNewPw, togglePassword: toggleNewPw } = usePasswordVisibility();
19
+
20
+ return (
21
+ <form
22
+ onSubmit={handleSubmit}
23
+ className="flex-1 overflow-y-auto px-4 pb-5 lg:p-5 flex flex-col h-full lg:h-full gap-5 lg:gap-6"
24
+ >
25
+ <div className="flex items-center justify-between">
26
+ <span className="paragraph-medium-semibold text-gray-950">Alterar senha</span>
27
+ <Button type="button" variant="ghost" className="size-8! p-0" onClick={onBack}>
28
+ <IconX size={18} />
29
+ </Button>
30
+ </div>
31
+
32
+ <div className="flex flex-col gap-4">
33
+ <FormField
34
+ label="Senha atual"
35
+ type="password"
36
+ placeholder="Digite sua senha atual"
37
+ leftIcon={IconLock}
38
+ error={!!errors.currentPassword}
39
+ errorMessage={errors.currentPassword?.message}
40
+ classnameContainer="h-10!"
41
+ showPassword={showCurrentPw}
42
+ onTogglePassword={toggleCurrentPw}
43
+ {...register('currentPassword')}
44
+ />
45
+ <FormField
46
+ label="Nova senha"
47
+ type="password"
48
+ placeholder="Digite sua nova senha"
49
+ leftIcon={IconLock}
50
+ error={!!errors.newPassword}
51
+ errorMessage={errors.newPassword?.message}
52
+ classnameContainer="h-10!"
53
+ showPassword={showNewPw}
54
+ onTogglePassword={toggleNewPw}
55
+ {...register('newPassword')}
56
+ />
57
+ </div>
58
+
59
+ <Button type="submit" className="w-fit h-10!">
60
+ Salvar nova senha
61
+ </Button>
62
+ </form>
63
+ );
64
+ }
@@ -1,247 +1,247 @@
1
- 'use client';
2
-
3
- import { IconChevronLeft, IconX, IconMessage } from '@tabler/icons-react';
4
- import { Button } from '../../ui/buttons/Button';
5
- import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';
6
- import { Separator } from '../../ui/data-display/Separator';
7
- import { InputOTP, InputOTPGroup, InputOTPSlot } from '../../ui/form/InputOtp';
8
- import PhoneInput from '../../ui/form/PhoneInput';
9
- import { formatTimer, formatPhone } from '../../../utils/format/masks';
10
- import { OTP_CODE_LENGTH } from '../../../utils/validators/account';
11
- import { useAuth } from '../../../providers/auth.provider';
12
- import { useIsDefaultWhitelabel } from '../../../providers/whitelabel.provider';
13
- import { useInvalidateUser } from '../../../modules/auth/hooks/useUserQuery';
14
- import { confirmPhoneChangeAction } from '../../../modules/accounts/actions/account-management.action';
15
- import useChangePhoneForm from '../hooks/useChangePhoneForm';
16
- import useOtpVerification from '../hooks/useOtpVerification';
17
-
18
- interface ChangePhoneModalProps {
19
- open: boolean;
20
- onClose: () => void;
21
- }
22
-
23
- export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
24
- const { user } = useAuth();
25
- const isDefaultWl = useIsDefaultWhitelabel();
26
- const invalidateUser = useInvalidateUser();
27
-
28
- const hasExistingPhone = !!user?.phone;
29
-
30
- const currentPhoneDisplay = user?.phone
31
- ? formatPhone(
32
- user.ddi && user.phone.startsWith(user.ddi) ? user.phone.slice(user.ddi.length) : user.phone
33
- )
34
- : '';
35
-
36
- const handleDirectUpdateSuccess = () => {
37
- invalidateUser();
38
- onClose();
39
- };
40
-
41
- const {
42
- showVerification,
43
- phoneValue,
44
- phoneError,
45
- isSubmitting,
46
- submittedPhone,
47
- handlePhoneChange,
48
- handleContinue,
49
- handleBack,
50
- resetForm,
51
- } = useChangePhoneForm({
52
- hasExistingPhone,
53
- onDirectUpdateSuccess: handleDirectUpdateSuccess,
54
- });
55
-
56
- const handleSuccess = () => {
57
- invalidateUser();
58
- resetForm();
59
- onClose();
60
- };
61
-
62
- const {
63
- code,
64
- isLoading,
65
- hasError,
66
- timer,
67
- canResend,
68
- isValidLength,
69
- handleCodeChange,
70
- handleValidate,
71
- handleResend,
72
- reset: resetOtp,
73
- } = useOtpVerification({
74
- onSuccess: handleSuccess,
75
- successMessage: 'Telefone alterado',
76
- validateFn: async (token) => {
77
- const result = await confirmPhoneChangeAction(token, submittedPhone.local, submittedPhone.ddi);
78
- return result.success;
79
- },
80
- resendFn: async () => {
81
- const { requestPhoneChangeAction } = await import('../../../modules/accounts/actions/account-management.action');
82
- const result = await requestPhoneChangeAction(submittedPhone.local, submittedPhone.ddi);
83
- if (!result.success) {
84
- throw new Error(result.error);
85
- }
86
- },
87
- });
88
-
89
- const handleClose = () => {
90
- resetForm();
91
- resetOtp();
92
- onClose();
93
- };
94
-
95
- const handleBackFromVerification = () => {
96
- resetOtp();
97
- handleBack();
98
- };
99
-
100
- return (
101
- <Dialog open={open} onOpenChange={handleClose}>
102
- <DialogContent
103
- showCloseButton={false}
104
- overlayClassName="z-[1002]"
105
- className="flex flex-col p-0 gap-0 max-w-full sm:max-w-full border-0 rounded-t-2xl rounded-b-none h-dvh top-0 bottom-0 left-0 right-0 translate-x-0 translate-y-0 lg:max-w-125 lg:h-auto lg:rounded-lg lg:border lg:top-[50%] lg:left-[50%] lg:right-auto lg:bottom-auto lg:translate-x-[-50%] lg:translate-y-[-50%] z-[1003]"
106
- >
107
- {showVerification ? (
108
- <DialogHeader className="flex flex-row items-center justify-between px-4 py-3 border-b border-gray-200 lg:border-b-0">
109
- <Button variant="ghost" className="size-8! p-0" onClick={handleBackFromVerification}>
110
- <IconChevronLeft size={20} className="text-gray-950" />
111
- </Button>
112
- <DialogTitle className="paragraph-medium-semibold text-gray-950 text-center flex-1">
113
- Alterar telefone
114
- </DialogTitle>
115
- <Button variant="ghost" className="size-8! p-0" onClick={handleClose}>
116
- <IconX size={18} className="text-gray-500" />
117
- </Button>
118
- </DialogHeader>
119
- ) : (
120
- <>
121
- <DialogHeader className="sr-only">
122
- <DialogTitle>{hasExistingPhone ? 'Alterar telefone' : 'Adicionar telefone'}</DialogTitle>
123
- </DialogHeader>
124
- <div className="flex items-center justify-center px-4 py-3 relative border-b border-gray-200 lg:border-b-0">
125
- <span className="paragraph-medium-semibold text-gray-950 text-center">
126
- {hasExistingPhone ? 'Alterar telefone' : 'Adicionar telefone'}
127
- </span>
128
- <Button
129
- variant="ghost"
130
- className="absolute right-2 size-8! p-0"
131
- onClick={handleClose}
132
- >
133
- <IconX size={18} className="text-gray-500" />
134
- </Button>
135
- </div>
136
- </>
137
- )}
138
-
139
- <div className={`${showVerification || !hasExistingPhone ? 'w-full' : 'w-1/2'} h-0.75 ${isDefaultWl ? 'bg-cyan-300' : 'bg-zinc-300'}`} />
140
-
141
- {showVerification ? (
142
- <form
143
- onSubmit={(e) => {
144
- e.preventDefault();
145
- handleValidate();
146
- }}
147
- className="flex flex-col flex-1 lg:flex-none"
148
- >
149
- <div className="px-4 lg:px-5 py-5 lg:py-6 flex flex-col gap-4 flex-1 lg:flex-none">
150
- <div className="flex items-center justify-center size-12 bg-white rounded-lg shadow-xs border border-gray-200">
151
- <IconMessage size={20} className="text-gray-950" />
152
- </div>
153
-
154
- <div className="flex flex-col gap-1">
155
- <h3 className="paragraph-medium-semibold text-gray-950">Código de validação</h3>
156
- <p className="paragraph-small-regular text-gray-600">
157
- Enviamos um código de validação para o número atual{' '}
158
- <span className="font-semibold text-gray-950">{currentPhoneDisplay}.</span>
159
- </p>
160
- </div>
161
-
162
- <div className="flex flex-col gap-2">
163
- <InputOTP maxLength={OTP_CODE_LENGTH} value={code} onChange={handleCodeChange}>
164
- <InputOTPGroup className="flex flex-row gap-2">
165
- {[...Array(OTP_CODE_LENGTH)].map((_, i) => (
166
- <InputOTPSlot
167
- key={i}
168
- index={i}
169
- className={`uppercase text-2xl font-medium w-11 lg:w-12 h-13 lg:h-14 rounded-lg border bg-white shadow-none [&_div.animate-caret-blink]:bg-gray-950 ${hasError ? 'border-red-500' : 'border-gray-200'}`}
170
- />
171
- ))}
172
- </InputOTPGroup>
173
- </InputOTP>
174
- {hasError && (
175
- <p className="paragraph-small-regular text-red-500">Código incorreto</p>
176
- )}
177
- </div>
178
-
179
- {canResend ? (
180
- <button
181
- type="button"
182
- onClick={handleResend}
183
- className="paragraph-small-medium text-gray-950 underline cursor-pointer hover:text-gray-700 w-fit"
184
- >
185
- Reenviar código
186
- </button>
187
- ) : (
188
- <p className="paragraph-small-regular text-gray-500">
189
- Reenviar em{' '}
190
- <span className="paragraph-small-semibold text-gray-950">
191
- {formatTimer(timer)}
192
- </span>
193
- </p>
194
- )}
195
- </div>
196
-
197
- <Separator />
198
-
199
- <div className="flex items-center justify-between px-4 lg:px-5 py-4 lg:py-5 mt-auto lg:mt-0">
200
- <Button variant="secondary" className="h-10!" type="button" onClick={handleClose}>
201
- Cancelar
202
- </Button>
203
- <Button className="h-10!" type="submit" disabled={!isValidLength || isLoading}>
204
- {isLoading ? 'Validando...' : 'Alterar telefone'}
205
- </Button>
206
- </div>
207
- </form>
208
- ) : (
209
- <form onSubmit={handleContinue} className="flex flex-col flex-1 lg:flex-none">
210
- <div className="flex flex-col gap-5 lg:gap-6 px-4 lg:px-5 py-5 lg:py-6 flex-1 lg:flex-none">
211
- <div className="flex flex-col gap-1">
212
- <span className="paragraph-medium-semibold text-gray-950">
213
- {hasExistingPhone ? 'Atualizar telefone de contato' : 'Adicionar telefone de contato'}
214
- </span>
215
- <span className="paragraph-small-regular text-gray-600">
216
- {hasExistingPhone
217
- ? 'Informe o novo número para manter seu contato atualizado.'
218
- : 'Informe seu número de telefone para contato.'}
219
- </span>
220
- </div>
221
-
222
- <PhoneInput
223
- label={hasExistingPhone ? 'Novo número' : 'Número de telefone'}
224
- placeholder="(00) 0 0000-0000"
225
- value={phoneValue}
226
- onChange={handlePhoneChange}
227
- error={!!phoneError}
228
- errorMessage={phoneError}
229
- />
230
- </div>
231
-
232
- <div className="flex items-center justify-between p-4 lg:p-5 border-t border-gray-200 mt-auto lg:mt-0">
233
- <Button variant="secondary" className="h-10!" type="button" onClick={handleClose}>
234
- Cancelar
235
- </Button>
236
- <Button className="h-10!" type="submit" disabled={isSubmitting}>
237
- {isSubmitting
238
- ? (hasExistingPhone ? 'Enviando...' : 'Salvando...')
239
- : (hasExistingPhone ? 'Continuar' : 'Salvar')}
240
- </Button>
241
- </div>
242
- </form>
243
- )}
244
- </DialogContent>
245
- </Dialog>
246
- );
247
- }
1
+ 'use client';
2
+
3
+ import { IconChevronLeft, IconX, IconMessage } from '@tabler/icons-react';
4
+ import { Button } from '../../ui/buttons/Button';
5
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/overlay/Dialog';
6
+ import { Separator } from '../../ui/data-display/Separator';
7
+ import { InputOTP, InputOTPGroup, InputOTPSlot } from '../../ui/form/InputOtp';
8
+ import PhoneInput from '../../ui/form/PhoneInput';
9
+ import { formatTimer, formatPhone } from '../../../utils/format/masks';
10
+ import { OTP_CODE_LENGTH } from '../../../utils/validators/account';
11
+ import { useAuth } from '../../../providers/auth.provider';
12
+ import { useIsDefaultWhitelabel } from '../../../providers/whitelabel.provider';
13
+ import { useInvalidateUser } from '../../../modules/auth/hooks/useUserQuery';
14
+ import { confirmPhoneChangeAction } from '../../../modules/accounts/actions/account-management.action';
15
+ import useChangePhoneForm from '../hooks/useChangePhoneForm';
16
+ import useOtpVerification from '../hooks/useOtpVerification';
17
+
18
+ interface ChangePhoneModalProps {
19
+ open: boolean;
20
+ onClose: () => void;
21
+ }
22
+
23
+ export function ChangePhoneModal({ open, onClose }: ChangePhoneModalProps) {
24
+ const { user } = useAuth();
25
+ const isDefaultWl = useIsDefaultWhitelabel();
26
+ const invalidateUser = useInvalidateUser();
27
+
28
+ const hasExistingPhone = !!user?.phone;
29
+
30
+ const currentPhoneDisplay = user?.phone
31
+ ? formatPhone(
32
+ user.ddi && user.phone.startsWith(user.ddi) ? user.phone.slice(user.ddi.length) : user.phone
33
+ )
34
+ : '';
35
+
36
+ const handleDirectUpdateSuccess = () => {
37
+ invalidateUser();
38
+ onClose();
39
+ };
40
+
41
+ const {
42
+ showVerification,
43
+ phoneValue,
44
+ phoneError,
45
+ isSubmitting,
46
+ submittedPhone,
47
+ handlePhoneChange,
48
+ handleContinue,
49
+ handleBack,
50
+ resetForm,
51
+ } = useChangePhoneForm({
52
+ hasExistingPhone,
53
+ onDirectUpdateSuccess: handleDirectUpdateSuccess,
54
+ });
55
+
56
+ const handleSuccess = () => {
57
+ invalidateUser();
58
+ resetForm();
59
+ onClose();
60
+ };
61
+
62
+ const {
63
+ code,
64
+ isLoading,
65
+ hasError,
66
+ timer,
67
+ canResend,
68
+ isValidLength,
69
+ handleCodeChange,
70
+ handleValidate,
71
+ handleResend,
72
+ reset: resetOtp,
73
+ } = useOtpVerification({
74
+ onSuccess: handleSuccess,
75
+ successMessage: 'Telefone alterado',
76
+ validateFn: async (token) => {
77
+ const result = await confirmPhoneChangeAction(token, submittedPhone.local, submittedPhone.ddi);
78
+ return result.success;
79
+ },
80
+ resendFn: async () => {
81
+ const { requestPhoneChangeAction } = await import('../../../modules/accounts/actions/account-management.action');
82
+ const result = await requestPhoneChangeAction(submittedPhone.local, submittedPhone.ddi);
83
+ if (!result.success) {
84
+ throw new Error(result.error);
85
+ }
86
+ },
87
+ });
88
+
89
+ const handleClose = () => {
90
+ resetForm();
91
+ resetOtp();
92
+ onClose();
93
+ };
94
+
95
+ const handleBackFromVerification = () => {
96
+ resetOtp();
97
+ handleBack();
98
+ };
99
+
100
+ return (
101
+ <Dialog open={open} onOpenChange={handleClose}>
102
+ <DialogContent
103
+ showCloseButton={false}
104
+ overlayClassName="z-[1002]"
105
+ className="flex flex-col p-0 gap-0 max-w-full sm:max-w-full border-0 rounded-t-2xl rounded-b-none h-dvh top-0 bottom-0 left-0 right-0 translate-x-0 translate-y-0 lg:max-w-125 lg:h-auto lg:rounded-lg lg:border lg:top-[50%] lg:left-[50%] lg:right-auto lg:bottom-auto lg:translate-x-[-50%] lg:translate-y-[-50%] z-[1003]"
106
+ >
107
+ {showVerification ? (
108
+ <DialogHeader className="flex flex-row items-center justify-between px-4 py-3 border-b border-gray-200 lg:border-b-0">
109
+ <Button variant="ghost" className="size-8! p-0" onClick={handleBackFromVerification}>
110
+ <IconChevronLeft size={20} className="text-gray-950" />
111
+ </Button>
112
+ <DialogTitle className="paragraph-medium-semibold text-gray-950 text-center flex-1">
113
+ Alterar telefone
114
+ </DialogTitle>
115
+ <Button variant="ghost" className="size-8! p-0" onClick={handleClose}>
116
+ <IconX size={18} className="text-gray-500" />
117
+ </Button>
118
+ </DialogHeader>
119
+ ) : (
120
+ <>
121
+ <DialogHeader className="sr-only">
122
+ <DialogTitle>{hasExistingPhone ? 'Alterar telefone' : 'Adicionar telefone'}</DialogTitle>
123
+ </DialogHeader>
124
+ <div className="flex items-center justify-center px-4 py-3 relative border-b border-gray-200 lg:border-b-0">
125
+ <span className="paragraph-medium-semibold text-gray-950 text-center">
126
+ {hasExistingPhone ? 'Alterar telefone' : 'Adicionar telefone'}
127
+ </span>
128
+ <Button
129
+ variant="ghost"
130
+ className="absolute right-2 size-8! p-0"
131
+ onClick={handleClose}
132
+ >
133
+ <IconX size={18} className="text-gray-500" />
134
+ </Button>
135
+ </div>
136
+ </>
137
+ )}
138
+
139
+ <div className={`${showVerification || !hasExistingPhone ? 'w-full' : 'w-1/2'} h-0.75 ${isDefaultWl ? 'bg-cyan-300' : 'bg-zinc-300'}`} />
140
+
141
+ {showVerification ? (
142
+ <form
143
+ onSubmit={(e) => {
144
+ e.preventDefault();
145
+ handleValidate();
146
+ }}
147
+ className="flex flex-col flex-1 lg:flex-none"
148
+ >
149
+ <div className="px-4 lg:px-5 py-5 lg:py-6 flex flex-col gap-4 flex-1 lg:flex-none">
150
+ <div className="flex items-center justify-center size-12 bg-white rounded-lg shadow-xs border border-gray-200">
151
+ <IconMessage size={20} className="text-gray-950" />
152
+ </div>
153
+
154
+ <div className="flex flex-col gap-1">
155
+ <h3 className="paragraph-medium-semibold text-gray-950">Código de validação</h3>
156
+ <p className="paragraph-small-regular text-gray-600">
157
+ Enviamos um código de validação para o número atual{' '}
158
+ <span className="font-semibold text-gray-950">{currentPhoneDisplay}.</span>
159
+ </p>
160
+ </div>
161
+
162
+ <div className="flex flex-col gap-2">
163
+ <InputOTP maxLength={OTP_CODE_LENGTH} value={code} onChange={handleCodeChange}>
164
+ <InputOTPGroup className="flex flex-row gap-2">
165
+ {[...Array(OTP_CODE_LENGTH)].map((_, i) => (
166
+ <InputOTPSlot
167
+ key={i}
168
+ index={i}
169
+ className={`uppercase text-2xl font-medium w-11 lg:w-12 h-13 lg:h-14 rounded-lg border bg-white shadow-none [&_div.animate-caret-blink]:bg-gray-950 ${hasError ? 'border-red-500' : 'border-gray-200'}`}
170
+ />
171
+ ))}
172
+ </InputOTPGroup>
173
+ </InputOTP>
174
+ {hasError && (
175
+ <p className="paragraph-small-regular text-red-500">Código incorreto</p>
176
+ )}
177
+ </div>
178
+
179
+ {canResend ? (
180
+ <button
181
+ type="button"
182
+ onClick={handleResend}
183
+ className="paragraph-small-medium text-gray-950 underline cursor-pointer hover:text-gray-700 w-fit"
184
+ >
185
+ Reenviar código
186
+ </button>
187
+ ) : (
188
+ <p className="paragraph-small-regular text-gray-500">
189
+ Reenviar em{' '}
190
+ <span className="paragraph-small-semibold text-gray-950">
191
+ {formatTimer(timer)}
192
+ </span>
193
+ </p>
194
+ )}
195
+ </div>
196
+
197
+ <Separator />
198
+
199
+ <div className="flex items-center justify-between px-4 lg:px-5 py-4 lg:py-5 mt-auto lg:mt-0">
200
+ <Button variant="secondary" className="h-10!" type="button" onClick={handleClose}>
201
+ Cancelar
202
+ </Button>
203
+ <Button className="h-10!" type="submit" disabled={!isValidLength || isLoading}>
204
+ {isLoading ? 'Validando...' : 'Alterar telefone'}
205
+ </Button>
206
+ </div>
207
+ </form>
208
+ ) : (
209
+ <form onSubmit={handleContinue} className="flex flex-col flex-1 lg:flex-none">
210
+ <div className="flex flex-col gap-5 lg:gap-6 px-4 lg:px-5 py-5 lg:py-6 flex-1 lg:flex-none">
211
+ <div className="flex flex-col gap-1">
212
+ <span className="paragraph-medium-semibold text-gray-950">
213
+ {hasExistingPhone ? 'Atualizar telefone de contato' : 'Adicionar telefone de contato'}
214
+ </span>
215
+ <span className="paragraph-small-regular text-gray-600">
216
+ {hasExistingPhone
217
+ ? 'Informe o novo número para manter seu contato atualizado.'
218
+ : 'Informe seu número de telefone para contato.'}
219
+ </span>
220
+ </div>
221
+
222
+ <PhoneInput
223
+ label={hasExistingPhone ? 'Novo número' : 'Número de telefone'}
224
+ placeholder="(00) 0 0000-0000"
225
+ value={phoneValue}
226
+ onChange={handlePhoneChange}
227
+ error={!!phoneError}
228
+ errorMessage={phoneError}
229
+ />
230
+ </div>
231
+
232
+ <div className="flex items-center justify-between p-4 lg:p-5 border-t border-gray-200 mt-auto lg:mt-0">
233
+ <Button variant="secondary" className="h-10!" type="button" onClick={handleClose}>
234
+ Cancelar
235
+ </Button>
236
+ <Button className="h-10!" type="submit" disabled={isSubmitting}>
237
+ {isSubmitting
238
+ ? (hasExistingPhone ? 'Enviando...' : 'Salvando...')
239
+ : (hasExistingPhone ? 'Continuar' : 'Salvar')}
240
+ </Button>
241
+ </div>
242
+ </form>
243
+ )}
244
+ </DialogContent>
245
+ </Dialog>
246
+ );
247
+ }