@greatapps/common 1.1.430 → 1.1.432

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