@greatapps/common 1.1.371 → 1.1.374

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 (338) hide show
  1. package/dist/components/account/AccountModals.mjs.map +1 -1
  2. package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
  3. package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
  4. package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
  5. package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
  6. package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
  7. package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
  8. package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
  9. package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
  10. package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
  11. package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
  12. package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
  13. package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
  14. package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
  15. package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
  16. package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
  17. package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
  18. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  19. package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
  20. package/dist/components/handlers/SearchParamsHandler.mjs.map +1 -1
  21. package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
  22. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  23. package/dist/components/layouts/CollapsibleSidebar.mjs.map +1 -1
  24. package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
  25. package/dist/components/layouts/NavBar.mjs.map +1 -1
  26. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  27. package/dist/components/layouts/ProfilePopover.mjs +9 -1
  28. package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
  29. package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
  30. package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
  31. package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
  32. package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
  33. package/dist/components/modals/ModalManager.mjs.map +1 -1
  34. package/dist/components/modals/Modals.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/ProjectSelector.mjs.map +1 -1
  42. package/dist/components/pages/NotFoundPage.mjs.map +1 -1
  43. package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
  44. package/dist/components/ui/buttons/Button.mjs.map +1 -1
  45. package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
  46. package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
  47. package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
  48. package/dist/components/ui/data-display/Badge.mjs.map +1 -1
  49. package/dist/components/ui/data-display/Card.mjs.map +1 -1
  50. package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
  51. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  52. package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
  53. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  54. package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
  55. package/dist/components/ui/data-display/Separator.mjs.map +1 -1
  56. package/dist/components/ui/data-display/Table.mjs.map +1 -1
  57. package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
  58. package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
  59. package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
  60. package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
  61. package/dist/components/ui/feedback/Progress.mjs.map +1 -1
  62. package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
  63. package/dist/components/ui/feedback/Toast.mjs.map +1 -1
  64. package/dist/components/ui/form/Calendar.mjs.map +1 -1
  65. package/dist/components/ui/form/Checkbox.mjs.map +1 -1
  66. package/dist/components/ui/form/ComboboxField.mjs +1 -1
  67. package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
  68. package/dist/components/ui/form/DatePicker.mjs.map +1 -1
  69. package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
  70. package/dist/components/ui/form/FormField.mjs.map +1 -1
  71. package/dist/components/ui/form/Input.mjs.map +1 -1
  72. package/dist/components/ui/form/InputOtp.mjs.map +1 -1
  73. package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
  74. package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
  75. package/dist/components/ui/form/Select.mjs +1 -1
  76. package/dist/components/ui/form/Select.mjs.map +1 -1
  77. package/dist/components/ui/form/SelectField.mjs +1 -1
  78. package/dist/components/ui/form/SelectField.mjs.map +1 -1
  79. package/dist/components/ui/form/Switch.mjs.map +1 -1
  80. package/dist/components/ui/form/Textarea.mjs.map +1 -1
  81. package/dist/components/ui/overlay/Command.mjs.map +1 -1
  82. package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
  83. package/dist/components/ui/overlay/Popover.mjs.map +1 -1
  84. package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
  85. package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
  86. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
  87. package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
  88. package/dist/hooks/useDebounce.mjs.map +1 -1
  89. package/dist/hooks/useDebounceState.mjs.map +1 -1
  90. package/dist/hooks/useDebouncedEffect.mjs.map +1 -1
  91. package/dist/index.mjs.map +1 -1
  92. package/dist/infra/utils/clsx.mjs.map +1 -1
  93. package/dist/infra/utils/date.mjs.map +1 -1
  94. package/dist/infra/utils/parser.mjs.map +1 -1
  95. package/dist/infra/utils/percentage.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/list-currencies.action.mjs.map +1 -1
  100. package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
  101. package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
  102. package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
  103. package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
  104. package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
  105. package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
  106. package/dist/modules/accounts/services/account.service.mjs.map +1 -1
  107. package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
  108. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  109. package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
  110. package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
  111. package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
  112. package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
  113. package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
  114. package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
  115. package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
  116. package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
  117. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  118. package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
  119. package/dist/modules/cards/services/cards.service.mjs.map +1 -1
  120. package/dist/modules/cards/types.mjs.map +1 -1
  121. package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
  122. package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
  123. package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
  124. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  125. package/dist/modules/plans/services/plans.service.mjs.map +1 -1
  126. package/dist/modules/plans/types/plan.type.mjs.map +1 -1
  127. package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
  128. package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
  129. package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
  130. package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
  131. package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
  132. package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
  133. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  134. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  135. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  136. package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
  137. package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
  138. package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
  139. package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
  140. package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
  141. package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
  142. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  143. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  144. package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
  145. package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
  146. package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
  147. package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
  148. package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
  149. package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
  150. package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
  151. package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
  152. package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
  153. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
  154. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
  155. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  156. package/dist/modules/users/services/messages.service.mjs.map +1 -1
  157. package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
  158. package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
  159. package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
  160. package/dist/providers/whitelabel.provider.mjs.map +1 -1
  161. package/dist/store/useAccountModals.mjs.map +1 -1
  162. package/dist/store/useBuyCreditsModal.mjs.map +1 -1
  163. package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
  164. package/dist/store/useMdSidebarStore.mjs.map +1 -1
  165. package/dist/store/useModalManager.mjs.map +1 -1
  166. package/dist/utils/constants/br-states.mjs.map +1 -1
  167. package/dist/utils/countries.mjs.map +1 -1
  168. package/dist/utils/safeServerAction.mjs.map +1 -1
  169. package/dist/utils/withAction.mjs.map +1 -1
  170. package/package.json +89 -89
  171. package/src/components/account/AccountModals.tsx +17 -17
  172. package/src/components/account/ConfigurationsMyAccountModal.tsx +146 -146
  173. package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
  174. package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
  175. package/src/components/account/DeleteAccountModal.tsx +130 -130
  176. package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
  177. package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
  178. package/src/components/account/TwoFactorAuthModal.tsx +215 -215
  179. package/src/components/account/hooks/useChangePhoneForm.tsx +107 -107
  180. package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
  181. package/src/components/account/sections/ChangeEmailModal.tsx +225 -225
  182. package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
  183. package/src/components/account/sections/ChangePhoneModal.tsx +245 -245
  184. package/src/components/account/sections/MyProfileSection.tsx +327 -327
  185. package/src/components/account/sections/PreferencesSection.tsx +248 -248
  186. package/src/components/account/sections/SecuritySection.tsx +46 -46
  187. package/src/components/embeds/CrispEmbed.tsx +101 -101
  188. package/src/components/embeds/FrillEmbed.tsx +119 -119
  189. package/src/components/handlers/SearchParamsHandler.tsx +61 -61
  190. package/src/components/layouts/AppMobileNavBar.tsx +118 -118
  191. package/src/components/layouts/AppNavBar.tsx +46 -46
  192. package/src/components/layouts/CollapsibleSidebar.tsx +67 -67
  193. package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
  194. package/src/components/layouts/NavBar.tsx +172 -172
  195. package/src/components/layouts/NotificationsPopover.tsx +115 -115
  196. package/src/components/layouts/ProfilePopover.tsx +178 -170
  197. package/src/components/layouts/SideBarNavigation.tsx +62 -62
  198. package/src/components/layouts/UsersSelectorPopover.tsx +234 -234
  199. package/src/components/layouts/WhitelabelCodes.tsx +59 -59
  200. package/src/components/modals/BuyCreditsModal.tsx +314 -314
  201. package/src/components/modals/ModalManager.tsx +29 -29
  202. package/src/components/modals/Modals.tsx +26 -26
  203. package/src/components/modals/cards/AddCardModal.tsx +260 -260
  204. package/src/components/modals/cards/CardFormFields.tsx +294 -294
  205. package/src/components/navigation/CancelledSubscriptionBanner.tsx +60 -60
  206. package/src/components/navigation/NavItemsContext.ts +20 -20
  207. package/src/components/navigation/ProjectSelectorPopover.tsx +160 -160
  208. package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
  209. package/src/components/navigation/subcomponents/ProjectSelector.tsx +160 -160
  210. package/src/components/pages/NotFoundPage.tsx +50 -50
  211. package/src/components/pages/notifications/Notifications.tsx +160 -160
  212. package/src/components/ui/buttons/Button.tsx +57 -57
  213. package/src/components/ui/buttons/CancelButton.tsx +14 -14
  214. package/src/components/ui/buttons/CopyButton.tsx +54 -54
  215. package/src/components/ui/data-display/Accordion.tsx +81 -81
  216. package/src/components/ui/data-display/Badge.tsx +47 -47
  217. package/src/components/ui/data-display/Card.tsx +93 -93
  218. package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
  219. package/src/components/ui/data-display/CardItem.tsx +75 -75
  220. package/src/components/ui/data-display/Pagination.tsx +126 -126
  221. package/src/components/ui/data-display/PaymentInfoCard.tsx +186 -186
  222. package/src/components/ui/data-display/ScrollArea.tsx +59 -59
  223. package/src/components/ui/data-display/Separator.tsx +29 -29
  224. package/src/components/ui/data-display/Table.tsx +117 -117
  225. package/src/components/ui/data-display/Tabs.tsx +67 -67
  226. package/src/components/ui/feedback/CircularProgress.tsx +75 -75
  227. package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
  228. package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
  229. package/src/components/ui/feedback/Progress.tsx +40 -40
  230. package/src/components/ui/feedback/Skeleton.tsx +5 -5
  231. package/src/components/ui/feedback/Toast.tsx +101 -101
  232. package/src/components/ui/form/Calendar.tsx +228 -228
  233. package/src/components/ui/form/Checkbox.tsx +31 -31
  234. package/src/components/ui/form/ComboboxField.tsx +154 -154
  235. package/src/components/ui/form/DatePicker.tsx +97 -97
  236. package/src/components/ui/form/DateRangePicker.tsx +108 -108
  237. package/src/components/ui/form/FormField.tsx +131 -131
  238. package/src/components/ui/form/Input.tsx +20 -20
  239. package/src/components/ui/form/InputOtp.tsx +80 -80
  240. package/src/components/ui/form/PhoneInput.tsx +208 -208
  241. package/src/components/ui/form/RadioGroup.tsx +45 -45
  242. package/src/components/ui/form/Select.tsx +200 -200
  243. package/src/components/ui/form/SelectField.tsx +1 -1
  244. package/src/components/ui/form/Switch.tsx +32 -32
  245. package/src/components/ui/form/Textarea.tsx +19 -19
  246. package/src/components/ui/overlay/Command.tsx +185 -185
  247. package/src/components/ui/overlay/Dialog.tsx +151 -151
  248. package/src/components/ui/overlay/Popover.tsx +49 -49
  249. package/src/components/ui/overlay/Sheet.tsx +166 -166
  250. package/src/components/ui/overlay/Tooltip.tsx +62 -62
  251. package/src/components/widgets/notifications/NotificationCard.tsx +68 -68
  252. package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
  253. package/src/hooks/useDebounce.ts +26 -26
  254. package/src/hooks/useDebounceState.ts +11 -11
  255. package/src/hooks/useDebouncedEffect.ts +69 -69
  256. package/src/index.ts +391 -391
  257. package/src/infra/utils/clsx.ts +6 -6
  258. package/src/infra/utils/date.ts +7 -7
  259. package/src/infra/utils/parser.ts +52 -52
  260. package/src/infra/utils/percentage.ts +42 -42
  261. package/src/middleware.ts +4 -4
  262. package/src/modules/accounts/actions/account-management.action.ts +107 -107
  263. package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
  264. package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
  265. package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
  266. package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
  267. package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
  268. package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
  269. package/src/modules/accounts/hooks/useTimezones.ts +15 -15
  270. package/src/modules/accounts/hooks/useViaCep.ts +25 -25
  271. package/src/modules/accounts/services/account.service.ts +239 -239
  272. package/src/modules/accounts/types.ts +225 -225
  273. package/src/modules/auth/actions/validate-session.action.ts +56 -56
  274. package/src/modules/auth/hooks/login.hook.tsx +13 -13
  275. package/src/modules/auth/hooks/logout.hook.tsx +11 -11
  276. package/src/modules/auth/hooks/register.hook.tsx +11 -11
  277. package/src/modules/auth/hooks/useManagementPermissions.ts +45 -45
  278. package/src/modules/auth/types/management-permission.type.ts +7 -7
  279. package/src/modules/auth/utils/assert-management-permission.ts +46 -46
  280. package/src/modules/auth/utils/assert-management-subscription.ts +27 -27
  281. package/src/modules/auth/utils/build-wl-override.ts +43 -43
  282. package/src/modules/cards/actions/create-card.action.ts +9 -9
  283. package/src/modules/cards/actions/list-cards.action.ts +8 -8
  284. package/src/modules/cards/hooks/cards.hook.ts +14 -14
  285. package/src/modules/cards/hooks/create-card.hook.ts +18 -18
  286. package/src/modules/cards/services/cards.service.ts +51 -51
  287. package/src/modules/cards/types.ts +32 -32
  288. package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
  289. package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
  290. package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +17 -17
  291. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +13 -13
  292. package/src/modules/plans/services/plans.service.ts +36 -36
  293. package/src/modules/plans/types/plan.type.ts +21 -21
  294. package/src/modules/projects/actions/add-project-user.action.ts +9 -9
  295. package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
  296. package/src/modules/projects/actions/list-available-users.action.ts +9 -9
  297. package/src/modules/projects/actions/list-project-users.action.ts +9 -9
  298. package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
  299. package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
  300. package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
  301. package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
  302. package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
  303. package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
  304. package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
  305. package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
  306. package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
  307. package/src/modules/subscriptions/constants/query-keys.constants.ts +1 -1
  308. package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
  309. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
  310. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +16 -16
  311. package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +25 -25
  312. package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +39 -39
  313. package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
  314. package/src/modules/subscriptions/types/calculate-subscription.type.ts +75 -75
  315. package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
  316. package/src/modules/subscriptions/utils/has-subscription-expired.ts +8 -8
  317. package/src/modules/subscriptions/utils/periodicity.ts +52 -52
  318. package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
  319. package/src/modules/users/action/find-user-by-id.action.ts +8 -8
  320. package/src/modules/users/action/list-messages.action.ts +12 -12
  321. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
  322. package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
  323. package/src/modules/users/hooks/messages.hook.ts +60 -60
  324. package/src/modules/users/services/messages.service.ts +48 -48
  325. package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
  326. package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
  327. package/src/modules/whitelabel/schema.ts +84 -84
  328. package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
  329. package/src/providers/whitelabel.provider.tsx +54 -54
  330. package/src/store/useAccountModals.ts +55 -55
  331. package/src/store/useBuyCreditsModal.ts +21 -21
  332. package/src/store/useDesktopSidebarStore.ts +47 -47
  333. package/src/store/useMdSidebarStore.ts +34 -34
  334. package/src/store/useModalManager.ts +104 -104
  335. package/src/utils/constants/br-states.ts +29 -29
  336. package/src/utils/countries.ts +224 -224
  337. package/src/utils/safeServerAction.ts +21 -21
  338. package/src/utils/withAction.ts +13 -13
@@ -1,248 +1,248 @@
1
- 'use client';
2
-
3
- import { useState, useEffect } from 'react';
4
- import { useForm } from 'react-hook-form';
5
- import { toast } from 'sonner';
6
- import { IconLock } from '@tabler/icons-react';
7
- import { cn } from '../../../infra/utils/clsx';
8
- import { Button } from '../../ui/buttons/Button';
9
- import { Separator } from '../../ui/data-display/Separator';
10
- import { Toast } from '../../ui/feedback/Toast';
11
- import { FormField } from '../../ui/form/FormField';
12
- import { ComboboxField } from '../../ui/form/ComboboxField';
13
- import { SelectField } from '../../ui/form/SelectField';
14
- import ConfirmGlobalPreferencesModal from '../ConfirmGlobalPreferencesModal';
15
- import { useAuth } from '../../../providers/auth.provider';
16
- import { UserProfile } from '../../../modules/users/schema';
17
- import type { UpdateAccountRequest } from '../../../modules/accounts/types';
18
- import {
19
- useUpdateAccountUser,
20
- useUpdateAccount,
21
- } from '../../../modules/accounts/hooks/useAccountManagement';
22
- import {
23
- LANGUAGE_OPTIONS,
24
- TIME_FORMAT_OPTIONS,
25
- } from '../constants';
26
- import { useTimezones } from '../../../modules/accounts/hooks/useTimezones';
27
- import { useCurrencies } from '../../../modules/accounts/hooks/useCurrencies';
28
-
29
- interface PreferencesFormValues {
30
- companyName: string;
31
- language: string;
32
- currency: string;
33
- timezone: string;
34
- timeFormat: string;
35
- receive_sms: boolean;
36
- receive_email: boolean;
37
- }
38
-
39
- interface PreferencesSectionProps {
40
- onClose: () => void;
41
- }
42
-
43
- export function PreferencesSection({ onClose }: PreferencesSectionProps) {
44
- const { data: timezones = [] } = useTimezones();
45
- const { data: currencies = [] } = useCurrencies();
46
- const { user, account } = useAuth();
47
- const isOwner = user?.profile === UserProfile.owner;
48
- const canEditPreferences = isOwner || user?.profile === UserProfile.admin;
49
- const updateAccountUser = useUpdateAccountUser();
50
- const updateAccount = useUpdateAccount();
51
- const [confirmGlobalOpen, setConfirmGlobalOpen] = useState(false);
52
- const [pendingSubmit, setPendingSubmit] = useState<{
53
- data: PreferencesFormValues;
54
- accountFields: UpdateAccountRequest;
55
- } | null>(null);
56
- const [isSaving, setIsSaving] = useState(false);
57
-
58
- const { watch, setValue, handleSubmit, reset, formState: { dirtyFields } } =
59
- useForm<PreferencesFormValues>({
60
- defaultValues: {
61
- companyName: '',
62
- language: '',
63
- currency: '',
64
- timezone: '',
65
- timeFormat: '24h',
66
- receive_sms: false,
67
- receive_email: false,
68
- },
69
- });
70
-
71
- useEffect(() => {
72
- if (!user || !account) return;
73
- reset({
74
- companyName: account.name ?? '',
75
- language: LANGUAGE_OPTIONS.find(
76
- (o) => o.apiValue === user.language?.toLowerCase()
77
- )?.value ?? 'pt-BR',
78
- currency: account.currency,
79
- timezone: account.timezone,
80
- timeFormat: '24h',
81
- receive_sms: user.receive_sms ?? false,
82
- receive_email: user.receive_email ?? false,
83
- });
84
- }, [user, account, reset]);
85
-
86
- const doSave = async (data: PreferencesFormValues, accountFields: UpdateAccountRequest) => {
87
- setIsSaving(true);
88
- try {
89
- const apiLanguage = LANGUAGE_OPTIONS.find((o) => o.value === data.language)?.apiValue ?? data.language.toLowerCase();
90
- await updateAccountUser.mutateAsync({
91
- language: apiLanguage,
92
- receive_sms: data.receive_sms,
93
- receive_email: data.receive_email,
94
- });
95
-
96
- if (canEditPreferences && Object.keys(accountFields).length > 0) {
97
- await updateAccount.mutateAsync(accountFields);
98
- }
99
-
100
- reset(data);
101
- toast.custom((t) => (
102
- <Toast variant="success" message="Preferências salvas com sucesso" toastId={t} />
103
- ));
104
- onClose();
105
- } catch (error) {
106
- toast.custom((t) => (
107
- <Toast
108
- variant="error"
109
- message={error instanceof Error ? error.message : 'Erro ao salvar preferências'}
110
- toastId={t}
111
- />
112
- ));
113
- } finally {
114
- setIsSaving(false);
115
- }
116
- };
117
-
118
- const onSubmit = (data: PreferencesFormValues) => {
119
- const accountFields: UpdateAccountRequest = {
120
- ...(isOwner && dirtyFields.companyName && { name: data.companyName }),
121
- ...(canEditPreferences && dirtyFields.currency && { currency: data.currency }),
122
- ...(canEditPreferences && dirtyFields.timezone && { timezone: data.timezone }),
123
- };
124
- const globalFieldChanged = Object.keys(accountFields).length > 0;
125
-
126
- if (globalFieldChanged) {
127
- setPendingSubmit({ data, accountFields });
128
- setConfirmGlobalOpen(true);
129
- } else {
130
- doSave(data, accountFields);
131
- }
132
- };
133
-
134
- const handleConfirmGlobal = () => {
135
- setConfirmGlobalOpen(false);
136
- if (pendingSubmit) {
137
- doSave(pendingSubmit.data, pendingSubmit.accountFields);
138
- setPendingSubmit(null);
139
- }
140
- };
141
-
142
- const handleCancelGlobal = () => {
143
- setConfirmGlobalOpen(false);
144
- setPendingSubmit(null);
145
- };
146
-
147
- return (
148
- <>
149
- <form onSubmit={handleSubmit(onSubmit)} className="flex flex-col h-full">
150
- <div className="overflow-y-auto overscroll-contain px-4 pb-4 lg:p-5 flex flex-col gap-5 lg:gap-6 flex-1">
151
- <span className="paragraph-medium-semibold text-gray-950">Preferências</span>
152
- <div className="flex flex-col gap-8">
153
- <div className="flex flex-col lg:flex-row items-center gap-3">
154
- <FormField
155
- label="Nome da empresa"
156
- placeholder="Digite o nome da empresa"
157
- classnameContainer={cn('w-full', !isOwner && 'cursor-not-allowed opacity-50')}
158
- value={watch('companyName')}
159
- onChange={(e) => setValue('companyName', e.target.value, { shouldDirty: true })}
160
- disabled={!isOwner}
161
- />
162
- </div>
163
-
164
- <div className="flex flex-col lg:flex-row items-center gap-3">
165
- <ComboboxField
166
- label="Idioma"
167
- placeholder="Selecione o idioma"
168
- searchPlaceholder="Buscar idioma..."
169
- containerClassName="w-full"
170
- options={LANGUAGE_OPTIONS}
171
- value={watch('language')}
172
- onChange={(value) => setValue('language', value, { shouldDirty: true })}
173
- />
174
- <ComboboxField
175
- label="Moeda"
176
- placeholder="Selecione a moeda"
177
- searchPlaceholder="Buscar moeda..."
178
- containerClassName="w-full"
179
- options={currencies}
180
- value={watch('currency')}
181
- onChange={(value) => setValue('currency', value, { shouldDirty: true })}
182
- icon={!canEditPreferences ? <IconLock className="size-4 text-gray-400" /> : undefined}
183
- disabled={!canEditPreferences}
184
- />
185
- </div>
186
-
187
- <Separator />
188
-
189
- <div className="flex flex-col gap-4">
190
- <span className="paragraph-medium-semibold text-gray-950">Exibição hora</span>
191
- <div className="flex flex-col lg:flex-row items-center gap-3">
192
- <ComboboxField
193
- label="Fuso horário"
194
- placeholder="Selecione o fuso horário"
195
- searchPlaceholder="Buscar fuso horário..."
196
- containerClassName="w-full"
197
- options={timezones}
198
- value={watch('timezone')}
199
- onChange={(value) => setValue('timezone', value, { shouldDirty: true })}
200
- icon={!canEditPreferences ? <IconLock className="size-4 text-gray-400" /> : undefined}
201
- disabled={!canEditPreferences}
202
- />
203
- <SelectField
204
- label="Formato hora"
205
- placeholder="Selecione o formato"
206
- className="h-10!"
207
- containerClassName="w-full"
208
- options={TIME_FORMAT_OPTIONS}
209
- value={watch('timeFormat')}
210
- onChange={(value) =>
211
- setValue('timeFormat', value as string, { shouldDirty: true })
212
- }
213
- icon={<IconLock className="size-4 text-gray-400" />}
214
- disabled
215
- />
216
- </div>
217
- </div>
218
-
219
- </div>
220
- </div>
221
-
222
- <div className="fixed bottom-0 left-0 right-0 lg:absolute flex items-center h-20 px-4 lg:px-5 border-t border-gray-200 justify-between bg-white z-10">
223
- <Button
224
- variant="secondary"
225
- className="h-10!"
226
- type="button"
227
- disabled={isSaving}
228
- onClick={() => {
229
- reset();
230
- onClose();
231
- }}
232
- >
233
- Cancelar
234
- </Button>
235
- <Button className="h-10!" type="submit" disabled={isSaving}>
236
- {isSaving ? 'Salvando...' : 'Salvar alterações'}
237
- </Button>
238
- </div>
239
- </form>
240
-
241
- <ConfirmGlobalPreferencesModal
242
- open={confirmGlobalOpen}
243
- onConfirm={handleConfirmGlobal}
244
- onCancel={handleCancelGlobal}
245
- />
246
- </>
247
- );
248
- }
1
+ 'use client';
2
+
3
+ import { useState, useEffect } from 'react';
4
+ import { useForm } from 'react-hook-form';
5
+ import { toast } from 'sonner';
6
+ import { IconLock } from '@tabler/icons-react';
7
+ import { cn } from '../../../infra/utils/clsx';
8
+ import { Button } from '../../ui/buttons/Button';
9
+ import { Separator } from '../../ui/data-display/Separator';
10
+ import { Toast } from '../../ui/feedback/Toast';
11
+ import { FormField } from '../../ui/form/FormField';
12
+ import { ComboboxField } from '../../ui/form/ComboboxField';
13
+ import { SelectField } from '../../ui/form/SelectField';
14
+ import ConfirmGlobalPreferencesModal from '../ConfirmGlobalPreferencesModal';
15
+ import { useAuth } from '../../../providers/auth.provider';
16
+ import { UserProfile } from '../../../modules/users/schema';
17
+ import type { UpdateAccountRequest } from '../../../modules/accounts/types';
18
+ import {
19
+ useUpdateAccountUser,
20
+ useUpdateAccount,
21
+ } from '../../../modules/accounts/hooks/useAccountManagement';
22
+ import {
23
+ LANGUAGE_OPTIONS,
24
+ TIME_FORMAT_OPTIONS,
25
+ } from '../constants';
26
+ import { useTimezones } from '../../../modules/accounts/hooks/useTimezones';
27
+ import { useCurrencies } from '../../../modules/accounts/hooks/useCurrencies';
28
+
29
+ interface PreferencesFormValues {
30
+ companyName: string;
31
+ language: string;
32
+ currency: string;
33
+ timezone: string;
34
+ timeFormat: string;
35
+ receive_sms: boolean;
36
+ receive_email: boolean;
37
+ }
38
+
39
+ interface PreferencesSectionProps {
40
+ onClose: () => void;
41
+ }
42
+
43
+ export function PreferencesSection({ onClose }: PreferencesSectionProps) {
44
+ const { data: timezones = [] } = useTimezones();
45
+ const { data: currencies = [] } = useCurrencies();
46
+ const { user, account } = useAuth();
47
+ const isOwner = user?.profile === UserProfile.owner;
48
+ const canEditPreferences = isOwner || user?.profile === UserProfile.admin;
49
+ const updateAccountUser = useUpdateAccountUser();
50
+ const updateAccount = useUpdateAccount();
51
+ const [confirmGlobalOpen, setConfirmGlobalOpen] = useState(false);
52
+ const [pendingSubmit, setPendingSubmit] = useState<{
53
+ data: PreferencesFormValues;
54
+ accountFields: UpdateAccountRequest;
55
+ } | null>(null);
56
+ const [isSaving, setIsSaving] = useState(false);
57
+
58
+ const { watch, setValue, handleSubmit, reset, formState: { dirtyFields } } =
59
+ useForm<PreferencesFormValues>({
60
+ defaultValues: {
61
+ companyName: '',
62
+ language: '',
63
+ currency: '',
64
+ timezone: '',
65
+ timeFormat: '24h',
66
+ receive_sms: false,
67
+ receive_email: false,
68
+ },
69
+ });
70
+
71
+ useEffect(() => {
72
+ if (!user || !account) return;
73
+ reset({
74
+ companyName: account.name ?? '',
75
+ language: LANGUAGE_OPTIONS.find(
76
+ (o) => o.apiValue === user.language?.toLowerCase()
77
+ )?.value ?? 'pt-BR',
78
+ currency: account.currency,
79
+ timezone: account.timezone,
80
+ timeFormat: '24h',
81
+ receive_sms: user.receive_sms ?? false,
82
+ receive_email: user.receive_email ?? false,
83
+ });
84
+ }, [user, account, reset]);
85
+
86
+ const doSave = async (data: PreferencesFormValues, accountFields: UpdateAccountRequest) => {
87
+ setIsSaving(true);
88
+ try {
89
+ const apiLanguage = LANGUAGE_OPTIONS.find((o) => o.value === data.language)?.apiValue ?? data.language.toLowerCase();
90
+ await updateAccountUser.mutateAsync({
91
+ language: apiLanguage,
92
+ receive_sms: data.receive_sms,
93
+ receive_email: data.receive_email,
94
+ });
95
+
96
+ if (canEditPreferences && Object.keys(accountFields).length > 0) {
97
+ await updateAccount.mutateAsync(accountFields);
98
+ }
99
+
100
+ reset(data);
101
+ toast.custom((t) => (
102
+ <Toast variant="success" message="Preferências salvas com sucesso" toastId={t} />
103
+ ));
104
+ onClose();
105
+ } catch (error) {
106
+ toast.custom((t) => (
107
+ <Toast
108
+ variant="error"
109
+ message={error instanceof Error ? error.message : 'Erro ao salvar preferências'}
110
+ toastId={t}
111
+ />
112
+ ));
113
+ } finally {
114
+ setIsSaving(false);
115
+ }
116
+ };
117
+
118
+ const onSubmit = (data: PreferencesFormValues) => {
119
+ const accountFields: UpdateAccountRequest = {
120
+ ...(isOwner && dirtyFields.companyName && { name: data.companyName }),
121
+ ...(canEditPreferences && dirtyFields.currency && { currency: data.currency }),
122
+ ...(canEditPreferences && dirtyFields.timezone && { timezone: data.timezone }),
123
+ };
124
+ const globalFieldChanged = Object.keys(accountFields).length > 0;
125
+
126
+ if (globalFieldChanged) {
127
+ setPendingSubmit({ data, accountFields });
128
+ setConfirmGlobalOpen(true);
129
+ } else {
130
+ doSave(data, accountFields);
131
+ }
132
+ };
133
+
134
+ const handleConfirmGlobal = () => {
135
+ setConfirmGlobalOpen(false);
136
+ if (pendingSubmit) {
137
+ doSave(pendingSubmit.data, pendingSubmit.accountFields);
138
+ setPendingSubmit(null);
139
+ }
140
+ };
141
+
142
+ const handleCancelGlobal = () => {
143
+ setConfirmGlobalOpen(false);
144
+ setPendingSubmit(null);
145
+ };
146
+
147
+ return (
148
+ <>
149
+ <form onSubmit={handleSubmit(onSubmit)} className="flex flex-col h-full">
150
+ <div className="overflow-y-auto overscroll-contain px-4 pb-4 lg:p-5 flex flex-col gap-5 lg:gap-6 flex-1">
151
+ <span className="paragraph-medium-semibold text-gray-950">Preferências</span>
152
+ <div className="flex flex-col gap-8">
153
+ <div className="flex flex-col lg:flex-row items-center gap-3">
154
+ <FormField
155
+ label="Nome da empresa"
156
+ placeholder="Digite o nome da empresa"
157
+ classnameContainer={cn('w-full', !isOwner && 'cursor-not-allowed opacity-50')}
158
+ value={watch('companyName')}
159
+ onChange={(e) => setValue('companyName', e.target.value, { shouldDirty: true })}
160
+ disabled={!isOwner}
161
+ />
162
+ </div>
163
+
164
+ <div className="flex flex-col lg:flex-row items-center gap-3">
165
+ <ComboboxField
166
+ label="Idioma"
167
+ placeholder="Selecione o idioma"
168
+ searchPlaceholder="Buscar idioma..."
169
+ containerClassName="w-full"
170
+ options={LANGUAGE_OPTIONS}
171
+ value={watch('language')}
172
+ onChange={(value) => setValue('language', value, { shouldDirty: true })}
173
+ />
174
+ <ComboboxField
175
+ label="Moeda"
176
+ placeholder="Selecione a moeda"
177
+ searchPlaceholder="Buscar moeda..."
178
+ containerClassName="w-full"
179
+ options={currencies}
180
+ value={watch('currency')}
181
+ onChange={(value) => setValue('currency', value, { shouldDirty: true })}
182
+ icon={!canEditPreferences ? <IconLock className="size-4 text-gray-400" /> : undefined}
183
+ disabled={!canEditPreferences}
184
+ />
185
+ </div>
186
+
187
+ <Separator />
188
+
189
+ <div className="flex flex-col gap-4">
190
+ <span className="paragraph-medium-semibold text-gray-950">Exibição hora</span>
191
+ <div className="flex flex-col lg:flex-row items-center gap-3">
192
+ <ComboboxField
193
+ label="Fuso horário"
194
+ placeholder="Selecione o fuso horário"
195
+ searchPlaceholder="Buscar fuso horário..."
196
+ containerClassName="w-full"
197
+ options={timezones}
198
+ value={watch('timezone')}
199
+ onChange={(value) => setValue('timezone', value, { shouldDirty: true })}
200
+ icon={!canEditPreferences ? <IconLock className="size-4 text-gray-400" /> : undefined}
201
+ disabled={!canEditPreferences}
202
+ />
203
+ <SelectField
204
+ label="Formato hora"
205
+ placeholder="Selecione o formato"
206
+ className="h-10!"
207
+ containerClassName="w-full"
208
+ options={TIME_FORMAT_OPTIONS}
209
+ value={watch('timeFormat')}
210
+ onChange={(value) =>
211
+ setValue('timeFormat', value as string, { shouldDirty: true })
212
+ }
213
+ icon={<IconLock className="size-4 text-gray-400" />}
214
+ disabled
215
+ />
216
+ </div>
217
+ </div>
218
+
219
+ </div>
220
+ </div>
221
+
222
+ <div className="fixed bottom-0 left-0 right-0 lg:absolute flex items-center h-20 px-4 lg:px-5 border-t border-gray-200 justify-between bg-white z-10">
223
+ <Button
224
+ variant="secondary"
225
+ className="h-10!"
226
+ type="button"
227
+ disabled={isSaving}
228
+ onClick={() => {
229
+ reset();
230
+ onClose();
231
+ }}
232
+ >
233
+ Cancelar
234
+ </Button>
235
+ <Button className="h-10!" type="submit" disabled={isSaving}>
236
+ {isSaving ? 'Salvando...' : 'Salvar alterações'}
237
+ </Button>
238
+ </div>
239
+ </form>
240
+
241
+ <ConfirmGlobalPreferencesModal
242
+ open={confirmGlobalOpen}
243
+ onConfirm={handleConfirmGlobal}
244
+ onCancel={handleCancelGlobal}
245
+ />
246
+ </>
247
+ );
248
+ }
@@ -1,46 +1,46 @@
1
- 'use client';
2
-
3
- import { IconAlertTriangle } from '@tabler/icons-react';
4
- import { Button } from '../../ui/buttons/Button';
5
- import { useAuth } from '../../../providers/auth.provider';
6
- import { AccountSectionType } from '../../../enums/AccountSectionType';
7
-
8
- interface SecuritySectionProps {
9
- setActiveSection: (section: AccountSectionType) => void;
10
- onClose: () => void;
11
- onDeleteAccount?: () => void;
12
- }
13
-
14
- export function SecuritySection({
15
- onClose,
16
- onDeleteAccount,
17
- }: SecuritySectionProps) {
18
- return (
19
- <div className="h-full overflow-y-auto overscroll-contain px-4 pb-20 lg:p-5 lg:pt-5 flex flex-col gap-5 lg:gap-6 lg:pb-31 lg:overscroll-auto">
20
- <span className="paragraph-medium-semibold text-gray-950 hidden lg:block">Segurança</span>
21
-
22
- <div className="flex flex-col items-center lg:items-start gap-4">
23
- <div className="size-10 rounded-lg bg-red-50 flex items-center justify-center">
24
- <IconAlertTriangle size={20} className="text-red-500" />
25
- </div>
26
-
27
- <div className="flex flex-col gap-2">
28
- <span className="paragraph-medium-semibold text-gray-950">Excluir conta</span>
29
- <span className="paragraph-small-regular text-gray-600">
30
- Esta ação é permanente e não pode ser desfeita. Todos os seus dados, projetos e configurações serão removidos definitivamente.
31
- </span>
32
- </div>
33
-
34
- {onDeleteAccount && (
35
- <button
36
- type="button"
37
- className="paragraph-small-semibold text-red-600 bg-red-50 rounded-lg px-3 py-2 cursor-pointer hover:bg-red-100 transition-colors w-fit"
38
- onClick={onDeleteAccount}
39
- >
40
- Excluir minha conta
41
- </button>
42
- )}
43
- </div>
44
- </div>
45
- );
46
- }
1
+ 'use client';
2
+
3
+ import { IconAlertTriangle } from '@tabler/icons-react';
4
+ import { Button } from '../../ui/buttons/Button';
5
+ import { useAuth } from '../../../providers/auth.provider';
6
+ import { AccountSectionType } from '../../../enums/AccountSectionType';
7
+
8
+ interface SecuritySectionProps {
9
+ setActiveSection: (section: AccountSectionType) => void;
10
+ onClose: () => void;
11
+ onDeleteAccount?: () => void;
12
+ }
13
+
14
+ export function SecuritySection({
15
+ onClose,
16
+ onDeleteAccount,
17
+ }: SecuritySectionProps) {
18
+ return (
19
+ <div className="h-full overflow-y-auto overscroll-contain px-4 pb-20 lg:p-5 lg:pt-5 flex flex-col gap-5 lg:gap-6 lg:pb-31 lg:overscroll-auto">
20
+ <span className="paragraph-medium-semibold text-gray-950 hidden lg:block">Segurança</span>
21
+
22
+ <div className="flex flex-col items-center lg:items-start gap-4">
23
+ <div className="size-10 rounded-lg bg-red-50 flex items-center justify-center">
24
+ <IconAlertTriangle size={20} className="text-red-500" />
25
+ </div>
26
+
27
+ <div className="flex flex-col gap-2">
28
+ <span className="paragraph-medium-semibold text-gray-950">Excluir conta</span>
29
+ <span className="paragraph-small-regular text-gray-600">
30
+ Esta ação é permanente e não pode ser desfeita. Todos os seus dados, projetos e configurações serão removidos definitivamente.
31
+ </span>
32
+ </div>
33
+
34
+ {onDeleteAccount && (
35
+ <button
36
+ type="button"
37
+ className="paragraph-small-semibold text-red-600 bg-red-50 rounded-lg px-3 py-2 cursor-pointer hover:bg-red-100 transition-colors w-fit"
38
+ onClick={onDeleteAccount}
39
+ >
40
+ Excluir minha conta
41
+ </button>
42
+ )}
43
+ </div>
44
+ </div>
45
+ );
46
+ }