@greatapps/common 1.1.698 → 1.1.700
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.
- package/dist/components/account/ConfigurationsMyAccountModal.mjs +1 -1
- package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
- package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
- package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
- package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
- package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
- package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
- package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
- package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
- package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
- package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
- package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
- package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
- package/dist/components/account/sections/TokenSection.mjs.map +1 -1
- package/dist/components/embeds/ClarityEmbed.mjs.map +1 -1
- package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
- package/dist/components/embeds/EmbedWidgets.mjs.map +1 -1
- package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
- package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
- package/dist/components/layouts/AppNavBar.mjs.map +1 -1
- package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
- package/dist/components/layouts/NavBar.mjs.map +1 -1
- package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
- package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
- package/dist/components/layouts/SideBarNavigation.mjs.map +1 -1
- package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
- package/dist/components/layouts/WhitelabelCodes.mjs.map +1 -1
- package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
- package/dist/components/modals/CreditsDisabledModal.mjs.map +1 -1
- package/dist/components/modals/HexaPromoModal.mjs +166 -0
- package/dist/components/modals/HexaPromoModal.mjs.map +1 -0
- package/dist/components/modals/HexaPromoModalGate.mjs +54 -0
- package/dist/components/modals/HexaPromoModalGate.mjs.map +1 -0
- package/dist/components/modals/Modals.mjs.map +1 -1
- package/dist/components/modals/PaidPlanRequiredModal.mjs.map +1 -1
- package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
- package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -1
- package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
- package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -1
- package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
- package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
- package/dist/components/navigation/OverdueInvoiceBanner.mjs.map +1 -1
- package/dist/components/navigation/PendingCancellationBanner.mjs.map +1 -1
- package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
- package/dist/components/navigation/SubscriptionBanner.mjs.map +1 -1
- package/dist/components/navigation/TrialBanner.mjs.map +1 -1
- package/dist/components/navigation/UpcomingInvoiceBanner.mjs.map +1 -1
- package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
- package/dist/components/pages/NotFoundPage.mjs.map +1 -1
- package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
- package/dist/components/ui/buttons/Button.mjs.map +1 -1
- package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
- package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
- package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
- package/dist/components/ui/data-display/Badge.mjs.map +1 -1
- package/dist/components/ui/data-display/Card.mjs.map +1 -1
- package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
- package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
- package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
- package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
- package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
- package/dist/components/ui/data-display/Separator.mjs.map +1 -1
- package/dist/components/ui/data-display/Table.mjs.map +1 -1
- package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
- package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
- package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
- package/dist/components/ui/feedback/Progress.mjs.map +1 -1
- package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
- package/dist/components/ui/feedback/Toast.mjs.map +1 -1
- package/dist/components/ui/form/Calendar.mjs.map +1 -1
- package/dist/components/ui/form/Checkbox.mjs.map +1 -1
- package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
- package/dist/components/ui/form/DatePicker.mjs.map +1 -1
- package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
- package/dist/components/ui/form/FormField.mjs.map +1 -1
- package/dist/components/ui/form/Input.mjs.map +1 -1
- package/dist/components/ui/form/InputOtp.mjs.map +1 -1
- package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
- package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
- package/dist/components/ui/form/Select.mjs +1 -1
- package/dist/components/ui/form/Select.mjs.map +1 -1
- package/dist/components/ui/form/Switch.mjs.map +1 -1
- package/dist/components/ui/form/Textarea.mjs.map +1 -1
- package/dist/components/ui/overlay/Command.mjs.map +1 -1
- package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
- package/dist/components/ui/overlay/Popover.mjs.map +1 -1
- package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
- package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
- package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +1 -1
- package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +1 -1
- package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +1 -1
- package/dist/components/widgets/ImageUpload/index.mjs.map +1 -1
- package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -1
- package/dist/handlers.mjs.map +1 -1
- package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
- package/dist/hooks/useAuthQueryKey.mjs.map +1 -1
- package/dist/hooks/useBrandLoadingIcon.mjs.map +1 -1
- package/dist/hooks/useRouter.mjs.map +1 -1
- package/dist/http.mjs.map +1 -1
- package/dist/i18n/config.mjs.map +1 -1
- package/dist/i18n/country-language.mjs.map +1 -1
- package/dist/i18n/messages/en-us.mjs.map +1 -1
- package/dist/i18n/messages/es-es.mjs.map +1 -1
- package/dist/i18n/messages/index.mjs.map +1 -1
- package/dist/i18n/messages/pt-br.mjs.map +1 -1
- package/dist/i18n/normalize.mjs.map +1 -1
- package/dist/i18n/resolve-locale.mjs.map +1 -1
- package/dist/i18n.mjs.map +1 -1
- package/dist/index.mjs +38 -32
- package/dist/index.mjs.map +1 -1
- package/dist/infra/http/api-fetch.mjs.map +1 -1
- package/dist/infra/route/parse-id.mjs.map +1 -1
- package/dist/infra/route/parse-numeric.mjs.map +1 -1
- package/dist/infra/route/safe-route-handler.mjs.map +1 -1
- package/dist/infra/route/search-params.mjs.map +1 -1
- package/dist/infra/utils/array.mjs.map +1 -1
- package/dist/infra/utils/date.mjs.map +1 -1
- package/dist/middleware.mjs.map +1 -1
- package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/get-account-token.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
- package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
- package/dist/modules/accounts/hooks/use-account-token.hook.mjs.map +1 -1
- package/dist/modules/accounts/hooks/use-currency-formatter.hook.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useViaCep.mjs.map +1 -1
- package/dist/modules/accounts/services/account-token.service.mjs.map +1 -1
- package/dist/modules/accounts/services/account.service.mjs.map +1 -1
- package/dist/modules/auth/actions/social-google-login.action.mjs.map +1 -1
- package/dist/modules/auth/actions/social-google-onboarding.action.mjs.map +1 -1
- package/dist/modules/auth/actions/unlink-google.action.mjs.map +1 -1
- package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
- package/dist/modules/auth/actions/verify-two-factor.action.mjs.map +1 -1
- package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/social-google-login.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/social-google-onboarding.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/unlink-google.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/useManagementPermissions.mjs.map +1 -1
- package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
- package/dist/modules/auth/utils/assert-management-permission.mjs.map +1 -1
- package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
- package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
- package/dist/modules/auth/utils/assert-subscription-addon.mjs.map +1 -1
- package/dist/modules/auth/utils/build-wl-override.mjs.map +1 -1
- package/dist/modules/auth/utils/require-token-not-expired.mjs.map +1 -1
- package/dist/modules/auth/utils/require-valid-session.mjs.map +1 -1
- package/dist/modules/cards/actions/create-card.action.mjs.map +1 -1
- package/dist/modules/cards/actions/create-setup-intent.action.mjs.map +1 -1
- package/dist/modules/cards/actions/delete-card.action.mjs.map +1 -1
- package/dist/modules/cards/actions/set-default-card.action.mjs.map +1 -1
- package/dist/modules/cards/handlers/find-card-by-id.handler.mjs.map +1 -1
- package/dist/modules/cards/handlers/list-cards.handler.mjs.map +1 -1
- package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
- package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
- package/dist/modules/cards/hooks/create-card.hook.mjs.map +1 -1
- package/dist/modules/cards/hooks/create-setup-intent.hook.mjs.map +1 -1
- package/dist/modules/cards/hooks/delete-card.hook.mjs.map +1 -1
- package/dist/modules/cards/hooks/delete-confirmation.hook.mjs.map +1 -1
- package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -1
- package/dist/modules/cards/hooks/set-default-card.hook.mjs.map +1 -1
- package/dist/modules/cards/services/cards.service.mjs.map +1 -1
- package/dist/modules/cards/types.mjs.map +1 -1
- package/dist/modules/charges/actions/charge-action.action.mjs.map +1 -1
- package/dist/modules/charges/handlers/find-charge-by-id.handler.mjs.map +1 -1
- package/dist/modules/charges/handlers/list-charges.handler.mjs.map +1 -1
- package/dist/modules/charges/hooks/charge-action.hook.mjs.map +1 -1
- package/dist/modules/charges/hooks/charge-by-id.hook.mjs.map +1 -1
- package/dist/modules/charges/hooks/charges.hook.mjs.map +1 -1
- package/dist/modules/charges/services/charges.service.mjs.map +1 -1
- package/dist/modules/charges/types/charge.type.mjs.map +1 -1
- package/dist/modules/ia-credits/handlers/list-ia-credits.handler.mjs.map +1 -1
- package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
- package/dist/modules/images/actions/process-image.action.mjs.map +1 -1
- package/dist/modules/images/constants/image.constants.mjs.map +1 -1
- package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +1 -1
- package/dist/modules/images/services/image-processing.service.mjs.map +1 -1
- package/dist/modules/images/utils/base64.mjs.map +1 -1
- package/dist/modules/images/utils/compress-image.mjs.map +1 -1
- package/dist/modules/images/utils/crop-image.mjs.map +1 -1
- package/dist/modules/images/utils/validate-image.mjs.map +1 -1
- package/dist/modules/pages/constants/query-keys.constants.mjs.map +1 -1
- package/dist/modules/pages/handlers/count-pages.handler.mjs.map +1 -1
- package/dist/modules/pages/hooks/count-pages.hook.mjs.map +1 -1
- package/dist/modules/pages/services/pages.service.mjs.map +1 -1
- package/dist/modules/plans/handlers/find-plan-by-id.handler.mjs.map +1 -1
- package/dist/modules/plans/handlers/list-plans.handler.mjs.map +1 -1
- package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
- package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
- package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
- package/dist/modules/plans/services/plans.service.mjs.map +1 -1
- package/dist/modules/plans/types/plan.type.mjs.map +1 -1
- package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +1 -1
- package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
- package/dist/modules/projects/actions/create-project.action.mjs.map +1 -1
- package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -1
- package/dist/modules/projects/actions/find-project.action.mjs.map +1 -1
- package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
- package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -1
- package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
- package/dist/modules/projects/actions/update-project.action.mjs.map +1 -1
- package/dist/modules/projects/handlers/find-project.handler.mjs.map +1 -1
- package/dist/modules/projects/handlers/list-all-account-users.handler.mjs.map +1 -1
- package/dist/modules/projects/handlers/list-available-users.handler.mjs.map +1 -1
- package/dist/modules/projects/handlers/list-project-users.handler.mjs.map +1 -1
- package/dist/modules/projects/handlers/list-projects.handler.mjs.map +1 -1
- package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -1
- package/dist/modules/projects/services/project-users.service.mjs +2 -2
- package/dist/modules/projects/services/project-users.service.mjs.map +1 -1
- package/dist/modules/projects/services/projects.service.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/update-subscription-payment.action.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
- package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
- package/dist/modules/subscriptions/constants/subscription.constants.mjs.map +1 -1
- package/dist/modules/subscriptions/handlers/list-subscriptions.handler.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/update-subscription-payment.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
- package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
- package/dist/modules/subscriptions/types/pix-pending.type.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/get-subscription-cancellation-state.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/get-subscription-expiry-date.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/has-subscription-expired.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
- package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
- package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
- package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
- package/dist/modules/users/handlers/list-messages.handler.mjs.map +1 -1
- package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
- package/dist/modules/users/services/messages.service.mjs.map +1 -1
- package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
- package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
- package/dist/modules/whitelabel/utils/normalize-hostname.mjs.map +1 -1
- package/dist/providers/auth.provider.mjs +2 -0
- package/dist/providers/auth.provider.mjs.map +1 -1
- package/dist/providers/navigation.provider.mjs.map +1 -1
- package/dist/providers/whitelabel.provider.mjs.map +1 -1
- package/dist/route.mjs.map +1 -1
- package/dist/store/useAccountModals.mjs.map +1 -1
- package/dist/store/useBuyCreditsModal.mjs.map +1 -1
- package/dist/store/useCreditsDisabledModal.mjs.map +1 -1
- package/dist/store/useDesktopSidebarStore.mjs.map +1 -1
- package/dist/store/useHexaPromoModal.mjs +14 -0
- package/dist/store/useHexaPromoModal.mjs.map +1 -0
- package/dist/store/useMdSidebarStore.mjs.map +1 -1
- package/dist/store/usePaidPlanRequiredModal.mjs.map +1 -1
- package/dist/utils/constants/br-states.mjs.map +1 -1
- package/dist/utils/cookies/hexa-promo.mjs +88 -0
- package/dist/utils/cookies/hexa-promo.mjs.map +1 -0
- package/dist/utils/countries.mjs.map +1 -1
- package/dist/utils/format/currency.mjs.map +1 -1
- package/dist/utils/intl/cookie-domain.mjs.map +1 -1
- package/dist/utils/intl/locale-cookie.mjs.map +1 -1
- package/dist/utils/next-navigation.mjs.map +1 -1
- package/dist/utils/redirect.mjs.map +1 -1
- package/dist/utils/safeMutationAction.mjs.map +1 -1
- package/dist/utils/safeServerAction.mjs.map +1 -1
- package/dist/utils/withAction.mjs.map +1 -1
- package/package.json +115 -115
- package/src/components/account/ConfigurationsMyAccountModal.tsx +179 -179
- package/src/components/account/ConfirmDeleteAccountModal.tsx +110 -110
- package/src/components/account/ConfirmGlobalPreferencesModal.tsx +68 -68
- package/src/components/account/DeleteAccountModal.tsx +160 -160
- package/src/components/account/DisableTwoFactorAuthModal.tsx +92 -92
- package/src/components/account/IsntPossibleDeleteAccountModal.tsx +51 -51
- package/src/components/account/TwoFactorAuthModal.tsx +220 -220
- package/src/components/account/hooks/useChangePhoneForm.tsx +113 -113
- package/src/components/account/hooks/useTwoFactorAuthForm.tsx +116 -116
- package/src/components/account/sections/ChangeEmailModal.tsx +239 -239
- package/src/components/account/sections/ChangePasswordSection.tsx +68 -68
- package/src/components/account/sections/ChangePhoneModal.tsx +273 -273
- package/src/components/account/sections/MyProfileSection.tsx +276 -276
- package/src/components/account/sections/PreferencesSection.tsx +278 -278
- package/src/components/account/sections/SecuritySection.tsx +102 -102
- package/src/components/account/sections/TokenSection.tsx +85 -85
- package/src/components/embeds/ClarityEmbed.tsx +70 -70
- package/src/components/embeds/CrispEmbed.tsx +195 -195
- package/src/components/embeds/EmbedWidgets.tsx +62 -62
- package/src/components/embeds/FrillEmbed.tsx +146 -146
- package/src/components/layouts/AppMobileNavBar.tsx +214 -214
- package/src/components/layouts/AppNavBar.tsx +40 -40
- package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
- package/src/components/layouts/NavBar.tsx +228 -228
- package/src/components/layouts/NotificationsPopover.tsx +120 -120
- package/src/components/layouts/ProfilePopover.tsx +191 -191
- package/src/components/layouts/SideBarNavigation.tsx +65 -65
- package/src/components/layouts/UsersSelectorPopover.tsx +236 -236
- package/src/components/layouts/WhitelabelCodes.tsx +59 -59
- package/src/components/modals/BuyCreditsModal.tsx +390 -390
- package/src/components/modals/CreditsDisabledModal.tsx +62 -62
- package/src/components/modals/HexaPromoModal.tsx +212 -0
- package/src/components/modals/HexaPromoModalGate.tsx +80 -0
- package/src/components/modals/Modals.tsx +25 -25
- package/src/components/modals/PaidPlanRequiredModal.tsx +60 -60
- package/src/components/modals/cards/AddCardModal.tsx +420 -420
- package/src/components/modals/cards/CannotDeleteCardModal.tsx +124 -124
- package/src/components/modals/cards/CardFormFields.tsx +363 -363
- package/src/components/modals/cards/DeleteCardModal.tsx +136 -136
- package/src/components/navigation/CancelledSubscriptionBanner.tsx +62 -62
- package/src/components/navigation/NavItemsContext.ts +20 -20
- package/src/components/navigation/OverdueInvoiceBanner.tsx +51 -51
- package/src/components/navigation/PendingCancellationBanner.tsx +60 -60
- package/src/components/navigation/ProjectSelectorPopover.tsx +180 -180
- package/src/components/navigation/SubscriptionBanner.tsx +94 -94
- package/src/components/navigation/TrialBanner.tsx +54 -54
- package/src/components/navigation/UpcomingInvoiceBanner.tsx +55 -55
- package/src/components/navigation/shells/TabsMobileShell.tsx +74 -74
- package/src/components/navigation/subcomponents/BottomLinks.tsx +85 -85
- package/src/components/navigation/subcomponents/ProjectSelector.tsx +184 -184
- package/src/components/pages/NotFoundPage.tsx +75 -75
- package/src/components/pages/notifications/Notifications.tsx +190 -190
- package/src/components/ui/buttons/Button.tsx +77 -77
- package/src/components/ui/buttons/CancelButton.tsx +14 -14
- package/src/components/ui/buttons/CopyButton.tsx +59 -59
- package/src/components/ui/data-display/Accordion.tsx +81 -81
- package/src/components/ui/data-display/Badge.tsx +47 -47
- package/src/components/ui/data-display/Card.tsx +93 -93
- package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
- package/src/components/ui/data-display/CardItem.tsx +135 -135
- package/src/components/ui/data-display/Pagination.tsx +126 -126
- package/src/components/ui/data-display/PaymentInfoCard.tsx +193 -193
- package/src/components/ui/data-display/ScrollArea.tsx +59 -59
- package/src/components/ui/data-display/Separator.tsx +29 -29
- package/src/components/ui/data-display/Table.tsx +117 -117
- package/src/components/ui/data-display/Tabs.tsx +67 -67
- package/src/components/ui/feedback/CircularProgress.tsx +79 -79
- package/src/components/ui/feedback/DefaultCircularProgress.tsx +67 -67
- package/src/components/ui/feedback/LoadingOverlay.tsx +30 -30
- package/src/components/ui/feedback/Progress.tsx +40 -40
- package/src/components/ui/feedback/Skeleton.tsx +5 -5
- package/src/components/ui/feedback/Toast.tsx +104 -104
- package/src/components/ui/form/Calendar.tsx +228 -228
- package/src/components/ui/form/Checkbox.tsx +31 -31
- package/src/components/ui/form/ComboboxField.tsx +159 -159
- package/src/components/ui/form/DatePicker.tsx +100 -100
- package/src/components/ui/form/DateRangePicker.tsx +111 -111
- package/src/components/ui/form/FormField.tsx +133 -133
- package/src/components/ui/form/Input.tsx +20 -20
- package/src/components/ui/form/InputOtp.tsx +80 -80
- package/src/components/ui/form/PhoneInput.tsx +210 -210
- package/src/components/ui/form/RadioGroup.tsx +45 -45
- package/src/components/ui/form/Select.tsx +200 -200
- package/src/components/ui/form/Switch.tsx +32 -32
- package/src/components/ui/form/Textarea.tsx +19 -19
- package/src/components/ui/overlay/Command.tsx +185 -185
- package/src/components/ui/overlay/Dialog.tsx +153 -153
- package/src/components/ui/overlay/Popover.tsx +49 -49
- package/src/components/ui/overlay/Sheet.tsx +170 -170
- package/src/components/ui/overlay/Tooltip.tsx +62 -62
- package/src/components/widgets/ImageUpload/ImageCropModal.tsx +392 -392
- package/src/components/widgets/ImageUpload/ImageTooSmallModal.tsx +62 -62
- package/src/components/widgets/ImageUpload/ImageUpload.tsx +131 -131
- package/src/components/widgets/ImageUpload/index.ts +3 -3
- package/src/components/widgets/notifications/NotificationCard.tsx +73 -73
- package/src/handlers.ts +22 -22
- package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
- package/src/hooks/useAuthQueryKey.ts +32 -32
- package/src/hooks/useBrandLoadingIcon.tsx +18 -18
- package/src/hooks/useRouter.ts +38 -38
- package/src/http.ts +1 -1
- package/src/i18n/config.ts +17 -17
- package/src/i18n/country-language.ts +60 -60
- package/src/i18n/messages/en-us.ts +519 -519
- package/src/i18n/messages/es-es.ts +520 -520
- package/src/i18n/messages/index.ts +24 -24
- package/src/i18n/messages/pt-br.ts +543 -543
- package/src/i18n/normalize.ts +15 -15
- package/src/i18n/resolve-locale.ts +77 -77
- package/src/i18n.ts +10 -10
- package/src/index.ts +587 -584
- package/src/infra/http/api-fetch.ts +39 -39
- package/src/infra/route/parse-id.ts +9 -9
- package/src/infra/route/parse-numeric.ts +16 -16
- package/src/infra/route/safe-route-handler.ts +16 -16
- package/src/infra/route/search-params.ts +9 -9
- package/src/infra/utils/array.ts +167 -167
- package/src/infra/utils/date.ts +59 -59
- package/src/middleware.ts +4 -4
- package/src/modules/accounts/actions/account-management.action.ts +109 -109
- package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
- package/src/modules/accounts/actions/get-account-token.action.ts +8 -8
- package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
- package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
- package/src/modules/accounts/hooks/current-account.hook.tsx +26 -26
- package/src/modules/accounts/hooks/use-account-token.hook.tsx +14 -14
- package/src/modules/accounts/hooks/use-currency-formatter.hook.tsx +32 -32
- package/src/modules/accounts/hooks/useAccountManagement.ts +95 -95
- package/src/modules/accounts/hooks/useCurrencies.ts +18 -18
- package/src/modules/accounts/hooks/useTimezones.ts +18 -18
- package/src/modules/accounts/hooks/useViaCep.ts +25 -25
- package/src/modules/accounts/services/account-token.service.ts +52 -52
- package/src/modules/accounts/services/account.service.ts +243 -243
- package/src/modules/accounts/types.ts +230 -230
- package/src/modules/auth/actions/social-google-login.action.ts +12 -12
- package/src/modules/auth/actions/social-google-onboarding.action.ts +13 -13
- package/src/modules/auth/actions/unlink-google.action.ts +8 -8
- package/src/modules/auth/actions/validate-session.action.ts +70 -70
- package/src/modules/auth/actions/verify-two-factor.action.ts +19 -19
- package/src/modules/auth/hooks/login.hook.tsx +13 -13
- package/src/modules/auth/hooks/logout.hook.tsx +11 -11
- package/src/modules/auth/hooks/register.hook.tsx +11 -11
- package/src/modules/auth/hooks/social-google-login.hook.tsx +13 -13
- package/src/modules/auth/hooks/social-google-onboarding.hook.tsx +13 -13
- package/src/modules/auth/hooks/unlink-google.hook.tsx +13 -13
- package/src/modules/auth/hooks/useManagementPermissions.ts +52 -52
- package/src/modules/auth/hooks/useUserQuery.ts +103 -103
- package/src/modules/auth/types/management-permission.type.ts +14 -14
- package/src/modules/auth/utils/assert-management-permission.ts +56 -56
- package/src/modules/auth/utils/assert-management-subscription.ts +38 -38
- package/src/modules/auth/utils/assert-paid-subscription.ts +47 -47
- package/src/modules/auth/utils/assert-subscription-addon.ts +42 -42
- package/src/modules/auth/utils/build-wl-override.ts +43 -43
- package/src/modules/auth/utils/require-token-not-expired.ts +53 -53
- package/src/modules/auth/utils/require-valid-session.ts +35 -35
- package/src/modules/cards/actions/create-card.action.ts +9 -9
- package/src/modules/cards/actions/create-setup-intent.action.ts +8 -8
- package/src/modules/cards/actions/delete-card.action.ts +8 -8
- package/src/modules/cards/actions/set-default-card.action.ts +8 -8
- package/src/modules/cards/handlers/find-card-by-id.handler.ts +15 -15
- package/src/modules/cards/handlers/list-cards.handler.ts +10 -10
- package/src/modules/cards/hooks/card-by-id.hook.ts +17 -17
- package/src/modules/cards/hooks/cards.hook.ts +22 -22
- package/src/modules/cards/hooks/create-card.hook.ts +30 -30
- package/src/modules/cards/hooks/create-setup-intent.hook.ts +11 -11
- package/src/modules/cards/hooks/delete-card.hook.ts +52 -52
- package/src/modules/cards/hooks/delete-confirmation.hook.ts +40 -40
- package/src/modules/cards/hooks/handle-delete-card.hook.ts +47 -47
- package/src/modules/cards/hooks/set-default-card.hook.ts +55 -55
- package/src/modules/cards/services/cards.service.ts +136 -136
- package/src/modules/cards/types.ts +52 -52
- package/src/modules/charges/actions/charge-action.action.ts +13 -13
- package/src/modules/charges/handlers/find-charge-by-id.handler.ts +14 -14
- package/src/modules/charges/handlers/list-charges.handler.ts +15 -15
- package/src/modules/charges/hooks/charge-action.hook.ts +24 -24
- package/src/modules/charges/hooks/charge-by-id.hook.ts +19 -19
- package/src/modules/charges/hooks/charges.hook.ts +19 -19
- package/src/modules/charges/services/charges.service.ts +63 -63
- package/src/modules/charges/types/charge.type.ts +68 -68
- package/src/modules/ia-credits/handlers/list-ia-credits.handler.ts +14 -14
- package/src/modules/ia-credits/hooks/ia-credits.hook.ts +103 -103
- package/src/modules/images/actions/process-image.action.ts +40 -40
- package/src/modules/images/constants/image.constants.ts +11 -11
- package/src/modules/images/hooks/use-image-upload.hook.ts +153 -153
- package/src/modules/images/services/image-processing.service.ts +75 -75
- package/src/modules/images/types/image.type.ts +54 -54
- package/src/modules/images/utils/base64.ts +26 -26
- package/src/modules/images/utils/compress-image.ts +20 -20
- package/src/modules/images/utils/crop-image.ts +68 -68
- package/src/modules/images/utils/validate-image.ts +86 -86
- package/src/modules/pages/constants/query-keys.constants.ts +1 -1
- package/src/modules/pages/handlers/count-pages.handler.ts +12 -12
- package/src/modules/pages/hooks/count-pages.hook.ts +21 -21
- package/src/modules/pages/services/pages.service.ts +27 -27
- package/src/modules/plans/handlers/find-plan-by-id.handler.ts +14 -14
- package/src/modules/plans/handlers/list-plans.handler.ts +22 -22
- package/src/modules/plans/hooks/list-plans.hook.ts +23 -23
- package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +14 -14
- package/src/modules/plans/hooks/use-plan-by-id.hook.ts +39 -39
- package/src/modules/plans/services/plans.service.ts +136 -136
- package/src/modules/plans/types/plan.type.ts +79 -79
- package/src/modules/plans/utils/map-api-plan-to-ui.ts +167 -167
- package/src/modules/projects/actions/add-project-user.action.ts +9 -9
- package/src/modules/projects/actions/create-project.action.ts +9 -9
- package/src/modules/projects/actions/delete-project.action.ts +8 -8
- package/src/modules/projects/actions/find-project.action.ts +8 -8
- package/src/modules/projects/actions/list-project-users.action.ts +9 -9
- package/src/modules/projects/actions/list-projects.action.ts +16 -16
- package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
- package/src/modules/projects/actions/update-project.action.ts +9 -9
- package/src/modules/projects/handlers/find-project.handler.ts +15 -15
- package/src/modules/projects/handlers/list-all-account-users.handler.ts +23 -23
- package/src/modules/projects/handlers/list-available-users.handler.ts +26 -26
- package/src/modules/projects/handlers/list-project-users.handler.ts +26 -26
- package/src/modules/projects/handlers/list-projects.handler.ts +23 -23
- package/src/modules/projects/hooks/add-project-user.hook.ts +72 -72
- package/src/modules/projects/hooks/create-project.hook.ts +120 -120
- package/src/modules/projects/hooks/delete-project.hook.ts +58 -58
- package/src/modules/projects/hooks/find-project.hook.ts +18 -18
- package/src/modules/projects/hooks/list-all-account-users.hook.ts +40 -40
- package/src/modules/projects/hooks/list-available-users.hook.ts +39 -39
- package/src/modules/projects/hooks/list-infinite-projects.hook.ts +44 -44
- package/src/modules/projects/hooks/list-project-users.hook.ts +39 -39
- package/src/modules/projects/hooks/list-projects.hook.ts +23 -23
- package/src/modules/projects/hooks/remove-project-user.hook.ts +72 -72
- package/src/modules/projects/hooks/update-project.hook.ts +86 -86
- package/src/modules/projects/services/project-users.service.ts +3 -2
- package/src/modules/projects/services/projects.service.ts +156 -156
- package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
- package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
- package/src/modules/subscriptions/actions/update-subscription-payment.action.ts +13 -13
- package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +14 -14
- package/src/modules/subscriptions/constants/query-keys.constants.ts +3 -3
- package/src/modules/subscriptions/constants/subscription.constants.ts +1 -1
- package/src/modules/subscriptions/handlers/list-subscriptions.handler.ts +17 -17
- package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
- package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +22 -22
- package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +22 -22
- package/src/modules/subscriptions/hooks/update-subscription-payment.hook.ts +25 -25
- package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +28 -28
- package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +44 -44
- package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
- package/src/modules/subscriptions/types/calculate-subscription.type.ts +116 -116
- package/src/modules/subscriptions/types/pix-pending.type.ts +38 -38
- package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
- package/src/modules/subscriptions/utils/get-subscription-cancellation-state.ts +37 -37
- package/src/modules/subscriptions/utils/get-subscription-expiry-date.ts +33 -33
- package/src/modules/subscriptions/utils/has-subscription-expired.ts +11 -11
- package/src/modules/subscriptions/utils/periodicity.ts +79 -79
- package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
- package/src/modules/users/action/find-user-by-id.action.ts +8 -8
- package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
- package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
- package/src/modules/users/handlers/list-messages.handler.ts +39 -39
- package/src/modules/users/hooks/messages.hook.ts +69 -69
- package/src/modules/users/services/messages.service.ts +49 -49
- package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
- package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
- package/src/modules/whitelabel/schema.ts +84 -84
- package/src/modules/whitelabel/utils/normalize-hostname.ts +26 -26
- package/src/providers/auth.provider.tsx +267 -264
- package/src/providers/navigation.provider.tsx +99 -99
- package/src/providers/whitelabel.provider.tsx +90 -90
- package/src/route.ts +4 -4
- package/src/store/useAccountModals.ts +85 -85
- package/src/store/useBuyCreditsModal.ts +21 -21
- package/src/store/useCreditsDisabledModal.ts +11 -11
- package/src/store/useDesktopSidebarStore.ts +47 -47
- package/src/store/useHexaPromoModal.ts +13 -0
- package/src/store/useMdSidebarStore.ts +34 -34
- package/src/store/usePaidPlanRequiredModal.ts +19 -19
- package/src/utils/constants/br-states.ts +29 -29
- package/src/utils/cookies/hexa-promo.ts +114 -0
- package/src/utils/countries.ts +224 -224
- package/src/utils/format/currency.ts +70 -70
- package/src/utils/intl/cookie-domain.ts +29 -29
- package/src/utils/intl/locale-cookie.ts +18 -18
- package/src/utils/next-navigation.ts +7 -7
- package/src/utils/redirect.ts +78 -78
- package/src/utils/safeMutationAction.ts +24 -24
- package/src/utils/safeServerAction.ts +21 -21
- package/src/utils/withAction.ts +13 -13
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import "server-only";
|
|
2
|
-
|
|
3
|
-
import { ApiError } from "../../../infra/api/types";
|
|
4
|
-
import { listSubscriptionsAction } from "../../subscriptions/actions/list-subscriptions.action";
|
|
5
|
-
import { getSubscriptionExpiryDate } from "../../subscriptions/utils/get-subscription-expiry-date";
|
|
6
|
-
|
|
7
|
-
export async function assertManagementSubscription() {
|
|
8
|
-
const result = await listSubscriptionsAction({ active: true });
|
|
9
|
-
|
|
10
|
-
if (!result.success) {
|
|
11
|
-
throw new ApiError(
|
|
12
|
-
result.error || "Não foi possível validar a assinatura atual",
|
|
13
|
-
"SUBSCRIPTION_CONTEXT_FAILED",
|
|
14
|
-
403,
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const subscription = result.data?.data?.[0];
|
|
19
|
-
|
|
20
|
-
if (!subscription) {
|
|
21
|
-
throw new ApiError(
|
|
22
|
-
"Nenhuma assinatura ativa encontrada. Assine um plano para continuar.",
|
|
23
|
-
"SUBSCRIPTION_NOT_FOUND",
|
|
24
|
-
403,
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const expiryDate = getSubscriptionExpiryDate(subscription);
|
|
29
|
-
const isExpired = !!expiryDate && Date.now() >= expiryDate.getTime();
|
|
30
|
-
|
|
31
|
-
if (isExpired) {
|
|
32
|
-
throw new ApiError(
|
|
33
|
-
"Sua assinatura está vencida. Assine um novo plano para continuar.",
|
|
34
|
-
"SUBSCRIPTION_EXPIRED",
|
|
35
|
-
403,
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
1
|
+
import "server-only";
|
|
2
|
+
|
|
3
|
+
import { ApiError } from "../../../infra/api/types";
|
|
4
|
+
import { listSubscriptionsAction } from "../../subscriptions/actions/list-subscriptions.action";
|
|
5
|
+
import { getSubscriptionExpiryDate } from "../../subscriptions/utils/get-subscription-expiry-date";
|
|
6
|
+
|
|
7
|
+
export async function assertManagementSubscription() {
|
|
8
|
+
const result = await listSubscriptionsAction({ active: true });
|
|
9
|
+
|
|
10
|
+
if (!result.success) {
|
|
11
|
+
throw new ApiError(
|
|
12
|
+
result.error || "Não foi possível validar a assinatura atual",
|
|
13
|
+
"SUBSCRIPTION_CONTEXT_FAILED",
|
|
14
|
+
403,
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const subscription = result.data?.data?.[0];
|
|
19
|
+
|
|
20
|
+
if (!subscription) {
|
|
21
|
+
throw new ApiError(
|
|
22
|
+
"Nenhuma assinatura ativa encontrada. Assine um plano para continuar.",
|
|
23
|
+
"SUBSCRIPTION_NOT_FOUND",
|
|
24
|
+
403,
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const expiryDate = getSubscriptionExpiryDate(subscription);
|
|
29
|
+
const isExpired = !!expiryDate && Date.now() >= expiryDate.getTime();
|
|
30
|
+
|
|
31
|
+
if (isExpired) {
|
|
32
|
+
throw new ApiError(
|
|
33
|
+
"Sua assinatura está vencida. Assine um novo plano para continuar.",
|
|
34
|
+
"SUBSCRIPTION_EXPIRED",
|
|
35
|
+
403,
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import "server-only";
|
|
2
|
-
|
|
3
|
-
import { ApiError } from "../../../infra/api/types";
|
|
4
|
-
import { listSubscriptionsAction } from "../../subscriptions/actions/list-subscriptions.action";
|
|
5
|
-
import { getSubscriptionExpiryDate } from "../../subscriptions/utils/get-subscription-expiry-date";
|
|
6
|
-
|
|
7
|
-
export async function assertPaidSubscription() {
|
|
8
|
-
const result = await listSubscriptionsAction({ active: true });
|
|
9
|
-
|
|
10
|
-
if (!result.success) {
|
|
11
|
-
throw new ApiError(
|
|
12
|
-
result.error || "Não foi possível validar a assinatura atual",
|
|
13
|
-
"SUBSCRIPTION_CONTEXT_FAILED",
|
|
14
|
-
403,
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const subscription = result.data?.data?.[0];
|
|
19
|
-
|
|
20
|
-
if (!subscription) {
|
|
21
|
-
throw new ApiError(
|
|
22
|
-
"Nenhuma assinatura ativa encontrada. Assine um plano para continuar.",
|
|
23
|
-
"SUBSCRIPTION_NOT_FOUND",
|
|
24
|
-
403,
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const expiryDate = getSubscriptionExpiryDate(subscription);
|
|
29
|
-
const isExpired = !!expiryDate && Date.now() >= expiryDate.getTime();
|
|
30
|
-
|
|
31
|
-
if (isExpired) {
|
|
32
|
-
throw new ApiError(
|
|
33
|
-
"Sua assinatura está vencida. Assine um novo plano para continuar.",
|
|
34
|
-
"SUBSCRIPTION_EXPIRED",
|
|
35
|
-
403,
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (subscription.type === 'free' || subscription.id_plan === 5) {
|
|
41
|
-
throw new ApiError(
|
|
42
|
-
"Este recurso está disponível apenas para planos pagos. Faça upgrade do seu plano para continuar.",
|
|
43
|
-
"PAID_SUBSCRIPTION_REQUIRED",
|
|
44
|
-
403,
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
1
|
+
import "server-only";
|
|
2
|
+
|
|
3
|
+
import { ApiError } from "../../../infra/api/types";
|
|
4
|
+
import { listSubscriptionsAction } from "../../subscriptions/actions/list-subscriptions.action";
|
|
5
|
+
import { getSubscriptionExpiryDate } from "../../subscriptions/utils/get-subscription-expiry-date";
|
|
6
|
+
|
|
7
|
+
export async function assertPaidSubscription() {
|
|
8
|
+
const result = await listSubscriptionsAction({ active: true });
|
|
9
|
+
|
|
10
|
+
if (!result.success) {
|
|
11
|
+
throw new ApiError(
|
|
12
|
+
result.error || "Não foi possível validar a assinatura atual",
|
|
13
|
+
"SUBSCRIPTION_CONTEXT_FAILED",
|
|
14
|
+
403,
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const subscription = result.data?.data?.[0];
|
|
19
|
+
|
|
20
|
+
if (!subscription) {
|
|
21
|
+
throw new ApiError(
|
|
22
|
+
"Nenhuma assinatura ativa encontrada. Assine um plano para continuar.",
|
|
23
|
+
"SUBSCRIPTION_NOT_FOUND",
|
|
24
|
+
403,
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const expiryDate = getSubscriptionExpiryDate(subscription);
|
|
29
|
+
const isExpired = !!expiryDate && Date.now() >= expiryDate.getTime();
|
|
30
|
+
|
|
31
|
+
if (isExpired) {
|
|
32
|
+
throw new ApiError(
|
|
33
|
+
"Sua assinatura está vencida. Assine um novo plano para continuar.",
|
|
34
|
+
"SUBSCRIPTION_EXPIRED",
|
|
35
|
+
403,
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
if (subscription.type === 'free' || subscription.id_plan === 5) {
|
|
41
|
+
throw new ApiError(
|
|
42
|
+
"Este recurso está disponível apenas para planos pagos. Faça upgrade do seu plano para continuar.",
|
|
43
|
+
"PAID_SUBSCRIPTION_REQUIRED",
|
|
44
|
+
403,
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import "server-only";
|
|
2
|
-
|
|
3
|
-
import { ApiError } from "../../../infra/api/types";
|
|
4
|
-
import { listSubscriptionsAction } from "../../subscriptions/actions/list-subscriptions.action";
|
|
5
|
-
import type { AddonKindEnum } from "../../subscriptions/constants/addons.constants";
|
|
6
|
-
|
|
7
|
-
export async function assertSubscriptionAddon(
|
|
8
|
-
addonId: AddonKindEnum,
|
|
9
|
-
addonLabel: string,
|
|
10
|
-
) {
|
|
11
|
-
const result = await listSubscriptionsAction({ active: true });
|
|
12
|
-
|
|
13
|
-
if (!result.success) {
|
|
14
|
-
throw new ApiError(
|
|
15
|
-
result.error || "Não foi possível validar a assinatura atual",
|
|
16
|
-
"SUBSCRIPTION_CONTEXT_FAILED",
|
|
17
|
-
403,
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const subscription = result.data?.data?.[0];
|
|
22
|
-
|
|
23
|
-
if (!subscription) {
|
|
24
|
-
throw new ApiError(
|
|
25
|
-
`Nenhuma assinatura ativa encontrada. Para acessar este recurso, é necessário ter uma assinatura com ${addonLabel}.`,
|
|
26
|
-
"NO_ACTIVE_SUBSCRIPTION",
|
|
27
|
-
403,
|
|
28
|
-
);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const hasAddon = subscription?.items?.some(
|
|
32
|
-
(item) => item.id_addon === addonId,
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
if (!hasAddon) {
|
|
36
|
-
throw new ApiError(
|
|
37
|
-
`Sua assinatura não inclui ${addonLabel}. Faça upgrade do seu plano.`,
|
|
38
|
-
"ADDON_NOT_AVAILABLE",
|
|
39
|
-
403,
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
1
|
+
import "server-only";
|
|
2
|
+
|
|
3
|
+
import { ApiError } from "../../../infra/api/types";
|
|
4
|
+
import { listSubscriptionsAction } from "../../subscriptions/actions/list-subscriptions.action";
|
|
5
|
+
import type { AddonKindEnum } from "../../subscriptions/constants/addons.constants";
|
|
6
|
+
|
|
7
|
+
export async function assertSubscriptionAddon(
|
|
8
|
+
addonId: AddonKindEnum,
|
|
9
|
+
addonLabel: string,
|
|
10
|
+
) {
|
|
11
|
+
const result = await listSubscriptionsAction({ active: true });
|
|
12
|
+
|
|
13
|
+
if (!result.success) {
|
|
14
|
+
throw new ApiError(
|
|
15
|
+
result.error || "Não foi possível validar a assinatura atual",
|
|
16
|
+
"SUBSCRIPTION_CONTEXT_FAILED",
|
|
17
|
+
403,
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const subscription = result.data?.data?.[0];
|
|
22
|
+
|
|
23
|
+
if (!subscription) {
|
|
24
|
+
throw new ApiError(
|
|
25
|
+
`Nenhuma assinatura ativa encontrada. Para acessar este recurso, é necessário ter uma assinatura com ${addonLabel}.`,
|
|
26
|
+
"NO_ACTIVE_SUBSCRIPTION",
|
|
27
|
+
403,
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const hasAddon = subscription?.items?.some(
|
|
32
|
+
(item) => item.id_addon === addonId,
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
if (!hasAddon) {
|
|
36
|
+
throw new ApiError(
|
|
37
|
+
`Sua assinatura não inclui ${addonLabel}. Faça upgrade do seu plano.`,
|
|
38
|
+
"ADDON_NOT_AVAILABLE",
|
|
39
|
+
403,
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import 'server-only';
|
|
2
|
-
|
|
3
|
-
import type { RequestConfig } from '../../../infra/api/client';
|
|
4
|
-
import type { JWTPayload } from '../../users/schema';
|
|
5
|
-
import { findWhitelabel } from '../../whitelabel/actions/find-whitelabel.action';
|
|
6
|
-
import { whitelabelService } from '../../whitelabel/services/whitelabel.service';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Compara um `id_wl` com o whitelabel resolvido pelo hostname.
|
|
10
|
-
* Se forem diferentes (ex: admin com id_wl=1 num domínio de id_wl=30),
|
|
11
|
-
* retorna um RequestConfig com o override correto.
|
|
12
|
-
* Se forem iguais, retorna undefined (sem custo extra).
|
|
13
|
-
*/
|
|
14
|
-
export async function buildWlOverride(
|
|
15
|
-
jwtWlId: number,
|
|
16
|
-
): Promise<RequestConfig | undefined> {
|
|
17
|
-
try {
|
|
18
|
-
const { id: hostWlId } = await findWhitelabel();
|
|
19
|
-
|
|
20
|
-
if (jwtWlId !== hostWlId) {
|
|
21
|
-
const wlToken = await whitelabelService.getTokenByWhitelabelId(jwtWlId);
|
|
22
|
-
return { whiteLabelId: jwtWlId, authToken: wlToken };
|
|
23
|
-
}
|
|
24
|
-
} catch {
|
|
25
|
-
// Fallback to default whitelabel resolution
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Extrai `id_wl` do JWT cookie e delega para `buildWlOverride`.
|
|
33
|
-
*/
|
|
34
|
-
export async function buildWlOverrideFromJwt(
|
|
35
|
-
cookie: string,
|
|
36
|
-
): Promise<RequestConfig | undefined> {
|
|
37
|
-
try {
|
|
38
|
-
const payload = JSON.parse(atob(cookie.split('.')[1])) as JWTPayload;
|
|
39
|
-
return buildWlOverride(Number(payload.id_wl));
|
|
40
|
-
} catch {
|
|
41
|
-
return undefined;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
1
|
+
import 'server-only';
|
|
2
|
+
|
|
3
|
+
import type { RequestConfig } from '../../../infra/api/client';
|
|
4
|
+
import type { JWTPayload } from '../../users/schema';
|
|
5
|
+
import { findWhitelabel } from '../../whitelabel/actions/find-whitelabel.action';
|
|
6
|
+
import { whitelabelService } from '../../whitelabel/services/whitelabel.service';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Compara um `id_wl` com o whitelabel resolvido pelo hostname.
|
|
10
|
+
* Se forem diferentes (ex: admin com id_wl=1 num domínio de id_wl=30),
|
|
11
|
+
* retorna um RequestConfig com o override correto.
|
|
12
|
+
* Se forem iguais, retorna undefined (sem custo extra).
|
|
13
|
+
*/
|
|
14
|
+
export async function buildWlOverride(
|
|
15
|
+
jwtWlId: number,
|
|
16
|
+
): Promise<RequestConfig | undefined> {
|
|
17
|
+
try {
|
|
18
|
+
const { id: hostWlId } = await findWhitelabel();
|
|
19
|
+
|
|
20
|
+
if (jwtWlId !== hostWlId) {
|
|
21
|
+
const wlToken = await whitelabelService.getTokenByWhitelabelId(jwtWlId);
|
|
22
|
+
return { whiteLabelId: jwtWlId, authToken: wlToken };
|
|
23
|
+
}
|
|
24
|
+
} catch {
|
|
25
|
+
// Fallback to default whitelabel resolution
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Extrai `id_wl` do JWT cookie e delega para `buildWlOverride`.
|
|
33
|
+
*/
|
|
34
|
+
export async function buildWlOverrideFromJwt(
|
|
35
|
+
cookie: string,
|
|
36
|
+
): Promise<RequestConfig | undefined> {
|
|
37
|
+
try {
|
|
38
|
+
const payload = JSON.parse(atob(cookie.split('.')[1])) as JWTPayload;
|
|
39
|
+
return buildWlOverride(Number(payload.id_wl));
|
|
40
|
+
} catch {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
import 'server-only';
|
|
2
|
-
|
|
3
|
-
import { cookies } from 'next/headers';
|
|
4
|
-
import { decode } from '@greatapps/jwt';
|
|
5
|
-
import { ApiError } from '../../../infra/api/types';
|
|
6
|
-
|
|
7
|
-
const AUTH_COOKIE_NAME = 'greatapps';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Verifica se o JWT do cookie `greatapps` é válido (assinatura + expiração)
|
|
11
|
-
* sem bater no backend.
|
|
12
|
-
*
|
|
13
|
-
* Usa `@greatapps/jwt` decode que:
|
|
14
|
-
* 1. Valida a assinatura HMAC com `SECRET_JWT---{id_wl}`
|
|
15
|
-
* 2. Checa `exp` automaticamente (rejeita se expirou)
|
|
16
|
-
*
|
|
17
|
-
* - Se o token não existe → SESSION_INVALID 401
|
|
18
|
-
* - Se a assinatura é inválida → SESSION_INVALID 401
|
|
19
|
-
* - Se `exp` já passou → SESSION_INVALID 401
|
|
20
|
-
* - Se `SECRET_JWT` não está configurado → skip (não bloqueia)
|
|
21
|
-
*/
|
|
22
|
-
export async function requireTokenNotExpired(): Promise<void> {
|
|
23
|
-
if (process.env.DUMMY_AUTH_TOKEN) return;
|
|
24
|
-
|
|
25
|
-
const secretJwt = process.env.SECRET_JWT;
|
|
26
|
-
if (!secretJwt) return;
|
|
27
|
-
|
|
28
|
-
const cookieStore = await cookies();
|
|
29
|
-
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
|
30
|
-
|
|
31
|
-
if (!token) {
|
|
32
|
-
throw new ApiError('Sessão inválida ou expirada 1', 'SESSION_INVALID', 401);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
try {
|
|
36
|
-
const payload = JSON.parse(atob(token.split('.')[1]));
|
|
37
|
-
const idWl = payload.id_wl;
|
|
38
|
-
|
|
39
|
-
if (!idWl) {
|
|
40
|
-
throw new ApiError('Sessão inválida ou expirada 2', 'SESSION_INVALID', 401);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const secret = `${secretJwt}---${idWl}`;
|
|
44
|
-
const decoded = await decode(token, secret);
|
|
45
|
-
|
|
46
|
-
if (!decoded) {
|
|
47
|
-
throw new ApiError('Sessão inválida ou expirada 3', 'SESSION_INVALID', 401);
|
|
48
|
-
}
|
|
49
|
-
} catch (err) {
|
|
50
|
-
if (err instanceof ApiError) throw err;
|
|
51
|
-
throw new ApiError('Sessão inválida ou expirada 4', 'SESSION_INVALID', 401);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
1
|
+
import 'server-only';
|
|
2
|
+
|
|
3
|
+
import { cookies } from 'next/headers';
|
|
4
|
+
import { decode } from '@greatapps/jwt';
|
|
5
|
+
import { ApiError } from '../../../infra/api/types';
|
|
6
|
+
|
|
7
|
+
const AUTH_COOKIE_NAME = 'greatapps';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Verifica se o JWT do cookie `greatapps` é válido (assinatura + expiração)
|
|
11
|
+
* sem bater no backend.
|
|
12
|
+
*
|
|
13
|
+
* Usa `@greatapps/jwt` decode que:
|
|
14
|
+
* 1. Valida a assinatura HMAC com `SECRET_JWT---{id_wl}`
|
|
15
|
+
* 2. Checa `exp` automaticamente (rejeita se expirou)
|
|
16
|
+
*
|
|
17
|
+
* - Se o token não existe → SESSION_INVALID 401
|
|
18
|
+
* - Se a assinatura é inválida → SESSION_INVALID 401
|
|
19
|
+
* - Se `exp` já passou → SESSION_INVALID 401
|
|
20
|
+
* - Se `SECRET_JWT` não está configurado → skip (não bloqueia)
|
|
21
|
+
*/
|
|
22
|
+
export async function requireTokenNotExpired(): Promise<void> {
|
|
23
|
+
if (process.env.DUMMY_AUTH_TOKEN) return;
|
|
24
|
+
|
|
25
|
+
const secretJwt = process.env.SECRET_JWT;
|
|
26
|
+
if (!secretJwt) return;
|
|
27
|
+
|
|
28
|
+
const cookieStore = await cookies();
|
|
29
|
+
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
|
30
|
+
|
|
31
|
+
if (!token) {
|
|
32
|
+
throw new ApiError('Sessão inválida ou expirada 1', 'SESSION_INVALID', 401);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const payload = JSON.parse(atob(token.split('.')[1]));
|
|
37
|
+
const idWl = payload.id_wl;
|
|
38
|
+
|
|
39
|
+
if (!idWl) {
|
|
40
|
+
throw new ApiError('Sessão inválida ou expirada 2', 'SESSION_INVALID', 401);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const secret = `${secretJwt}---${idWl}`;
|
|
44
|
+
const decoded = await decode(token, secret);
|
|
45
|
+
|
|
46
|
+
if (!decoded) {
|
|
47
|
+
throw new ApiError('Sessão inválida ou expirada 3', 'SESSION_INVALID', 401);
|
|
48
|
+
}
|
|
49
|
+
} catch (err) {
|
|
50
|
+
if (err instanceof ApiError) throw err;
|
|
51
|
+
throw new ApiError('Sessão inválida ou expirada 4', 'SESSION_INVALID', 401);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
import 'server-only';
|
|
2
|
-
|
|
3
|
-
import { cache } from 'react';
|
|
4
|
-
|
|
5
|
-
import { ApiError } from '../../../infra/api/types';
|
|
6
|
-
import { getClientInfoFromRequest } from '../../../infra/utils/client-info';
|
|
7
|
-
import { authService } from '../services/auth.service';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Valida a sessão do usuário chamando POST /auth/keep no backend.
|
|
11
|
-
*
|
|
12
|
-
* Garante que o cookie `greatapps`:
|
|
13
|
-
* 1. Existe.
|
|
14
|
-
* 2. Corresponde a uma sessão registrada no banco (não foi forjado).
|
|
15
|
-
* 3. Ainda é considerada válida pelo backend (não foi revogada/expirada).
|
|
16
|
-
*
|
|
17
|
-
* Deduplicada por request via React.cache — múltiplas chamadas dentro do
|
|
18
|
-
* mesmo server action resultam em 1 round-trip ao backend, não N.
|
|
19
|
-
*
|
|
20
|
-
* Use em server actions sensíveis (mutações, billing, destrutivas).
|
|
21
|
-
* Prefira o wrapper `safeMutationAction` que já envelopa isto junto com
|
|
22
|
-
* o `safeServerAction` padrão.
|
|
23
|
-
*
|
|
24
|
-
* Em caso de erro de rede/backend, falha fechada (SESSION_INVALID 401).
|
|
25
|
-
*/
|
|
26
|
-
export const requireValidSession = cache(async (): Promise<void> => {
|
|
27
|
-
if (process.env.DUMMY_AUTH_TOKEN) return;
|
|
28
|
-
|
|
29
|
-
const clientInfo = await getClientInfoFromRequest();
|
|
30
|
-
const isValid = await authService.validateSession(clientInfo);
|
|
31
|
-
|
|
32
|
-
if (!isValid) {
|
|
33
|
-
throw new ApiError('Sessão inválida ou expirada', 'SESSION_INVALID', 401);
|
|
34
|
-
}
|
|
35
|
-
});
|
|
1
|
+
import 'server-only';
|
|
2
|
+
|
|
3
|
+
import { cache } from 'react';
|
|
4
|
+
|
|
5
|
+
import { ApiError } from '../../../infra/api/types';
|
|
6
|
+
import { getClientInfoFromRequest } from '../../../infra/utils/client-info';
|
|
7
|
+
import { authService } from '../services/auth.service';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Valida a sessão do usuário chamando POST /auth/keep no backend.
|
|
11
|
+
*
|
|
12
|
+
* Garante que o cookie `greatapps`:
|
|
13
|
+
* 1. Existe.
|
|
14
|
+
* 2. Corresponde a uma sessão registrada no banco (não foi forjado).
|
|
15
|
+
* 3. Ainda é considerada válida pelo backend (não foi revogada/expirada).
|
|
16
|
+
*
|
|
17
|
+
* Deduplicada por request via React.cache — múltiplas chamadas dentro do
|
|
18
|
+
* mesmo server action resultam em 1 round-trip ao backend, não N.
|
|
19
|
+
*
|
|
20
|
+
* Use em server actions sensíveis (mutações, billing, destrutivas).
|
|
21
|
+
* Prefira o wrapper `safeMutationAction` que já envelopa isto junto com
|
|
22
|
+
* o `safeServerAction` padrão.
|
|
23
|
+
*
|
|
24
|
+
* Em caso de erro de rede/backend, falha fechada (SESSION_INVALID 401).
|
|
25
|
+
*/
|
|
26
|
+
export const requireValidSession = cache(async (): Promise<void> => {
|
|
27
|
+
if (process.env.DUMMY_AUTH_TOKEN) return;
|
|
28
|
+
|
|
29
|
+
const clientInfo = await getClientInfoFromRequest();
|
|
30
|
+
const isValid = await authService.validateSession(clientInfo);
|
|
31
|
+
|
|
32
|
+
if (!isValid) {
|
|
33
|
+
throw new ApiError('Sessão inválida ou expirada', 'SESSION_INVALID', 401);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
'use server';
|
|
2
|
-
|
|
3
|
-
import { safeMutationAction } from '../../../utils/safeMutationAction';
|
|
4
|
-
import { cardsService } from '../services/cards.service';
|
|
5
|
-
import { CreateCardRequest } from '../types';
|
|
6
|
-
|
|
7
|
-
export async function createCardAction(data: CreateCardRequest) {
|
|
8
|
-
return safeMutationAction(() => cardsService.createCard(data));
|
|
9
|
-
}
|
|
1
|
+
'use server';
|
|
2
|
+
|
|
3
|
+
import { safeMutationAction } from '../../../utils/safeMutationAction';
|
|
4
|
+
import { cardsService } from '../services/cards.service';
|
|
5
|
+
import { CreateCardRequest } from '../types';
|
|
6
|
+
|
|
7
|
+
export async function createCardAction(data: CreateCardRequest) {
|
|
8
|
+
return safeMutationAction(() => cardsService.createCard(data));
|
|
9
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
'use server';
|
|
2
|
-
|
|
3
|
-
import { safeMutationAction } from '../../../utils/safeMutationAction';
|
|
4
|
-
import { cardsService } from '../services/cards.service';
|
|
5
|
-
|
|
6
|
-
export async function createSetupIntentAction() {
|
|
7
|
-
return safeMutationAction(() => cardsService.createSetupIntent());
|
|
8
|
-
}
|
|
1
|
+
'use server';
|
|
2
|
+
|
|
3
|
+
import { safeMutationAction } from '../../../utils/safeMutationAction';
|
|
4
|
+
import { cardsService } from '../services/cards.service';
|
|
5
|
+
|
|
6
|
+
export async function createSetupIntentAction() {
|
|
7
|
+
return safeMutationAction(() => cardsService.createSetupIntent());
|
|
8
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
'use server';
|
|
2
|
-
|
|
3
|
-
import { safeMutationAction } from '../../../utils/safeMutationAction';
|
|
4
|
-
import { cardsService } from '../services/cards.service';
|
|
5
|
-
|
|
6
|
-
export async function deleteCardAction(id: string) {
|
|
7
|
-
return safeMutationAction(() => cardsService.deleteCard(id));
|
|
8
|
-
}
|
|
1
|
+
'use server';
|
|
2
|
+
|
|
3
|
+
import { safeMutationAction } from '../../../utils/safeMutationAction';
|
|
4
|
+
import { cardsService } from '../services/cards.service';
|
|
5
|
+
|
|
6
|
+
export async function deleteCardAction(id: string) {
|
|
7
|
+
return safeMutationAction(() => cardsService.deleteCard(id));
|
|
8
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
'use server';
|
|
2
|
-
|
|
3
|
-
import { safeMutationAction } from '../../../utils/safeMutationAction';
|
|
4
|
-
import { cardsService } from '../services/cards.service';
|
|
5
|
-
|
|
6
|
-
export async function setDefaultCardAction(cardId: string) {
|
|
7
|
-
return safeMutationAction(() => cardsService.setDefaultCard(cardId));
|
|
8
|
-
}
|
|
1
|
+
'use server';
|
|
2
|
+
|
|
3
|
+
import { safeMutationAction } from '../../../utils/safeMutationAction';
|
|
4
|
+
import { cardsService } from '../services/cards.service';
|
|
5
|
+
|
|
6
|
+
export async function setDefaultCardAction(cardId: string) {
|
|
7
|
+
return safeMutationAction(() => cardsService.setDefaultCard(cardId));
|
|
8
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import 'server-only';
|
|
2
|
-
|
|
3
|
-
import type { NextRequest } from 'next/server';
|
|
4
|
-
import { parseId } from '../../../infra/route/parse-id';
|
|
5
|
-
import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
|
|
6
|
-
import { cardsService } from '../services/cards.service';
|
|
7
|
-
|
|
8
|
-
export function createFindCardByIdHandler() {
|
|
9
|
-
return async function GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
|
|
10
|
-
return safeRouteHandler(async () => {
|
|
11
|
-
const { id } = await params;
|
|
12
|
-
return cardsService.findCardById(parseId(id));
|
|
13
|
-
});
|
|
14
|
-
};
|
|
15
|
-
}
|
|
1
|
+
import 'server-only';
|
|
2
|
+
|
|
3
|
+
import type { NextRequest } from 'next/server';
|
|
4
|
+
import { parseId } from '../../../infra/route/parse-id';
|
|
5
|
+
import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
|
|
6
|
+
import { cardsService } from '../services/cards.service';
|
|
7
|
+
|
|
8
|
+
export function createFindCardByIdHandler() {
|
|
9
|
+
return async function GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
|
|
10
|
+
return safeRouteHandler(async () => {
|
|
11
|
+
const { id } = await params;
|
|
12
|
+
return cardsService.findCardById(parseId(id));
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import 'server-only';
|
|
2
|
-
|
|
3
|
-
import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
|
|
4
|
-
import { cardsService } from '../services/cards.service';
|
|
5
|
-
|
|
6
|
-
export function createListCardsHandler() {
|
|
7
|
-
return async function GET() {
|
|
8
|
-
return safeRouteHandler(() => cardsService.listCards());
|
|
9
|
-
};
|
|
10
|
-
}
|
|
1
|
+
import 'server-only';
|
|
2
|
+
|
|
3
|
+
import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
|
|
4
|
+
import { cardsService } from '../services/cards.service';
|
|
5
|
+
|
|
6
|
+
export function createListCardsHandler() {
|
|
7
|
+
return async function GET() {
|
|
8
|
+
return safeRouteHandler(() => cardsService.listCards());
|
|
9
|
+
};
|
|
10
|
+
}
|