@greatapps/common 1.1.631 → 1.1.633
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/navigation/SubscriptionBanner.mjs +1 -0
- package/dist/components/navigation/SubscriptionBanner.mjs.map +1 -1
- package/dist/modules/auth/utils/assert-management-subscription.mjs +3 -1
- package/dist/modules/auth/utils/assert-management-subscription.mjs.map +1 -1
- package/dist/modules/auth/utils/assert-paid-subscription.mjs +3 -1
- package/dist/modules/auth/utils/assert-paid-subscription.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs +2 -1
- package/dist/modules/subscriptions/hooks/use-cancelled-subscription-guard.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/navigation/SubscriptionBanner.tsx +2 -0
- package/src/modules/auth/utils/assert-management-subscription.ts +6 -1
- package/src/modules/auth/utils/assert-paid-subscription.ts +6 -1
- package/src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts +4 -1
|
@@ -27,6 +27,7 @@ function SubscriptionBanner({ onReactivate, onDetails }) {
|
|
|
27
27
|
if (isCancelled) {
|
|
28
28
|
return /* @__PURE__ */ jsx(CancelledSubscriptionBanner, { onReactivate });
|
|
29
29
|
}
|
|
30
|
+
if (subscription.type === "whitelabel") return null;
|
|
30
31
|
if (daysSinceDue > 0 && daysSinceDue <= SUBSCRIPTION_GRACE_PERIOD_DAYS) {
|
|
31
32
|
return /* @__PURE__ */ jsx(OverdueInvoiceBanner, { onDetails });
|
|
32
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/navigation/SubscriptionBanner.tsx"],"sourcesContent":["'use client';\n\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\nimport { useCharges } from '../../modules/charges/hooks/charges.hook';\nimport { SUBSCRIPTION_GRACE_PERIOD_DAYS } from '../../modules/subscriptions/constants/subscription.constants';\nimport { toCalendarDate, daysBetween } from '../../infra/utils/date';\nimport { OverdueInvoiceBanner } from './OverdueInvoiceBanner';\nimport { UpcomingInvoiceBanner } from './UpcomingInvoiceBanner';\nimport { CancelledSubscriptionBanner } from './CancelledSubscriptionBanner';\n\nconst UPCOMING_WINDOW_DAYS = 7;\nconst PAYMENT_METHOD_BOLETO = 2;\n\ninterface SubscriptionBannerProps {\n onReactivate?: () => void;\n onDetails?: () => void;\n}\n\nexport function SubscriptionBanner({ onReactivate, onDetails }: SubscriptionBannerProps) {\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\n const { data: pendingChargesData, isLoading: isLoadingCharges } = useCharges({ page: 1, limit: 1, status: [0] });\n\n if (isLoadingCharges) return null;\n if (!subscription?.date_due) return null;\n if (subscription.type === 'free' || subscription.type === 'trial') return null;\n\n const dueDate = toCalendarDate(subscription.date_due);\n const today = toCalendarDate(new Date());\n if (!dueDate || !today) return null;\n\n const daysSinceDue = daysBetween(dueDate, today);\n const daysToDue = daysBetween(today, dueDate);\n const hasPendingCharge = !!pendingChargesData?.data?.[0];\n const isBoleto = subscription.payment_method === PAYMENT_METHOD_BOLETO;\n\n // Cancelamento só é efetivo quando date_cancellation existe E já passou do dia de hoje\n // (comparação por calendar-day em horário local, via toCalendarDate).\n const cancellationDate = toCalendarDate(subscription.date_cancellation);\n const isCancelled = !!cancellationDate && today.getTime() >= cancellationDate.getTime();\n\n if (isCancelled) {\n return <CancelledSubscriptionBanner onReactivate={onReactivate} />;\n }\n\n if (daysSinceDue > 0 && daysSinceDue <= SUBSCRIPTION_GRACE_PERIOD_DAYS) {\n return <OverdueInvoiceBanner onDetails={onDetails} />;\n }\n\n if (isBoleto && hasPendingCharge && daysToDue >= 0 && daysToDue <= UPCOMING_WINDOW_DAYS) {\n return <UpcomingInvoiceBanner dueDate={dueDate} onDetails={onDetails} />;\n }\n\n return null;\n}\n"],"mappings":";AAyCW;AAvCX,SAAS,6BAA6B;AACtC,SAAS,kBAAkB;AAC3B,SAAS,sCAAsC;AAC/C,SAAS,gBAAgB,mBAAmB;AAC5C,SAAS,4BAA4B;AACrC,SAAS,6BAA6B;AACtC,SAAS,mCAAmC;AAE5C,MAAM,uBAAuB;AAC7B,MAAM,wBAAwB;AAOvB,SAAS,mBAAmB,EAAE,cAAc,UAAU,GAA4B;AACvF,QAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,sBAAsB;AAC3E,QAAM,EAAE,MAAM,oBAAoB,WAAW,iBAAiB,IAAI,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC;AAE/G,MAAI,iBAAkB,QAAO;AAC7B,MAAI,CAAC,cAAc,SAAU,QAAO;AACpC,MAAI,aAAa,SAAS,UAAU,aAAa,SAAS,QAAS,QAAO;AAE1E,QAAM,UAAU,eAAe,aAAa,QAAQ;AACpD,QAAM,QAAQ,eAAe,oBAAI,KAAK,CAAC;AACvC,MAAI,CAAC,WAAW,CAAC,MAAO,QAAO;AAE/B,QAAM,eAAe,YAAY,SAAS,KAAK;AAC/C,QAAM,YAAY,YAAY,OAAO,OAAO;AAC5C,QAAM,mBAAmB,CAAC,CAAC,oBAAoB,OAAO,CAAC;AACvD,QAAM,WAAW,aAAa,mBAAmB;AAIjD,QAAM,mBAAmB,eAAe,aAAa,iBAAiB;AACtE,QAAM,cAAc,CAAC,CAAC,oBAAoB,MAAM,QAAQ,KAAK,iBAAiB,QAAQ;AAEtF,MAAI,aAAa;AACf,WAAO,oBAAC,+BAA4B,cAA4B;AAAA,EAClE;AAEA,MAAI,eAAe,KAAK,gBAAgB,gCAAgC;AACtE,WAAO,oBAAC,wBAAqB,WAAsB;AAAA,EACrD;AAEA,MAAI,YAAY,oBAAoB,aAAa,KAAK,aAAa,sBAAsB;AACvF,WAAO,oBAAC,yBAAsB,SAAkB,WAAsB;AAAA,EACxE;AAEA,SAAO;AACT;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/navigation/SubscriptionBanner.tsx"],"sourcesContent":["'use client';\n\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\nimport { useCharges } from '../../modules/charges/hooks/charges.hook';\nimport { SUBSCRIPTION_GRACE_PERIOD_DAYS } from '../../modules/subscriptions/constants/subscription.constants';\nimport { toCalendarDate, daysBetween } from '../../infra/utils/date';\nimport { OverdueInvoiceBanner } from './OverdueInvoiceBanner';\nimport { UpcomingInvoiceBanner } from './UpcomingInvoiceBanner';\nimport { CancelledSubscriptionBanner } from './CancelledSubscriptionBanner';\n\nconst UPCOMING_WINDOW_DAYS = 7;\nconst PAYMENT_METHOD_BOLETO = 2;\n\ninterface SubscriptionBannerProps {\n onReactivate?: () => void;\n onDetails?: () => void;\n}\n\nexport function SubscriptionBanner({ onReactivate, onDetails }: SubscriptionBannerProps) {\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\n const { data: pendingChargesData, isLoading: isLoadingCharges } = useCharges({ page: 1, limit: 1, status: [0] });\n\n if (isLoadingCharges) return null;\n if (!subscription?.date_due) return null;\n if (subscription.type === 'free' || subscription.type === 'trial') return null;\n\n const dueDate = toCalendarDate(subscription.date_due);\n const today = toCalendarDate(new Date());\n if (!dueDate || !today) return null;\n\n const daysSinceDue = daysBetween(dueDate, today);\n const daysToDue = daysBetween(today, dueDate);\n const hasPendingCharge = !!pendingChargesData?.data?.[0];\n const isBoleto = subscription.payment_method === PAYMENT_METHOD_BOLETO;\n\n // Cancelamento só é efetivo quando date_cancellation existe E já passou do dia de hoje\n // (comparação por calendar-day em horário local, via toCalendarDate).\n const cancellationDate = toCalendarDate(subscription.date_cancellation);\n const isCancelled = !!cancellationDate && today.getTime() >= cancellationDate.getTime();\n\n if (isCancelled) {\n return <CancelledSubscriptionBanner onReactivate={onReactivate} />;\n }\n\n if (subscription.type === 'whitelabel') return null;\n\n if (daysSinceDue > 0 && daysSinceDue <= SUBSCRIPTION_GRACE_PERIOD_DAYS) {\n return <OverdueInvoiceBanner onDetails={onDetails} />;\n }\n\n if (isBoleto && hasPendingCharge && daysToDue >= 0 && daysToDue <= UPCOMING_WINDOW_DAYS) {\n return <UpcomingInvoiceBanner dueDate={dueDate} onDetails={onDetails} />;\n }\n\n return null;\n}\n"],"mappings":";AAyCW;AAvCX,SAAS,6BAA6B;AACtC,SAAS,kBAAkB;AAC3B,SAAS,sCAAsC;AAC/C,SAAS,gBAAgB,mBAAmB;AAC5C,SAAS,4BAA4B;AACrC,SAAS,6BAA6B;AACtC,SAAS,mCAAmC;AAE5C,MAAM,uBAAuB;AAC7B,MAAM,wBAAwB;AAOvB,SAAS,mBAAmB,EAAE,cAAc,UAAU,GAA4B;AACvF,QAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,sBAAsB;AAC3E,QAAM,EAAE,MAAM,oBAAoB,WAAW,iBAAiB,IAAI,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC;AAE/G,MAAI,iBAAkB,QAAO;AAC7B,MAAI,CAAC,cAAc,SAAU,QAAO;AACpC,MAAI,aAAa,SAAS,UAAU,aAAa,SAAS,QAAS,QAAO;AAE1E,QAAM,UAAU,eAAe,aAAa,QAAQ;AACpD,QAAM,QAAQ,eAAe,oBAAI,KAAK,CAAC;AACvC,MAAI,CAAC,WAAW,CAAC,MAAO,QAAO;AAE/B,QAAM,eAAe,YAAY,SAAS,KAAK;AAC/C,QAAM,YAAY,YAAY,OAAO,OAAO;AAC5C,QAAM,mBAAmB,CAAC,CAAC,oBAAoB,OAAO,CAAC;AACvD,QAAM,WAAW,aAAa,mBAAmB;AAIjD,QAAM,mBAAmB,eAAe,aAAa,iBAAiB;AACtE,QAAM,cAAc,CAAC,CAAC,oBAAoB,MAAM,QAAQ,KAAK,iBAAiB,QAAQ;AAEtF,MAAI,aAAa;AACf,WAAO,oBAAC,+BAA4B,cAA4B;AAAA,EAClE;AAEA,MAAI,aAAa,SAAS,aAAc,QAAO;AAE/C,MAAI,eAAe,KAAK,gBAAgB,gCAAgC;AACtE,WAAO,oBAAC,wBAAqB,WAAsB;AAAA,EACrD;AAEA,MAAI,YAAY,oBAAoB,aAAa,KAAK,aAAa,sBAAsB;AACvF,WAAO,oBAAC,yBAAsB,SAAkB,WAAsB;AAAA,EACxE;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -19,7 +19,9 @@ async function assertManagementSubscription() {
|
|
|
19
19
|
403
|
|
20
20
|
);
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
const isWhitelabelType = subscription?.type === "whitelabel";
|
|
23
|
+
const isExpired = isWhitelabelType ? !!subscription?.date_cancellation && /* @__PURE__ */ new Date() >= new Date(subscription.date_cancellation) : hasSubscriptionExpired(subscription?.date_due);
|
|
24
|
+
if (isExpired) {
|
|
23
25
|
throw new ApiError(
|
|
24
26
|
"Sua assinatura est\xE1 vencida. Assine um novo plano para continuar.",
|
|
25
27
|
"SUBSCRIPTION_EXPIRED",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/auth/utils/assert-management-subscription.ts"],"sourcesContent":["import \"server-only\";\n\nimport { ApiError } from \"../../../infra/api/types\";\nimport { listSubscriptionsAction } from \"../../subscriptions/actions/list-subscriptions.action\";\nimport { hasSubscriptionExpired } from \"../../subscriptions/utils/has-subscription-expired\";\n\nexport async function assertManagementSubscription() {\n const result = await listSubscriptionsAction({ active: true });\n\n if (!result.success) {\n throw new ApiError(\n result.error || \"Não foi possível validar a assinatura atual\",\n \"SUBSCRIPTION_CONTEXT_FAILED\",\n 403,\n );\n }\n\n const subscription = result.data?.data?.[0];\n\n if (!subscription) {\n throw new ApiError(\n \"Nenhuma assinatura ativa encontrada. Assine um plano para continuar.\",\n \"SUBSCRIPTION_NOT_FOUND\",\n 403,\n );\n }\n\n
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/auth/utils/assert-management-subscription.ts"],"sourcesContent":["import \"server-only\";\n\nimport { ApiError } from \"../../../infra/api/types\";\nimport { listSubscriptionsAction } from \"../../subscriptions/actions/list-subscriptions.action\";\nimport { hasSubscriptionExpired } from \"../../subscriptions/utils/has-subscription-expired\";\n\nexport async function assertManagementSubscription() {\n const result = await listSubscriptionsAction({ active: true });\n\n if (!result.success) {\n throw new ApiError(\n result.error || \"Não foi possível validar a assinatura atual\",\n \"SUBSCRIPTION_CONTEXT_FAILED\",\n 403,\n );\n }\n\n const subscription = result.data?.data?.[0];\n\n if (!subscription) {\n throw new ApiError(\n \"Nenhuma assinatura ativa encontrada. Assine um plano para continuar.\",\n \"SUBSCRIPTION_NOT_FOUND\",\n 403,\n );\n }\n\n const isWhitelabelType = subscription?.type === 'whitelabel';\n const isExpired = isWhitelabelType\n ? !!subscription?.date_cancellation && new Date() >= new Date(subscription.date_cancellation)\n : hasSubscriptionExpired(subscription?.date_due);\n\n if (isExpired) {\n throw new ApiError(\n \"Sua assinatura está vencida. Assine um novo plano para continuar.\",\n \"SUBSCRIPTION_EXPIRED\",\n 403,\n );\n }\n}\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,gBAAgB;AACzB,SAAS,+BAA+B;AACxC,SAAS,8BAA8B;AAEvC,eAAsB,+BAA+B;AACnD,QAAM,SAAS,MAAM,wBAAwB,EAAE,QAAQ,KAAK,CAAC;AAE7D,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,OAAO,SAAS;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,MAAM,OAAO,CAAC;AAE1C,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,cAAc,SAAS;AAChD,QAAM,YAAY,mBACd,CAAC,CAAC,cAAc,qBAAqB,oBAAI,KAAK,KAAK,IAAI,KAAK,aAAa,iBAAiB,IAC1F,uBAAuB,cAAc,QAAQ;AAEjD,MAAI,WAAW;AACb,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -19,7 +19,9 @@ async function assertPaidSubscription() {
|
|
|
19
19
|
403
|
|
20
20
|
);
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
const isWhitelabelType = subscription.type === "whitelabel";
|
|
23
|
+
const isExpired = isWhitelabelType ? !!subscription.date_cancellation && /* @__PURE__ */ new Date() >= new Date(subscription.date_cancellation) : hasSubscriptionExpired(subscription.date_due);
|
|
24
|
+
if (isExpired) {
|
|
23
25
|
throw new ApiError(
|
|
24
26
|
"Sua assinatura est\xE1 vencida. Assine um novo plano para continuar.",
|
|
25
27
|
"SUBSCRIPTION_EXPIRED",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/auth/utils/assert-paid-subscription.ts"],"sourcesContent":["import \"server-only\";\n\nimport { ApiError } from \"../../../infra/api/types\";\nimport { listSubscriptionsAction } from \"../../subscriptions/actions/list-subscriptions.action\";\nimport { hasSubscriptionExpired } from \"../../subscriptions/utils/has-subscription-expired\";\n\nexport async function assertPaidSubscription() {\n const result = await listSubscriptionsAction({ active: true });\n\n if (!result.success) {\n throw new ApiError(\n result.error || \"Não foi possível validar a assinatura atual\",\n \"SUBSCRIPTION_CONTEXT_FAILED\",\n 403,\n );\n }\n\n const subscription = result.data?.data?.[0];\n\n if (!subscription) {\n throw new ApiError(\n \"Nenhuma assinatura ativa encontrada. Assine um plano para continuar.\",\n \"SUBSCRIPTION_NOT_FOUND\",\n 403,\n );\n }\n\n
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/auth/utils/assert-paid-subscription.ts"],"sourcesContent":["import \"server-only\";\n\nimport { ApiError } from \"../../../infra/api/types\";\nimport { listSubscriptionsAction } from \"../../subscriptions/actions/list-subscriptions.action\";\nimport { hasSubscriptionExpired } from \"../../subscriptions/utils/has-subscription-expired\";\n\nexport async function assertPaidSubscription() {\n const result = await listSubscriptionsAction({ active: true });\n\n if (!result.success) {\n throw new ApiError(\n result.error || \"Não foi possível validar a assinatura atual\",\n \"SUBSCRIPTION_CONTEXT_FAILED\",\n 403,\n );\n }\n\n const subscription = result.data?.data?.[0];\n\n if (!subscription) {\n throw new ApiError(\n \"Nenhuma assinatura ativa encontrada. Assine um plano para continuar.\",\n \"SUBSCRIPTION_NOT_FOUND\",\n 403,\n );\n }\n\n const isWhitelabelType = subscription.type === 'whitelabel';\n const isExpired = isWhitelabelType\n ? !!subscription.date_cancellation && new Date() >= new Date(subscription.date_cancellation)\n : hasSubscriptionExpired(subscription.date_due);\n\n if (isExpired) {\n throw new ApiError(\n \"Sua assinatura está vencida. Assine um novo plano para continuar.\",\n \"SUBSCRIPTION_EXPIRED\",\n 403,\n );\n }\n\n \n if (subscription.type === 'free' || subscription.id_plan === 5) {\n throw new ApiError(\n \"Este recurso está disponível apenas para planos pagos. Faça upgrade do seu plano para continuar.\",\n \"PAID_SUBSCRIPTION_REQUIRED\",\n 403,\n );\n }\n}\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,gBAAgB;AACzB,SAAS,+BAA+B;AACxC,SAAS,8BAA8B;AAEvC,eAAsB,yBAAyB;AAC7C,QAAM,SAAS,MAAM,wBAAwB,EAAE,QAAQ,KAAK,CAAC;AAE7D,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,OAAO,SAAS;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,MAAM,OAAO,CAAC;AAE1C,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,aAAa,SAAS;AAC/C,QAAM,YAAY,mBACd,CAAC,CAAC,aAAa,qBAAqB,oBAAI,KAAK,KAAK,IAAI,KAAK,aAAa,iBAAiB,IACzF,uBAAuB,aAAa,QAAQ;AAEhD,MAAI,WAAW;AACb,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa,SAAS,UAAU,aAAa,YAAY,GAAG;AAC9D,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -12,7 +12,8 @@ function useCancelledSubscriptionGuard() {
|
|
|
12
12
|
data: { data: [subscription] = [] } = {}
|
|
13
13
|
} = useActiveSubscription();
|
|
14
14
|
const isViewer = user?.profile === UserProfile.viewer;
|
|
15
|
-
const
|
|
15
|
+
const isWhitelabelType = subscription?.type === "whitelabel";
|
|
16
|
+
const isCancelledSubscription = isWhitelabelType ? !!subscription?.date_cancellation && /* @__PURE__ */ new Date() >= new Date(subscription.date_cancellation) : hasSubscriptionExpired(subscription?.date_due);
|
|
16
17
|
const shouldBlockManagementAction = !isViewer && isCancelledSubscription;
|
|
17
18
|
const guardAction = useCallback(
|
|
18
19
|
(action) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts"],"sourcesContent":["'use client';\n\nimport { useCallback } from 'react';\nimport { UserProfile } from '../../users/schema';\nimport { useAuth } from '../../../providers/auth.provider';\nimport { useModalManager } from '../../../store/useModalManager';\nimport { useActiveSubscription } from './find-active-subscription.hook';\nimport { hasSubscriptionExpired } from '../utils/has-subscription-expired';\n\nexport function useCancelledSubscriptionGuard() {\n const { user } = useAuth();\n const { openModal } = useModalManager();\n const {\n data: { data: [subscription] = [] } = {},\n } = useActiveSubscription();\n\n const isViewer = user?.profile === UserProfile.viewer;\n const isCancelledSubscription = hasSubscriptionExpired(subscription?.date_due);\n const shouldBlockManagementAction = !isViewer && isCancelledSubscription;\n\n const guardAction = useCallback(\n (action?: () => void) => {\n if (shouldBlockManagementAction) {\n openModal('subscriptionExpiredModal');\n return false;\n }\n\n action?.();\n return true;\n },\n [openModal, shouldBlockManagementAction]\n );\n\n return {\n isCancelledSubscription,\n shouldBlockManagementAction,\n guardAction,\n };\n}\n"],"mappings":";AAEA,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AACtC,SAAS,8BAA8B;AAEhC,SAAS,gCAAgC;AAC9C,QAAM,EAAE,KAAK,IAAI,QAAQ;AACzB,QAAM,EAAE,UAAU,IAAI,gBAAgB;AACtC,QAAM;AAAA,IACJ,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACzC,IAAI,sBAAsB;AAE1B,QAAM,WAAW,MAAM,YAAY,YAAY;AAC/C,QAAM,0BAA0B,uBAAuB,cAAc,QAAQ;
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/subscriptions/hooks/use-cancelled-subscription-guard.ts"],"sourcesContent":["'use client';\n\nimport { useCallback } from 'react';\nimport { UserProfile } from '../../users/schema';\nimport { useAuth } from '../../../providers/auth.provider';\nimport { useModalManager } from '../../../store/useModalManager';\nimport { useActiveSubscription } from './find-active-subscription.hook';\nimport { hasSubscriptionExpired } from '../utils/has-subscription-expired';\n\nexport function useCancelledSubscriptionGuard() {\n const { user } = useAuth();\n const { openModal } = useModalManager();\n const {\n data: { data: [subscription] = [] } = {},\n } = useActiveSubscription();\n\n const isViewer = user?.profile === UserProfile.viewer;\n const isWhitelabelType = subscription?.type === 'whitelabel';\n const isCancelledSubscription = isWhitelabelType\n ? !!subscription?.date_cancellation && new Date() >= new Date(subscription.date_cancellation)\n : hasSubscriptionExpired(subscription?.date_due);\n const shouldBlockManagementAction = !isViewer && isCancelledSubscription;\n\n const guardAction = useCallback(\n (action?: () => void) => {\n if (shouldBlockManagementAction) {\n openModal('subscriptionExpiredModal');\n return false;\n }\n\n action?.();\n return true;\n },\n [openModal, shouldBlockManagementAction]\n );\n\n return {\n isCancelledSubscription,\n shouldBlockManagementAction,\n guardAction,\n };\n}\n"],"mappings":";AAEA,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AACtC,SAAS,8BAA8B;AAEhC,SAAS,gCAAgC;AAC9C,QAAM,EAAE,KAAK,IAAI,QAAQ;AACzB,QAAM,EAAE,UAAU,IAAI,gBAAgB;AACtC,QAAM;AAAA,IACJ,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACzC,IAAI,sBAAsB;AAE1B,QAAM,WAAW,MAAM,YAAY,YAAY;AAC/C,QAAM,mBAAmB,cAAc,SAAS;AAChD,QAAM,0BAA0B,mBAC5B,CAAC,CAAC,cAAc,qBAAqB,oBAAI,KAAK,KAAK,IAAI,KAAK,aAAa,iBAAiB,IAC1F,uBAAuB,cAAc,QAAQ;AACjD,QAAM,8BAA8B,CAAC,YAAY;AAEjD,QAAM,cAAc;AAAA,IAClB,CAAC,WAAwB;AACvB,UAAI,6BAA6B;AAC/B,kBAAU,0BAA0B;AACpC,eAAO;AAAA,MACT;AAEA,eAAS;AACT,aAAO;AAAA,IACT;AAAA,IACA,CAAC,WAAW,2BAA2B;AAAA,EACzC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
package/package.json
CHANGED
|
@@ -42,6 +42,8 @@ export function SubscriptionBanner({ onReactivate, onDetails }: SubscriptionBann
|
|
|
42
42
|
return <CancelledSubscriptionBanner onReactivate={onReactivate} />;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
if (subscription.type === 'whitelabel') return null;
|
|
46
|
+
|
|
45
47
|
if (daysSinceDue > 0 && daysSinceDue <= SUBSCRIPTION_GRACE_PERIOD_DAYS) {
|
|
46
48
|
return <OverdueInvoiceBanner onDetails={onDetails} />;
|
|
47
49
|
}
|
|
@@ -25,7 +25,12 @@ export async function assertManagementSubscription() {
|
|
|
25
25
|
);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
const isWhitelabelType = subscription?.type === 'whitelabel';
|
|
29
|
+
const isExpired = isWhitelabelType
|
|
30
|
+
? !!subscription?.date_cancellation && new Date() >= new Date(subscription.date_cancellation)
|
|
31
|
+
: hasSubscriptionExpired(subscription?.date_due);
|
|
32
|
+
|
|
33
|
+
if (isExpired) {
|
|
29
34
|
throw new ApiError(
|
|
30
35
|
"Sua assinatura está vencida. Assine um novo plano para continuar.",
|
|
31
36
|
"SUBSCRIPTION_EXPIRED",
|
|
@@ -25,7 +25,12 @@ export async function assertPaidSubscription() {
|
|
|
25
25
|
);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
const isWhitelabelType = subscription.type === 'whitelabel';
|
|
29
|
+
const isExpired = isWhitelabelType
|
|
30
|
+
? !!subscription.date_cancellation && new Date() >= new Date(subscription.date_cancellation)
|
|
31
|
+
: hasSubscriptionExpired(subscription.date_due);
|
|
32
|
+
|
|
33
|
+
if (isExpired) {
|
|
29
34
|
throw new ApiError(
|
|
30
35
|
"Sua assinatura está vencida. Assine um novo plano para continuar.",
|
|
31
36
|
"SUBSCRIPTION_EXPIRED",
|
|
@@ -15,7 +15,10 @@ export function useCancelledSubscriptionGuard() {
|
|
|
15
15
|
} = useActiveSubscription();
|
|
16
16
|
|
|
17
17
|
const isViewer = user?.profile === UserProfile.viewer;
|
|
18
|
-
const
|
|
18
|
+
const isWhitelabelType = subscription?.type === 'whitelabel';
|
|
19
|
+
const isCancelledSubscription = isWhitelabelType
|
|
20
|
+
? !!subscription?.date_cancellation && new Date() >= new Date(subscription.date_cancellation)
|
|
21
|
+
: hasSubscriptionExpired(subscription?.date_due);
|
|
19
22
|
const shouldBlockManagementAction = !isViewer && isCancelledSubscription;
|
|
20
23
|
|
|
21
24
|
const guardAction = useCallback(
|