@greatapps/common 1.1.655 → 1.1.657

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/components/account/sections/TokenSection.mjs +1 -1
  2. package/dist/components/account/sections/TokenSection.mjs.map +1 -1
  3. package/dist/components/embeds/CrispEmbed.mjs +8 -20
  4. package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
  5. package/dist/handlers.mjs +33 -0
  6. package/dist/handlers.mjs.map +1 -0
  7. package/dist/http.mjs +5 -0
  8. package/dist/http.mjs.map +1 -0
  9. package/dist/infra/http/api-fetch.mjs +30 -0
  10. package/dist/infra/http/api-fetch.mjs.map +1 -0
  11. package/dist/infra/route/parse-id.mjs +12 -0
  12. package/dist/infra/route/parse-id.mjs.map +1 -0
  13. package/dist/infra/route/safe-route-handler.mjs +18 -0
  14. package/dist/infra/route/safe-route-handler.mjs.map +1 -0
  15. package/dist/infra/route/search-params.mjs +11 -0
  16. package/dist/infra/route/search-params.mjs.map +1 -0
  17. package/dist/modules/cards/handlers/find-card-by-id.handler.mjs +16 -0
  18. package/dist/modules/cards/handlers/find-card-by-id.handler.mjs.map +1 -0
  19. package/dist/modules/cards/handlers/list-cards.handler.mjs +12 -0
  20. package/dist/modules/cards/handlers/list-cards.handler.mjs.map +1 -0
  21. package/dist/modules/cards/hooks/card-by-id.hook.mjs +2 -5
  22. package/dist/modules/cards/hooks/card-by-id.hook.mjs.map +1 -1
  23. package/dist/modules/cards/hooks/cards.hook.mjs +2 -5
  24. package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
  25. package/dist/modules/charges/handlers/find-charge-by-id.handler.mjs +15 -0
  26. package/dist/modules/charges/handlers/find-charge-by-id.handler.mjs.map +1 -0
  27. package/dist/modules/charges/handlers/list-charges.handler.mjs +15 -0
  28. package/dist/modules/charges/handlers/list-charges.handler.mjs.map +1 -0
  29. package/dist/modules/charges/hooks/charge-by-id.hook.mjs +2 -3
  30. package/dist/modules/charges/hooks/charge-by-id.hook.mjs.map +1 -1
  31. package/dist/modules/charges/hooks/charges.hook.mjs +2 -3
  32. package/dist/modules/charges/hooks/charges.hook.mjs.map +1 -1
  33. package/dist/modules/ia-credits/handlers/list-ia-credits.handler.mjs +15 -0
  34. package/dist/modules/ia-credits/handlers/list-ia-credits.handler.mjs.map +1 -0
  35. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs +5 -3
  36. package/dist/modules/ia-credits/hooks/ia-credits.hook.mjs.map +1 -1
  37. package/dist/modules/pages/handlers/count-pages.handler.mjs +14 -0
  38. package/dist/modules/pages/handlers/count-pages.handler.mjs.map +1 -0
  39. package/dist/modules/pages/hooks/count-pages.hook.mjs +3 -4
  40. package/dist/modules/pages/hooks/count-pages.hook.mjs.map +1 -1
  41. package/dist/modules/plans/handlers/find-plan-by-id.handler.mjs +15 -0
  42. package/dist/modules/plans/handlers/find-plan-by-id.handler.mjs.map +1 -0
  43. package/dist/modules/plans/handlers/list-plans.handler.mjs +20 -0
  44. package/dist/modules/plans/handlers/list-plans.handler.mjs.map +1 -0
  45. package/dist/modules/plans/hooks/list-plans.hook.mjs +2 -3
  46. package/dist/modules/plans/hooks/list-plans.hook.mjs.map +1 -1
  47. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs +2 -3
  48. package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
  49. package/dist/modules/projects/handlers/find-project.handler.mjs +16 -0
  50. package/dist/modules/projects/handlers/find-project.handler.mjs.map +1 -0
  51. package/dist/modules/projects/handlers/list-all-account-users.handler.mjs +17 -0
  52. package/dist/modules/projects/handlers/list-all-account-users.handler.mjs.map +1 -0
  53. package/dist/modules/projects/handlers/list-available-users.handler.mjs +20 -0
  54. package/dist/modules/projects/handlers/list-available-users.handler.mjs.map +1 -0
  55. package/dist/modules/projects/handlers/list-project-users.handler.mjs +20 -0
  56. package/dist/modules/projects/handlers/list-project-users.handler.mjs.map +1 -0
  57. package/dist/modules/projects/handlers/list-projects.handler.mjs +17 -0
  58. package/dist/modules/projects/handlers/list-projects.handler.mjs.map +1 -0
  59. package/dist/modules/projects/hooks/find-project.hook.mjs +2 -3
  60. package/dist/modules/projects/hooks/find-project.hook.mjs.map +1 -1
  61. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs +6 -6
  62. package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
  63. package/dist/modules/projects/hooks/list-available-users.hook.mjs +6 -6
  64. package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
  65. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs +6 -6
  66. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -1
  67. package/dist/modules/projects/hooks/list-project-users.hook.mjs +6 -6
  68. package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
  69. package/dist/modules/projects/hooks/list-projects.hook.mjs +2 -3
  70. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -1
  71. package/dist/modules/subscriptions/handlers/list-subscriptions.handler.mjs +17 -0
  72. package/dist/modules/subscriptions/handlers/list-subscriptions.handler.mjs.map +1 -0
  73. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs +5 -5
  74. package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
  75. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs +5 -3
  76. package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
  77. package/dist/modules/users/handlers/list-messages.handler.mjs +36 -0
  78. package/dist/modules/users/handlers/list-messages.handler.mjs.map +1 -0
  79. package/dist/modules/users/hooks/messages.hook.mjs +7 -6
  80. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
  81. package/dist/route.mjs +9 -0
  82. package/dist/route.mjs.map +1 -0
  83. package/package.json +13 -1
  84. package/src/components/account/sections/TokenSection.tsx +1 -1
  85. package/src/components/embeds/CrispEmbed.tsx +11 -28
  86. package/src/handlers.ts +22 -0
  87. package/src/http.ts +1 -0
  88. package/src/infra/http/api-fetch.ts +39 -0
  89. package/src/infra/route/parse-id.ts +9 -0
  90. package/src/infra/route/safe-route-handler.ts +16 -0
  91. package/src/infra/route/search-params.ts +9 -0
  92. package/src/modules/cards/handlers/find-card-by-id.handler.ts +15 -0
  93. package/src/modules/cards/handlers/list-cards.handler.ts +10 -0
  94. package/src/modules/cards/hooks/card-by-id.hook.ts +4 -5
  95. package/src/modules/cards/hooks/cards.hook.ts +4 -5
  96. package/src/modules/charges/handlers/find-charge-by-id.handler.ts +14 -0
  97. package/src/modules/charges/handlers/list-charges.handler.ts +15 -0
  98. package/src/modules/charges/hooks/charge-by-id.hook.ts +5 -3
  99. package/src/modules/charges/hooks/charges.hook.ts +5 -4
  100. package/src/modules/ia-credits/handlers/list-ia-credits.handler.ts +14 -0
  101. package/src/modules/ia-credits/hooks/ia-credits.hook.ts +7 -3
  102. package/src/modules/pages/handlers/count-pages.handler.ts +12 -0
  103. package/src/modules/pages/hooks/count-pages.hook.ts +3 -4
  104. package/src/modules/plans/handlers/find-plan-by-id.handler.ts +14 -0
  105. package/src/modules/plans/handlers/list-plans.handler.ts +20 -0
  106. package/src/modules/plans/hooks/list-plans.hook.ts +2 -3
  107. package/src/modules/plans/hooks/use-plan-by-id.hook.ts +4 -3
  108. package/src/modules/projects/handlers/find-project.handler.ts +15 -0
  109. package/src/modules/projects/handlers/list-all-account-users.handler.ts +17 -0
  110. package/src/modules/projects/handlers/list-available-users.handler.ts +20 -0
  111. package/src/modules/projects/handlers/list-project-users.handler.ts +20 -0
  112. package/src/modules/projects/handlers/list-projects.handler.ts +17 -0
  113. package/src/modules/projects/hooks/find-project.hook.ts +3 -3
  114. package/src/modules/projects/hooks/list-all-account-users.hook.ts +8 -7
  115. package/src/modules/projects/hooks/list-available-users.hook.ts +8 -7
  116. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +8 -7
  117. package/src/modules/projects/hooks/list-project-users.hook.ts +8 -7
  118. package/src/modules/projects/hooks/list-projects.hook.ts +3 -3
  119. package/src/modules/subscriptions/handlers/list-subscriptions.handler.ts +17 -0
  120. package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +8 -5
  121. package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +8 -5
  122. package/src/modules/users/handlers/list-messages.handler.ts +39 -0
  123. package/src/modules/users/hooks/messages.hook.ts +10 -8
  124. package/src/route.ts +3 -0
@@ -56,7 +56,7 @@ function TokenSection() {
56
56
  /* @__PURE__ */ jsx(
57
57
  "a",
58
58
  {
59
- href: "https://documenter.getpostman.com/view/4861938/T1Djiz8H",
59
+ href: "https://documenter.getpostman.com/view/4861938/2sAYdoDmj4",
60
60
  target: "_blank",
61
61
  rel: "noopener noreferrer",
62
62
  className: "paragraph-small-medium text-gray-500 underline hover:text-gray-700 transition-colors w-fit",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/account/sections/TokenSection.tsx"],"sourcesContent":["'use client';\n\nimport { IconCheck, IconCopy, IconInfoCircle } from '@tabler/icons-react';\nimport { toast } from 'sonner';\nimport { Toast } from '../../ui/feedback/Toast';\nimport { Button } from '../../ui/buttons/Button';\nimport { FormField } from '../../ui/form/FormField';\nimport useCopyToClipboard from '../../../hooks/copy-to-clipboard.hook';\nimport { useAccountToken } from '../../../modules/accounts/hooks/use-account-token.hook';\nimport { useIsDefaultWhitelabel } from '../../../providers/whitelabel.provider';\n\nexport function TokenSection() {\n const { data: token = '', isLoading } = useAccountToken();\n const isDefaultWl = useIsDefaultWhitelabel();\n\n const { isCopied, copy } = useCopyToClipboard({\n onSuccess: () => {\n toast.custom((t) => (\n <Toast variant=\"success\" message=\"Token copiado com sucesso\" toastId={t} />\n ));\n },\n onError: () => {\n toast.custom((t) => (\n <Toast variant=\"error\" message=\"Não foi possível copiar o token\" toastId={t} />\n ));\n },\n });\n\n return (\n <div className=\"h-full overflow-y-auto overscroll-contain px-4 pb-20 lg:p-5 lg:pt-5 flex flex-col gap-5 lg:gap-6 lg:pb-31 lg:overscroll-auto\">\n <span className=\"paragraph-medium-semibold text-gray-950\">Token da conta</span>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-end gap-3\">\n <FormField\n label=\"Token\"\n value={isLoading ? 'Carregando...' : token}\n disabled\n readOnly\n classnameContainer=\"bg-gray-50 cursor-default opacity-100!\"\n className=\"text-gray-950/50\"\n />\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"h-10! shrink-0 gap-2\"\n onClick={() => copy(token)}\n disabled={isLoading || !token}\n >\n {isCopied ? <IconCheck size={16} /> : <IconCopy size={16} />}\n {isCopied ? 'Copiado' : 'Copiar'}\n </Button>\n </div>\n\n <div className={`flex items-center gap-3 p-4 rounded-lg ${isDefaultWl ? 'bg-cyan-50' : 'bg-zinc-50'}`}>\n <IconInfoCircle className=\"size-4 text-zinc-950 shrink-0\" />\n <span className=\"paragraph-small-regular text-zinc-950 max-w-[420px]\">\n Este token é exclusivo da sua conta e permite acesso à API. Não compartilhe com terceiros.\n </span>\n </div>\n\n <a\n href=\"https://documenter.getpostman.com/view/4861938/T1Djiz8H\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"paragraph-small-medium text-gray-500 underline hover:text-gray-700 transition-colors w-fit\"\n >\n Acessar a documentação\n </a>\n </div>\n </div>\n );\n}\n"],"mappings":";AAkBQ,cAwBE,YAxBF;AAhBR,SAAS,WAAW,UAAU,sBAAsB;AACpD,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,OAAO,wBAAwB;AAC/B,SAAS,uBAAuB;AAChC,SAAS,8BAA8B;AAEhC,SAAS,eAAe;AAC7B,QAAM,EAAE,MAAM,QAAQ,IAAI,UAAU,IAAI,gBAAgB;AACxD,QAAM,cAAc,uBAAuB;AAE3C,QAAM,EAAE,UAAU,KAAK,IAAI,mBAAmB;AAAA,IAC5C,WAAW,MAAM;AACf,YAAM,OAAO,CAAC,MACZ,oBAAC,SAAM,SAAQ,WAAU,SAAQ,6BAA4B,SAAS,GAAG,CAC1E;AAAA,IACH;AAAA,IACA,SAAS,MAAM;AACb,YAAM,OAAO,CAAC,MACZ,oBAAC,SAAM,SAAQ,SAAQ,SAAQ,yCAAkC,SAAS,GAAG,CAC9E;AAAA,IACH;AAAA,EACF,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,gIACb;AAAA,wBAAC,UAAK,WAAU,2CAA0C,4BAAc;AAAA,IAExE,qBAAC,SAAI,WAAU,uBACb;AAAA,2BAAC,SAAI,WAAU,wBACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,OAAO,YAAY,kBAAkB;AAAA,YACrC,UAAQ;AAAA,YACR,UAAQ;AAAA,YACR,oBAAmB;AAAA,YACnB,WAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,SAAS,MAAM,KAAK,KAAK;AAAA,YACzB,UAAU,aAAa,CAAC;AAAA,YAEvB;AAAA,yBAAW,oBAAC,aAAU,MAAM,IAAI,IAAK,oBAAC,YAAS,MAAM,IAAI;AAAA,cACzD,WAAW,YAAY;AAAA;AAAA;AAAA,QAC1B;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAW,0CAA0C,cAAc,eAAe,YAAY,IACjG;AAAA,4BAAC,kBAAe,WAAU,iCAAgC;AAAA,QAC1D,oBAAC,UAAK,WAAU,uDAAsD,iHAEtE;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/account/sections/TokenSection.tsx"],"sourcesContent":["'use client';\n\nimport { IconCheck, IconCopy, IconInfoCircle } from '@tabler/icons-react';\nimport { toast } from 'sonner';\nimport { Toast } from '../../ui/feedback/Toast';\nimport { Button } from '../../ui/buttons/Button';\nimport { FormField } from '../../ui/form/FormField';\nimport useCopyToClipboard from '../../../hooks/copy-to-clipboard.hook';\nimport { useAccountToken } from '../../../modules/accounts/hooks/use-account-token.hook';\nimport { useIsDefaultWhitelabel } from '../../../providers/whitelabel.provider';\n\nexport function TokenSection() {\n const { data: token = '', isLoading } = useAccountToken();\n const isDefaultWl = useIsDefaultWhitelabel();\n\n const { isCopied, copy } = useCopyToClipboard({\n onSuccess: () => {\n toast.custom((t) => (\n <Toast variant=\"success\" message=\"Token copiado com sucesso\" toastId={t} />\n ));\n },\n onError: () => {\n toast.custom((t) => (\n <Toast variant=\"error\" message=\"Não foi possível copiar o token\" toastId={t} />\n ));\n },\n });\n\n return (\n <div className=\"h-full overflow-y-auto overscroll-contain px-4 pb-20 lg:p-5 lg:pt-5 flex flex-col gap-5 lg:gap-6 lg:pb-31 lg:overscroll-auto\">\n <span className=\"paragraph-medium-semibold text-gray-950\">Token da conta</span>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-end gap-3\">\n <FormField\n label=\"Token\"\n value={isLoading ? 'Carregando...' : token}\n disabled\n readOnly\n classnameContainer=\"bg-gray-50 cursor-default opacity-100!\"\n className=\"text-gray-950/50\"\n />\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"h-10! shrink-0 gap-2\"\n onClick={() => copy(token)}\n disabled={isLoading || !token}\n >\n {isCopied ? <IconCheck size={16} /> : <IconCopy size={16} />}\n {isCopied ? 'Copiado' : 'Copiar'}\n </Button>\n </div>\n\n <div className={`flex items-center gap-3 p-4 rounded-lg ${isDefaultWl ? 'bg-cyan-50' : 'bg-zinc-50'}`}>\n <IconInfoCircle className=\"size-4 text-zinc-950 shrink-0\" />\n <span className=\"paragraph-small-regular text-zinc-950 max-w-[420px]\">\n Este token é exclusivo da sua conta e permite acesso à API. Não compartilhe com terceiros.\n </span>\n </div>\n\n <a\n href=\"https://documenter.getpostman.com/view/4861938/2sAYdoDmj4\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"paragraph-small-medium text-gray-500 underline hover:text-gray-700 transition-colors w-fit\"\n >\n Acessar a documentação\n </a>\n </div>\n </div>\n );\n}\n"],"mappings":";AAkBQ,cAwBE,YAxBF;AAhBR,SAAS,WAAW,UAAU,sBAAsB;AACpD,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,OAAO,wBAAwB;AAC/B,SAAS,uBAAuB;AAChC,SAAS,8BAA8B;AAEhC,SAAS,eAAe;AAC7B,QAAM,EAAE,MAAM,QAAQ,IAAI,UAAU,IAAI,gBAAgB;AACxD,QAAM,cAAc,uBAAuB;AAE3C,QAAM,EAAE,UAAU,KAAK,IAAI,mBAAmB;AAAA,IAC5C,WAAW,MAAM;AACf,YAAM,OAAO,CAAC,MACZ,oBAAC,SAAM,SAAQ,WAAU,SAAQ,6BAA4B,SAAS,GAAG,CAC1E;AAAA,IACH;AAAA,IACA,SAAS,MAAM;AACb,YAAM,OAAO,CAAC,MACZ,oBAAC,SAAM,SAAQ,SAAQ,SAAQ,yCAAkC,SAAS,GAAG,CAC9E;AAAA,IACH;AAAA,EACF,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,gIACb;AAAA,wBAAC,UAAK,WAAU,2CAA0C,4BAAc;AAAA,IAExE,qBAAC,SAAI,WAAU,uBACb;AAAA,2BAAC,SAAI,WAAU,wBACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,OAAO,YAAY,kBAAkB;AAAA,YACrC,UAAQ;AAAA,YACR,UAAQ;AAAA,YACR,oBAAmB;AAAA,YACnB,WAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,SAAS,MAAM,KAAK,KAAK;AAAA,YACzB,UAAU,aAAa,CAAC;AAAA,YAEvB;AAAA,yBAAW,oBAAC,aAAU,MAAM,IAAI,IAAK,oBAAC,YAAS,MAAM,IAAI;AAAA,cACzD,WAAW,YAAY;AAAA;AAAA;AAAA,QAC1B;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAW,0CAA0C,cAAc,eAAe,YAAY,IACjG;AAAA,4BAAC,kBAAe,WAAU,iCAAgC;AAAA,QAC1D,oBAAC,UAAK,WAAU,uDAAsD,iHAEtE;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
@@ -55,25 +55,6 @@ function sendCrispMessage(text) {
55
55
  function openCrispChat() {
56
56
  crispDo("chat:open");
57
57
  }
58
- function deliverFreePlanWelcome() {
59
- sendCrispMessage(FREE_PLAN_WELCOME_MESSAGE);
60
- openCrispChat();
61
- }
62
- function isCrispApiLoaded() {
63
- try {
64
- const $crisp = window.$crisp;
65
- return !!$crisp && typeof $crisp.is === "function";
66
- } catch {
67
- return false;
68
- }
69
- }
70
- function deliverFreePlanWelcomeWhenReady(attemptsLeft) {
71
- if (isCrispApiLoaded() || attemptsLeft <= 0) {
72
- deliverFreePlanWelcome();
73
- return;
74
- }
75
- setTimeout(deliverFreePlanWelcomeWhenReady, 400, attemptsLeft - 1);
76
- }
77
58
  function updateCrispUser(data) {
78
59
  try {
79
60
  if (data.email) safeCrispPush(["set", "user:email", data.email]);
@@ -167,7 +148,14 @@ function CrispEmbed() {
167
148
  try {
168
149
  const shownKey = `${FREE_PLAN_WELCOME_SHOWN_KEY}:${user.id}`;
169
150
  if (window.localStorage.getItem(shownKey)) return;
170
- deliverFreePlanWelcomeWhenReady(25);
151
+ safeCrispPush([
152
+ "on",
153
+ "session:loaded",
154
+ () => {
155
+ sendCrispMessage(FREE_PLAN_WELCOME_MESSAGE);
156
+ openCrispChat();
157
+ }
158
+ ]);
171
159
  window.localStorage.setItem(shownKey, "1");
172
160
  } catch {
173
161
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/embeds/CrispEmbed.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { useAuth } from '../../providers/auth.provider';\nimport { useIsDefaultWhitelabel, useWhitelabel } from '../../providers/whitelabel.provider';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\n\nconst V4_WHITELABEL_ID = 367568;\n\nconst PROFILE_LABELS: Record<string, string> = {\n owner: 'Proprietário',\n admin: 'Administrador',\n editor: 'Colaborador',\n viewer: 'Visualizador',\n};\n\nconst CRISP_WEBSITE_ID = '3339a3ec-b4c6-4aac-8b86-45668fb7655c';\nconst CRISP_SCRIPT_URL = 'https://client.crisp.chat/l.js';\nconst CRISP_LOAD_DELAY = 800;\n\n// ── Crisp helpers ──────────────────────────────────────────────\n\nfunction safeCrispPush(args: unknown[]) {\n try {\n const win = window as any;\n if (!win.$crisp) win.$crisp = [];\n win.$crisp.push(args);\n } catch {}\n}\n\nfunction crispDo(action: string) {\n safeCrispPush(['do', action]);\n}\n\nfunction crispSegment(segment: string) {\n safeCrispPush(['set', 'session:segments', [[segment]]]);\n}\n\nfunction crispSessionData(key: string, value: string) {\n safeCrispPush(['set', 'session:data', [[[key, value]]]]);\n}\n\n// ── Public API ─────────────────────────────────────────────────\n\nexport function openCrispHelpdesk() {\n crispDo('helpdesk:search');\n}\n\nexport function hideCrisp() {\n crispDo('chat:hide');\n}\n\nexport function showCrisp() {\n crispDo('chat:show');\n}\n\nconst FREE_PLAN_ID = 5;\nconst FREE_PLAN_WELCOME_SHOWN_KEY = 'crisp:free-plan-welcome:shown';\nconst FREE_PLAN_WELCOME_QUERY_FLAG = 'createNew';\nconst FREE_PLAN_WELCOME_MESSAGE = `Oi! Tenho uma novidade exclusiva para você 🎉\n\nCriamos o Plano Iniciante pensando exatamente em você: R$ 14,90/mês para quem já deu o primeiro passo e quer ir além.\n\nCom ele você conecta seu próprio domínio, publica até 3 páginas e libera recursos como scripts, API Meta, exportação de leads e possibilidade de contratar GreatAI.\n\nAcesse o menu \"Assinaturas\" e assine agora!`;\n\nexport function sendCrispMessage(text: string) {\n safeCrispPush(['do', 'message:show', ['text', text]]);\n}\n\nexport function openCrispChat() {\n crispDo('chat:open');\n}\n\nfunction deliverFreePlanWelcome() {\n sendCrispMessage(FREE_PLAN_WELCOME_MESSAGE);\n openCrispChat();\n}\n\n// Crisp substitui o array `$crisp` por um objeto com métodos quando o\n// script termina de carregar — `is` só existe na API real.\nfunction isCrispApiLoaded(): boolean {\n try {\n const $crisp = (window as any).$crisp;\n return !!$crisp && typeof $crisp.is === 'function';\n } catch {\n return false;\n }\n}\n\n// Espera a Crisp carregar antes de exibir a mensagem. Diferente de\n// `on session:loaded`, comandos `do` não dependem de um evento que pode\n// já ter disparado — são executados na hora numa Crisp já carregada.\nfunction deliverFreePlanWelcomeWhenReady(attemptsLeft: number) {\n if (isCrispApiLoaded() || attemptsLeft <= 0) {\n deliverFreePlanWelcome();\n return;\n }\n setTimeout(deliverFreePlanWelcomeWhenReady, 400, attemptsLeft - 1);\n}\n\nexport function updateCrispUser(data: {\n email?: string;\n name?: string;\n lastName?: string;\n company?: string;\n ddi?: string;\n phone?: string;\n photo?: string;\n}) {\n try {\n if (data.email) safeCrispPush(['set', 'user:email', data.email]);\n\n const fullName = `${data.name ?? ''} ${data.lastName ?? ''}`.trim();\n if (fullName) safeCrispPush(['set', 'user:nickname', fullName]);\n\n if (data.company) safeCrispPush(['set', 'user:company', data.company]);\n\n const phone = `${data.ddi ?? ''}${data.phone ?? ''}`.trim();\n if (phone) safeCrispPush(['set', 'user:phone', phone]);\n\n if (data.photo?.startsWith('http')) {\n safeCrispPush(['set', 'user:avatar', data.photo]);\n }\n } catch {}\n}\n\n// ── Component ──────────────────────────────────────────────────\n\nexport function CrispEmbed() {\n const { user, account } = useAuth();\n const { whitelabel } = useWhitelabel();\n const { data: subscriptionData } = useActiveSubscription();\n const scriptLoadedRef = useRef(false);\n\n const isGreat = useIsDefaultWhitelabel();\n const subscription = subscriptionData?.data?.[0] ?? null;\n const isV4 = whitelabel?.id === V4_WHITELABEL_ID;\n const shouldLoadCrisp = isV4 || isGreat;\n\n // Load Crisp script (once, with 800ms delay)\n useEffect(() => {\n if (!user || !shouldLoadCrisp || scriptLoadedRef.current) return;\n\n try {\n const win = window as any;\n\n if (!win.$crisp) {\n win.$crisp = [];\n win.CRISP_WEBSITE_ID = CRISP_WEBSITE_ID;\n win.$crisp.push(['config', 'container:index', [100]]);\n }\n\n if (document.querySelector(`script[src=\"${CRISP_SCRIPT_URL}\"]`)) {\n scriptLoadedRef.current = true;\n return;\n }\n\n const timeout = setTimeout(() => {\n try {\n if (document.querySelector(`script[src=\"${CRISP_SCRIPT_URL}\"]`)) return;\n const s = document.createElement('script');\n s.src = CRISP_SCRIPT_URL;\n s.async = true;\n document.head.appendChild(s);\n scriptLoadedRef.current = true;\n } catch {}\n }, CRISP_LOAD_DELAY);\n\n return () => clearTimeout(timeout);\n } catch {}\n }, [user, shouldLoadCrisp]);\n\n // Identify user\n useEffect(() => {\n try {\n if (!user || !shouldLoadCrisp || !(window as any)?.$crisp) return;\n\n updateCrispUser({\n email: user.email,\n name: user.name,\n lastName: user.last_name,\n company: account?.name,\n ddi: user.ddi,\n phone: user.phone,\n photo: user.photo ?? undefined,\n });\n\n if (isV4) {\n crispSegment('company_v4');\n crispSessionData('Company', 'V4');\n } else {\n const planName = subscription?.plan_name ?? '';\n const profileLabel = PROFILE_LABELS[user.profile ?? ''] ?? user.profile ?? '';\n if (planName) crispSegment(`plano_${planName}`);\n if (profileLabel) crispSegment(`usuario_${profileLabel}`);\n if (planName) crispSessionData('Plano', planName);\n if (profileLabel) crispSessionData('Usuario', profileLabel);\n }\n } catch {}\n }, [user, account, isV4, shouldLoadCrisp, subscription?.plan_name]);\n\n // Captura `?createNew=true` da URL inicial. O register do gapps redireciona\n // para pages com esse flag, e localStorage não cruza origens — então o\n // sinal de \"acabou de se cadastrar\" vem via query string.\n const [isFreshSignup, setIsFreshSignup] = useState(false);\n useEffect(() => {\n try {\n const params = new URLSearchParams(window.location.search);\n if (params.get(FREE_PLAN_WELCOME_QUERY_FLAG) === 'true') {\n setIsFreshSignup(true);\n }\n } catch {}\n }, []);\n\n // Mostra mensagem de boas-vindas no Crisp para quem acabou de se cadastrar no plano free.\n useEffect(() => {\n if (!user || !shouldLoadCrisp || !isFreshSignup) return;\n if (subscription?.id_plan !== FREE_PLAN_ID) return;\n try {\n const shownKey = `${FREE_PLAN_WELCOME_SHOWN_KEY}:${user.id}`;\n if (window.localStorage.getItem(shownKey)) return;\n\n deliverFreePlanWelcomeWhenReady(25);\n window.localStorage.setItem(shownKey, '1');\n } catch {}\n }, [user, shouldLoadCrisp, isFreshSignup, subscription?.id_plan]);\n\n return null;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/embeds/CrispEmbed.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { useAuth } from '../../providers/auth.provider';\nimport { useIsDefaultWhitelabel, useWhitelabel } from '../../providers/whitelabel.provider';\nimport { useActiveSubscription } from '../../modules/subscriptions/hooks/find-active-subscription.hook';\n\nconst V4_WHITELABEL_ID = 367568;\n\nconst PROFILE_LABELS: Record<string, string> = {\n owner: 'Proprietário',\n admin: 'Administrador',\n editor: 'Colaborador',\n viewer: 'Visualizador',\n};\n\nconst CRISP_WEBSITE_ID = '3339a3ec-b4c6-4aac-8b86-45668fb7655c';\nconst CRISP_SCRIPT_URL = 'https://client.crisp.chat/l.js';\nconst CRISP_LOAD_DELAY = 800;\n\n// ── Crisp helpers ──────────────────────────────────────────────\n\nfunction safeCrispPush(args: unknown[]) {\n try {\n const win = window as any;\n if (!win.$crisp) win.$crisp = [];\n win.$crisp.push(args);\n } catch {}\n}\n\nfunction crispDo(action: string) {\n safeCrispPush(['do', action]);\n}\n\nfunction crispSegment(segment: string) {\n safeCrispPush(['set', 'session:segments', [[segment]]]);\n}\n\nfunction crispSessionData(key: string, value: string) {\n safeCrispPush(['set', 'session:data', [[[key, value]]]]);\n}\n\n// ── Public API ─────────────────────────────────────────────────\n\nexport function openCrispHelpdesk() {\n crispDo('helpdesk:search');\n}\n\nexport function hideCrisp() {\n crispDo('chat:hide');\n}\n\nexport function showCrisp() {\n crispDo('chat:show');\n}\n\nconst FREE_PLAN_ID = 5;\nconst FREE_PLAN_WELCOME_SHOWN_KEY = 'crisp:free-plan-welcome:shown';\nconst FREE_PLAN_WELCOME_QUERY_FLAG = 'createNew';\nconst FREE_PLAN_WELCOME_MESSAGE = `Oi! Tenho uma novidade exclusiva para você 🎉\n\nCriamos o Plano Iniciante pensando exatamente em você: R$ 14,90/mês para quem já deu o primeiro passo e quer ir além.\n\nCom ele você conecta seu próprio domínio, publica até 3 páginas e libera recursos como scripts, API Meta, exportação de leads e possibilidade de contratar GreatAI.\n\nAcesse o menu \"Assinaturas\" e assine agora!`;\n\nexport function sendCrispMessage(text: string) {\n safeCrispPush(['do', 'message:show', ['text', text]]);\n}\n\nexport function openCrispChat() {\n crispDo('chat:open');\n}\n\nexport function updateCrispUser(data: {\n email?: string;\n name?: string;\n lastName?: string;\n company?: string;\n ddi?: string;\n phone?: string;\n photo?: string;\n}) {\n try {\n if (data.email) safeCrispPush(['set', 'user:email', data.email]);\n\n const fullName = `${data.name ?? ''} ${data.lastName ?? ''}`.trim();\n if (fullName) safeCrispPush(['set', 'user:nickname', fullName]);\n\n if (data.company) safeCrispPush(['set', 'user:company', data.company]);\n\n const phone = `${data.ddi ?? ''}${data.phone ?? ''}`.trim();\n if (phone) safeCrispPush(['set', 'user:phone', phone]);\n\n if (data.photo?.startsWith('http')) {\n safeCrispPush(['set', 'user:avatar', data.photo]);\n }\n } catch {}\n}\n\n// ── Component ──────────────────────────────────────────────────\n\nexport function CrispEmbed() {\n const { user, account } = useAuth();\n const { whitelabel } = useWhitelabel();\n const { data: subscriptionData } = useActiveSubscription();\n const scriptLoadedRef = useRef(false);\n\n const isGreat = useIsDefaultWhitelabel();\n const subscription = subscriptionData?.data?.[0] ?? null;\n const isV4 = whitelabel?.id === V4_WHITELABEL_ID;\n const shouldLoadCrisp = isV4 || isGreat;\n\n // Load Crisp script (once, with 800ms delay)\n useEffect(() => {\n if (!user || !shouldLoadCrisp || scriptLoadedRef.current) return;\n\n try {\n const win = window as any;\n\n if (!win.$crisp) {\n win.$crisp = [];\n win.CRISP_WEBSITE_ID = CRISP_WEBSITE_ID;\n win.$crisp.push(['config', 'container:index', [100]]);\n }\n\n if (document.querySelector(`script[src=\"${CRISP_SCRIPT_URL}\"]`)) {\n scriptLoadedRef.current = true;\n return;\n }\n\n const timeout = setTimeout(() => {\n try {\n if (document.querySelector(`script[src=\"${CRISP_SCRIPT_URL}\"]`)) return;\n const s = document.createElement('script');\n s.src = CRISP_SCRIPT_URL;\n s.async = true;\n document.head.appendChild(s);\n scriptLoadedRef.current = true;\n } catch {}\n }, CRISP_LOAD_DELAY);\n\n return () => clearTimeout(timeout);\n } catch {}\n }, [user, shouldLoadCrisp]);\n\n // Identify user\n useEffect(() => {\n try {\n if (!user || !shouldLoadCrisp || !(window as any)?.$crisp) return;\n\n updateCrispUser({\n email: user.email,\n name: user.name,\n lastName: user.last_name,\n company: account?.name,\n ddi: user.ddi,\n phone: user.phone,\n photo: user.photo ?? undefined,\n });\n\n if (isV4) {\n crispSegment('company_v4');\n crispSessionData('Company', 'V4');\n } else {\n const planName = subscription?.plan_name ?? '';\n const profileLabel = PROFILE_LABELS[user.profile ?? ''] ?? user.profile ?? '';\n if (planName) crispSegment(`plano_${planName}`);\n if (profileLabel) crispSegment(`usuario_${profileLabel}`);\n if (planName) crispSessionData('Plano', planName);\n if (profileLabel) crispSessionData('Usuario', profileLabel);\n }\n } catch {}\n }, [user, account, isV4, shouldLoadCrisp, subscription?.plan_name]);\n\n // Captura `?createNew=true` da URL inicial. O register do gapps redireciona\n // para pages com esse flag, e localStorage não cruza origens — então o\n // sinal de \"acabou de se cadastrar\" vem via query string.\n const [isFreshSignup, setIsFreshSignup] = useState(false);\n useEffect(() => {\n try {\n const params = new URLSearchParams(window.location.search);\n if (params.get(FREE_PLAN_WELCOME_QUERY_FLAG) === 'true') {\n setIsFreshSignup(true);\n }\n } catch {}\n }, []);\n\n // Mostra mensagem de boas-vindas no Crisp para quem acabou de se cadastrar no plano free.\n useEffect(() => {\n if (!user || !shouldLoadCrisp || !isFreshSignup) return;\n if (subscription?.id_plan !== FREE_PLAN_ID) return;\n try {\n const shownKey = `${FREE_PLAN_WELCOME_SHOWN_KEY}:${user.id}`;\n if (window.localStorage.getItem(shownKey)) return;\n\n // Defer to session:loaded para garantir que a Crisp está pronta antes\n // de exibir a mensagem. Sem isso, comandos enfileirados pré-load podem\n // ser descartados silenciosamente.\n safeCrispPush([\n 'on',\n 'session:loaded',\n () => {\n sendCrispMessage(FREE_PLAN_WELCOME_MESSAGE);\n openCrispChat();\n },\n ]);\n window.localStorage.setItem(shownKey, '1');\n } catch {}\n }, [user, shouldLoadCrisp, isFreshSignup, subscription?.id_plan]);\n\n return null;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,33 @@
1
+ import { createListCardsHandler } from "./modules/cards/handlers/list-cards.handler";
2
+ import { createFindCardByIdHandler } from "./modules/cards/handlers/find-card-by-id.handler";
3
+ import { createListChargesHandler } from "./modules/charges/handlers/list-charges.handler";
4
+ import { createFindChargeByIdHandler } from "./modules/charges/handlers/find-charge-by-id.handler";
5
+ import { createListIaCreditsHandler } from "./modules/ia-credits/handlers/list-ia-credits.handler";
6
+ import { createCountPagesHandler } from "./modules/pages/handlers/count-pages.handler";
7
+ import { createListPlansHandler } from "./modules/plans/handlers/list-plans.handler";
8
+ import { createFindPlanByIdHandler } from "./modules/plans/handlers/find-plan-by-id.handler";
9
+ import { createListProjectsHandler } from "./modules/projects/handlers/list-projects.handler";
10
+ import { createFindProjectHandler } from "./modules/projects/handlers/find-project.handler";
11
+ import { createListProjectUsersHandler } from "./modules/projects/handlers/list-project-users.handler";
12
+ import { createListAvailableUsersHandler } from "./modules/projects/handlers/list-available-users.handler";
13
+ import { createListAllAccountUsersHandler } from "./modules/projects/handlers/list-all-account-users.handler";
14
+ import { createListSubscriptionsHandler } from "./modules/subscriptions/handlers/list-subscriptions.handler";
15
+ import { createListMessagesHandler } from "./modules/users/handlers/list-messages.handler";
16
+ export {
17
+ createCountPagesHandler,
18
+ createFindCardByIdHandler,
19
+ createFindChargeByIdHandler,
20
+ createFindPlanByIdHandler,
21
+ createFindProjectHandler,
22
+ createListAllAccountUsersHandler,
23
+ createListAvailableUsersHandler,
24
+ createListCardsHandler,
25
+ createListChargesHandler,
26
+ createListIaCreditsHandler,
27
+ createListMessagesHandler,
28
+ createListPlansHandler,
29
+ createListProjectUsersHandler,
30
+ createListProjectsHandler,
31
+ createListSubscriptionsHandler
32
+ };
33
+ //# sourceMappingURL=handlers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/handlers.ts"],"sourcesContent":["export { createListCardsHandler } from './modules/cards/handlers/list-cards.handler';\nexport { createFindCardByIdHandler } from './modules/cards/handlers/find-card-by-id.handler';\n\nexport { createListChargesHandler } from './modules/charges/handlers/list-charges.handler';\nexport { createFindChargeByIdHandler } from './modules/charges/handlers/find-charge-by-id.handler';\n\nexport { createListIaCreditsHandler } from './modules/ia-credits/handlers/list-ia-credits.handler';\n\nexport { createCountPagesHandler } from './modules/pages/handlers/count-pages.handler';\n\nexport { createListPlansHandler } from './modules/plans/handlers/list-plans.handler';\nexport { createFindPlanByIdHandler } from './modules/plans/handlers/find-plan-by-id.handler';\n\nexport { createListProjectsHandler } from './modules/projects/handlers/list-projects.handler';\nexport { createFindProjectHandler } from './modules/projects/handlers/find-project.handler';\nexport { createListProjectUsersHandler } from './modules/projects/handlers/list-project-users.handler';\nexport { createListAvailableUsersHandler } from './modules/projects/handlers/list-available-users.handler';\nexport { createListAllAccountUsersHandler } from './modules/projects/handlers/list-all-account-users.handler';\n\nexport { createListSubscriptionsHandler } from './modules/subscriptions/handlers/list-subscriptions.handler';\n\nexport { createListMessagesHandler } from './modules/users/handlers/list-messages.handler';\n"],"mappings":"AAAA,SAAS,8BAA8B;AACvC,SAAS,iCAAiC;AAE1C,SAAS,gCAAgC;AACzC,SAAS,mCAAmC;AAE5C,SAAS,kCAAkC;AAE3C,SAAS,+BAA+B;AAExC,SAAS,8BAA8B;AACvC,SAAS,iCAAiC;AAE1C,SAAS,iCAAiC;AAC1C,SAAS,gCAAgC;AACzC,SAAS,qCAAqC;AAC9C,SAAS,uCAAuC;AAChD,SAAS,wCAAwC;AAEjD,SAAS,sCAAsC;AAE/C,SAAS,iCAAiC;","names":[]}
package/dist/http.mjs ADDED
@@ -0,0 +1,5 @@
1
+ import { apiFetch } from "./infra/http/api-fetch";
2
+ export {
3
+ apiFetch
4
+ };
5
+ //# sourceMappingURL=http.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/http.ts"],"sourcesContent":["export { apiFetch } from './infra/http/api-fetch';\n"],"mappings":"AAAA,SAAS,gBAAgB;","names":[]}
@@ -0,0 +1,30 @@
1
+ import { buildQueryParams } from "../utils/params";
2
+ async function apiFetch(path, options = {}) {
3
+ const { params, signal } = options;
4
+ const qs = params ? buildQueryParams(params) : "";
5
+ const url = qs ? `${path}?${qs}` : path;
6
+ const response = await fetch(url, {
7
+ method: "GET",
8
+ credentials: "same-origin",
9
+ headers: { Accept: "application/json" },
10
+ signal
11
+ });
12
+ if (!response.ok) {
13
+ let message = `Erro ${response.status}`;
14
+ try {
15
+ const body2 = await response.json();
16
+ if (body2 && !body2.success && body2.error) message = body2.error;
17
+ } catch {
18
+ }
19
+ throw new Error(message);
20
+ }
21
+ const body = await response.json();
22
+ if (!body.success) {
23
+ throw new Error(body.error ?? "Erro desconhecido");
24
+ }
25
+ return body.data;
26
+ }
27
+ export {
28
+ apiFetch
29
+ };
30
+ //# sourceMappingURL=api-fetch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/infra/http/api-fetch.ts"],"sourcesContent":["import { buildQueryParams } from '../utils/params';\nimport type { ActionResult } from '../api/types';\n\ntype QueryParams = Parameters<typeof buildQueryParams>[0];\n\ninterface ApiFetchOptions {\n params?: object;\n signal?: AbortSignal;\n}\n\nexport async function apiFetch<T>(path: string, options: ApiFetchOptions = {}): Promise<T> {\n const { params, signal } = options;\n const qs = params ? buildQueryParams(params as QueryParams) : '';\n const url = qs ? `${path}?${qs}` : path;\n\n const response = await fetch(url, {\n method: 'GET',\n credentials: 'same-origin',\n headers: { Accept: 'application/json' },\n signal,\n });\n\n if (!response.ok) {\n let message = `Erro ${response.status}`;\n try {\n const body = (await response.json()) as ActionResult<unknown>;\n if (body && !body.success && body.error) message = body.error;\n } catch {\n // corpo não-JSON — mantém a mensagem genérica\n }\n throw new Error(message);\n }\n\n const body = (await response.json()) as ActionResult<T>;\n if (!body.success) {\n throw new Error(body.error ?? 'Erro desconhecido');\n }\n return body.data as T;\n}\n"],"mappings":"AAAA,SAAS,wBAAwB;AAUjC,eAAsB,SAAY,MAAc,UAA2B,CAAC,GAAe;AACzF,QAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,QAAM,KAAK,SAAS,iBAAiB,MAAqB,IAAI;AAC9D,QAAM,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK;AAEnC,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,EAAE,QAAQ,mBAAmB;AAAA,IACtC;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,QAAI,UAAU,QAAQ,SAAS,MAAM;AACrC,QAAI;AACF,YAAMA,QAAQ,MAAM,SAAS,KAAK;AAClC,UAAIA,SAAQ,CAACA,MAAK,WAAWA,MAAK,MAAO,WAAUA,MAAK;AAAA,IAC1D,QAAQ;AAAA,IAER;AACA,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAEA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,MAAI,CAAC,KAAK,SAAS;AACjB,UAAM,IAAI,MAAM,KAAK,SAAS,mBAAmB;AAAA,EACnD;AACA,SAAO,KAAK;AACd;","names":["body"]}
@@ -0,0 +1,12 @@
1
+ import { ApiError } from "../api/types";
2
+ function parseId(value) {
3
+ const id = Number(value);
4
+ if (!Number.isFinite(id) || id <= 0) {
5
+ throw new ApiError("Identificador inv\xE1lido", "INVALID_ID", 400);
6
+ }
7
+ return id;
8
+ }
9
+ export {
10
+ parseId
11
+ };
12
+ //# sourceMappingURL=parse-id.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/infra/route/parse-id.ts"],"sourcesContent":["import { ApiError } from '../api/types';\n\nexport function parseId(value: string): number {\n const id = Number(value);\n if (!Number.isFinite(id) || id <= 0) {\n throw new ApiError('Identificador inválido', 'INVALID_ID', 400);\n }\n return id;\n}\n"],"mappings":"AAAA,SAAS,gBAAgB;AAElB,SAAS,QAAQ,OAAuB;AAC7C,QAAM,KAAK,OAAO,KAAK;AACvB,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,MAAM,GAAG;AACnC,UAAM,IAAI,SAAS,6BAA0B,cAAc,GAAG;AAAA,EAChE;AACA,SAAO;AACT;","names":[]}
@@ -0,0 +1,18 @@
1
+ import "server-only";
2
+ import { ApiError } from "../api/types";
3
+ async function safeRouteHandler(fn) {
4
+ try {
5
+ const data = await fn();
6
+ return Response.json({ success: true, data });
7
+ } catch (error) {
8
+ if (error instanceof ApiError) {
9
+ return Response.json({ success: false, error: error.message }, { status: error.statusCode });
10
+ }
11
+ console.error("[safeRouteHandler] erro inesperado", error);
12
+ return Response.json({ success: false, error: "Erro interno do servidor" }, { status: 500 });
13
+ }
14
+ }
15
+ export {
16
+ safeRouteHandler
17
+ };
18
+ //# sourceMappingURL=safe-route-handler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/infra/route/safe-route-handler.ts"],"sourcesContent":["import 'server-only';\n\nimport { ApiError } from '../api/types';\n\nexport async function safeRouteHandler<T>(fn: () => Promise<T>): Promise<Response> {\n try {\n const data = await fn();\n return Response.json({ success: true, data });\n } catch (error) {\n if (error instanceof ApiError) {\n return Response.json({ success: false, error: error.message }, { status: error.statusCode });\n }\n console.error('[safeRouteHandler] erro inesperado', error);\n return Response.json({ success: false, error: 'Erro interno do servidor' }, { status: 500 });\n }\n}\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,gBAAgB;AAEzB,eAAsB,iBAAoB,IAAyC;AACjF,MAAI;AACF,UAAM,OAAO,MAAM,GAAG;AACtB,WAAO,SAAS,KAAK,EAAE,SAAS,MAAM,KAAK,CAAC;AAAA,EAC9C,SAAS,OAAO;AACd,QAAI,iBAAiB,UAAU;AAC7B,aAAO,SAAS,KAAK,EAAE,SAAS,OAAO,OAAO,MAAM,QAAQ,GAAG,EAAE,QAAQ,MAAM,WAAW,CAAC;AAAA,IAC7F;AACA,YAAQ,MAAM,sCAAsC,KAAK;AACzD,WAAO,SAAS,KAAK,EAAE,SAAS,OAAO,OAAO,2BAA2B,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC7F;AACF;","names":[]}
@@ -0,0 +1,11 @@
1
+ function searchParamsToParams(searchParams) {
2
+ const params = /* @__PURE__ */ Object.create(null);
3
+ for (const [key, value] of searchParams.entries()) {
4
+ params[key] = value;
5
+ }
6
+ return params;
7
+ }
8
+ export {
9
+ searchParamsToParams
10
+ };
11
+ //# sourceMappingURL=search-params.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/infra/route/search-params.ts"],"sourcesContent":["export function searchParamsToParams<T extends object>(\n searchParams: URLSearchParams\n): Partial<T> {\n const params = Object.create(null) as Partial<Record<keyof T, string>>;\n for (const [key, value] of searchParams.entries()) {\n params[key as keyof T] = value;\n }\n return params as Partial<T>;\n}\n"],"mappings":"AAAO,SAAS,qBACd,cACY;AACZ,QAAM,SAAS,uBAAO,OAAO,IAAI;AACjC,aAAW,CAAC,KAAK,KAAK,KAAK,aAAa,QAAQ,GAAG;AACjD,WAAO,GAAc,IAAI;AAAA,EAC3B;AACA,SAAO;AACT;","names":[]}
@@ -0,0 +1,16 @@
1
+ import "server-only";
2
+ import { parseId } from "../../../infra/route/parse-id";
3
+ import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
4
+ import { cardsService } from "../services/cards.service";
5
+ function createFindCardByIdHandler() {
6
+ return async function GET(_req, { params }) {
7
+ return safeRouteHandler(async () => {
8
+ const { id } = await params;
9
+ return cardsService.findCardById(parseId(id));
10
+ });
11
+ };
12
+ }
13
+ export {
14
+ createFindCardByIdHandler
15
+ };
16
+ //# sourceMappingURL=find-card-by-id.handler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/cards/handlers/find-card-by-id.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { parseId } from '../../../infra/route/parse-id';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { cardsService } from '../services/cards.service';\n\nexport function createFindCardByIdHandler() {\n return async function GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) {\n return safeRouteHandler(async () => {\n const { id } = await params;\n return cardsService.findCardById(parseId(id));\n });\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,eAAe;AACxB,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAEtB,SAAS,4BAA4B;AAC1C,SAAO,eAAe,IAAI,MAAmB,EAAE,OAAO,GAAwC;AAC5F,WAAO,iBAAiB,YAAY;AAClC,YAAM,EAAE,GAAG,IAAI,MAAM;AACrB,aAAO,aAAa,aAAa,QAAQ,EAAE,CAAC;AAAA,IAC9C,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -0,0 +1,12 @@
1
+ import "server-only";
2
+ import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
3
+ import { cardsService } from "../services/cards.service";
4
+ function createListCardsHandler() {
5
+ return async function GET() {
6
+ return safeRouteHandler(() => cardsService.listCards());
7
+ };
8
+ }
9
+ export {
10
+ createListCardsHandler
11
+ };
12
+ //# sourceMappingURL=list-cards.handler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/cards/handlers/list-cards.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { cardsService } from '../services/cards.service';\n\nexport function createListCardsHandler() {\n return async function GET() {\n return safeRouteHandler(() => cardsService.listCards());\n };\n}\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAEtB,SAAS,yBAAyB;AACvC,SAAO,eAAe,MAAM;AAC1B,WAAO,iBAAiB,MAAM,aAAa,UAAU,CAAC;AAAA,EACxD;AACF;","names":[]}
@@ -1,15 +1,12 @@
1
1
  "use client";
2
2
  import { useQuery } from "@tanstack/react-query";
3
- import { withAction } from "../../../utils/withAction";
3
+ import { apiFetch } from "../../../infra/http/api-fetch";
4
4
  import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
5
5
  function useCardById(id) {
6
6
  const cardKey = useAuthQueryKey(["card", id]);
7
7
  return useQuery({
8
8
  queryKey: cardKey,
9
- queryFn: async () => {
10
- const { findCardByIdAction } = await import("../actions/find-card-by-id.action");
11
- return withAction(findCardByIdAction)(id);
12
- },
9
+ queryFn: ({ signal }) => apiFetch(`/api/cards/${id}`, { signal }),
13
10
  enabled: id != null
14
11
  });
15
12
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/cards/hooks/card-by-id.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nexport function useCardById(id: number | undefined) {\n const cardKey = useAuthQueryKey(['card', id]);\n\n return useQuery({\n queryKey: cardKey,\n queryFn: async () => {\n const { findCardByIdAction } = await import('../actions/find-card-by-id.action');\n return withAction(findCardByIdAction)(id!);\n },\n enabled: id != null,\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAEzB,SAAS,YAAY,IAAwB;AAClD,QAAM,UAAU,gBAAgB,CAAC,QAAQ,EAAE,CAAC;AAE5C,SAAO,SAAS;AAAA,IACd,UAAU;AAAA,IACV,SAAS,YAAY;AACnB,YAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,mCAAmC;AAC/E,aAAO,WAAW,kBAAkB,EAAE,EAAG;AAAA,IAC3C;AAAA,IACA,SAAS,MAAM;AAAA,EACjB,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/cards/hooks/card-by-id.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport type { SuccessResult } from '../../../infra/api/types';\nimport type { Card } from '../types';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nexport function useCardById(id: number | undefined) {\n const cardKey = useAuthQueryKey(['card', id]);\n\n return useQuery({\n queryKey: cardKey,\n queryFn: ({ signal }) => apiFetch<SuccessResult<Card>>(`/api/cards/${id}`, { signal }),\n enabled: id != null,\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAGzB,SAAS,uBAAuB;AAEzB,SAAS,YAAY,IAAwB;AAClD,QAAM,UAAU,gBAAgB,CAAC,QAAQ,EAAE,CAAC;AAE5C,SAAO,SAAS;AAAA,IACd,UAAU;AAAA,IACV,SAAS,CAAC,EAAE,OAAO,MAAM,SAA8B,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,IACrF,SAAS,MAAM;AAAA,EACjB,CAAC;AACH;","names":[]}
@@ -1,16 +1,13 @@
1
1
  "use client";
2
2
  import { useQuery } from "@tanstack/react-query";
3
- import { withAction } from "../../../utils/withAction";
3
+ import { apiFetch } from "../../../infra/http/api-fetch";
4
4
  import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
5
5
  const CARDS_QUERY_KEY = ["cards"];
6
6
  function useCards() {
7
7
  const queryKey = useAuthQueryKey([...CARDS_QUERY_KEY]);
8
8
  return useQuery({
9
9
  queryKey,
10
- queryFn: async () => {
11
- const { listCardsAction } = await import("../actions/list-cards.action");
12
- return withAction(listCardsAction)();
13
- },
10
+ queryFn: ({ signal }) => apiFetch("/api/cards", { signal }),
14
11
  select: (result) => ({
15
12
  ...result,
16
13
  data: result.data.filter((card) => !card.deleted)
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/cards/hooks/cards.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nexport const CARDS_QUERY_KEY = ['cards'] as const;\n\nexport function useCards() {\n const queryKey = useAuthQueryKey([...CARDS_QUERY_KEY]);\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n const { listCardsAction } = await import('../actions/list-cards.action');\n return withAction(listCardsAction)();\n },\n select: (result) => ({\n ...result,\n data: result.data.filter((card) => !card.deleted),\n }),\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAEzB,MAAM,kBAAkB,CAAC,OAAO;AAEhC,SAAS,WAAW;AACzB,QAAM,WAAW,gBAAgB,CAAC,GAAG,eAAe,CAAC;AAErD,SAAO,SAAS;AAAA,IACd;AAAA,IACA,SAAS,YAAY;AACnB,YAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,8BAA8B;AACvE,aAAO,WAAW,eAAe,EAAE;AAAA,IACrC;AAAA,IACA,QAAQ,CAAC,YAAY;AAAA,MACnB,GAAG;AAAA,MACH,MAAM,OAAO,KAAK,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO;AAAA,IAClD;AAAA,EACF,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/cards/hooks/cards.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport type { PaginatedSuccessResult } from '../../../infra/api/types';\nimport type { Card } from '../types';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nexport const CARDS_QUERY_KEY = ['cards'] as const;\n\nexport function useCards() {\n const queryKey = useAuthQueryKey([...CARDS_QUERY_KEY]);\n\n return useQuery({\n queryKey,\n queryFn: ({ signal }) => apiFetch<PaginatedSuccessResult<Card>>('/api/cards', { signal }),\n select: (result) => ({\n ...result,\n data: result.data.filter((card) => !card.deleted),\n }),\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAGzB,SAAS,uBAAuB;AAEzB,MAAM,kBAAkB,CAAC,OAAO;AAEhC,SAAS,WAAW;AACzB,QAAM,WAAW,gBAAgB,CAAC,GAAG,eAAe,CAAC;AAErD,SAAO,SAAS;AAAA,IACd;AAAA,IACA,SAAS,CAAC,EAAE,OAAO,MAAM,SAAuC,cAAc,EAAE,OAAO,CAAC;AAAA,IACxF,QAAQ,CAAC,YAAY;AAAA,MACnB,GAAG;AAAA,MACH,MAAM,OAAO,KAAK,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO;AAAA,IAClD;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,15 @@
1
+ import "server-only";
2
+ import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
3
+ import { chargesService } from "../services/charges.service";
4
+ function createFindChargeByIdHandler() {
5
+ return async function GET(_req, { params }) {
6
+ return safeRouteHandler(async () => {
7
+ const { id } = await params;
8
+ return chargesService.findChargeById(id);
9
+ });
10
+ };
11
+ }
12
+ export {
13
+ createFindChargeByIdHandler
14
+ };
15
+ //# sourceMappingURL=find-charge-by-id.handler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/charges/handlers/find-charge-by-id.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { chargesService } from '../services/charges.service';\n\nexport function createFindChargeByIdHandler() {\n return async function GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) {\n return safeRouteHandler(async () => {\n const { id } = await params;\n return chargesService.findChargeById(id);\n });\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAExB,SAAS,8BAA8B;AAC5C,SAAO,eAAe,IAAI,MAAmB,EAAE,OAAO,GAAwC;AAC5F,WAAO,iBAAiB,YAAY;AAClC,YAAM,EAAE,GAAG,IAAI,MAAM;AACrB,aAAO,eAAe,eAAe,EAAE;AAAA,IACzC,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -0,0 +1,15 @@
1
+ import "server-only";
2
+ import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
3
+ import { searchParamsToParams } from "../../../infra/route/search-params";
4
+ import { chargesService } from "../services/charges.service";
5
+ function createListChargesHandler() {
6
+ return async function GET(req) {
7
+ return safeRouteHandler(
8
+ () => chargesService.listCharges(searchParamsToParams(req.nextUrl.searchParams))
9
+ );
10
+ };
11
+ }
12
+ export {
13
+ createListChargesHandler
14
+ };
15
+ //# sourceMappingURL=list-charges.handler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/charges/handlers/list-charges.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { searchParamsToParams } from '../../../infra/route/search-params';\nimport { chargesService } from '../services/charges.service';\nimport type { FindChargesParams } from '../types/charge.type';\n\nexport function createListChargesHandler() {\n return async function GET(req: NextRequest) {\n return safeRouteHandler(() =>\n chargesService.listCharges(searchParamsToParams<FindChargesParams>(req.nextUrl.searchParams))\n );\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,sBAAsB;AAGxB,SAAS,2BAA2B;AACzC,SAAO,eAAe,IAAI,KAAkB;AAC1C,WAAO;AAAA,MAAiB,MACtB,eAAe,YAAY,qBAAwC,IAAI,QAAQ,YAAY,CAAC;AAAA,IAC9F;AAAA,EACF;AACF;","names":[]}
@@ -1,14 +1,13 @@
1
1
  "use client";
2
2
  import { useQuery } from "@tanstack/react-query";
3
- import { withAction } from "../../../utils/withAction";
3
+ import { apiFetch } from "../../../infra/http/api-fetch";
4
4
  import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
5
- import { findChargeByIdAction } from "../actions/find-charge-by-id.action";
6
5
  import { CHARGES_QUERY_KEY } from "../../subscriptions/constants/query-keys.constants";
7
6
  function useChargeById(chargeId) {
8
7
  const chargesKey = useAuthQueryKey([...CHARGES_QUERY_KEY, chargeId]);
9
8
  return useQuery({
10
9
  queryKey: chargesKey,
11
- queryFn: () => withAction(findChargeByIdAction)(chargeId),
10
+ queryFn: ({ signal }) => apiFetch(`/api/charges/${chargeId}`, { signal }),
12
11
  enabled: !!chargeId
13
12
  });
14
13
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/charges/hooks/charge-by-id.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { findChargeByIdAction } from '../actions/find-charge-by-id.action';\nimport { CHARGES_QUERY_KEY } from '../../subscriptions/constants/query-keys.constants';\n\nexport function useChargeById(chargeId: string | number | null | undefined) {\n const chargesKey = useAuthQueryKey([...CHARGES_QUERY_KEY, chargeId]);\n\n return useQuery({\n queryKey: chargesKey,\n queryFn: () => withAction(findChargeByIdAction)(chargeId!),\n enabled: !!chargeId,\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,4BAA4B;AACrC,SAAS,yBAAyB;AAE3B,SAAS,cAAc,UAA8C;AAC1E,QAAM,aAAa,gBAAgB,CAAC,GAAG,mBAAmB,QAAQ,CAAC;AAEnE,SAAO,SAAS;AAAA,IACd,UAAU;AAAA,IACV,SAAS,MAAM,WAAW,oBAAoB,EAAE,QAAS;AAAA,IACzD,SAAS,CAAC,CAAC;AAAA,EACb,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/charges/hooks/charge-by-id.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport type { SuccessResult } from '../../../infra/api/types';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { Charge } from '../types/charge.type';\nimport { CHARGES_QUERY_KEY } from '../../subscriptions/constants/query-keys.constants';\n\nexport function useChargeById(chargeId: string | number | null | undefined) {\n const chargesKey = useAuthQueryKey([...CHARGES_QUERY_KEY, chargeId]);\n\n return useQuery({\n queryKey: chargesKey,\n queryFn: ({ signal }) =>\n apiFetch<SuccessResult<Charge>>(`/api/charges/${chargeId}`, { signal }),\n enabled: !!chargeId,\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAEzB,SAAS,uBAAuB;AAEhC,SAAS,yBAAyB;AAE3B,SAAS,cAAc,UAA8C;AAC1E,QAAM,aAAa,gBAAgB,CAAC,GAAG,mBAAmB,QAAQ,CAAC;AAEnE,SAAO,SAAS;AAAA,IACd,UAAU;AAAA,IACV,SAAS,CAAC,EAAE,OAAO,MACjB,SAAgC,gBAAgB,QAAQ,IAAI,EAAE,OAAO,CAAC;AAAA,IACxE,SAAS,CAAC,CAAC;AAAA,EACb,CAAC;AACH;","names":[]}
@@ -1,14 +1,13 @@
1
1
  "use client";
2
2
  import { useQuery } from "@tanstack/react-query";
3
- import { withAction } from "../../../utils/withAction";
3
+ import { apiFetch } from "../../../infra/http/api-fetch";
4
4
  import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
5
- import { listChargesAction } from "../actions/list-charges.action";
6
5
  import { CHARGES_QUERY_KEY } from "../../subscriptions/constants/query-keys.constants";
7
6
  function useCharges(params) {
8
7
  const chargesKey = useAuthQueryKey([...CHARGES_QUERY_KEY, params]);
9
8
  return useQuery({
10
9
  queryKey: chargesKey,
11
- queryFn: () => withAction(listChargesAction)(params),
10
+ queryFn: ({ signal }) => apiFetch("/api/charges", { params, signal }),
12
11
  staleTime: 1e4
13
12
  });
14
13
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/charges/hooks/charges.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { listChargesAction } from '../actions/list-charges.action';\nimport { FindChargesParams } from '../types/charge.type';\nimport { CHARGES_QUERY_KEY } from '../../subscriptions/constants/query-keys.constants';\n\nexport function useCharges(params?: Partial<FindChargesParams>) {\n const chargesKey = useAuthQueryKey([...CHARGES_QUERY_KEY, params]);\n\n return useQuery({\n queryKey: chargesKey,\n queryFn: () => withAction(listChargesAction)(params),\n staleTime: 10_000,\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAElC,SAAS,yBAAyB;AAE3B,SAAS,WAAW,QAAqC;AAC9D,QAAM,aAAa,gBAAgB,CAAC,GAAG,mBAAmB,MAAM,CAAC;AAEjE,SAAO,SAAS;AAAA,IACd,UAAU;AAAA,IACV,SAAS,MAAM,WAAW,iBAAiB,EAAE,MAAM;AAAA,IACnD,WAAW;AAAA,EACb,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/charges/hooks/charges.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport type { PaginatedSuccessResult } from '../../../infra/api/types';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { Charge, FindChargesParams } from '../types/charge.type';\nimport { CHARGES_QUERY_KEY } from '../../subscriptions/constants/query-keys.constants';\n\nexport function useCharges(params?: Partial<FindChargesParams>) {\n const chargesKey = useAuthQueryKey([...CHARGES_QUERY_KEY, params]);\n\n return useQuery({\n queryKey: chargesKey,\n queryFn: ({ signal }) =>\n apiFetch<PaginatedSuccessResult<Charge>>('/api/charges', { params, signal }),\n staleTime: 10_000,\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAEzB,SAAS,uBAAuB;AAEhC,SAAS,yBAAyB;AAE3B,SAAS,WAAW,QAAqC;AAC9D,QAAM,aAAa,gBAAgB,CAAC,GAAG,mBAAmB,MAAM,CAAC;AAEjE,SAAO,SAAS;AAAA,IACd,UAAU;AAAA,IACV,SAAS,CAAC,EAAE,OAAO,MACjB,SAAyC,gBAAgB,EAAE,QAAQ,OAAO,CAAC;AAAA,IAC7E,WAAW;AAAA,EACb,CAAC;AACH;","names":[]}
@@ -0,0 +1,15 @@
1
+ import "server-only";
2
+ import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
3
+ import { iaCreditsService } from "../services/ia-credits.service";
4
+ function createListIaCreditsHandler() {
5
+ return async function GET(_req, { params }) {
6
+ return safeRouteHandler(async () => {
7
+ const { id } = await params;
8
+ return iaCreditsService.listOperations(id);
9
+ });
10
+ };
11
+ }
12
+ export {
13
+ createListIaCreditsHandler
14
+ };
15
+ //# sourceMappingURL=list-ia-credits.handler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/ia-credits/handlers/list-ia-credits.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { iaCreditsService } from '../services/ia-credits.service';\n\nexport function createListIaCreditsHandler() {\n return async function GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) {\n return safeRouteHandler(async () => {\n const { id } = await params;\n return iaCreditsService.listOperations(id);\n });\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAE1B,SAAS,6BAA6B;AAC3C,SAAO,eAAe,IAAI,MAAmB,EAAE,OAAO,GAAwC;AAC5F,WAAO,iBAAiB,YAAY;AAClC,YAAM,EAAE,GAAG,IAAI,MAAM;AACrB,aAAO,iBAAiB,eAAe,EAAE;AAAA,IAC3C,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -1,9 +1,8 @@
1
1
  "use client";
2
2
  import { useMemo } from "react";
3
3
  import { useQuery } from "@tanstack/react-query";
4
- import { listIaCreditsAction } from "../actions/list-ia-credits.action";
4
+ import { apiFetch } from "../../../infra/http/api-fetch";
5
5
  import { useActiveSubscription } from "../../subscriptions/hooks/find-active-subscription.hook";
6
- import { withAction } from "../../../utils/withAction";
7
6
  import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
8
7
  function calculateSummary(operations) {
9
8
  const today = /* @__PURE__ */ new Date();
@@ -56,7 +55,10 @@ function useIaCredits() {
56
55
  const queryKey = useAuthQueryKey(["ia-credits", subscriptionId]);
57
56
  const query = useQuery({
58
57
  queryKey,
59
- queryFn: withAction(() => listIaCreditsAction(subscriptionId)),
58
+ queryFn: ({ signal }) => apiFetch(
59
+ `/api/subscriptions/${subscriptionId}/ia-credits`,
60
+ { signal }
61
+ ),
60
62
  enabled: subscriptionId != null
61
63
  });
62
64
  const operations = query.data?.data ?? [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/ia-credits/hooks/ia-credits.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { listIaCreditsAction } from '../actions/list-ia-credits.action';\nimport type { IaCreditOperation, IaCreditsSummary } from '../types';\nimport { useActiveSubscription } from '../../subscriptions/hooks/find-active-subscription.hook';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nfunction calculateSummary(operations: IaCreditOperation[]): IaCreditsSummary {\n const today = new Date();\n const todayDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n\n const adds = operations.filter((op) => op.operation === 'add');\n const subtracts = operations.filter((op) => op.operation === 'subtract');\n\n let totalCredits = 0;\n let usedCredits = 0;\n let nextExpirationInDays: number | null = null;\n let nextExpiringCredits: number | null = null;\n\n for (const add of adds) {\n const expirationRaw = add.expiration_time;\n if (!expirationRaw) continue;\n\n const expiration = new Date(expirationRaw);\n const expirationDate = new Date(\n expiration.getFullYear(),\n expiration.getMonth(),\n expiration.getDate()\n );\n\n const expiredByDate = expirationDate.getTime() < todayDate.getTime();\n const hasExpired = add.has_expired || expiredByDate;\n\n if (hasExpired) continue;\n\n const addedCredits = add.operation_value;\n\n const consumedForAdd = subtracts\n .filter((sub) => String(sub.consumed_from_add_id) === String(add.id))\n .reduce((sum, sub) => sum + sub.operation_value, 0);\n\n const remainingForAdd = Math.max(0, addedCredits - consumedForAdd);\n\n totalCredits += addedCredits;\n usedCredits += consumedForAdd;\n\n const diffMs = expirationDate.getTime() - todayDate.getTime();\n const days = Math.max(0, Math.ceil(diffMs / (1000 * 60 * 60 * 24)));\n\n if (remainingForAdd > 0) {\n if (nextExpirationInDays === null || days < nextExpirationInDays) {\n nextExpirationInDays = days;\n nextExpiringCredits = remainingForAdd;\n }\n }\n }\n\n const availableCredits = Math.max(0, totalCredits - usedCredits);\n\n return {\n totalCredits,\n usedCredits,\n availableCredits,\n nextExpiringCredits,\n nextExpirationInDays,\n };\n}\n\nexport function useIaCredits() {\n const { data: subscriptionData, isPending: isSubscriptionLoading } = useActiveSubscription();\n const subscription = subscriptionData?.data?.[0] ?? null;\n const subscriptionId = subscription?.id;\n const queryKey = useAuthQueryKey(['ia-credits', subscriptionId]);\n\n const query = useQuery({\n queryKey,\n queryFn: withAction(() => listIaCreditsAction(subscriptionId!)),\n enabled: subscriptionId != null,\n });\n\n const operations = query.data?.data ?? [];\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const summary = useMemo(() => calculateSummary(operations), [operations]);\n\n return {\n subscription,\n operations,\n summary,\n isLoading: isSubscriptionLoading || query.isPending,\n isSubscriptionLoading,\n isCreditsLoading: query.isPending,\n isError: query.isError,\n error: query.error,\n };\n}\n"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,2BAA2B;AAEpC,SAAS,6BAA6B;AACtC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAEhC,SAAS,iBAAiB,YAAmD;AAC3E,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,YAAY,IAAI,KAAK,MAAM,YAAY,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC;AAEjF,QAAM,OAAO,WAAW,OAAO,CAAC,OAAO,GAAG,cAAc,KAAK;AAC7D,QAAM,YAAY,WAAW,OAAO,CAAC,OAAO,GAAG,cAAc,UAAU;AAEvE,MAAI,eAAe;AACnB,MAAI,cAAc;AAClB,MAAI,uBAAsC;AAC1C,MAAI,sBAAqC;AAEzC,aAAW,OAAO,MAAM;AACtB,UAAM,gBAAgB,IAAI;AAC1B,QAAI,CAAC,cAAe;AAEpB,UAAM,aAAa,IAAI,KAAK,aAAa;AACzC,UAAM,iBAAiB,IAAI;AAAA,MACzB,WAAW,YAAY;AAAA,MACvB,WAAW,SAAS;AAAA,MACpB,WAAW,QAAQ;AAAA,IACrB;AAEA,UAAM,gBAAgB,eAAe,QAAQ,IAAI,UAAU,QAAQ;AACnE,UAAM,aAAa,IAAI,eAAe;AAEtC,QAAI,WAAY;AAEhB,UAAM,eAAe,IAAI;AAEzB,UAAM,iBAAiB,UACpB,OAAO,CAAC,QAAQ,OAAO,IAAI,oBAAoB,MAAM,OAAO,IAAI,EAAE,CAAC,EACnE,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,iBAAiB,CAAC;AAEpD,UAAM,kBAAkB,KAAK,IAAI,GAAG,eAAe,cAAc;AAEjE,oBAAgB;AAChB,mBAAe;AAEf,UAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,QAAQ;AAC5D,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,UAAU,MAAO,KAAK,KAAK,GAAG,CAAC;AAElE,QAAI,kBAAkB,GAAG;AACvB,UAAI,yBAAyB,QAAQ,OAAO,sBAAsB;AAChE,+BAAuB;AACvB,8BAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,KAAK,IAAI,GAAG,eAAe,WAAW;AAE/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,eAAe;AAC7B,QAAM,EAAE,MAAM,kBAAkB,WAAW,sBAAsB,IAAI,sBAAsB;AAC3F,QAAM,eAAe,kBAAkB,OAAO,CAAC,KAAK;AACpD,QAAM,iBAAiB,cAAc;AACrC,QAAM,WAAW,gBAAgB,CAAC,cAAc,cAAc,CAAC;AAE/D,QAAM,QAAQ,SAAS;AAAA,IACrB;AAAA,IACA,SAAS,WAAW,MAAM,oBAAoB,cAAe,CAAC;AAAA,IAC9D,SAAS,kBAAkB;AAAA,EAC7B,CAAC;AAED,QAAM,aAAa,MAAM,MAAM,QAAQ,CAAC;AAGxC,QAAM,UAAU,QAAQ,MAAM,iBAAiB,UAAU,GAAG,CAAC,UAAU,CAAC;AAExE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,yBAAyB,MAAM;AAAA,IAC1C;AAAA,IACA,kBAAkB,MAAM;AAAA,IACxB,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,EACf;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/modules/ia-credits/hooks/ia-credits.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport type { PaginatedSuccessResult } from '../../../infra/api/types';\nimport type { IaCreditOperation, IaCreditsSummary } from '../types';\nimport { useActiveSubscription } from '../../subscriptions/hooks/find-active-subscription.hook';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nfunction calculateSummary(operations: IaCreditOperation[]): IaCreditsSummary {\n const today = new Date();\n const todayDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n\n const adds = operations.filter((op) => op.operation === 'add');\n const subtracts = operations.filter((op) => op.operation === 'subtract');\n\n let totalCredits = 0;\n let usedCredits = 0;\n let nextExpirationInDays: number | null = null;\n let nextExpiringCredits: number | null = null;\n\n for (const add of adds) {\n const expirationRaw = add.expiration_time;\n if (!expirationRaw) continue;\n\n const expiration = new Date(expirationRaw);\n const expirationDate = new Date(\n expiration.getFullYear(),\n expiration.getMonth(),\n expiration.getDate()\n );\n\n const expiredByDate = expirationDate.getTime() < todayDate.getTime();\n const hasExpired = add.has_expired || expiredByDate;\n\n if (hasExpired) continue;\n\n const addedCredits = add.operation_value;\n\n const consumedForAdd = subtracts\n .filter((sub) => String(sub.consumed_from_add_id) === String(add.id))\n .reduce((sum, sub) => sum + sub.operation_value, 0);\n\n const remainingForAdd = Math.max(0, addedCredits - consumedForAdd);\n\n totalCredits += addedCredits;\n usedCredits += consumedForAdd;\n\n const diffMs = expirationDate.getTime() - todayDate.getTime();\n const days = Math.max(0, Math.ceil(diffMs / (1000 * 60 * 60 * 24)));\n\n if (remainingForAdd > 0) {\n if (nextExpirationInDays === null || days < nextExpirationInDays) {\n nextExpirationInDays = days;\n nextExpiringCredits = remainingForAdd;\n }\n }\n }\n\n const availableCredits = Math.max(0, totalCredits - usedCredits);\n\n return {\n totalCredits,\n usedCredits,\n availableCredits,\n nextExpiringCredits,\n nextExpirationInDays,\n };\n}\n\nexport function useIaCredits() {\n const { data: subscriptionData, isPending: isSubscriptionLoading } = useActiveSubscription();\n const subscription = subscriptionData?.data?.[0] ?? null;\n const subscriptionId = subscription?.id;\n const queryKey = useAuthQueryKey(['ia-credits', subscriptionId]);\n\n const query = useQuery({\n queryKey,\n queryFn: ({ signal }) =>\n apiFetch<PaginatedSuccessResult<IaCreditOperation>>(\n `/api/subscriptions/${subscriptionId}/ia-credits`,\n { signal }\n ),\n enabled: subscriptionId != null,\n });\n\n const operations = query.data?.data ?? [];\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const summary = useMemo(() => calculateSummary(operations), [operations]);\n\n return {\n subscription,\n operations,\n summary,\n isLoading: isSubscriptionLoading || query.isPending,\n isSubscriptionLoading,\n isCreditsLoading: query.isPending,\n isError: query.isError,\n error: query.error,\n };\n}\n"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAGzB,SAAS,6BAA6B;AACtC,SAAS,uBAAuB;AAEhC,SAAS,iBAAiB,YAAmD;AAC3E,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,YAAY,IAAI,KAAK,MAAM,YAAY,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC;AAEjF,QAAM,OAAO,WAAW,OAAO,CAAC,OAAO,GAAG,cAAc,KAAK;AAC7D,QAAM,YAAY,WAAW,OAAO,CAAC,OAAO,GAAG,cAAc,UAAU;AAEvE,MAAI,eAAe;AACnB,MAAI,cAAc;AAClB,MAAI,uBAAsC;AAC1C,MAAI,sBAAqC;AAEzC,aAAW,OAAO,MAAM;AACtB,UAAM,gBAAgB,IAAI;AAC1B,QAAI,CAAC,cAAe;AAEpB,UAAM,aAAa,IAAI,KAAK,aAAa;AACzC,UAAM,iBAAiB,IAAI;AAAA,MACzB,WAAW,YAAY;AAAA,MACvB,WAAW,SAAS;AAAA,MACpB,WAAW,QAAQ;AAAA,IACrB;AAEA,UAAM,gBAAgB,eAAe,QAAQ,IAAI,UAAU,QAAQ;AACnE,UAAM,aAAa,IAAI,eAAe;AAEtC,QAAI,WAAY;AAEhB,UAAM,eAAe,IAAI;AAEzB,UAAM,iBAAiB,UACpB,OAAO,CAAC,QAAQ,OAAO,IAAI,oBAAoB,MAAM,OAAO,IAAI,EAAE,CAAC,EACnE,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,iBAAiB,CAAC;AAEpD,UAAM,kBAAkB,KAAK,IAAI,GAAG,eAAe,cAAc;AAEjE,oBAAgB;AAChB,mBAAe;AAEf,UAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,QAAQ;AAC5D,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,UAAU,MAAO,KAAK,KAAK,GAAG,CAAC;AAElE,QAAI,kBAAkB,GAAG;AACvB,UAAI,yBAAyB,QAAQ,OAAO,sBAAsB;AAChE,+BAAuB;AACvB,8BAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,KAAK,IAAI,GAAG,eAAe,WAAW;AAE/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,eAAe;AAC7B,QAAM,EAAE,MAAM,kBAAkB,WAAW,sBAAsB,IAAI,sBAAsB;AAC3F,QAAM,eAAe,kBAAkB,OAAO,CAAC,KAAK;AACpD,QAAM,iBAAiB,cAAc;AACrC,QAAM,WAAW,gBAAgB,CAAC,cAAc,cAAc,CAAC;AAE/D,QAAM,QAAQ,SAAS;AAAA,IACrB;AAAA,IACA,SAAS,CAAC,EAAE,OAAO,MACjB;AAAA,MACE,sBAAsB,cAAc;AAAA,MACpC,EAAE,OAAO;AAAA,IACX;AAAA,IACF,SAAS,kBAAkB;AAAA,EAC7B,CAAC;AAED,QAAM,aAAa,MAAM,MAAM,QAAQ,CAAC;AAGxC,QAAM,UAAU,QAAQ,MAAM,iBAAiB,UAAU,GAAG,CAAC,UAAU,CAAC;AAExE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,yBAAyB,MAAM;AAAA,IAC1C;AAAA,IACA,kBAAkB,MAAM;AAAA,IACxB,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,EACf;AACF;","names":[]}
@@ -0,0 +1,14 @@
1
+ import "server-only";
2
+ import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
3
+ import { pagesService } from "../services/pages.service";
4
+ function createCountPagesHandler() {
5
+ return async function GET() {
6
+ return safeRouteHandler(async () => ({
7
+ total: await pagesService.countPages()
8
+ }));
9
+ };
10
+ }
11
+ export {
12
+ createCountPagesHandler
13
+ };
14
+ //# sourceMappingURL=count-pages.handler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/pages/handlers/count-pages.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { pagesService } from '../services/pages.service';\n\nexport function createCountPagesHandler() {\n return async function GET() {\n return safeRouteHandler(async () => ({\n total: await pagesService.countPages(),\n }));\n };\n}\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAEtB,SAAS,0BAA0B;AACxC,SAAO,eAAe,MAAM;AAC1B,WAAO,iBAAiB,aAAa;AAAA,MACnC,OAAO,MAAM,aAAa,WAAW;AAAA,IACvC,EAAE;AAAA,EACJ;AACF;","names":[]}
@@ -1,16 +1,15 @@
1
1
  "use client";
2
2
  import { useQuery } from "@tanstack/react-query";
3
- import { countPagesAction } from "../actions/count-pages.action";
3
+ import { apiFetch } from "../../../infra/http/api-fetch";
4
4
  import { PAGES_QUERY_KEY } from "../constants/query-keys.constants";
5
- import { withAction } from "../../../utils/withAction";
6
5
  import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
7
6
  const COUNT_PAGES_QUERY_KEY = [...PAGES_QUERY_KEY, "count"];
8
7
  function useCountPages() {
9
8
  const queryKey = useAuthQueryKey([...COUNT_PAGES_QUERY_KEY]);
10
9
  return useQuery({
11
10
  queryKey,
12
- queryFn: async () => {
13
- const result = await withAction(countPagesAction)();
11
+ queryFn: async ({ signal }) => {
12
+ const result = await apiFetch("/api/pages/count", { signal });
14
13
  return result.total;
15
14
  },
16
15
  staleTime: 3e4