@greatapps/common 1.1.603 → 1.1.605

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.
@@ -18,7 +18,9 @@ function CancelledSubscriptionBanner({ onReactivate }) {
18
18
  if (subscription.type === "free" || subscription.type === "trial") return null;
19
19
  const dueDate = new Date(subscription.date_due);
20
20
  const today = /* @__PURE__ */ new Date();
21
- const isPastDue = today >= dueDate;
21
+ const dueCalendar = Date.UTC(dueDate.getUTCFullYear(), dueDate.getUTCMonth(), dueDate.getUTCDate());
22
+ const todayCalendar = Date.UTC(today.getFullYear(), today.getMonth(), today.getDate());
23
+ const isPastDue = todayCalendar > dueCalendar;
22
24
  const formattedDate = formatShortDate(dueDate);
23
25
  if (!subscription.date_cancellation && !isPastDue) return null;
24
26
  return /* @__PURE__ */ jsx("div", { className: "fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0", children: /* @__PURE__ */ jsxs(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/navigation/CancelledSubscriptionBanner.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { IconAlertOctagon, IconX } from '@tabler/icons-react';\nimport { formatShortDate } from '../../infra/utils/date';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\n\ninterface CancelledSubscriptionBannerProps {\n onReactivate?: () => void;\n}\n\nexport function CancelledSubscriptionBanner({ onReactivate }: CancelledSubscriptionBannerProps) {\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\n const [visible, setVisible] = useState(true);\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => setAnimated(true), 50);\n return () => clearTimeout(timer);\n }, []);\n\n const dismiss = useCallback(() => setVisible(false), []);\n\n if (!visible) return null;\n if (!subscription?.date_due) return null;\n if (subscription.type === 'free' || subscription.type === 'trial') return null;\n\n const dueDate = new Date(subscription.date_due);\n const today = new Date();\n const isPastDue = today >= dueDate;\n const formattedDate = formatShortDate(dueDate);\n\n if (!subscription.date_cancellation && !isPastDue) return null;\n\n return (\n <div className=\"fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0\">\n <div\n className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-red-500 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}\n >\n <div className=\"flex items-center gap-2 flex-1 w-full sm:w-auto\">\n <IconAlertOctagon size={16} className=\"text-white shrink-0\" />\n <span className=\"paragraph-xsmall-semibold text-white\">\n {isPastDue\n ? 'Sua assinatura foi cancelada e suas páginas foram retiradas do ar.'\n : `Assinatura cancelada! Suas páginas serão retiradas do ar no dia ${formattedDate}!`}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center p-1.5 cursor-pointer\"\n onClick={onReactivate}\n >\n <span className=\"paragraph-xsmall-semibold text-white underline\">\n Escolher um novo plano\n </span>\n </button>\n <button type=\"button\" className=\"cursor-pointer shrink-0\" onClick={dismiss}>\n <IconX size={18} className=\"text-red-200\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";AAuCQ,SACE,KADF;AArCR,SAAS,UAAU,WAAW,mBAAmB;AACjD,SAAS,kBAAkB,aAAa;AACxC,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AAM/B,SAAS,4BAA4B,EAAE,aAAa,GAAqC;AAC9F,QAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,sBAAsB;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,YAAY,IAAI,GAAG,EAAE;AACpD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,CAAC;AAEvD,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,CAAC,cAAc,SAAU,QAAO;AACpC,MAAI,aAAa,SAAS,UAAU,aAAa,SAAS,QAAS,QAAO;AAE1E,QAAM,UAAU,IAAI,KAAK,aAAa,QAAQ;AAC9C,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,YAAY,SAAS;AAC3B,QAAM,gBAAgB,gBAAgB,OAAO;AAE7C,MAAI,CAAC,aAAa,qBAAqB,CAAC,UAAW,QAAO;AAE1D,SACE,oBAAC,SAAI,WAAU,wGACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,8NAA8N,WAAW,mCAAmC,mBAAmB;AAAA,MAE1S;AAAA,6BAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,oBAAiB,MAAM,IAAI,WAAU,uBAAsB;AAAA,UAC5D,oBAAC,UAAK,WAAU,wCACb,sBACG,0EACA,yEAAmE,aAAa,KACtF;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,+EACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAET,8BAAC,UAAK,WAAU,kDAAiD,oCAEjE;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,SACjE,8BAAC,SAAM,MAAM,IAAI,WAAU,gBAAe,GAC5C;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/navigation/CancelledSubscriptionBanner.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { IconAlertOctagon, IconX } from '@tabler/icons-react';\nimport { formatShortDate } from '../../infra/utils/date';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\n\ninterface CancelledSubscriptionBannerProps {\n onReactivate?: () => void;\n}\n\nexport function CancelledSubscriptionBanner({ onReactivate }: CancelledSubscriptionBannerProps) {\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\n const [visible, setVisible] = useState(true);\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n const timer = setTimeout(() => setAnimated(true), 50);\n return () => clearTimeout(timer);\n }, []);\n\n const dismiss = useCallback(() => setVisible(false), []);\n\n if (!visible) return null;\n if (!subscription?.date_due) return null;\n if (subscription.type === 'free' || subscription.type === 'trial') return null;\n\n const dueDate = new Date(subscription.date_due);\n const today = new Date();\n const dueCalendar = Date.UTC(dueDate.getUTCFullYear(), dueDate.getUTCMonth(), dueDate.getUTCDate());\n const todayCalendar = Date.UTC(today.getFullYear(), today.getMonth(), today.getDate());\n const isPastDue = todayCalendar > dueCalendar;\n const formattedDate = formatShortDate(dueDate);\n\n if (!subscription.date_cancellation && !isPastDue) return null;\n\n return (\n <div className=\"fixed top-[80px] md:top-0 left-0 right-0 z-[60] flex justify-center pointer-events-none px-4 lg:px-0\">\n <div\n className={`flex flex-col sm:flex-row items-start sm:items-center justify-between bg-red-500 rounded-lg px-3 py-2 sm:py-1 w-full lg:w-[805px] max-w-full pointer-events-auto transition-transform duration-500 ease-out gap-2 sm:gap-0 ${animated ? 'translate-y-0 md:translate-y-9' : '-translate-y-full'}`}\n >\n <div className=\"flex items-center gap-2 flex-1 w-full sm:w-auto\">\n <IconAlertOctagon size={16} className=\"text-white shrink-0\" />\n <span className=\"paragraph-xsmall-semibold text-white\">\n {isPastDue\n ? 'Sua assinatura foi cancelada e suas páginas foram retiradas do ar.'\n : `Assinatura cancelada! Suas páginas serão retiradas do ar no dia ${formattedDate}!`}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5 w-full sm:w-auto justify-between sm:justify-start\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center p-1.5 cursor-pointer\"\n onClick={onReactivate}\n >\n <span className=\"paragraph-xsmall-semibold text-white underline\">\n Escolher um novo plano\n </span>\n </button>\n <button type=\"button\" className=\"cursor-pointer shrink-0\" onClick={dismiss}>\n <IconX size={18} className=\"text-red-200\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";AAyCQ,SACE,KADF;AAvCR,SAAS,UAAU,WAAW,mBAAmB;AACjD,SAAS,kBAAkB,aAAa;AACxC,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AAM/B,SAAS,4BAA4B,EAAE,aAAa,GAAqC;AAC9F,QAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,sBAAsB;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,YAAY,IAAI,GAAG,EAAE;AACpD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,CAAC;AAEvD,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,CAAC,cAAc,SAAU,QAAO;AACpC,MAAI,aAAa,SAAS,UAAU,aAAa,SAAS,QAAS,QAAO;AAE1E,QAAM,UAAU,IAAI,KAAK,aAAa,QAAQ;AAC9C,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,cAAc,KAAK,IAAI,QAAQ,eAAe,GAAG,QAAQ,YAAY,GAAG,QAAQ,WAAW,CAAC;AAClG,QAAM,gBAAgB,KAAK,IAAI,MAAM,YAAY,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC;AACrF,QAAM,YAAY,gBAAgB;AAClC,QAAM,gBAAgB,gBAAgB,OAAO;AAE7C,MAAI,CAAC,aAAa,qBAAqB,CAAC,UAAW,QAAO;AAE1D,SACE,oBAAC,SAAI,WAAU,wGACb;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,8NAA8N,WAAW,mCAAmC,mBAAmB;AAAA,MAE1S;AAAA,6BAAC,SAAI,WAAU,mDACb;AAAA,8BAAC,oBAAiB,MAAM,IAAI,WAAU,uBAAsB;AAAA,UAC5D,oBAAC,UAAK,WAAU,wCACb,sBACG,0EACA,yEAAmE,aAAa,KACtF;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,+EACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cAET,8BAAC,UAAK,WAAU,kDAAiD,oCAEjE;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,YAAO,MAAK,UAAS,WAAU,2BAA0B,SAAS,SACjE,8BAAC,SAAM,MAAM,IAAI,WAAU,gBAAe,GAC5C;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
@@ -15,7 +15,10 @@ function SubscriptionBanner({
15
15
  const isCancellable = subscription?.date_due && subscription.type !== "free" && subscription.type !== "trial";
16
16
  if (!isCancellable) return null;
17
17
  const dueDate = new Date(subscription.date_due);
18
- const isPastDue = /* @__PURE__ */ new Date() >= dueDate;
18
+ const today = /* @__PURE__ */ new Date();
19
+ const dueCalendar = Date.UTC(dueDate.getUTCFullYear(), dueDate.getUTCMonth(), dueDate.getUTCDate());
20
+ const todayCalendar = Date.UTC(today.getFullYear(), today.getMonth(), today.getDate());
21
+ const isPastDue = todayCalendar > dueCalendar;
19
22
  if (!subscription.date_cancellation && !isPastDue) return null;
20
23
  return /* @__PURE__ */ jsx(CancelledSubscriptionBanner, { onReactivate });
21
24
  }
@@ -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 { OverdueInvoiceBanner } from './OverdueInvoiceBanner';\nimport { CancelledSubscriptionBanner } from './CancelledSubscriptionBanner';\n\ninterface OverdueInfo {\n dueDate: Date | null | undefined;\n}\n\ninterface SubscriptionBannerProps {\n onReactivate?: () => void;\n onOverdueDetails?: () => void;\n overdue?: OverdueInfo | null;\n}\n\nexport function SubscriptionBanner({\n onReactivate,\n onOverdueDetails,\n overdue,\n}: SubscriptionBannerProps) {\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\n\n if (overdue) {\n return <OverdueInvoiceBanner dueDate={overdue.dueDate} onDetails={onOverdueDetails} />;\n }\n\n const isCancellable =\n subscription?.date_due &&\n subscription.type !== 'free' &&\n subscription.type !== 'trial';\n\n if (!isCancellable) return null;\n\n const dueDate = new Date(subscription.date_due!);\n const isPastDue = new Date() >= dueDate;\n\n if (!subscription.date_cancellation && !isPastDue) return null;\n\n return <CancelledSubscriptionBanner onReactivate={onReactivate} />;\n}\n"],"mappings":";AAwBW;AAtBX,SAAS,6BAA6B;AACtC,SAAS,4BAA4B;AACrC,SAAS,mCAAmC;AAYrC,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,sBAAsB;AAE3E,MAAI,SAAS;AACX,WAAO,oBAAC,wBAAqB,SAAS,QAAQ,SAAS,WAAW,kBAAkB;AAAA,EACtF;AAEA,QAAM,gBACJ,cAAc,YACd,aAAa,SAAS,UACtB,aAAa,SAAS;AAExB,MAAI,CAAC,cAAe,QAAO;AAE3B,QAAM,UAAU,IAAI,KAAK,aAAa,QAAS;AAC/C,QAAM,YAAY,oBAAI,KAAK,KAAK;AAEhC,MAAI,CAAC,aAAa,qBAAqB,CAAC,UAAW,QAAO;AAE1D,SAAO,oBAAC,+BAA4B,cAA4B;AAClE;","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 { OverdueInvoiceBanner } from './OverdueInvoiceBanner';\nimport { CancelledSubscriptionBanner } from './CancelledSubscriptionBanner';\n\ninterface OverdueInfo {\n dueDate: Date | null | undefined;\n}\n\ninterface SubscriptionBannerProps {\n onReactivate?: () => void;\n onOverdueDetails?: () => void;\n overdue?: OverdueInfo | null;\n}\n\nexport function SubscriptionBanner({\n onReactivate,\n onOverdueDetails,\n overdue,\n}: SubscriptionBannerProps) {\n const { data: { data: [subscription] = [] } = {} } = useActiveSubscription();\n\n if (overdue) {\n return <OverdueInvoiceBanner dueDate={overdue.dueDate} onDetails={onOverdueDetails} />;\n }\n\n const isCancellable =\n subscription?.date_due &&\n subscription.type !== 'free' &&\n subscription.type !== 'trial';\n\n if (!isCancellable) return null;\n\n const dueDate = new Date(subscription.date_due!);\n const today = new Date();\n const dueCalendar = Date.UTC(dueDate.getUTCFullYear(), dueDate.getUTCMonth(), dueDate.getUTCDate());\n const todayCalendar = Date.UTC(today.getFullYear(), today.getMonth(), today.getDate());\n const isPastDue = todayCalendar > dueCalendar;\n\n if (!subscription.date_cancellation && !isPastDue) return null;\n\n return <CancelledSubscriptionBanner onReactivate={onReactivate} />;\n}\n"],"mappings":";AAwBW;AAtBX,SAAS,6BAA6B;AACtC,SAAS,4BAA4B;AACrC,SAAS,mCAAmC;AAYrC,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,sBAAsB;AAE3E,MAAI,SAAS;AACX,WAAO,oBAAC,wBAAqB,SAAS,QAAQ,SAAS,WAAW,kBAAkB;AAAA,EACtF;AAEA,QAAM,gBACJ,cAAc,YACd,aAAa,SAAS,UACtB,aAAa,SAAS;AAExB,MAAI,CAAC,cAAe,QAAO;AAE3B,QAAM,UAAU,IAAI,KAAK,aAAa,QAAS;AAC/C,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,cAAc,KAAK,IAAI,QAAQ,eAAe,GAAG,QAAQ,YAAY,GAAG,QAAQ,WAAW,CAAC;AAClG,QAAM,gBAAgB,KAAK,IAAI,MAAM,YAAY,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC;AACrF,QAAM,YAAY,gBAAgB;AAElC,MAAI,CAAC,aAAa,qBAAqB,CAAC,UAAW,QAAO;AAE1D,SAAO,oBAAC,+BAA4B,cAA4B;AAClE;","names":[]}
@@ -1,10 +1,10 @@
1
1
  function formatShortDate(date) {
2
2
  if (!date) return "--";
3
3
  const d = new Date(date);
4
- const day = String(d.getDate()).padStart(2, "0");
5
- const month = String(d.getMonth() + 1).padStart(2, "0");
6
- if (d.getFullYear() !== (/* @__PURE__ */ new Date()).getFullYear()) {
7
- return `${day}/${month}/${d.getFullYear()}`;
4
+ const day = String(d.getUTCDate()).padStart(2, "0");
5
+ const month = String(d.getUTCMonth() + 1).padStart(2, "0");
6
+ if (d.getUTCFullYear() !== (/* @__PURE__ */ new Date()).getUTCFullYear()) {
7
+ return `${day}/${month}/${d.getUTCFullYear()}`;
8
8
  }
9
9
  return `${day}/${month}`;
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/infra/utils/date.ts"],"sourcesContent":["export function formatShortDate(date: Date | string | null | undefined): string {\n if (!date) return '--';\n const d = new Date(date);\n const day = String(d.getDate()).padStart(2, '0');\n const month = String(d.getMonth() + 1).padStart(2, '0');\n if (d.getFullYear() !== new Date().getFullYear()) {\n return `${day}/${month}/${d.getFullYear()}`;\n }\n return `${day}/${month}`;\n}\n\nexport function formatDateTime(date: Date | string | null | undefined): string | null {\n if (!date) return null;\n return new Date(date).toLocaleString('pt-BR', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n"],"mappings":"AAAO,SAAS,gBAAgB,MAAgD;AAC9E,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,IAAI,IAAI,KAAK,IAAI;AACvB,QAAM,MAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC/C,QAAM,QAAQ,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACtD,MAAI,EAAE,YAAY,OAAM,oBAAI,KAAK,GAAE,YAAY,GAAG;AAChD,WAAO,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,YAAY,CAAC;AAAA,EAC3C;AACA,SAAO,GAAG,GAAG,IAAI,KAAK;AACxB;AAEO,SAAS,eAAe,MAAuD;AACpF,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,IAAI,KAAK,IAAI,EAAE,eAAe,SAAS;AAAA,IAC5C,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../src/infra/utils/date.ts"],"sourcesContent":["export function formatShortDate(date: Date | string | null | undefined): string {\n if (!date) return '--';\n const d = new Date(date);\n const day = String(d.getUTCDate()).padStart(2, '0');\n const month = String(d.getUTCMonth() + 1).padStart(2, '0');\n if (d.getUTCFullYear() !== new Date().getUTCFullYear()) {\n return `${day}/${month}/${d.getUTCFullYear()}`;\n }\n return `${day}/${month}`;\n}\n\nexport function formatDateTime(date: Date | string | null | undefined): string | null {\n if (!date) return null;\n return new Date(date).toLocaleString('pt-BR', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n"],"mappings":"AAAO,SAAS,gBAAgB,MAAgD;AAC9E,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,IAAI,IAAI,KAAK,IAAI;AACvB,QAAM,MAAM,OAAO,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,QAAM,QAAQ,OAAO,EAAE,YAAY,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,MAAI,EAAE,eAAe,OAAM,oBAAI,KAAK,GAAE,eAAe,GAAG;AACtD,WAAO,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,eAAe,CAAC;AAAA,EAC9C;AACA,SAAO,GAAG,GAAG,IAAI,KAAK;AACxB;AAEO,SAAS,eAAe,MAAuD;AACpF,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,IAAI,KAAK,IAAI,EAAE,eAAe,SAAS;AAAA,IAC5C,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACH;","names":[]}
@@ -2,8 +2,8 @@ const GRACE_PERIOD_DAYS = 15;
2
2
  function hasSubscriptionExpired(dateDue) {
3
3
  if (!dateDue) return false;
4
4
  const dueDate = new Date(dateDue);
5
- dueDate.setDate(dueDate.getDate() + GRACE_PERIOD_DAYS);
6
- dueDate.setHours(23, 59, 59, 999);
5
+ dueDate.setUTCDate(dueDate.getUTCDate() + GRACE_PERIOD_DAYS);
6
+ dueDate.setUTCHours(23, 59, 59, 999);
7
7
  return Date.now() > dueDate.getTime();
8
8
  }
9
9
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/subscriptions/utils/has-subscription-expired.ts"],"sourcesContent":["const GRACE_PERIOD_DAYS = 15;\n\nexport function hasSubscriptionExpired(dateDue: Date | null | undefined) {\n if (!dateDue) return false;\n\n const dueDate = new Date(dateDue);\n dueDate.setDate(dueDate.getDate() + GRACE_PERIOD_DAYS);\n dueDate.setHours(23, 59, 59, 999);\n\n return Date.now() > dueDate.getTime();\n}\n"],"mappings":"AAAA,MAAM,oBAAoB;AAEnB,SAAS,uBAAuB,SAAkC;AACvE,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,UAAU,IAAI,KAAK,OAAO;AAChC,UAAQ,QAAQ,QAAQ,QAAQ,IAAI,iBAAiB;AACrD,UAAQ,SAAS,IAAI,IAAI,IAAI,GAAG;AAEhC,SAAO,KAAK,IAAI,IAAI,QAAQ,QAAQ;AACtC;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/subscriptions/utils/has-subscription-expired.ts"],"sourcesContent":["const GRACE_PERIOD_DAYS = 15;\n\nexport function hasSubscriptionExpired(dateDue: Date | null | undefined) {\n if (!dateDue) return false;\n\n const dueDate = new Date(dateDue);\n dueDate.setUTCDate(dueDate.getUTCDate() + GRACE_PERIOD_DAYS);\n dueDate.setUTCHours(23, 59, 59, 999);\n\n return Date.now() > dueDate.getTime();\n}\n"],"mappings":"AAAA,MAAM,oBAAoB;AAEnB,SAAS,uBAAuB,SAAkC;AACvE,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,UAAU,IAAI,KAAK,OAAO;AAChC,UAAQ,WAAW,QAAQ,WAAW,IAAI,iBAAiB;AAC3D,UAAQ,YAAY,IAAI,IAAI,IAAI,GAAG;AAEnC,SAAO,KAAK,IAAI,IAAI,QAAQ,QAAQ;AACtC;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@greatapps/common",
3
- "version": "1.1.603",
3
+ "version": "1.1.605",
4
4
  "description": "Shared library for GreatApps frontend applications",
5
5
  "main": "./dist/index.mjs",
6
6
  "types": "./src/index.ts",
@@ -27,7 +27,9 @@ export function CancelledSubscriptionBanner({ onReactivate }: CancelledSubscript
27
27
 
28
28
  const dueDate = new Date(subscription.date_due);
29
29
  const today = new Date();
30
- const isPastDue = today >= dueDate;
30
+ const dueCalendar = Date.UTC(dueDate.getUTCFullYear(), dueDate.getUTCMonth(), dueDate.getUTCDate());
31
+ const todayCalendar = Date.UTC(today.getFullYear(), today.getMonth(), today.getDate());
32
+ const isPastDue = todayCalendar > dueCalendar;
31
33
  const formattedDate = formatShortDate(dueDate);
32
34
 
33
35
  if (!subscription.date_cancellation && !isPastDue) return null;
@@ -33,7 +33,10 @@ export function SubscriptionBanner({
33
33
  if (!isCancellable) return null;
34
34
 
35
35
  const dueDate = new Date(subscription.date_due!);
36
- const isPastDue = new Date() >= dueDate;
36
+ const today = new Date();
37
+ const dueCalendar = Date.UTC(dueDate.getUTCFullYear(), dueDate.getUTCMonth(), dueDate.getUTCDate());
38
+ const todayCalendar = Date.UTC(today.getFullYear(), today.getMonth(), today.getDate());
39
+ const isPastDue = todayCalendar > dueCalendar;
37
40
 
38
41
  if (!subscription.date_cancellation && !isPastDue) return null;
39
42
 
@@ -1,10 +1,10 @@
1
1
  export function formatShortDate(date: Date | string | null | undefined): string {
2
2
  if (!date) return '--';
3
3
  const d = new Date(date);
4
- const day = String(d.getDate()).padStart(2, '0');
5
- const month = String(d.getMonth() + 1).padStart(2, '0');
6
- if (d.getFullYear() !== new Date().getFullYear()) {
7
- return `${day}/${month}/${d.getFullYear()}`;
4
+ const day = String(d.getUTCDate()).padStart(2, '0');
5
+ const month = String(d.getUTCMonth() + 1).padStart(2, '0');
6
+ if (d.getUTCFullYear() !== new Date().getUTCFullYear()) {
7
+ return `${day}/${month}/${d.getUTCFullYear()}`;
8
8
  }
9
9
  return `${day}/${month}`;
10
10
  }
@@ -4,8 +4,8 @@ export function hasSubscriptionExpired(dateDue: Date | null | undefined) {
4
4
  if (!dateDue) return false;
5
5
 
6
6
  const dueDate = new Date(dateDue);
7
- dueDate.setDate(dueDate.getDate() + GRACE_PERIOD_DAYS);
8
- dueDate.setHours(23, 59, 59, 999);
7
+ dueDate.setUTCDate(dueDate.getUTCDate() + GRACE_PERIOD_DAYS);
8
+ dueDate.setUTCHours(23, 59, 59, 999);
9
9
 
10
10
  return Date.now() > dueDate.getTime();
11
11
  }