@greatapps/common 1.1.565 → 1.1.567

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 (37) hide show
  1. package/dist/components/modals/cards/CannotDeleteCardModal.mjs +100 -0
  2. package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -0
  3. package/dist/components/modals/cards/DeleteCardModal.mjs +121 -0
  4. package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -0
  5. package/dist/components/ui/data-display/CardItem.mjs +68 -17
  6. package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
  7. package/dist/components/ui/data-display/PaymentInfoCard.mjs +22 -26
  8. package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
  9. package/dist/index.mjs +10 -0
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/modules/cards/hooks/delete-confirmation.hook.mjs +31 -0
  12. package/dist/modules/cards/hooks/delete-confirmation.hook.mjs.map +1 -0
  13. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs +31 -0
  14. package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -0
  15. package/dist/modules/subscriptions/actions/update-subscription-payment.action.mjs +12 -0
  16. package/dist/modules/subscriptions/actions/update-subscription-payment.action.mjs.map +1 -0
  17. package/dist/modules/subscriptions/hooks/update-subscription-payment.hook.mjs +23 -0
  18. package/dist/modules/subscriptions/hooks/update-subscription-payment.hook.mjs.map +1 -0
  19. package/dist/modules/subscriptions/services/subscriptions.service.mjs +16 -0
  20. package/dist/modules/subscriptions/services/subscriptions.service.mjs.map +1 -1
  21. package/dist/modules/subscriptions/types/subscription.type.mjs +1 -1
  22. package/dist/modules/subscriptions/types/subscription.type.mjs.map +1 -1
  23. package/dist/server.mjs +2 -0
  24. package/dist/server.mjs.map +1 -1
  25. package/package.json +1 -1
  26. package/src/components/modals/cards/CannotDeleteCardModal.tsx +123 -0
  27. package/src/components/modals/cards/DeleteCardModal.tsx +132 -0
  28. package/src/components/ui/data-display/CardItem.tsx +70 -12
  29. package/src/components/ui/data-display/PaymentInfoCard.tsx +28 -28
  30. package/src/index.ts +6 -0
  31. package/src/modules/cards/hooks/delete-confirmation.hook.ts +42 -0
  32. package/src/modules/cards/hooks/handle-delete-card.hook.ts +42 -0
  33. package/src/modules/subscriptions/actions/update-subscription-payment.action.ts +13 -0
  34. package/src/modules/subscriptions/hooks/update-subscription-payment.hook.ts +25 -0
  35. package/src/modules/subscriptions/services/subscriptions.service.ts +23 -0
  36. package/src/modules/subscriptions/types/subscription.type.ts +1 -1
  37. package/src/server.ts +1 -0
@@ -0,0 +1,100 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useCallback } from "react";
4
+ import { Dialog, DialogContent, DialogTitle } from "../../ui/overlay/Dialog";
5
+ import { Button } from "../../ui/buttons/Button";
6
+ import { Toast } from "../../ui/feedback/Toast";
7
+ import { CardItem } from "../../ui/data-display/CardItem";
8
+ import { IconAlertTriangle, IconPlus } from "@tabler/icons-react";
9
+ import { toast } from "sonner";
10
+ import { useModalManager } from "../../../store/useModalManager";
11
+ import { useCards } from "../../../modules/cards/hooks/cards.hook";
12
+ import { useActiveSubscription } from "../../../modules/subscriptions/hooks/find-active-subscription.hook";
13
+ import { useUpdateSubscriptionPayment } from "../../../modules/subscriptions/hooks/update-subscription-payment.hook";
14
+ function CannotDeleteCardModal() {
15
+ const { activeModal, modalData, closeModal, openModal } = useModalManager();
16
+ const { data: cardsData } = useCards();
17
+ const { mutateAsync: updatePayment } = useUpdateSubscriptionPayment();
18
+ const { data: subscriptionData } = useActiveSubscription();
19
+ const activeSubscription = subscriptionData?.data?.[0] ?? null;
20
+ const isOpen = activeModal === "cannotDeleteCardModal";
21
+ const cardToDeleteId = modalData.cardId;
22
+ const allCards = cardsData?.data ?? [];
23
+ const cardToDelete = allCards.find((c) => c.id.toString() === cardToDeleteId);
24
+ const availableCards = allCards.filter((c) => c.id.toString() !== cardToDeleteId);
25
+ const handleSelectCard = useCallback(
26
+ async (card) => {
27
+ if (!activeSubscription || !cardToDelete) return;
28
+ try {
29
+ await updatePayment({
30
+ subscriptionId: activeSubscription.id,
31
+ data: { id_card: card.id.toString(), payment_method: 1 }
32
+ });
33
+ closeModal();
34
+ openModal("deleteCardModal", {
35
+ cardId: cardToDelete.id.toString()
36
+ });
37
+ } catch (error) {
38
+ toast.custom(
39
+ (t) => /* @__PURE__ */ jsx(
40
+ Toast,
41
+ {
42
+ variant: "error",
43
+ message: error instanceof Error ? error.message : "Erro ao atualizar cart\xE3o da assinatura",
44
+ toastId: t
45
+ }
46
+ ),
47
+ { duration: 5e3 }
48
+ );
49
+ }
50
+ },
51
+ [updatePayment, activeSubscription, closeModal, openModal, cardToDelete]
52
+ );
53
+ const handleAddCard = useCallback(() => {
54
+ closeModal();
55
+ openModal("addCardModal", { showDefaultToggle: true });
56
+ }, [openModal, closeModal]);
57
+ return /* @__PURE__ */ jsxs(Dialog, { open: isOpen, onOpenChange: (open) => !open && closeModal(), children: [
58
+ /* @__PURE__ */ jsx(DialogTitle, { className: "sr-only", children: "N\xE3o \xE9 poss\xEDvel excluir este cart\xE3o" }),
59
+ /* @__PURE__ */ jsxs(DialogContent, { className: "flex flex-col p-0 max-w-full sm:max-w-full border-0 rounded-t-2xl rounded-b-none h-dvh top-0 bottom-0 left-0 right-0 translate-x-0 translate-y-0 lg:max-w-[436px] lg:h-auto lg:max-h-[90vh] lg:rounded-lg lg:border lg:top-[50%] lg:left-[50%] lg:right-auto lg:bottom-auto lg:translate-x-[-50%] lg:translate-y-[-50%] overflow-hidden", children: [
60
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-5 p-4 lg:p-5", children: [
61
+ /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center size-10 bg-red-50 rounded-lg", children: /* @__PURE__ */ jsx(IconAlertTriangle, { className: "size-6 text-red-500" }) }),
62
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
63
+ /* @__PURE__ */ jsx("h2", { className: "paragraph-medium-semibold text-zinc-950", children: "N\xE3o \xE9 poss\xEDvel excluir este cart\xE3o" }),
64
+ /* @__PURE__ */ jsx("p", { className: "paragraph-small-regular text-zinc-600", children: "Este cart\xE3o est\xE1 em uso e tem uma assinatura ativa vinculada a ele. Selecione outro cart\xE3o como padr\xE3o ou adicione um novo." })
65
+ ] })
66
+ ] }),
67
+ availableCards.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 px-4 lg:px-5 pb-4 lg:pb-5 overflow-y-auto max-h-[200px] flex-1 lg:flex-none", children: [
68
+ /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-zinc-600", children: "Selecione um cart\xE3o como padr\xE3o:" }),
69
+ availableCards.map((card) => /* @__PURE__ */ jsx(
70
+ CardItem,
71
+ {
72
+ card,
73
+ onSelect: () => handleSelectCard(card),
74
+ showMenu: false
75
+ },
76
+ card.id
77
+ ))
78
+ ] }),
79
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-row gap-2 p-4 lg:p-5 border-t border-zinc-200 mt-auto lg:mt-0", children: [
80
+ /* @__PURE__ */ jsxs(Button, { onClick: handleAddCard, className: "h-10! flex-1", children: [
81
+ /* @__PURE__ */ jsx(IconPlus, { size: 20 }),
82
+ "Adicionar novo cart\xE3o"
83
+ ] }),
84
+ /* @__PURE__ */ jsx(
85
+ Button,
86
+ {
87
+ variant: "secondary",
88
+ onClick: () => closeModal(),
89
+ className: "h-10! flex-1",
90
+ children: "Cancelar"
91
+ }
92
+ )
93
+ ] })
94
+ ] })
95
+ ] });
96
+ }
97
+ export {
98
+ CannotDeleteCardModal
99
+ };
100
+ //# sourceMappingURL=CannotDeleteCardModal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/modals/cards/CannotDeleteCardModal.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback } from 'react';\nimport { Dialog, DialogContent, DialogTitle } from '../../ui/overlay/Dialog';\nimport { Button } from '../../ui/buttons/Button';\nimport { Toast } from '../../ui/feedback/Toast';\nimport { CardItem } from '../../ui/data-display/CardItem';\nimport { IconAlertTriangle, IconPlus } from '@tabler/icons-react';\nimport { toast } from 'sonner';\nimport { useModalManager } from '../../../store/useModalManager';\nimport { useCards } from '../../../modules/cards/hooks/cards.hook';\nimport { useActiveSubscription } from '../../../modules/subscriptions/hooks/find-active-subscription.hook';\nimport { useUpdateSubscriptionPayment } from '../../../modules/subscriptions/hooks/update-subscription-payment.hook';\nimport type { Card } from '../../../modules/cards/types';\n\nexport function CannotDeleteCardModal() {\n const { activeModal, modalData, closeModal, openModal } = useModalManager();\n const { data: cardsData } = useCards();\n const { mutateAsync: updatePayment } = useUpdateSubscriptionPayment();\n const { data: subscriptionData } = useActiveSubscription();\n const activeSubscription = subscriptionData?.data?.[0] ?? null;\n\n const isOpen = activeModal === 'cannotDeleteCardModal';\n const cardToDeleteId = modalData.cardId as string | undefined;\n\n const allCards = cardsData?.data ?? [];\n const cardToDelete = allCards.find((c) => c.id.toString() === cardToDeleteId);\n const availableCards = allCards.filter((c) => c.id.toString() !== cardToDeleteId);\n\n const handleSelectCard = useCallback(\n async (card: Card) => {\n if (!activeSubscription || !cardToDelete) return;\n\n try {\n await updatePayment({\n subscriptionId: activeSubscription.id,\n data: { id_card: card.id.toString(), payment_method: 1 },\n });\n\n closeModal();\n openModal('deleteCardModal', {\n cardId: cardToDelete.id.toString(),\n });\n } catch (error) {\n toast.custom(\n (t) => (\n <Toast\n variant=\"error\"\n message={\n error instanceof Error\n ? error.message\n : 'Erro ao atualizar cartão da assinatura'\n }\n toastId={t}\n />\n ),\n { duration: 5000 },\n );\n }\n },\n [updatePayment, activeSubscription, closeModal, openModal, cardToDelete],\n );\n\n const handleAddCard = useCallback(() => {\n closeModal();\n openModal('addCardModal', { showDefaultToggle: true });\n }, [openModal, closeModal]);\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && closeModal()}>\n <DialogTitle className=\"sr-only\">\n Não é possível excluir este cartão\n </DialogTitle>\n <DialogContent className=\"flex flex-col p-0 max-w-full sm:max-w-full border-0 rounded-t-2xl rounded-b-none h-dvh top-0 bottom-0 left-0 right-0 translate-x-0 translate-y-0 lg:max-w-[436px] lg:h-auto lg:max-h-[90vh] lg:rounded-lg lg:border lg:top-[50%] lg:left-[50%] lg:right-auto lg:bottom-auto lg:translate-x-[-50%] lg:translate-y-[-50%] overflow-hidden\">\n <div className=\"flex flex-col gap-5 p-4 lg:p-5\">\n <div className=\"flex items-center justify-center size-10 bg-red-50 rounded-lg\">\n <IconAlertTriangle className=\"size-6 text-red-500\" />\n </div>\n\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"paragraph-medium-semibold text-zinc-950\">\n Não é possível excluir este cartão\n </h2>\n <p className=\"paragraph-small-regular text-zinc-600\">\n Este cartão está em uso e tem uma assinatura ativa vinculada a ele.\n Selecione outro cartão como padrão ou adicione um novo.\n </p>\n </div>\n </div>\n\n {availableCards.length > 0 && (\n <div className=\"flex flex-col gap-3 px-4 lg:px-5 pb-4 lg:pb-5 overflow-y-auto max-h-[200px] flex-1 lg:flex-none\">\n <span className=\"paragraph-xsmall-semibold text-zinc-600\">\n Selecione um cartão como padrão:\n </span>\n {availableCards.map((card) => (\n <CardItem\n key={card.id}\n card={card}\n onSelect={() => handleSelectCard(card)}\n showMenu={false}\n />\n ))}\n </div>\n )}\n\n <div className=\"flex flex-row gap-2 p-4 lg:p-5 border-t border-zinc-200 mt-auto lg:mt-0\">\n <Button onClick={handleAddCard} className=\"h-10! flex-1\">\n <IconPlus size={20} />\n Adicionar novo cartão\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => closeModal()}\n className=\"h-10! flex-1\"\n >\n Cancelar\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,121 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ Dialog,
5
+ DialogContent,
6
+ DialogHeader,
7
+ DialogTitle,
8
+ DialogDescription
9
+ } from "../../ui/overlay/Dialog";
10
+ import { Button } from "../../ui/buttons/Button";
11
+ import { Separator } from "../../ui/data-display/Separator";
12
+ import { Toast } from "../../ui/feedback/Toast";
13
+ import { FormField } from "../../ui/form/FormField";
14
+ import { IconTrash } from "@tabler/icons-react";
15
+ import { toast } from "sonner";
16
+ import { useModalManager } from "../../../store/useModalManager";
17
+ import { useDeleteConfirmation } from "../../../modules/cards/hooks/delete-confirmation.hook";
18
+ import { useDeleteCard } from "../../../modules/cards/hooks/delete-card.hook";
19
+ import { useCards } from "../../../modules/cards/hooks/cards.hook";
20
+ function DeleteCardModal() {
21
+ const { activeModal, modalData, closeModal } = useModalManager();
22
+ const { form, isValidConfirmation, resetConfirmation } = useDeleteConfirmation();
23
+ const deleteCard = useDeleteCard();
24
+ const { data: cardsData } = useCards();
25
+ const isOpen = activeModal === "deleteCardModal";
26
+ const cardId = modalData.cardId;
27
+ const onSuccess = modalData.onSuccess;
28
+ const card = cardsData?.data?.find((c) => c.id.toString() === cardId);
29
+ const cardLastDigits = (card?.number ?? "").replaceAll(/\D/g, "").slice(-4);
30
+ const handleClose = () => {
31
+ resetConfirmation();
32
+ closeModal();
33
+ };
34
+ const onSubmit = async () => {
35
+ if (!cardId) return;
36
+ try {
37
+ await deleteCard.mutateAsync(cardId);
38
+ } catch (error) {
39
+ toast.custom(
40
+ (t) => /* @__PURE__ */ jsx(
41
+ Toast,
42
+ {
43
+ toastId: t,
44
+ variant: "error",
45
+ message: error instanceof Error ? error.message : "N\xE3o foi poss\xEDvel excluir o cart\xE3o"
46
+ }
47
+ ),
48
+ { duration: 5e3 }
49
+ );
50
+ return;
51
+ }
52
+ onSuccess?.();
53
+ resetConfirmation();
54
+ closeModal();
55
+ toast.custom(
56
+ (t) => /* @__PURE__ */ jsx(
57
+ Toast,
58
+ {
59
+ variant: "success",
60
+ message: `O cart\xE3o \u2022\u2022\u2022\u2022 ${cardLastDigits} foi exclu\xEDdo com sucesso`,
61
+ toastId: t
62
+ }
63
+ ),
64
+ { duration: 5e3 }
65
+ );
66
+ };
67
+ return /* @__PURE__ */ jsx(Dialog, { open: isOpen, onOpenChange: (open) => !open && handleClose(), children: /* @__PURE__ */ jsx(DialogContent, { className: "flex flex-col p-0! gap-0! max-w-[calc(100%-2rem)]! w-full sm:max-w-[400px]! lg:max-w-[410px]! rounded-lg border", children: /* @__PURE__ */ jsxs("form", { onSubmit: form.handleSubmit(onSubmit), className: "flex flex-col", children: [
68
+ /* @__PURE__ */ jsxs(DialogHeader, { className: "gap-4 text-left p-4 lg:p-5 pb-0 lg:pb-0", children: [
69
+ /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center w-fit bg-red-50 rounded-lg p-2.5", children: /* @__PURE__ */ jsx(IconTrash, { size: 20, className: "text-red-500" }) }),
70
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
71
+ /* @__PURE__ */ jsx(DialogTitle, { className: "paragraph-medium-semibold text-zinc-950", children: "Excluir cart\xE3o" }),
72
+ /* @__PURE__ */ jsxs(DialogDescription, { className: "paragraph-small-regular text-zinc-600", children: [
73
+ "Deseja realmente excluir o cart\xE3o:",
74
+ " ",
75
+ /* @__PURE__ */ jsxs("span", { className: "font-semibold text-zinc-950", children: [
76
+ "\u2022\u2022\u2022\u2022 ",
77
+ cardLastDigits
78
+ ] }),
79
+ "?"
80
+ ] })
81
+ ] })
82
+ ] }),
83
+ /* @__PURE__ */ jsx("div", { className: "px-4 lg:px-5 py-5", children: /* @__PURE__ */ jsx(
84
+ FormField,
85
+ {
86
+ label: "Digite EXCLUIR abaixo",
87
+ required: true,
88
+ placeholder: "EXCLUIR",
89
+ ...form.register("confirmText")
90
+ }
91
+ ) }),
92
+ /* @__PURE__ */ jsx(Separator, {}),
93
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-row items-center gap-2 p-4 lg:p-5", children: [
94
+ /* @__PURE__ */ jsx(
95
+ Button,
96
+ {
97
+ type: "submit",
98
+ disabled: !isValidConfirmation,
99
+ loading: form.formState.isSubmitting,
100
+ className: "h-10!",
101
+ children: form.formState.isSubmitting ? "Excluindo..." : "Excluir"
102
+ }
103
+ ),
104
+ /* @__PURE__ */ jsx(
105
+ Button,
106
+ {
107
+ type: "button",
108
+ variant: "secondary",
109
+ className: "h-10!",
110
+ onClick: handleClose,
111
+ disabled: form.formState.isSubmitting,
112
+ children: "Cancelar"
113
+ }
114
+ )
115
+ ] })
116
+ ] }) }) });
117
+ }
118
+ export {
119
+ DeleteCardModal
120
+ };
121
+ //# sourceMappingURL=DeleteCardModal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/modals/cards/DeleteCardModal.tsx"],"sourcesContent":["'use client';\n\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from '../../ui/overlay/Dialog';\nimport { Button } from '../../ui/buttons/Button';\nimport { Separator } from '../../ui/data-display/Separator';\nimport { Toast } from '../../ui/feedback/Toast';\nimport { FormField } from '../../ui/form/FormField';\nimport { IconTrash } from '@tabler/icons-react';\nimport { toast } from 'sonner';\nimport { useModalManager } from '../../../store/useModalManager';\nimport { useDeleteConfirmation } from '../../../modules/cards/hooks/delete-confirmation.hook';\nimport { useDeleteCard } from '../../../modules/cards/hooks/delete-card.hook';\nimport { useCards } from '../../../modules/cards/hooks/cards.hook';\n\nexport function DeleteCardModal() {\n const { activeModal, modalData, closeModal } = useModalManager();\n const { form, isValidConfirmation, resetConfirmation } = useDeleteConfirmation();\n const deleteCard = useDeleteCard();\n const { data: cardsData } = useCards();\n\n const isOpen = activeModal === 'deleteCardModal';\n const cardId = modalData.cardId as string | undefined;\n const onSuccess = modalData.onSuccess as (() => void) | undefined;\n\n const card = cardsData?.data?.find((c) => c.id.toString() === cardId);\n const cardLastDigits = (card?.number ?? '').replaceAll(/\\D/g, '').slice(-4);\n\n const handleClose = () => {\n resetConfirmation();\n closeModal();\n };\n\n const onSubmit = async () => {\n if (!cardId) return;\n\n try {\n await deleteCard.mutateAsync(cardId);\n } catch (error) {\n toast.custom(\n (t) => (\n <Toast\n toastId={t}\n variant=\"error\"\n message={\n error instanceof Error\n ? error.message\n : 'Não foi possível excluir o cartão'\n }\n />\n ),\n { duration: 5000 },\n );\n return;\n }\n\n onSuccess?.();\n resetConfirmation();\n closeModal();\n\n toast.custom(\n (t) => (\n <Toast\n variant=\"success\"\n message={`O cartão •••• ${cardLastDigits} foi excluído com sucesso`}\n toastId={t}\n />\n ),\n { duration: 5000 },\n );\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"flex flex-col p-0! gap-0! max-w-[calc(100%-2rem)]! w-full sm:max-w-[400px]! lg:max-w-[410px]! rounded-lg border\">\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"flex flex-col\">\n <DialogHeader className=\"gap-4 text-left p-4 lg:p-5 pb-0 lg:pb-0\">\n <div className=\"flex items-center justify-center w-fit bg-red-50 rounded-lg p-2.5\">\n <IconTrash size={20} className=\"text-red-500\" />\n </div>\n <div className=\"flex flex-col gap-2\">\n <DialogTitle className=\"paragraph-medium-semibold text-zinc-950\">\n Excluir cartão\n </DialogTitle>\n <DialogDescription className=\"paragraph-small-regular text-zinc-600\">\n Deseja realmente excluir o cartão:{' '}\n <span className=\"font-semibold text-zinc-950\">\n •••• {cardLastDigits}\n </span>\n ?\n </DialogDescription>\n </div>\n </DialogHeader>\n\n <div className=\"px-4 lg:px-5 py-5\">\n <FormField\n label=\"Digite EXCLUIR abaixo\"\n required\n placeholder=\"EXCLUIR\"\n {...form.register('confirmText')}\n />\n </div>\n <Separator />\n <div className=\"flex flex-row items-center gap-2 p-4 lg:p-5\">\n <Button\n type=\"submit\"\n disabled={!isValidConfirmation}\n loading={form.formState.isSubmitting}\n className=\"h-10!\"\n >\n {form.formState.isSubmitting ? 'Excluindo...' : 'Excluir'}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"h-10!\"\n onClick={handleClose}\n disabled={form.formState.isSubmitting}\n >\n Cancelar\n </Button>\n </div>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,19 +1,56 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
- import { IconDotsVertical, IconTrash } from "@tabler/icons-react";
4
+ import { toast } from "sonner";
5
+ import { IconDotsVertical, IconStar, IconTrash } from "@tabler/icons-react";
5
6
  import { Popover, PopoverContent, PopoverTrigger } from "../overlay/Popover";
6
7
  import { NavBarItem } from "../../layouts/NavBarItem";
8
+ import { Toast } from "../feedback/Toast";
7
9
  import { CardBrandIcon } from "./CardBrandIcons";
10
+ import { useSetDefaultCard } from "../../../modules/cards/hooks/set-default-card.hook";
11
+ import { useHandleDeleteCard } from "../../../modules/cards/hooks/handle-delete-card.hook";
8
12
  function CardItem({
9
13
  card,
10
14
  isSelected,
11
15
  onSelect,
12
- showMenu = false,
13
- canDelete = true,
14
- onDelete
16
+ showMenu = true,
17
+ hideDelete = false,
18
+ hideSetDefault = false,
19
+ onAfterDelete,
20
+ onAfterSetDefault
15
21
  }) {
16
22
  const [popoverOpen, setPopoverOpen] = useState(false);
23
+ const setDefaultCardMutation = useSetDefaultCard();
24
+ const handleDeleteCard = useHandleDeleteCard({ onAfterDelete });
25
+ const handleSetDefault = () => {
26
+ setDefaultCardMutation.mutate(card.id.toString(), {
27
+ onSuccess: () => {
28
+ toast.custom((t) => /* @__PURE__ */ jsx(
29
+ Toast,
30
+ {
31
+ variant: "success",
32
+ message: "Cart\xE3o definido como padr\xE3o",
33
+ toastId: t
34
+ }
35
+ ));
36
+ onAfterSetDefault?.(card);
37
+ },
38
+ onError: () => {
39
+ toast.custom((t) => /* @__PURE__ */ jsx(
40
+ Toast,
41
+ {
42
+ variant: "error",
43
+ message: "Erro ao definir cart\xE3o padr\xE3o",
44
+ toastId: t
45
+ }
46
+ ));
47
+ }
48
+ });
49
+ };
50
+ const menuHasSetDefault = !hideSetDefault && !card.is_default;
51
+ const menuHasDelete = !hideDelete;
52
+ const hasMenuItems = menuHasSetDefault || menuHasDelete;
53
+ const renderMenu = showMenu && hasMenuItems;
17
54
  return /* @__PURE__ */ jsxs(
18
55
  "div",
19
56
  {
@@ -27,8 +64,9 @@ function CardItem({
27
64
  (card.number ?? "").replaceAll(/\D/g, "").slice(-4)
28
65
  ] })
29
66
  ] }),
67
+ card.is_default && /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-semibold text-zinc-600 bg-zinc-100 px-2 py-0.5 rounded-lg whitespace-nowrap", children: "Padr\xE3o" }),
30
68
  /* @__PURE__ */ jsx(CardBrandIcon, { brand: card.brand }),
31
- showMenu && /* @__PURE__ */ jsxs(Popover, { open: popoverOpen, onOpenChange: setPopoverOpen, children: [
69
+ renderMenu && /* @__PURE__ */ jsxs(Popover, { open: popoverOpen, onOpenChange: setPopoverOpen, children: [
32
70
  /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
33
71
  "button",
34
72
  {
@@ -37,23 +75,36 @@ function CardItem({
37
75
  children: /* @__PURE__ */ jsx(IconDotsVertical, { className: "size-5 text-zinc-500" })
38
76
  }
39
77
  ) }),
40
- /* @__PURE__ */ jsx(
78
+ /* @__PURE__ */ jsxs(
41
79
  PopoverContent,
42
80
  {
43
81
  align: "end",
44
- className: "w-[140px] p-2 bg-white rounded-2xl shadow-md border border-zinc-200",
82
+ className: "w-[180px] p-2 bg-white rounded-2xl border border-zinc-200",
45
83
  onClick: (e) => e.stopPropagation(),
46
- children: canDelete && /* @__PURE__ */ jsx(
47
- NavBarItem,
48
- {
49
- icon: /* @__PURE__ */ jsx(IconTrash, { size: 20, className: "text-zinc-400" }),
50
- label: "Excluir",
51
- onClick: () => {
52
- setPopoverOpen(false);
53
- onDelete?.();
84
+ children: [
85
+ menuHasSetDefault && /* @__PURE__ */ jsx(
86
+ NavBarItem,
87
+ {
88
+ icon: /* @__PURE__ */ jsx(IconStar, { size: 18, className: "text-zinc-400" }),
89
+ label: "Tornar padr\xE3o",
90
+ onClick: () => {
91
+ setPopoverOpen(false);
92
+ handleSetDefault();
93
+ }
54
94
  }
55
- }
56
- )
95
+ ),
96
+ menuHasDelete && /* @__PURE__ */ jsx(
97
+ NavBarItem,
98
+ {
99
+ icon: /* @__PURE__ */ jsx(IconTrash, { size: 18, className: "text-zinc-400" }),
100
+ label: "Excluir",
101
+ onClick: () => {
102
+ setPopoverOpen(false);
103
+ handleDeleteCard(card);
104
+ }
105
+ }
106
+ )
107
+ ]
57
108
  }
58
109
  )
59
110
  ] })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ui/data-display/CardItem.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { IconDotsVertical, IconTrash } from '@tabler/icons-react';\nimport { Popover, PopoverContent, PopoverTrigger } from '../overlay/Popover';\nimport { NavBarItem } from '../../layouts/NavBarItem';\nimport { CardBrandIcon } from './CardBrandIcons';\nimport type { Card } from '../../../modules/cards/types';\n\ntype CardItemProps = {\n card: Card;\n isSelected?: boolean;\n onSelect?: () => void;\n showMenu?: boolean;\n canDelete?: boolean;\n onDelete?: () => void;\n};\n\nexport function CardItem({\n card,\n isSelected,\n onSelect,\n showMenu = false,\n canDelete = true,\n onDelete,\n}: CardItemProps) {\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n return (\n <div\n className={`flex items-center p-4 cursor-pointer transition-colors gap-3 rounded-lg border ${\n isSelected ? 'bg-zinc-50 border-zinc-950' : 'bg-white border-zinc-200 hover:bg-zinc-50'\n }`}\n onClick={onSelect}\n >\n <div className=\"flex flex-col gap-0.5 flex-1 min-w-0\">\n <span className=\"paragraph-small-semibold text-zinc-950 truncate\">\n {card.name}\n </span>\n <span className=\"paragraph-small-medium text-zinc-950\">\n •••• {(card.number ?? '').replaceAll(/\\D/g, '').slice(-4)}\n </span>\n </div>\n <CardBrandIcon brand={card.brand} />\n {showMenu && (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>\n <button\n className=\"size-10 flex items-center justify-center rounded-lg hover:bg-zinc-100 cursor-pointer\"\n onClick={(e) => e.stopPropagation()}\n >\n <IconDotsVertical className=\"size-5 text-zinc-500\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"w-[140px] p-2 bg-white rounded-2xl shadow-md border border-zinc-200\"\n onClick={(e) => e.stopPropagation()}\n >\n {canDelete && (\n <NavBarItem\n icon={<IconTrash size={20} className=\"text-zinc-400\" />}\n label=\"Excluir\"\n onClick={() => {\n setPopoverOpen(false);\n onDelete?.();\n }}\n />\n )}\n </PopoverContent>\n </Popover>\n )}\n </div>\n );\n}\n"],"mappings":";AAoCQ,cAGA,YAHA;AAlCR,SAAS,gBAAgB;AACzB,SAAS,kBAAkB,iBAAiB;AAC5C,SAAS,SAAS,gBAAgB,sBAAsB;AACxD,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAYvB,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AACF,GAAkB;AAChB,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AAEpD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,kFACT,aAAa,+BAA+B,2CAC9C;AAAA,MACA,SAAS;AAAA,MAET;AAAA,6BAAC,SAAI,WAAU,wCACb;AAAA,8BAAC,UAAK,WAAU,mDACb,eAAK,MACR;AAAA,UACA,qBAAC,UAAK,WAAU,wCAAuC;AAAA;AAAA,aAC9C,KAAK,UAAU,IAAI,WAAW,OAAO,EAAE,EAAE,MAAM,EAAE;AAAA,aAC1D;AAAA,WACF;AAAA,QACA,oBAAC,iBAAc,OAAO,KAAK,OAAO;AAAA,QACjC,YACC,qBAAC,WAAQ,MAAM,aAAa,cAAc,gBACxC;AAAA,8BAAC,kBAAe,SAAO,MACrB;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,cAElC,8BAAC,oBAAiB,WAAU,wBAAuB;AAAA;AAAA,UACrD,GACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,WAAU;AAAA,cACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,cAEjC,uBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM,oBAAC,aAAU,MAAM,IAAI,WAAU,iBAAgB;AAAA,kBACrD,OAAM;AAAA,kBACN,SAAS,MAAM;AACb,mCAAe,KAAK;AACpB,+BAAW;AAAA,kBACb;AAAA;AAAA,cACF;AAAA;AAAA,UAEJ;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/ui/data-display/CardItem.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport { IconDotsVertical, IconStar, IconTrash } from '@tabler/icons-react';\nimport { Popover, PopoverContent, PopoverTrigger } from '../overlay/Popover';\nimport { NavBarItem } from '../../layouts/NavBarItem';\nimport { Toast } from '../feedback/Toast';\nimport { CardBrandIcon } from './CardBrandIcons';\nimport { useSetDefaultCard } from '../../../modules/cards/hooks/set-default-card.hook';\nimport { useHandleDeleteCard } from '../../../modules/cards/hooks/handle-delete-card.hook';\nimport type { Card } from '../../../modules/cards/types';\n\ntype CardItemProps = {\n card: Card;\n isSelected?: boolean;\n onSelect?: () => void;\n showMenu?: boolean;\n hideDelete?: boolean;\n hideSetDefault?: boolean;\n onAfterDelete?: (card: Card) => void;\n onAfterSetDefault?: (card: Card) => void;\n};\n\nexport function CardItem({\n card,\n isSelected,\n onSelect,\n showMenu = true,\n hideDelete = false,\n hideSetDefault = false,\n onAfterDelete,\n onAfterSetDefault,\n}: CardItemProps) {\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n const setDefaultCardMutation = useSetDefaultCard();\n\n const handleDeleteCard = useHandleDeleteCard({ onAfterDelete });\n\n const handleSetDefault = () => {\n setDefaultCardMutation.mutate(card.id.toString(), {\n onSuccess: () => {\n toast.custom((t) => (\n <Toast\n variant=\"success\"\n message=\"Cartão definido como padrão\"\n toastId={t}\n />\n ));\n onAfterSetDefault?.(card);\n },\n onError: () => {\n toast.custom((t) => (\n <Toast\n variant=\"error\"\n message=\"Erro ao definir cartão padrão\"\n toastId={t}\n />\n ));\n },\n });\n };\n\n const menuHasSetDefault = !hideSetDefault && !card.is_default;\n const menuHasDelete = !hideDelete;\n const hasMenuItems = menuHasSetDefault || menuHasDelete;\n const renderMenu = showMenu && hasMenuItems;\n\n return (\n <div\n className={`flex items-center p-4 cursor-pointer transition-colors gap-3 rounded-lg border ${\n isSelected\n ? 'bg-zinc-50 border-zinc-950'\n : 'bg-white border-zinc-200 hover:bg-zinc-50'\n }`}\n onClick={onSelect}\n >\n <div className=\"flex flex-col gap-0.5 flex-1 min-w-0\">\n <span className=\"paragraph-small-semibold text-zinc-950 truncate\">\n {card.name}\n </span>\n <span className=\"paragraph-small-medium text-zinc-950\">\n •••• {(card.number ?? '').replaceAll(/\\D/g, '').slice(-4)}\n </span>\n </div>\n {card.is_default && (\n <span className=\"paragraph-xsmall-semibold text-zinc-600 bg-zinc-100 px-2 py-0.5 rounded-lg whitespace-nowrap\">\n Padrão\n </span>\n )}\n <CardBrandIcon brand={card.brand} />\n {renderMenu && (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>\n <button\n className=\"size-10 flex items-center justify-center rounded-lg hover:bg-zinc-100 cursor-pointer\"\n onClick={(e) => e.stopPropagation()}\n >\n <IconDotsVertical className=\"size-5 text-zinc-500\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"w-[180px] p-2 bg-white rounded-2xl border border-zinc-200\"\n onClick={(e) => e.stopPropagation()}\n >\n {menuHasSetDefault && (\n <NavBarItem\n icon={<IconStar size={18} className=\"text-zinc-400\" />}\n label=\"Tornar padrão\"\n onClick={() => {\n setPopoverOpen(false);\n handleSetDefault();\n }}\n />\n )}\n {menuHasDelete && (\n <NavBarItem\n icon={<IconTrash size={18} className=\"text-zinc-400\" />}\n label=\"Excluir\"\n onClick={() => {\n setPopoverOpen(false);\n handleDeleteCard(card);\n }}\n />\n )}\n </PopoverContent>\n </Popover>\n )}\n </div>\n );\n}\n"],"mappings":";AA4CU,cAsCF,YAtCE;AA1CV,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,kBAAkB,UAAU,iBAAiB;AACtD,SAAS,SAAS,gBAAgB,sBAAsB;AACxD,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AACtB,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAClC,SAAS,2BAA2B;AAc7B,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB;AAAA,EACA;AACF,GAAkB;AAChB,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AAEpD,QAAM,yBAAyB,kBAAkB;AAEjD,QAAM,mBAAmB,oBAAoB,EAAE,cAAc,CAAC;AAE9D,QAAM,mBAAmB,MAAM;AAC7B,2BAAuB,OAAO,KAAK,GAAG,SAAS,GAAG;AAAA,MAChD,WAAW,MAAM;AACf,cAAM,OAAO,CAAC,MACZ;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAQ;AAAA,YACR,SAAS;AAAA;AAAA,QACX,CACD;AACD,4BAAoB,IAAI;AAAA,MAC1B;AAAA,MACA,SAAS,MAAM;AACb,cAAM,OAAO,CAAC,MACZ;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAQ;AAAA,YACR,SAAS;AAAA;AAAA,QACX,CACD;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,oBAAoB,CAAC,kBAAkB,CAAC,KAAK;AACnD,QAAM,gBAAgB,CAAC;AACvB,QAAM,eAAe,qBAAqB;AAC1C,QAAM,aAAa,YAAY;AAE/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,kFACT,aACI,+BACA,2CACN;AAAA,MACA,SAAS;AAAA,MAET;AAAA,6BAAC,SAAI,WAAU,wCACb;AAAA,8BAAC,UAAK,WAAU,mDACb,eAAK,MACR;AAAA,UACA,qBAAC,UAAK,WAAU,wCAAuC;AAAA;AAAA,aAC9C,KAAK,UAAU,IAAI,WAAW,OAAO,EAAE,EAAE,MAAM,EAAE;AAAA,aAC1D;AAAA,WACF;AAAA,QACC,KAAK,cACJ,oBAAC,UAAK,WAAU,gGAA+F,uBAE/G;AAAA,QAEF,oBAAC,iBAAc,OAAO,KAAK,OAAO;AAAA,QACjC,cACC,qBAAC,WAAQ,MAAM,aAAa,cAAc,gBACxC;AAAA,8BAAC,kBAAe,SAAO,MACrB;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,cAElC,8BAAC,oBAAiB,WAAU,wBAAuB;AAAA;AAAA,UACrD,GACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,WAAU;AAAA,cACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,cAEjC;AAAA,qCACC;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,oBAAC,YAAS,MAAM,IAAI,WAAU,iBAAgB;AAAA,oBACpD,OAAM;AAAA,oBACN,SAAS,MAAM;AACb,qCAAe,KAAK;AACpB,uCAAiB;AAAA,oBACnB;AAAA;AAAA,gBACF;AAAA,gBAED,iBACC;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,oBAAC,aAAU,MAAM,IAAI,WAAU,iBAAgB;AAAA,oBACrD,OAAM;AAAA,oBACN,SAAS,MAAM;AACb,qCAAe,KAAK;AACpB,uCAAiB,IAAI;AAAA,oBACvB;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UAEJ;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useState } from "react";
3
4
  import { IconChevronDown, IconPlus } from "@tabler/icons-react";
4
5
  import { CardBrandIcon } from "./CardBrandIcons";
5
6
  import { CardItem } from "./CardItem";
6
7
  import useIsMobile from "../../../hooks/useIsMobile";
7
8
  import { useCards } from "../../../modules/cards/hooks/cards.hook";
8
- import { useCallback, useState } from "react";
9
9
  import { useModalManager } from "../../../store/useModalManager";
10
10
  import { useIsDefaultWhitelabel } from "../../../providers/whitelabel.provider";
11
11
  function PaymentInfoCard({
@@ -13,7 +13,9 @@ function PaymentInfoCard({
13
13
  selectedCardId,
14
14
  onCardSelect,
15
15
  onManageCards,
16
- onOpenAddCard
16
+ onOpenAddCard,
17
+ hideDelete,
18
+ hideSetDefault
17
19
  }) {
18
20
  const isMobile = useIsMobile();
19
21
  const { openModal } = useModalManager();
@@ -21,8 +23,10 @@ function PaymentInfoCard({
21
23
  const [isExpanded, setIsExpanded] = useState(false);
22
24
  const { data: cardsData } = useCards();
23
25
  const cards = cardsData?.data ?? [];
24
- const selectedCard = cards.find((card) => card.id.toString() === selectedCardId.toString());
25
- const canDeleteCards = cards.length > 1;
26
+ const selectedCard = cards.find(
27
+ (card) => card.id.toString() === selectedCardId.toString()
28
+ );
29
+ const onlyOneCard = cards.length <= 1;
26
30
  const hasCards = cards.length > 0;
27
31
  const hasMoreThan3Cards = cards.length > 3;
28
32
  const shouldShowManageButton = isMobile && hasMoreThan3Cards;
@@ -36,25 +40,6 @@ function PaymentInfoCard({
36
40
  onCardAdded: (cardId) => onCardSelect(cardId)
37
41
  });
38
42
  }, [openModal, onOpenAddCard, onCardSelect]);
39
- const handleDeleteCard = useCallback(
40
- (card) => {
41
- if (canDeleteCards) {
42
- openModal("deleteCardModal", {
43
- cardId: card.id.toString(),
44
- cardLastDigits: (card.number ?? "").replaceAll(/\D/g, "").slice(-4),
45
- onSuccess: () => {
46
- if (card.id === selectedCardId && cards.length > 1) {
47
- const remainingCards = cards.filter((c) => c.id !== card.id);
48
- if (remainingCards.length > 0) {
49
- onCardSelect(remainingCards[0].id.toString());
50
- }
51
- }
52
- }
53
- });
54
- }
55
- },
56
- [canDeleteCards, openModal, selectedCardId, cards, onCardSelect]
57
- );
58
43
  const handleSelectCard = useCallback(
59
44
  (cardId) => {
60
45
  onCardSelect(cardId);
@@ -62,6 +47,17 @@ function PaymentInfoCard({
62
47
  },
63
48
  [onCardSelect]
64
49
  );
50
+ const handleAfterDelete = useCallback(
51
+ (card) => {
52
+ if (card.id.toString() === selectedCardId.toString()) {
53
+ const remaining = cards.filter((c) => c.id !== card.id);
54
+ if (remaining.length > 0) {
55
+ onCardSelect(remaining[0].id.toString());
56
+ }
57
+ }
58
+ },
59
+ [cards, selectedCardId, onCardSelect]
60
+ );
65
61
  if (!hasCards) {
66
62
  return /* @__PURE__ */ jsxs("div", { className: "border border-zinc-200 rounded-lg overflow-hidden", children: [
67
63
  email && /* @__PURE__ */ jsxs("div", { className: "flex items-center h-[60px] px-4 border-b border-zinc-200 gap-3", children: [
@@ -124,9 +120,9 @@ function PaymentInfoCard({
124
120
  card,
125
121
  isSelected: card.id.toString() === selectedCardId.toString(),
126
122
  onSelect: () => handleSelectCard(card.id.toString()),
127
- showMenu: true,
128
- canDelete: canDeleteCards,
129
- onDelete: () => handleDeleteCard(card)
123
+ hideDelete: hideDelete || onlyOneCard,
124
+ hideSetDefault,
125
+ onAfterDelete: handleAfterDelete
130
126
  },
131
127
  card.id
132
128
  )),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ui/data-display/PaymentInfoCard.tsx"],"sourcesContent":["'use client';\n\nimport { IconChevronDown, IconPlus } from '@tabler/icons-react';\nimport { CardBrandIcon } from './CardBrandIcons';\nimport { CardItem } from './CardItem';\nimport useIsMobile from '../../../hooks/useIsMobile';\nimport { useCards } from '../../../modules/cards/hooks/cards.hook';\nimport { useCallback, useState } from 'react';\nimport { useModalManager } from '../../../store/useModalManager';\nimport { useIsDefaultWhitelabel } from '../../../providers/whitelabel.provider';\nimport type { Card } from '../../../modules/cards/types';\n\ntype PaymentInfoCardProps = {\n email?: string;\n selectedCardId: string;\n onCardSelect: (cardId: string) => void;\n onManageCards?: () => void;\n onOpenAddCard?: () => void;\n};\n\nexport function PaymentInfoCard({\n email,\n selectedCardId,\n onCardSelect,\n onManageCards,\n onOpenAddCard,\n}: PaymentInfoCardProps) {\n const isMobile = useIsMobile();\n const { openModal } = useModalManager();\n const isDefaultWl = useIsDefaultWhitelabel();\n\n const [isExpanded, setIsExpanded] = useState(false);\n\n const { data: cardsData } = useCards();\n const cards = cardsData?.data ?? [];\n\n const selectedCard = cards.find((card) => card.id.toString() === selectedCardId.toString());\n\n const canDeleteCards = cards.length > 1;\n const hasCards = cards.length > 0;\n\n const hasMoreThan3Cards = cards.length > 3;\n const shouldShowManageButton = isMobile && hasMoreThan3Cards;\n const displayedCards = shouldShowManageButton ? cards.slice(0, 3) : cards;\n\n const handleOpenAddCardModal = useCallback(() => {\n if (onOpenAddCard) {\n onOpenAddCard();\n return;\n }\n openModal('addCardModal', {\n onCardAdded: (cardId: string) => onCardSelect(cardId),\n });\n }, [openModal, onOpenAddCard, onCardSelect]);\n\n const handleDeleteCard = useCallback(\n (card: Card) => {\n if (canDeleteCards) {\n openModal('deleteCardModal', {\n cardId: card.id.toString(),\n cardLastDigits: (card.number ?? '').replaceAll(/\\D/g, '').slice(-4),\n onSuccess: () => {\n if (card.id === selectedCardId && cards.length > 1) {\n const remainingCards = cards.filter((c) => c.id !== card.id);\n if (remainingCards.length > 0) {\n onCardSelect(remainingCards[0].id.toString());\n }\n }\n },\n });\n }\n },\n [canDeleteCards, openModal, selectedCardId, cards, onCardSelect]\n );\n\n const handleSelectCard = useCallback(\n (cardId: string) => {\n onCardSelect(cardId);\n setIsExpanded(false);\n },\n [onCardSelect]\n );\n\n if (!hasCards) {\n return (\n <div className=\"border border-zinc-200 rounded-lg overflow-hidden\">\n {email && (\n <div className=\"flex items-center h-[60px] px-4 border-b border-zinc-200 gap-3\">\n <span className=\"paragraph-small-medium text-zinc-500 w-[100px]\">E-mail</span>\n <span className=\"paragraph-small-medium text-zinc-950 flex-1\">{email}</span>\n </div>\n )}\n <div className=\"flex items-center h-[60px] px-4 gap-3\">\n <span className=\"paragraph-small-medium text-zinc-500 w-[100px]\">Pagamento</span>\n <button\n type=\"button\"\n onClick={handleOpenAddCardModal}\n className=\"flex items-center h-8 px-2 paragraph-small-semibold text-zinc-950 border border-zinc-200 rounded-md hover:border-zinc-400 transition-colors cursor-pointer w-fit\"\n >\n <IconPlus className=\"size-[18px]\" />\n <span className=\"px-1.5\">Adicionar cartão</span>\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"border border-zinc-200 rounded-lg overflow-hidden\">\n {email && (\n <div className=\"flex items-center h-[60px] px-4 border-b border-zinc-200 gap-3\">\n <span className=\"paragraph-small-medium text-zinc-500 w-[100px]\">E-mail</span>\n <span className=\"paragraph-small-medium text-zinc-950 flex-1\">{email}</span>\n </div>\n )}\n\n <div\n className=\"flex items-center px-4 py-4 cursor-pointer gap-3\"\n onClick={() => setIsExpanded((prev) => !prev)}\n >\n {!isExpanded ? (\n <>\n <span className=\"paragraph-small-medium text-zinc-500 w-[100px]\">Pagamento</span>\n <div className=\"flex flex-col gap-0.5 flex-1 min-w-0\">\n <span className=\"paragraph-small-semibold text-zinc-950 truncate\">{selectedCard?.name}</span>\n <span className=\"paragraph-small-medium text-zinc-950\">\n •••• {selectedCard?.number?.replaceAll(/\\D/g, '')?.slice(-4)}\n </span>\n </div>\n {selectedCard && <CardBrandIcon brand={selectedCard.brand} />}\n <div className=\"size-8 flex items-center justify-center rounded-lg\">\n <IconChevronDown className=\"size-[18px] text-zinc-500\" />\n </div>\n </>\n ) : (\n <>\n <span className=\"paragraph-small-semibold text-zinc-950 flex-1\">\n Selecione a forma de pagamento\n </span>\n <div className=\"size-8 flex items-center justify-center rounded-lg\">\n <IconChevronDown className=\"size-[18px] text-zinc-500 rotate-180\" />\n </div>\n </>\n )}\n </div>\n\n <div\n className={`flex flex-col gap-2 px-4 overflow-hidden transition-all duration-300 ease-in-out ${\n isExpanded ? 'max-h-[500px] pb-4 opacity-100' : 'max-h-0 pb-0 opacity-0'\n }`}\n >\n {displayedCards.map((card) => (\n <CardItem\n key={card.id}\n card={card}\n isSelected={card.id.toString() === selectedCardId.toString()}\n onSelect={() => handleSelectCard(card.id.toString())}\n showMenu\n canDelete={canDeleteCards}\n onDelete={() => handleDeleteCard(card)}\n />\n ))}\n {shouldShowManageButton && onManageCards && (\n <button\n type=\"button\"\n onClick={onManageCards}\n className={`flex items-center justify-center h-10 px-4 paragraph-small-semibold rounded-lg transition-colors cursor-pointer mt-2 ${\n isDefaultWl\n ? 'text-cyan-600 border border-cyan-200 hover:bg-cyan-50'\n : 'text-zinc-600 border border-zinc-200 hover:bg-zinc-50'\n }`}\n >\n Gerenciar cartões\n </button>\n )}\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={handleOpenAddCardModal}\n className=\"flex items-center h-8 px-2 paragraph-small-semibold text-zinc-950 border border-zinc-200 rounded-md hover:border-zinc-400 transition-colors cursor-pointer w-fit\"\n >\n <IconPlus className=\"size-[18px]\" />\n <span className=\"px-1.5\">\n {isExpanded ? 'Adicionar cartão' : 'Nova forma de pagamento'}\n </span>\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/ui/data-display/PaymentInfoCard.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useState } from 'react';\nimport { IconChevronDown, IconPlus } from '@tabler/icons-react';\nimport { CardBrandIcon } from './CardBrandIcons';\nimport { CardItem } from './CardItem';\nimport useIsMobile from '../../../hooks/useIsMobile';\nimport { useCards } from '../../../modules/cards/hooks/cards.hook';\nimport { useModalManager } from '../../../store/useModalManager';\nimport { useIsDefaultWhitelabel } from '../../../providers/whitelabel.provider';\nimport type { Card } from '../../../modules/cards/types';\n\ntype PaymentInfoCardProps = {\n email?: string;\n selectedCardId: string;\n onCardSelect: (cardId: string) => void;\n onManageCards?: () => void;\n onOpenAddCard?: () => void;\n hideDelete?: boolean;\n hideSetDefault?: boolean;\n};\n\nexport function PaymentInfoCard({\n email,\n selectedCardId,\n onCardSelect,\n onManageCards,\n onOpenAddCard,\n hideDelete,\n hideSetDefault,\n}: PaymentInfoCardProps) {\n const isMobile = useIsMobile();\n const { openModal } = useModalManager();\n const isDefaultWl = useIsDefaultWhitelabel();\n\n const [isExpanded, setIsExpanded] = useState(false);\n\n const { data: cardsData } = useCards();\n const cards = cardsData?.data ?? [];\n\n const selectedCard = cards.find(\n (card) => card.id.toString() === selectedCardId.toString(),\n );\n\n const onlyOneCard = cards.length <= 1;\n const hasCards = cards.length > 0;\n\n const hasMoreThan3Cards = cards.length > 3;\n const shouldShowManageButton = isMobile && hasMoreThan3Cards;\n const displayedCards = shouldShowManageButton ? cards.slice(0, 3) : cards;\n\n const handleOpenAddCardModal = useCallback(() => {\n if (onOpenAddCard) {\n onOpenAddCard();\n return;\n }\n openModal('addCardModal', {\n onCardAdded: (cardId: string) => onCardSelect(cardId),\n });\n }, [openModal, onOpenAddCard, onCardSelect]);\n\n const handleSelectCard = useCallback(\n (cardId: string) => {\n onCardSelect(cardId);\n setIsExpanded(false);\n },\n [onCardSelect],\n );\n\n const handleAfterDelete = useCallback(\n (card: Card) => {\n if (card.id.toString() === selectedCardId.toString()) {\n const remaining = cards.filter((c) => c.id !== card.id);\n if (remaining.length > 0) {\n onCardSelect(remaining[0].id.toString());\n }\n }\n },\n [cards, selectedCardId, onCardSelect],\n );\n\n if (!hasCards) {\n return (\n <div className=\"border border-zinc-200 rounded-lg overflow-hidden\">\n {email && (\n <div className=\"flex items-center h-[60px] px-4 border-b border-zinc-200 gap-3\">\n <span className=\"paragraph-small-medium text-zinc-500 w-[100px]\">E-mail</span>\n <span className=\"paragraph-small-medium text-zinc-950 flex-1\">{email}</span>\n </div>\n )}\n <div className=\"flex items-center h-[60px] px-4 gap-3\">\n <span className=\"paragraph-small-medium text-zinc-500 w-[100px]\">Pagamento</span>\n <button\n type=\"button\"\n onClick={handleOpenAddCardModal}\n className=\"flex items-center h-8 px-2 paragraph-small-semibold text-zinc-950 border border-zinc-200 rounded-md hover:border-zinc-400 transition-colors cursor-pointer w-fit\"\n >\n <IconPlus className=\"size-[18px]\" />\n <span className=\"px-1.5\">Adicionar cartão</span>\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"border border-zinc-200 rounded-lg overflow-hidden\">\n {email && (\n <div className=\"flex items-center h-[60px] px-4 border-b border-zinc-200 gap-3\">\n <span className=\"paragraph-small-medium text-zinc-500 w-[100px]\">E-mail</span>\n <span className=\"paragraph-small-medium text-zinc-950 flex-1\">{email}</span>\n </div>\n )}\n\n <div\n className=\"flex items-center px-4 py-4 cursor-pointer gap-3\"\n onClick={() => setIsExpanded((prev) => !prev)}\n >\n {!isExpanded ? (\n <>\n <span className=\"paragraph-small-medium text-zinc-500 w-[100px]\">Pagamento</span>\n <div className=\"flex flex-col gap-0.5 flex-1 min-w-0\">\n <span className=\"paragraph-small-semibold text-zinc-950 truncate\">\n {selectedCard?.name}\n </span>\n <span className=\"paragraph-small-medium text-zinc-950\">\n •••• {selectedCard?.number?.replaceAll(/\\D/g, '')?.slice(-4)}\n </span>\n </div>\n {selectedCard && <CardBrandIcon brand={selectedCard.brand} />}\n <div className=\"size-8 flex items-center justify-center rounded-lg\">\n <IconChevronDown className=\"size-[18px] text-zinc-500\" />\n </div>\n </>\n ) : (\n <>\n <span className=\"paragraph-small-semibold text-zinc-950 flex-1\">\n Selecione a forma de pagamento\n </span>\n <div className=\"size-8 flex items-center justify-center rounded-lg\">\n <IconChevronDown className=\"size-[18px] text-zinc-500 rotate-180\" />\n </div>\n </>\n )}\n </div>\n\n <div\n className={`flex flex-col gap-2 px-4 overflow-hidden transition-all duration-300 ease-in-out ${\n isExpanded ? 'max-h-[500px] pb-4 opacity-100' : 'max-h-0 pb-0 opacity-0'\n }`}\n >\n {displayedCards.map((card) => (\n <CardItem\n key={card.id}\n card={card}\n isSelected={card.id.toString() === selectedCardId.toString()}\n onSelect={() => handleSelectCard(card.id.toString())}\n hideDelete={hideDelete || onlyOneCard}\n hideSetDefault={hideSetDefault}\n onAfterDelete={handleAfterDelete}\n />\n ))}\n {shouldShowManageButton && onManageCards && (\n <button\n type=\"button\"\n onClick={onManageCards}\n className={`flex items-center justify-center h-10 px-4 paragraph-small-semibold rounded-lg transition-colors cursor-pointer mt-2 ${\n isDefaultWl\n ? 'text-cyan-600 border border-cyan-200 hover:bg-cyan-50'\n : 'text-zinc-600 border border-zinc-200 hover:bg-zinc-50'\n }`}\n >\n Gerenciar cartões\n </button>\n )}\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={handleOpenAddCardModal}\n className=\"flex items-center h-8 px-2 paragraph-small-semibold text-zinc-950 border border-zinc-200 rounded-md hover:border-zinc-400 transition-colors cursor-pointer w-fit\"\n >\n <IconPlus className=\"size-[18px]\" />\n <span className=\"px-1.5\">\n {isExpanded ? 'Adicionar cartão' : 'Nova forma de pagamento'}\n </span>\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -54,11 +54,14 @@ import { usePlanById } from "./modules/plans/hooks/use-plan-by-id.hook";
54
54
  import { useHasPlanAddon } from "./modules/plans/hooks/use-has-plan-addon.hook";
55
55
  import { useCalculateSubscription } from "./modules/subscriptions/hooks/calculate-subscription.hook";
56
56
  import { useUpdateSubscriptionPlan } from "./modules/subscriptions/hooks/update-subscription-plan.hook";
57
+ import { useUpdateSubscriptionPayment } from "./modules/subscriptions/hooks/update-subscription-payment.hook";
57
58
  import { useCards, CARDS_QUERY_KEY } from "./modules/cards/hooks/cards.hook";
58
59
  import { useCardById } from "./modules/cards/hooks/card-by-id.hook";
59
60
  import { useCreateCard } from "./modules/cards/hooks/create-card.hook";
60
61
  import { useSetDefaultCard } from "./modules/cards/hooks/set-default-card.hook";
61
62
  import { useDeleteCard } from "./modules/cards/hooks/delete-card.hook";
63
+ import { useDeleteConfirmation } from "./modules/cards/hooks/delete-confirmation.hook";
64
+ import { useHandleDeleteCard } from "./modules/cards/hooks/handle-delete-card.hook";
62
65
  import { useIaCredits } from "./modules/ia-credits/hooks/ia-credits.hook";
63
66
  import {
64
67
  SubscriptionSchema,
@@ -97,6 +100,8 @@ import { usePaidPlanRequiredModal } from "./store/usePaidPlanRequiredModal";
97
100
  import { default as default2 } from "./components/modals/BuyCreditsModal";
98
101
  import { default as default3 } from "./components/modals/PaidPlanRequiredModal";
99
102
  import { default as default4 } from "./components/modals/cards/AddCardModal";
103
+ import { DeleteCardModal } from "./components/modals/cards/DeleteCardModal";
104
+ import { CannotDeleteCardModal } from "./components/modals/cards/CannotDeleteCardModal";
100
105
  import {
101
106
  CardFormFields,
102
107
  cardFormSchema
@@ -396,6 +401,7 @@ export {
396
401
  CalendarDayButton,
397
402
  default8 as CancelButton,
398
403
  CancelledSubscriptionBanner,
404
+ CannotDeleteCardModal,
399
405
  Card,
400
406
  CardAction,
401
407
  CardBrandIcon,
@@ -429,6 +435,7 @@ export {
429
435
  DatePicker,
430
436
  DateRangePicker,
431
437
  default10 as DefaultCircularProgress,
438
+ DeleteCardModal,
432
439
  Dialog,
433
440
  DialogClose,
434
441
  DialogContent,
@@ -623,8 +630,10 @@ export {
623
630
  useDeleteAccount,
624
631
  useDeleteAccountUser,
625
632
  useDeleteCard,
633
+ useDeleteConfirmation,
626
634
  useDeleteProject,
627
635
  useDesktopSidebarStore,
636
+ useHandleDeleteCard,
628
637
  useHasPlanAddon,
629
638
  useIaCredits,
630
639
  useImageUpload,
@@ -652,6 +661,7 @@ export {
652
661
  useUpdateAccountUser,
653
662
  useUpdateAccountUserById,
654
663
  useUpdateProject,
664
+ useUpdateSubscriptionPayment,
655
665
  useUpdateSubscriptionPlan,
656
666
  useUserQuery,
657
667
  useUserValidateSession,