@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.
- package/dist/components/modals/cards/CannotDeleteCardModal.mjs +100 -0
- package/dist/components/modals/cards/CannotDeleteCardModal.mjs.map +1 -0
- package/dist/components/modals/cards/DeleteCardModal.mjs +121 -0
- package/dist/components/modals/cards/DeleteCardModal.mjs.map +1 -0
- package/dist/components/ui/data-display/CardItem.mjs +68 -17
- package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
- package/dist/components/ui/data-display/PaymentInfoCard.mjs +22 -26
- package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
- package/dist/index.mjs +10 -0
- package/dist/index.mjs.map +1 -1
- package/dist/modules/cards/hooks/delete-confirmation.hook.mjs +31 -0
- package/dist/modules/cards/hooks/delete-confirmation.hook.mjs.map +1 -0
- package/dist/modules/cards/hooks/handle-delete-card.hook.mjs +31 -0
- package/dist/modules/cards/hooks/handle-delete-card.hook.mjs.map +1 -0
- package/dist/modules/subscriptions/actions/update-subscription-payment.action.mjs +12 -0
- package/dist/modules/subscriptions/actions/update-subscription-payment.action.mjs.map +1 -0
- package/dist/modules/subscriptions/hooks/update-subscription-payment.hook.mjs +23 -0
- package/dist/modules/subscriptions/hooks/update-subscription-payment.hook.mjs.map +1 -0
- package/dist/modules/subscriptions/services/subscriptions.service.mjs +16 -0
- package/dist/modules/subscriptions/services/subscriptions.service.mjs.map +1 -1
- package/dist/modules/subscriptions/types/subscription.type.mjs +1 -1
- package/dist/modules/subscriptions/types/subscription.type.mjs.map +1 -1
- package/dist/server.mjs +2 -0
- package/dist/server.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/modals/cards/CannotDeleteCardModal.tsx +123 -0
- package/src/components/modals/cards/DeleteCardModal.tsx +132 -0
- package/src/components/ui/data-display/CardItem.tsx +70 -12
- package/src/components/ui/data-display/PaymentInfoCard.tsx +28 -28
- package/src/index.ts +6 -0
- package/src/modules/cards/hooks/delete-confirmation.hook.ts +42 -0
- package/src/modules/cards/hooks/handle-delete-card.hook.ts +42 -0
- package/src/modules/subscriptions/actions/update-subscription-payment.action.ts +13 -0
- package/src/modules/subscriptions/hooks/update-subscription-payment.hook.ts +25 -0
- package/src/modules/subscriptions/services/subscriptions.service.ts +23 -0
- package/src/modules/subscriptions/types/subscription.type.ts +1 -1
- 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 {
|
|
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 =
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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__ */
|
|
78
|
+
/* @__PURE__ */ jsxs(
|
|
41
79
|
PopoverContent,
|
|
42
80
|
{
|
|
43
81
|
align: "end",
|
|
44
|
-
className: "w-[
|
|
82
|
+
className: "w-[180px] p-2 bg-white rounded-2xl border border-zinc-200",
|
|
45
83
|
onClick: (e) => e.stopPropagation(),
|
|
46
|
-
children:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
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(
|
|
25
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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":";AAqFU,SAmCE,UAlCA,KADF;AAnFV,SAAS,aAAa,gBAAgB;AACtC,SAAS,iBAAiB,gBAAgB;AAC1C,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,OAAO,iBAAiB;AACxB,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,8BAA8B;AAahC,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,WAAW,YAAY;AAC7B,QAAM,EAAE,UAAU,IAAI,gBAAgB;AACtC,QAAM,cAAc,uBAAuB;AAE3C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,QAAM,EAAE,MAAM,UAAU,IAAI,SAAS;AACrC,QAAM,QAAQ,WAAW,QAAQ,CAAC;AAElC,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC,SAAS,KAAK,GAAG,SAAS,MAAM,eAAe,SAAS;AAAA,EAC3D;AAEA,QAAM,cAAc,MAAM,UAAU;AACpC,QAAM,WAAW,MAAM,SAAS;AAEhC,QAAM,oBAAoB,MAAM,SAAS;AACzC,QAAM,yBAAyB,YAAY;AAC3C,QAAM,iBAAiB,yBAAyB,MAAM,MAAM,GAAG,CAAC,IAAI;AAEpE,QAAM,yBAAyB,YAAY,MAAM;AAC/C,QAAI,eAAe;AACjB,oBAAc;AACd;AAAA,IACF;AACA,cAAU,gBAAgB;AAAA,MACxB,aAAa,CAAC,WAAmB,aAAa,MAAM;AAAA,IACtD,CAAC;AAAA,EACH,GAAG,CAAC,WAAW,eAAe,YAAY,CAAC;AAE3C,QAAM,mBAAmB;AAAA,IACvB,CAAC,WAAmB;AAClB,mBAAa,MAAM;AACnB,oBAAc,KAAK;AAAA,IACrB;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,oBAAoB;AAAA,IACxB,CAAC,SAAe;AACd,UAAI,KAAK,GAAG,SAAS,MAAM,eAAe,SAAS,GAAG;AACpD,cAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE;AACtD,YAAI,UAAU,SAAS,GAAG;AACxB,uBAAa,UAAU,CAAC,EAAE,GAAG,SAAS,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,OAAO,gBAAgB,YAAY;AAAA,EACtC;AAEA,MAAI,CAAC,UAAU;AACb,WACE,qBAAC,SAAI,WAAU,qDACZ;AAAA,eACC,qBAAC,SAAI,WAAU,kEACb;AAAA,4BAAC,UAAK,WAAU,kDAAiD,oBAAM;AAAA,QACvE,oBAAC,UAAK,WAAU,+CAA+C,iBAAM;AAAA,SACvE;AAAA,MAEF,qBAAC,SAAI,WAAU,yCACb;AAAA,4BAAC,UAAK,WAAU,kDAAiD,uBAAS;AAAA,QAC1E;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAU;AAAA,YAEV;AAAA,kCAAC,YAAS,WAAU,eAAc;AAAA,cAClC,oBAAC,UAAK,WAAU,UAAS,iCAAgB;AAAA;AAAA;AAAA,QAC3C;AAAA,SACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAU,uBACb;AAAA,yBAAC,SAAI,WAAU,qDACZ;AAAA,eACC,qBAAC,SAAI,WAAU,kEACb;AAAA,4BAAC,UAAK,WAAU,kDAAiD,oBAAM;AAAA,QACvE,oBAAC,UAAK,WAAU,+CAA+C,iBAAM;AAAA,SACvE;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM,cAAc,CAAC,SAAS,CAAC,IAAI;AAAA,UAE3C,WAAC,aACA,iCACE;AAAA,gCAAC,UAAK,WAAU,kDAAiD,uBAAS;AAAA,YAC1E,qBAAC,SAAI,WAAU,wCACb;AAAA,kCAAC,UAAK,WAAU,mDACb,wBAAc,MACjB;AAAA,cACA,qBAAC,UAAK,WAAU,wCAAuC;AAAA;AAAA,gBAC/C,cAAc,QAAQ,WAAW,OAAO,EAAE,GAAG,MAAM,EAAE;AAAA,iBAC7D;AAAA,eACF;AAAA,YACC,gBAAgB,oBAAC,iBAAc,OAAO,aAAa,OAAO;AAAA,YAC3D,oBAAC,SAAI,WAAU,sDACb,8BAAC,mBAAgB,WAAU,6BAA4B,GACzD;AAAA,aACF,IAEA,iCACE;AAAA,gCAAC,UAAK,WAAU,iDAAgD,4CAEhE;AAAA,YACA,oBAAC,SAAI,WAAU,sDACb,8BAAC,mBAAgB,WAAU,wCAAuC,GACpE;AAAA,aACF;AAAA;AAAA,MAEJ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,oFACT,aAAa,mCAAmC,wBAClD;AAAA,UAEC;AAAA,2BAAe,IAAI,CAAC,SACnB;AAAA,cAAC;AAAA;AAAA,gBAEC;AAAA,gBACA,YAAY,KAAK,GAAG,SAAS,MAAM,eAAe,SAAS;AAAA,gBAC3D,UAAU,MAAM,iBAAiB,KAAK,GAAG,SAAS,CAAC;AAAA,gBACnD,YAAY,cAAc;AAAA,gBAC1B;AAAA,gBACA,eAAe;AAAA;AAAA,cANV,KAAK;AAAA,YAOZ,CACD;AAAA,YACA,0BAA0B,iBACzB;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,WAAW,wHACT,cACI,0DACA,uDACN;AAAA,gBACD;AAAA;AAAA,YAED;AAAA;AAAA;AAAA,MAEJ;AAAA,OACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QAEV;AAAA,8BAAC,YAAS,WAAU,eAAc;AAAA,UAClC,oBAAC,UAAK,WAAU,UACb,uBAAa,wBAAqB,2BACrC;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","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,
|