@greatapps/common 1.1.261 → 1.1.262
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/account/ConfigurationsMyAccountModal.mjs +1 -1
- package/dist/components/account/ConfigurationsMyAccountModal.mjs.map +1 -1
- package/dist/components/account/ConfirmDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/ConfirmGlobalPreferencesModal.mjs.map +1 -1
- package/dist/components/account/DeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/DisableTwoFactorAuthModal.mjs.map +1 -1
- package/dist/components/account/IsntPossibleDeleteAccountModal.mjs.map +1 -1
- package/dist/components/account/TwoFactorAuthModal.mjs.map +1 -1
- package/dist/components/account/hooks/useChangePhoneForm.mjs.map +1 -1
- package/dist/components/account/hooks/useTwoFactorAuthForm.mjs.map +1 -1
- package/dist/components/account/sections/ChangeEmailModal.mjs.map +1 -1
- package/dist/components/account/sections/ChangePasswordSection.mjs.map +1 -1
- package/dist/components/account/sections/ChangePhoneModal.mjs.map +1 -1
- package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
- package/dist/components/account/sections/PreferencesSection.mjs.map +1 -1
- package/dist/components/account/sections/SecuritySection.mjs.map +1 -1
- package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
- package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
- package/dist/components/layouts/AppMobileNavBar.mjs +1 -1
- package/dist/components/layouts/AppMobileNavBar.mjs.map +1 -1
- package/dist/components/layouts/AppNavBar.mjs.map +1 -1
- package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -1
- package/dist/components/layouts/NavBar.mjs.map +1 -1
- package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
- package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
- package/dist/components/layouts/UsersSelectorPopover.mjs.map +1 -1
- package/dist/components/modals/BuyCreditsModal.mjs.map +1 -1
- package/dist/components/navigation/CancelledSubscriptionBanner.mjs.map +1 -1
- package/dist/components/navigation/NavItemsContext.mjs.map +1 -1
- package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
- package/dist/components/navigation/shells/TabsMobileShell.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
- package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
- package/dist/components/ui/buttons/Button.mjs.map +1 -1
- package/dist/components/ui/buttons/CancelButton.mjs.map +1 -1
- package/dist/components/ui/buttons/CopyButton.mjs.map +1 -1
- package/dist/components/ui/data-display/Accordion.mjs.map +1 -1
- package/dist/components/ui/data-display/Badge.mjs.map +1 -1
- package/dist/components/ui/data-display/Card.mjs.map +1 -1
- package/dist/components/ui/data-display/CardBrandIcons.mjs.map +1 -1
- package/dist/components/ui/data-display/CardItem.mjs.map +1 -1
- package/dist/components/ui/data-display/Pagination.mjs.map +1 -1
- package/dist/components/ui/data-display/PaymentInfoCard.mjs.map +1 -1
- package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -1
- package/dist/components/ui/data-display/Separator.mjs.map +1 -1
- package/dist/components/ui/data-display/Table.mjs.map +1 -1
- package/dist/components/ui/data-display/Tabs.mjs.map +1 -1
- package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -1
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -1
- package/dist/components/ui/feedback/LoadingOverlay.mjs.map +1 -1
- package/dist/components/ui/feedback/Progress.mjs.map +1 -1
- package/dist/components/ui/feedback/Skeleton.mjs.map +1 -1
- package/dist/components/ui/feedback/Toast.mjs.map +1 -1
- package/dist/components/ui/form/Calendar.mjs.map +1 -1
- package/dist/components/ui/form/Checkbox.mjs.map +1 -1
- package/dist/components/ui/form/ComboboxField.mjs.map +1 -1
- package/dist/components/ui/form/DatePicker.mjs.map +1 -1
- package/dist/components/ui/form/DateRangePicker.mjs.map +1 -1
- package/dist/components/ui/form/FormField.mjs.map +1 -1
- package/dist/components/ui/form/Input.mjs.map +1 -1
- package/dist/components/ui/form/InputOtp.mjs.map +1 -1
- package/dist/components/ui/form/PhoneInput.mjs.map +1 -1
- package/dist/components/ui/form/RadioGroup.mjs.map +1 -1
- package/dist/components/ui/form/Select.mjs +1 -1
- package/dist/components/ui/form/Select.mjs.map +1 -1
- package/dist/components/ui/form/Switch.mjs.map +1 -1
- package/dist/components/ui/form/Textarea.mjs.map +1 -1
- package/dist/components/ui/overlay/Command.mjs.map +1 -1
- package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
- package/dist/components/ui/overlay/Popover.mjs.map +1 -1
- package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
- package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
- package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/middleware.mjs.map +1 -1
- package/dist/modules/accounts/actions/account-management.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/find-current-account.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/list-currencies.action.mjs.map +1 -1
- package/dist/modules/accounts/actions/list-timezones.action.mjs.map +1 -1
- package/dist/modules/accounts/hooks/current-account.hook.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useAccountManagement.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useCurrencies.mjs.map +1 -1
- package/dist/modules/accounts/hooks/useTimezones.mjs.map +1 -1
- package/dist/modules/accounts/services/account.service.mjs.map +1 -1
- package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -1
- package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -1
- package/dist/modules/auth/hooks/register.hook.mjs.map +1 -1
- package/dist/modules/cards/actions/list-cards.action.mjs.map +1 -1
- package/dist/modules/cards/hooks/cards.hook.mjs.map +1 -1
- package/dist/modules/cards/services/cards.service.mjs.map +1 -1
- package/dist/modules/cards/types.mjs.map +1 -1
- package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +1 -1
- package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +1 -1
- package/dist/modules/plans/hooks/use-has-plan-addon.hook.mjs.map +1 -1
- package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
- package/dist/modules/plans/services/plans.service.mjs.map +1 -1
- package/dist/modules/plans/types/plan.type.mjs.map +1 -1
- package/dist/modules/projects/actions/add-project-user.action.mjs.map +1 -1
- package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +1 -1
- package/dist/modules/projects/actions/list-available-users.action.mjs.map +1 -1
- package/dist/modules/projects/actions/list-project-users.action.mjs.map +1 -1
- package/dist/modules/projects/actions/remove-project-user.action.mjs.map +1 -1
- package/dist/modules/projects/hooks/add-project-user.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-all-account-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-available-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/list-project-users.hook.mjs.map +1 -1
- package/dist/modules/projects/hooks/remove-project-user.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/calculate-subscription.action.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/list-subscriptions.action.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/update-subscription-plan.action.mjs.map +1 -1
- package/dist/modules/subscriptions/constants/query-keys.constants.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/calculate-subscription.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/find-active-subscription.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/list-subscriptions.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/update-subscription-plan.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/types/calculate-subscription.type.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/build-plan-extras.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/periodicity.mjs.map +1 -1
- package/dist/modules/subscriptions/utils/resolve-plan-extras-prices.mjs.map +1 -1
- package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -1
- package/dist/modules/users/action/list-messages.action.mjs.map +1 -1
- package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -1
- package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -1
- package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
- package/dist/modules/whitelabel/actions/find-whitelabel-styles.action.mjs.map +1 -1
- package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -1
- package/dist/modules/whitelabel/actions/revalidate-whitelabel-styles.action.mjs.map +1 -1
- package/dist/modules/whitelabel/actions/revalidate-whitelabel.action.mjs.map +1 -1
- package/dist/modules/whitelabel/services/whitelabel-styles.service.mjs.map +1 -1
- package/dist/providers/whitelabel.provider.mjs.map +1 -1
- package/dist/store/useBuyCreditsModal.mjs.map +1 -1
- package/dist/utils/countries.mjs.map +1 -1
- package/dist/utils/safeServerAction.mjs.map +1 -1
- package/dist/utils/withAction.mjs.map +1 -1
- package/package.json +89 -89
- package/src/components/account/ConfigurationsMyAccountModal.tsx +150 -150
- package/src/components/account/ConfirmDeleteAccountModal.tsx +55 -55
- package/src/components/account/ConfirmGlobalPreferencesModal.tsx +66 -66
- package/src/components/account/DeleteAccountModal.tsx +130 -130
- package/src/components/account/DisableTwoFactorAuthModal.tsx +86 -86
- package/src/components/account/IsntPossibleDeleteAccountModal.tsx +49 -49
- package/src/components/account/TwoFactorAuthModal.tsx +223 -223
- package/src/components/account/hooks/useChangePhoneForm.tsx +81 -81
- package/src/components/account/hooks/useTwoFactorAuthForm.tsx +101 -101
- package/src/components/account/sections/ChangeEmailModal.tsx +225 -225
- package/src/components/account/sections/ChangePasswordSection.tsx +64 -64
- package/src/components/account/sections/ChangePhoneModal.tsx +231 -231
- package/src/components/account/sections/MyProfileSection.tsx +327 -327
- package/src/components/account/sections/PreferencesSection.tsx +273 -273
- package/src/components/account/sections/SecuritySection.tsx +160 -160
- package/src/components/embeds/CrispEmbed.tsx +101 -101
- package/src/components/embeds/FrillEmbed.tsx +119 -119
- package/src/components/layouts/AppMobileNavBar.tsx +118 -118
- package/src/components/layouts/AppNavBar.tsx +51 -51
- package/src/components/layouts/MdSideBarNavigation.tsx +56 -56
- package/src/components/layouts/NavBar.tsx +120 -120
- package/src/components/layouts/NotificationsPopover.tsx +115 -115
- package/src/components/layouts/ProfilePopover.tsx +164 -164
- package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
- package/src/components/modals/BuyCreditsModal.tsx +301 -301
- package/src/components/navigation/CancelledSubscriptionBanner.tsx +69 -69
- package/src/components/navigation/NavItemsContext.ts +20 -20
- package/src/components/navigation/ProjectSelectorPopover.tsx +157 -157
- package/src/components/navigation/shells/TabsMobileShell.tsx +72 -72
- package/src/components/navigation/subcomponents/ProjectSelector.tsx +156 -156
- package/src/components/pages/notifications/Notifications.tsx +160 -160
- package/src/components/ui/buttons/Button.tsx +57 -57
- package/src/components/ui/buttons/CancelButton.tsx +14 -14
- package/src/components/ui/buttons/CopyButton.tsx +54 -54
- package/src/components/ui/data-display/Accordion.tsx +81 -81
- package/src/components/ui/data-display/Badge.tsx +47 -47
- package/src/components/ui/data-display/Card.tsx +93 -93
- package/src/components/ui/data-display/CardBrandIcons.tsx +336 -336
- package/src/components/ui/data-display/CardItem.tsx +75 -75
- package/src/components/ui/data-display/Pagination.tsx +126 -126
- package/src/components/ui/data-display/PaymentInfoCard.tsx +186 -186
- package/src/components/ui/data-display/ScrollArea.tsx +59 -59
- package/src/components/ui/data-display/Separator.tsx +29 -29
- package/src/components/ui/data-display/Table.tsx +117 -117
- package/src/components/ui/data-display/Tabs.tsx +67 -67
- package/src/components/ui/feedback/CircularProgress.tsx +75 -75
- package/src/components/ui/feedback/DefaultCircularProgress.tsx +61 -61
- package/src/components/ui/feedback/LoadingOverlay.tsx +31 -31
- package/src/components/ui/feedback/Progress.tsx +40 -40
- package/src/components/ui/feedback/Skeleton.tsx +5 -5
- package/src/components/ui/feedback/Toast.tsx +101 -101
- package/src/components/ui/form/Calendar.tsx +228 -228
- package/src/components/ui/form/Checkbox.tsx +31 -31
- package/src/components/ui/form/ComboboxField.tsx +154 -154
- package/src/components/ui/form/DatePicker.tsx +97 -97
- package/src/components/ui/form/DateRangePicker.tsx +108 -108
- package/src/components/ui/form/FormField.tsx +131 -131
- package/src/components/ui/form/Input.tsx +20 -20
- package/src/components/ui/form/InputOtp.tsx +80 -80
- package/src/components/ui/form/PhoneInput.tsx +205 -205
- package/src/components/ui/form/RadioGroup.tsx +45 -45
- package/src/components/ui/form/Select.tsx +200 -200
- package/src/components/ui/form/Switch.tsx +32 -32
- package/src/components/ui/form/Textarea.tsx +19 -19
- package/src/components/ui/overlay/Command.tsx +185 -185
- package/src/components/ui/overlay/Dialog.tsx +151 -151
- package/src/components/ui/overlay/Popover.tsx +49 -49
- package/src/components/ui/overlay/Sheet.tsx +166 -166
- package/src/components/ui/overlay/Tooltip.tsx +62 -62
- package/src/hooks/copy-to-clipboard.hook.tsx +67 -67
- package/src/index.ts +376 -376
- package/src/middleware.ts +4 -4
- package/src/modules/accounts/actions/account-management.action.ts +91 -91
- package/src/modules/accounts/actions/find-current-account.action.ts +9 -9
- package/src/modules/accounts/actions/list-currencies.action.ts +8 -8
- package/src/modules/accounts/actions/list-timezones.action.ts +8 -8
- package/src/modules/accounts/hooks/current-account.hook.tsx +22 -22
- package/src/modules/accounts/hooks/useAccountManagement.ts +85 -85
- package/src/modules/accounts/hooks/useCurrencies.ts +15 -15
- package/src/modules/accounts/hooks/useTimezones.ts +15 -15
- package/src/modules/accounts/services/account.service.ts +236 -236
- package/src/modules/accounts/types.ts +214 -214
- package/src/modules/auth/actions/validate-session.action.ts +56 -56
- package/src/modules/auth/hooks/login.hook.tsx +13 -13
- package/src/modules/auth/hooks/logout.hook.tsx +11 -11
- package/src/modules/auth/hooks/register.hook.tsx +11 -11
- package/src/modules/cards/actions/list-cards.action.ts +8 -8
- package/src/modules/cards/hooks/cards.hook.ts +14 -14
- package/src/modules/cards/services/cards.service.ts +32 -32
- package/src/modules/cards/types.ts +32 -32
- package/src/modules/ia-credits/actions/list-ia-credits.action.ts +8 -8
- package/src/modules/plans/actions/find-plan-by-id.action.ts +8 -8
- package/src/modules/plans/hooks/use-has-plan-addon.hook.ts +17 -17
- package/src/modules/plans/hooks/use-plan-by-id.hook.ts +13 -13
- package/src/modules/plans/services/plans.service.ts +36 -36
- package/src/modules/plans/types/plan.type.ts +21 -21
- package/src/modules/projects/actions/add-project-user.action.ts +9 -9
- package/src/modules/projects/actions/list-all-account-users.action.ts +9 -9
- package/src/modules/projects/actions/list-available-users.action.ts +9 -9
- package/src/modules/projects/actions/list-project-users.action.ts +9 -9
- package/src/modules/projects/actions/remove-project-user.action.ts +9 -9
- package/src/modules/projects/hooks/add-project-user.hook.ts +69 -69
- package/src/modules/projects/hooks/list-all-account-users.hook.ts +34 -34
- package/src/modules/projects/hooks/list-available-users.hook.ts +33 -33
- package/src/modules/projects/hooks/list-project-users.hook.ts +33 -33
- package/src/modules/projects/hooks/remove-project-user.hook.ts +69 -69
- package/src/modules/subscriptions/actions/calculate-subscription.action.ts +9 -9
- package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
- package/src/modules/subscriptions/actions/update-subscription-plan.action.ts +26 -26
- package/src/modules/subscriptions/constants/query-keys.constants.ts +1 -1
- package/src/modules/subscriptions/hooks/calculate-subscription.hook.ts +13 -13
- package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
- package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +16 -16
- package/src/modules/subscriptions/hooks/update-subscription-plan.hook.ts +25 -25
- package/src/modules/subscriptions/types/billing-period.type.ts +1 -1
- package/src/modules/subscriptions/types/calculate-subscription.type.ts +75 -75
- package/src/modules/subscriptions/utils/build-plan-extras.ts +56 -56
- package/src/modules/subscriptions/utils/periodicity.ts +52 -52
- package/src/modules/subscriptions/utils/resolve-plan-extras-prices.ts +23 -23
- package/src/modules/users/action/find-user-by-id.action.ts +8 -8
- package/src/modules/users/action/list-messages.action.ts +12 -12
- package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -8
- package/src/modules/users/action/mark-message-as-read.action.ts +8 -8
- package/src/modules/users/hooks/messages.hook.ts +60 -60
- package/src/modules/whitelabel/actions/find-whitelabel-styles.action.ts +14 -14
- package/src/modules/whitelabel/actions/find-whitelabel.action.ts +23 -23
- package/src/modules/whitelabel/actions/revalidate-whitelabel-styles.action.ts +10 -10
- package/src/modules/whitelabel/actions/revalidate-whitelabel.action.ts +19 -19
- package/src/modules/whitelabel/schema.ts +83 -83
- package/src/modules/whitelabel/services/whitelabel-styles.service.ts +129 -129
- package/src/modules/whitelabel/styles-schema.ts +37 -37
- package/src/providers/whitelabel.provider.tsx +54 -54
- package/src/store/useBuyCreditsModal.ts +25 -25
- package/src/utils/countries.ts +224 -224
- package/src/utils/safeServerAction.ts +21 -21
- package/src/utils/withAction.ts +13 -13
|
@@ -1,186 +1,186 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { IconChevronDown, IconPlus } from '@tabler/icons-react';
|
|
4
|
-
import { CardBrandIcon } from './CardBrandIcons';
|
|
5
|
-
import { CardItem } from './CardItem';
|
|
6
|
-
import useIsMobile from '../../../hooks/useIsMobile';
|
|
7
|
-
import { useCards } from '../../../modules/cards/hooks/cards.hook';
|
|
8
|
-
import { useCallback, useState } from 'react';
|
|
9
|
-
import { useModalManager } from '../../../store/useModalManager';
|
|
10
|
-
import type { Card } from '../../../modules/cards/types';
|
|
11
|
-
|
|
12
|
-
type PaymentInfoCardProps = {
|
|
13
|
-
email?: string;
|
|
14
|
-
selectedCardId: string;
|
|
15
|
-
onCardSelect: (cardId: string) => void;
|
|
16
|
-
onManageCards?: () => void;
|
|
17
|
-
onOpenAddCard?: () => void;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export function PaymentInfoCard({
|
|
21
|
-
email,
|
|
22
|
-
selectedCardId,
|
|
23
|
-
onCardSelect,
|
|
24
|
-
onManageCards,
|
|
25
|
-
onOpenAddCard,
|
|
26
|
-
}: PaymentInfoCardProps) {
|
|
27
|
-
const isMobile = useIsMobile();
|
|
28
|
-
const { openModal } = useModalManager();
|
|
29
|
-
|
|
30
|
-
const [isExpanded, setIsExpanded] = useState(false);
|
|
31
|
-
|
|
32
|
-
const { data: cardsData } = useCards();
|
|
33
|
-
const cards = cardsData?.data ?? [];
|
|
34
|
-
|
|
35
|
-
const selectedCard = cards.find((card) => card.id.toString() === selectedCardId.toString());
|
|
36
|
-
|
|
37
|
-
const canDeleteCards = cards.length > 1;
|
|
38
|
-
const hasCards = cards.length > 0;
|
|
39
|
-
|
|
40
|
-
const hasMoreThan3Cards = cards.length > 3;
|
|
41
|
-
const shouldShowManageButton = isMobile && hasMoreThan3Cards;
|
|
42
|
-
const displayedCards = shouldShowManageButton ? cards.slice(0, 3) : cards;
|
|
43
|
-
|
|
44
|
-
const handleOpenAddCardModal = useCallback(() => {
|
|
45
|
-
if (onOpenAddCard) {
|
|
46
|
-
onOpenAddCard();
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
openModal('addCardModal', {
|
|
50
|
-
onCardAdded: (cardId: string) => onCardSelect(cardId),
|
|
51
|
-
});
|
|
52
|
-
}, [openModal, onOpenAddCard, onCardSelect]);
|
|
53
|
-
|
|
54
|
-
const handleDeleteCard = useCallback(
|
|
55
|
-
(card: Card) => {
|
|
56
|
-
if (canDeleteCards) {
|
|
57
|
-
openModal('deleteCardModal', {
|
|
58
|
-
cardId: card.id.toString(),
|
|
59
|
-
cardLastDigits: card.number.replaceAll(/\D/g, '').slice(-4),
|
|
60
|
-
onSuccess: () => {
|
|
61
|
-
if (card.id === selectedCardId && cards.length > 1) {
|
|
62
|
-
const remainingCards = cards.filter((c) => c.id !== card.id);
|
|
63
|
-
if (remainingCards.length > 0) {
|
|
64
|
-
onCardSelect(remainingCards[0].id.toString());
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
[canDeleteCards, openModal, selectedCardId, cards, onCardSelect]
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
const handleSelectCard = useCallback(
|
|
75
|
-
(cardId: string) => {
|
|
76
|
-
onCardSelect(cardId);
|
|
77
|
-
setIsExpanded(false);
|
|
78
|
-
},
|
|
79
|
-
[onCardSelect]
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
if (!hasCards) {
|
|
83
|
-
return (
|
|
84
|
-
<div className="border border-zinc-200 rounded-lg overflow-hidden">
|
|
85
|
-
{email && (
|
|
86
|
-
<div className="flex items-center h-[60px] px-4 border-b border-zinc-200 gap-3">
|
|
87
|
-
<span className="paragraph-small-medium text-zinc-500 w-[100px]">E-mail</span>
|
|
88
|
-
<span className="paragraph-small-medium text-zinc-950 flex-1">{email}</span>
|
|
89
|
-
</div>
|
|
90
|
-
)}
|
|
91
|
-
<div className="flex items-center h-[60px] px-4 gap-3">
|
|
92
|
-
<span className="paragraph-small-medium text-zinc-500 w-[100px]">Pagamento</span>
|
|
93
|
-
<button
|
|
94
|
-
type="button"
|
|
95
|
-
onClick={handleOpenAddCardModal}
|
|
96
|
-
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"
|
|
97
|
-
>
|
|
98
|
-
<IconPlus className="size-[18px]" />
|
|
99
|
-
<span className="px-1.5">Adicionar cartão</span>
|
|
100
|
-
</button>
|
|
101
|
-
</div>
|
|
102
|
-
</div>
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return (
|
|
107
|
-
<div className="flex flex-col gap-3">
|
|
108
|
-
<div className="border border-zinc-200 rounded-lg overflow-hidden">
|
|
109
|
-
{email && (
|
|
110
|
-
<div className="flex items-center h-[60px] px-4 border-b border-zinc-200 gap-3">
|
|
111
|
-
<span className="paragraph-small-medium text-zinc-500 w-[100px]">E-mail</span>
|
|
112
|
-
<span className="paragraph-small-medium text-zinc-950 flex-1">{email}</span>
|
|
113
|
-
</div>
|
|
114
|
-
)}
|
|
115
|
-
|
|
116
|
-
<div
|
|
117
|
-
className="flex items-center px-4 py-4 cursor-pointer gap-3"
|
|
118
|
-
onClick={() => setIsExpanded((prev) => !prev)}
|
|
119
|
-
>
|
|
120
|
-
{!isExpanded ? (
|
|
121
|
-
<>
|
|
122
|
-
<span className="paragraph-small-medium text-zinc-500 w-[100px]">Pagamento</span>
|
|
123
|
-
<div className="flex flex-col gap-0.5 flex-1 min-w-0">
|
|
124
|
-
<span className="paragraph-small-semibold text-zinc-950 truncate">{selectedCard?.name}</span>
|
|
125
|
-
<span className="paragraph-small-medium text-zinc-950">
|
|
126
|
-
•••• {selectedCard?.number?.replaceAll(/\D/g, '')?.slice(-4)}
|
|
127
|
-
</span>
|
|
128
|
-
</div>
|
|
129
|
-
{selectedCard && <CardBrandIcon brand={selectedCard.brand} />}
|
|
130
|
-
<div className="size-8 flex items-center justify-center rounded-lg">
|
|
131
|
-
<IconChevronDown className="size-[18px] text-zinc-500" />
|
|
132
|
-
</div>
|
|
133
|
-
</>
|
|
134
|
-
) : (
|
|
135
|
-
<>
|
|
136
|
-
<span className="paragraph-small-semibold text-zinc-950 flex-1">
|
|
137
|
-
Selecione a forma de pagamento
|
|
138
|
-
</span>
|
|
139
|
-
<div className="size-8 flex items-center justify-center rounded-lg">
|
|
140
|
-
<IconChevronDown className="size-[18px] text-zinc-500 rotate-180" />
|
|
141
|
-
</div>
|
|
142
|
-
</>
|
|
143
|
-
)}
|
|
144
|
-
</div>
|
|
145
|
-
|
|
146
|
-
<div
|
|
147
|
-
className={`flex flex-col gap-2 px-4 overflow-hidden transition-all duration-300 ease-in-out ${
|
|
148
|
-
isExpanded ? 'max-h-[500px] pb-4 opacity-100' : 'max-h-0 pb-0 opacity-0'
|
|
149
|
-
}`}
|
|
150
|
-
>
|
|
151
|
-
{displayedCards.map((card) => (
|
|
152
|
-
<CardItem
|
|
153
|
-
key={card.id}
|
|
154
|
-
card={card}
|
|
155
|
-
isSelected={card.id.toString() === selectedCardId.toString()}
|
|
156
|
-
onSelect={() => handleSelectCard(card.id.toString())}
|
|
157
|
-
showMenu
|
|
158
|
-
canDelete={canDeleteCards}
|
|
159
|
-
onDelete={() => handleDeleteCard(card)}
|
|
160
|
-
/>
|
|
161
|
-
))}
|
|
162
|
-
{shouldShowManageButton && onManageCards && (
|
|
163
|
-
<button
|
|
164
|
-
type="button"
|
|
165
|
-
onClick={onManageCards}
|
|
166
|
-
className="flex items-center justify-center h-10 px-4 paragraph-small-semibold text-cyan-600 border border-cyan-200 rounded-lg hover:bg-cyan-50 transition-colors cursor-pointer mt-2"
|
|
167
|
-
>
|
|
168
|
-
Gerenciar cartões
|
|
169
|
-
</button>
|
|
170
|
-
)}
|
|
171
|
-
</div>
|
|
172
|
-
</div>
|
|
173
|
-
|
|
174
|
-
<button
|
|
175
|
-
type="button"
|
|
176
|
-
onClick={handleOpenAddCardModal}
|
|
177
|
-
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"
|
|
178
|
-
>
|
|
179
|
-
<IconPlus className="size-[18px]" />
|
|
180
|
-
<span className="px-1.5">
|
|
181
|
-
{isExpanded ? 'Adicionar cartão' : 'Nova forma de pagamento'}
|
|
182
|
-
</span>
|
|
183
|
-
</button>
|
|
184
|
-
</div>
|
|
185
|
-
);
|
|
186
|
-
}
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { IconChevronDown, IconPlus } from '@tabler/icons-react';
|
|
4
|
+
import { CardBrandIcon } from './CardBrandIcons';
|
|
5
|
+
import { CardItem } from './CardItem';
|
|
6
|
+
import useIsMobile from '../../../hooks/useIsMobile';
|
|
7
|
+
import { useCards } from '../../../modules/cards/hooks/cards.hook';
|
|
8
|
+
import { useCallback, useState } from 'react';
|
|
9
|
+
import { useModalManager } from '../../../store/useModalManager';
|
|
10
|
+
import type { Card } from '../../../modules/cards/types';
|
|
11
|
+
|
|
12
|
+
type PaymentInfoCardProps = {
|
|
13
|
+
email?: string;
|
|
14
|
+
selectedCardId: string;
|
|
15
|
+
onCardSelect: (cardId: string) => void;
|
|
16
|
+
onManageCards?: () => void;
|
|
17
|
+
onOpenAddCard?: () => void;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export function PaymentInfoCard({
|
|
21
|
+
email,
|
|
22
|
+
selectedCardId,
|
|
23
|
+
onCardSelect,
|
|
24
|
+
onManageCards,
|
|
25
|
+
onOpenAddCard,
|
|
26
|
+
}: PaymentInfoCardProps) {
|
|
27
|
+
const isMobile = useIsMobile();
|
|
28
|
+
const { openModal } = useModalManager();
|
|
29
|
+
|
|
30
|
+
const [isExpanded, setIsExpanded] = useState(false);
|
|
31
|
+
|
|
32
|
+
const { data: cardsData } = useCards();
|
|
33
|
+
const cards = cardsData?.data ?? [];
|
|
34
|
+
|
|
35
|
+
const selectedCard = cards.find((card) => card.id.toString() === selectedCardId.toString());
|
|
36
|
+
|
|
37
|
+
const canDeleteCards = cards.length > 1;
|
|
38
|
+
const hasCards = cards.length > 0;
|
|
39
|
+
|
|
40
|
+
const hasMoreThan3Cards = cards.length > 3;
|
|
41
|
+
const shouldShowManageButton = isMobile && hasMoreThan3Cards;
|
|
42
|
+
const displayedCards = shouldShowManageButton ? cards.slice(0, 3) : cards;
|
|
43
|
+
|
|
44
|
+
const handleOpenAddCardModal = useCallback(() => {
|
|
45
|
+
if (onOpenAddCard) {
|
|
46
|
+
onOpenAddCard();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
openModal('addCardModal', {
|
|
50
|
+
onCardAdded: (cardId: string) => onCardSelect(cardId),
|
|
51
|
+
});
|
|
52
|
+
}, [openModal, onOpenAddCard, onCardSelect]);
|
|
53
|
+
|
|
54
|
+
const handleDeleteCard = useCallback(
|
|
55
|
+
(card: Card) => {
|
|
56
|
+
if (canDeleteCards) {
|
|
57
|
+
openModal('deleteCardModal', {
|
|
58
|
+
cardId: card.id.toString(),
|
|
59
|
+
cardLastDigits: card.number.replaceAll(/\D/g, '').slice(-4),
|
|
60
|
+
onSuccess: () => {
|
|
61
|
+
if (card.id === selectedCardId && cards.length > 1) {
|
|
62
|
+
const remainingCards = cards.filter((c) => c.id !== card.id);
|
|
63
|
+
if (remainingCards.length > 0) {
|
|
64
|
+
onCardSelect(remainingCards[0].id.toString());
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
[canDeleteCards, openModal, selectedCardId, cards, onCardSelect]
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
const handleSelectCard = useCallback(
|
|
75
|
+
(cardId: string) => {
|
|
76
|
+
onCardSelect(cardId);
|
|
77
|
+
setIsExpanded(false);
|
|
78
|
+
},
|
|
79
|
+
[onCardSelect]
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
if (!hasCards) {
|
|
83
|
+
return (
|
|
84
|
+
<div className="border border-zinc-200 rounded-lg overflow-hidden">
|
|
85
|
+
{email && (
|
|
86
|
+
<div className="flex items-center h-[60px] px-4 border-b border-zinc-200 gap-3">
|
|
87
|
+
<span className="paragraph-small-medium text-zinc-500 w-[100px]">E-mail</span>
|
|
88
|
+
<span className="paragraph-small-medium text-zinc-950 flex-1">{email}</span>
|
|
89
|
+
</div>
|
|
90
|
+
)}
|
|
91
|
+
<div className="flex items-center h-[60px] px-4 gap-3">
|
|
92
|
+
<span className="paragraph-small-medium text-zinc-500 w-[100px]">Pagamento</span>
|
|
93
|
+
<button
|
|
94
|
+
type="button"
|
|
95
|
+
onClick={handleOpenAddCardModal}
|
|
96
|
+
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"
|
|
97
|
+
>
|
|
98
|
+
<IconPlus className="size-[18px]" />
|
|
99
|
+
<span className="px-1.5">Adicionar cartão</span>
|
|
100
|
+
</button>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
<div className="flex flex-col gap-3">
|
|
108
|
+
<div className="border border-zinc-200 rounded-lg overflow-hidden">
|
|
109
|
+
{email && (
|
|
110
|
+
<div className="flex items-center h-[60px] px-4 border-b border-zinc-200 gap-3">
|
|
111
|
+
<span className="paragraph-small-medium text-zinc-500 w-[100px]">E-mail</span>
|
|
112
|
+
<span className="paragraph-small-medium text-zinc-950 flex-1">{email}</span>
|
|
113
|
+
</div>
|
|
114
|
+
)}
|
|
115
|
+
|
|
116
|
+
<div
|
|
117
|
+
className="flex items-center px-4 py-4 cursor-pointer gap-3"
|
|
118
|
+
onClick={() => setIsExpanded((prev) => !prev)}
|
|
119
|
+
>
|
|
120
|
+
{!isExpanded ? (
|
|
121
|
+
<>
|
|
122
|
+
<span className="paragraph-small-medium text-zinc-500 w-[100px]">Pagamento</span>
|
|
123
|
+
<div className="flex flex-col gap-0.5 flex-1 min-w-0">
|
|
124
|
+
<span className="paragraph-small-semibold text-zinc-950 truncate">{selectedCard?.name}</span>
|
|
125
|
+
<span className="paragraph-small-medium text-zinc-950">
|
|
126
|
+
•••• {selectedCard?.number?.replaceAll(/\D/g, '')?.slice(-4)}
|
|
127
|
+
</span>
|
|
128
|
+
</div>
|
|
129
|
+
{selectedCard && <CardBrandIcon brand={selectedCard.brand} />}
|
|
130
|
+
<div className="size-8 flex items-center justify-center rounded-lg">
|
|
131
|
+
<IconChevronDown className="size-[18px] text-zinc-500" />
|
|
132
|
+
</div>
|
|
133
|
+
</>
|
|
134
|
+
) : (
|
|
135
|
+
<>
|
|
136
|
+
<span className="paragraph-small-semibold text-zinc-950 flex-1">
|
|
137
|
+
Selecione a forma de pagamento
|
|
138
|
+
</span>
|
|
139
|
+
<div className="size-8 flex items-center justify-center rounded-lg">
|
|
140
|
+
<IconChevronDown className="size-[18px] text-zinc-500 rotate-180" />
|
|
141
|
+
</div>
|
|
142
|
+
</>
|
|
143
|
+
)}
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
<div
|
|
147
|
+
className={`flex flex-col gap-2 px-4 overflow-hidden transition-all duration-300 ease-in-out ${
|
|
148
|
+
isExpanded ? 'max-h-[500px] pb-4 opacity-100' : 'max-h-0 pb-0 opacity-0'
|
|
149
|
+
}`}
|
|
150
|
+
>
|
|
151
|
+
{displayedCards.map((card) => (
|
|
152
|
+
<CardItem
|
|
153
|
+
key={card.id}
|
|
154
|
+
card={card}
|
|
155
|
+
isSelected={card.id.toString() === selectedCardId.toString()}
|
|
156
|
+
onSelect={() => handleSelectCard(card.id.toString())}
|
|
157
|
+
showMenu
|
|
158
|
+
canDelete={canDeleteCards}
|
|
159
|
+
onDelete={() => handleDeleteCard(card)}
|
|
160
|
+
/>
|
|
161
|
+
))}
|
|
162
|
+
{shouldShowManageButton && onManageCards && (
|
|
163
|
+
<button
|
|
164
|
+
type="button"
|
|
165
|
+
onClick={onManageCards}
|
|
166
|
+
className="flex items-center justify-center h-10 px-4 paragraph-small-semibold text-cyan-600 border border-cyan-200 rounded-lg hover:bg-cyan-50 transition-colors cursor-pointer mt-2"
|
|
167
|
+
>
|
|
168
|
+
Gerenciar cartões
|
|
169
|
+
</button>
|
|
170
|
+
)}
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
<button
|
|
175
|
+
type="button"
|
|
176
|
+
onClick={handleOpenAddCardModal}
|
|
177
|
+
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"
|
|
178
|
+
>
|
|
179
|
+
<IconPlus className="size-[18px]" />
|
|
180
|
+
<span className="px-1.5">
|
|
181
|
+
{isExpanded ? 'Adicionar cartão' : 'Nova forma de pagamento'}
|
|
182
|
+
</span>
|
|
183
|
+
</button>
|
|
184
|
+
</div>
|
|
185
|
+
);
|
|
186
|
+
}
|
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
"use client"
|
|
4
|
-
|
|
5
|
-
import * as React from "react"
|
|
6
|
-
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
|
|
7
|
-
import { cn } from "../../../infra/utils/clsx"
|
|
8
|
-
|
|
9
|
-
function ScrollArea({
|
|
10
|
-
className,
|
|
11
|
-
children,
|
|
12
|
-
...props
|
|
13
|
-
}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {
|
|
14
|
-
return (
|
|
15
|
-
<ScrollAreaPrimitive.Root
|
|
16
|
-
data-slot="scroll-area"
|
|
17
|
-
className={cn("relative", className)}
|
|
18
|
-
{...props}
|
|
19
|
-
>
|
|
20
|
-
<ScrollAreaPrimitive.Viewport
|
|
21
|
-
data-slot="scroll-area-viewport"
|
|
22
|
-
className="focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1"
|
|
23
|
-
>
|
|
24
|
-
{children}
|
|
25
|
-
</ScrollAreaPrimitive.Viewport>
|
|
26
|
-
<ScrollBar />
|
|
27
|
-
<ScrollAreaPrimitive.Corner />
|
|
28
|
-
</ScrollAreaPrimitive.Root>
|
|
29
|
-
)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function ScrollBar({
|
|
33
|
-
className,
|
|
34
|
-
orientation = "vertical",
|
|
35
|
-
...props
|
|
36
|
-
}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {
|
|
37
|
-
return (
|
|
38
|
-
<ScrollAreaPrimitive.ScrollAreaScrollbar
|
|
39
|
-
data-slot="scroll-area-scrollbar"
|
|
40
|
-
orientation={orientation}
|
|
41
|
-
className={cn(
|
|
42
|
-
"flex touch-none p-px transition-colors select-none",
|
|
43
|
-
orientation === "vertical" &&
|
|
44
|
-
"h-full w-2.5 border-l border-l-transparent",
|
|
45
|
-
orientation === "horizontal" &&
|
|
46
|
-
"h-2.5 flex-col border-t border-t-transparent",
|
|
47
|
-
className
|
|
48
|
-
)}
|
|
49
|
-
{...props}
|
|
50
|
-
>
|
|
51
|
-
<ScrollAreaPrimitive.ScrollAreaThumb
|
|
52
|
-
data-slot="scroll-area-thumb"
|
|
53
|
-
className="bg-border relative flex-1 rounded-full"
|
|
54
|
-
/>
|
|
55
|
-
</ScrollAreaPrimitive.ScrollAreaScrollbar>
|
|
56
|
-
)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export { ScrollArea, ScrollBar }
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
"use client"
|
|
4
|
+
|
|
5
|
+
import * as React from "react"
|
|
6
|
+
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
|
|
7
|
+
import { cn } from "../../../infra/utils/clsx"
|
|
8
|
+
|
|
9
|
+
function ScrollArea({
|
|
10
|
+
className,
|
|
11
|
+
children,
|
|
12
|
+
...props
|
|
13
|
+
}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {
|
|
14
|
+
return (
|
|
15
|
+
<ScrollAreaPrimitive.Root
|
|
16
|
+
data-slot="scroll-area"
|
|
17
|
+
className={cn("relative", className)}
|
|
18
|
+
{...props}
|
|
19
|
+
>
|
|
20
|
+
<ScrollAreaPrimitive.Viewport
|
|
21
|
+
data-slot="scroll-area-viewport"
|
|
22
|
+
className="focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1"
|
|
23
|
+
>
|
|
24
|
+
{children}
|
|
25
|
+
</ScrollAreaPrimitive.Viewport>
|
|
26
|
+
<ScrollBar />
|
|
27
|
+
<ScrollAreaPrimitive.Corner />
|
|
28
|
+
</ScrollAreaPrimitive.Root>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function ScrollBar({
|
|
33
|
+
className,
|
|
34
|
+
orientation = "vertical",
|
|
35
|
+
...props
|
|
36
|
+
}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {
|
|
37
|
+
return (
|
|
38
|
+
<ScrollAreaPrimitive.ScrollAreaScrollbar
|
|
39
|
+
data-slot="scroll-area-scrollbar"
|
|
40
|
+
orientation={orientation}
|
|
41
|
+
className={cn(
|
|
42
|
+
"flex touch-none p-px transition-colors select-none",
|
|
43
|
+
orientation === "vertical" &&
|
|
44
|
+
"h-full w-2.5 border-l border-l-transparent",
|
|
45
|
+
orientation === "horizontal" &&
|
|
46
|
+
"h-2.5 flex-col border-t border-t-transparent",
|
|
47
|
+
className
|
|
48
|
+
)}
|
|
49
|
+
{...props}
|
|
50
|
+
>
|
|
51
|
+
<ScrollAreaPrimitive.ScrollAreaThumb
|
|
52
|
+
data-slot="scroll-area-thumb"
|
|
53
|
+
className="bg-border relative flex-1 rounded-full"
|
|
54
|
+
/>
|
|
55
|
+
</ScrollAreaPrimitive.ScrollAreaScrollbar>
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { ScrollArea, ScrollBar }
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
"use client"
|
|
4
|
-
|
|
5
|
-
import * as React from "react"
|
|
6
|
-
import * as SeparatorPrimitive from "@radix-ui/react-separator"
|
|
7
|
-
import { cn } from "../../../infra/utils/clsx"
|
|
8
|
-
|
|
9
|
-
function Separator({
|
|
10
|
-
className,
|
|
11
|
-
orientation = "horizontal",
|
|
12
|
-
decorative = true,
|
|
13
|
-
...props
|
|
14
|
-
}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {
|
|
15
|
-
return (
|
|
16
|
-
<SeparatorPrimitive.Root
|
|
17
|
-
data-slot="separator"
|
|
18
|
-
decorative={decorative}
|
|
19
|
-
orientation={orientation}
|
|
20
|
-
className={cn(
|
|
21
|
-
"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
|
|
22
|
-
className
|
|
23
|
-
)}
|
|
24
|
-
{...props}
|
|
25
|
-
/>
|
|
26
|
-
)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export { Separator }
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
"use client"
|
|
4
|
+
|
|
5
|
+
import * as React from "react"
|
|
6
|
+
import * as SeparatorPrimitive from "@radix-ui/react-separator"
|
|
7
|
+
import { cn } from "../../../infra/utils/clsx"
|
|
8
|
+
|
|
9
|
+
function Separator({
|
|
10
|
+
className,
|
|
11
|
+
orientation = "horizontal",
|
|
12
|
+
decorative = true,
|
|
13
|
+
...props
|
|
14
|
+
}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {
|
|
15
|
+
return (
|
|
16
|
+
<SeparatorPrimitive.Root
|
|
17
|
+
data-slot="separator"
|
|
18
|
+
decorative={decorative}
|
|
19
|
+
orientation={orientation}
|
|
20
|
+
className={cn(
|
|
21
|
+
"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
|
|
22
|
+
className
|
|
23
|
+
)}
|
|
24
|
+
{...props}
|
|
25
|
+
/>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { Separator }
|