@greatapps/common 1.1.234 → 1.1.236
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.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/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/Pagination.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/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 +1 -0
- 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/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/ia-credits/actions/list-ia-credits.action.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/find-plan-by-id.action.mjs.map +1 -1
- package/dist/modules/subscriptions/actions/list-subscriptions.action.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/use-has-plan-addon.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/hooks/use-plan-by-id.hook.mjs.map +1 -1
- package/dist/modules/subscriptions/services/plans.service.mjs.map +1 -1
- package/dist/modules/subscriptions/types/plan.type.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/services/whitelabel-styles.service.mjs.map +1 -1
- package/dist/providers/whitelabel.provider.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 +110 -110
- package/src/components/layouts/AppNavBar.tsx +57 -57
- 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 +167 -167
- package/src/components/layouts/UsersSelectorPopover.tsx +238 -238
- 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 +154 -154
- 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/Pagination.tsx +126 -126
- 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/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 +359 -359
- package/src/middleware.ts +4 -4
- package/src/modules/accounts/actions/account-management.action.ts +91 -90
- 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/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/ia-credits/actions/list-ia-credits.action.ts +8 -8
- 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/find-plan-by-id.action.ts +8 -8
- package/src/modules/subscriptions/actions/list-subscriptions.action.ts +9 -9
- package/src/modules/subscriptions/hooks/find-active-subscription.hook.ts +19 -19
- package/src/modules/subscriptions/hooks/list-subscriptions.hook.ts +17 -17
- package/src/modules/subscriptions/hooks/use-has-plan-addon.hook.ts +17 -17
- package/src/modules/subscriptions/hooks/use-plan-by-id.hook.ts +13 -13
- package/src/modules/subscriptions/services/plans.service.ts +36 -36
- package/src/modules/subscriptions/types/plan.type.ts +21 -21
- 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/services/whitelabel-styles.service.ts +98 -98
- package/src/modules/whitelabel/styles-schema.ts +37 -37
- package/src/providers/whitelabel.provider.tsx +46 -46
- package/src/utils/countries.ts +224 -224
- package/src/utils/safeServerAction.ts +21 -21
- package/src/utils/withAction.ts +13 -13
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
"use client"
|
|
4
|
-
|
|
5
|
-
import * as React from "react"
|
|
6
|
-
import { IconChevronLeft } from '@tabler/icons-react'
|
|
7
|
-
import { useMdSidebarStore } from "../../store/useMdSidebarStore"
|
|
8
|
-
import { cn } from "../../infra/utils/clsx"
|
|
9
|
-
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/overlay/Tooltip"
|
|
10
|
-
|
|
11
|
-
function MdSideBarNavigation({
|
|
12
|
-
className,
|
|
13
|
-
children,
|
|
14
|
-
...props
|
|
15
|
-
}: React.ComponentProps<"div">) {
|
|
16
|
-
const { isExpanded, collapse } = useMdSidebarStore()
|
|
17
|
-
|
|
18
|
-
return (
|
|
19
|
-
<>
|
|
20
|
-
<div
|
|
21
|
-
className={`hidden md:block lg:hidden fixed inset-0 bg-black/50 z-20 transition-opacity duration-300 ${
|
|
22
|
-
isExpanded ? "opacity-100" : "opacity-0 pointer-events-none"
|
|
23
|
-
}`}
|
|
24
|
-
onClick={collapse}
|
|
25
|
-
/>
|
|
26
|
-
<div
|
|
27
|
-
className={`hidden md:flex lg:hidden fixed top-0 bottom-0 left-[73px] z-30 transition-transform duration-300 ease-in-out overflow-visible ${
|
|
28
|
-
isExpanded ? "translate-x-0" : "-translate-x-full"
|
|
29
|
-
}`}
|
|
30
|
-
>
|
|
31
|
-
<div
|
|
32
|
-
data-slot="md-sidebar-navigation"
|
|
33
|
-
className={cn("relative w-[273px] h-full flex flex-col p-4 bg-white border-r border-gray-200", className)}
|
|
34
|
-
{...props}
|
|
35
|
-
>
|
|
36
|
-
{isExpanded && (
|
|
37
|
-
<Tooltip>
|
|
38
|
-
<TooltipTrigger asChild>
|
|
39
|
-
<button
|
|
40
|
-
onClick={collapse}
|
|
41
|
-
className="absolute top-[68px] -right-4 size-8 flex items-center justify-center rounded-full border border-gray-200 bg-white hover:bg-gray-100 cursor-pointer transition-colors z-40"
|
|
42
|
-
>
|
|
43
|
-
<IconChevronLeft size={16} className="text-gray-500" />
|
|
44
|
-
</button>
|
|
45
|
-
</TooltipTrigger>
|
|
46
|
-
<TooltipContent side="right">Recolher menu</TooltipContent>
|
|
47
|
-
</Tooltip>
|
|
48
|
-
)}
|
|
49
|
-
{children}
|
|
50
|
-
</div>
|
|
51
|
-
</div>
|
|
52
|
-
</>
|
|
53
|
-
)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export { MdSideBarNavigation };
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
"use client"
|
|
4
|
+
|
|
5
|
+
import * as React from "react"
|
|
6
|
+
import { IconChevronLeft } from '@tabler/icons-react'
|
|
7
|
+
import { useMdSidebarStore } from "../../store/useMdSidebarStore"
|
|
8
|
+
import { cn } from "../../infra/utils/clsx"
|
|
9
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/overlay/Tooltip"
|
|
10
|
+
|
|
11
|
+
function MdSideBarNavigation({
|
|
12
|
+
className,
|
|
13
|
+
children,
|
|
14
|
+
...props
|
|
15
|
+
}: React.ComponentProps<"div">) {
|
|
16
|
+
const { isExpanded, collapse } = useMdSidebarStore()
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<>
|
|
20
|
+
<div
|
|
21
|
+
className={`hidden md:block lg:hidden fixed inset-0 bg-black/50 z-20 transition-opacity duration-300 ${
|
|
22
|
+
isExpanded ? "opacity-100" : "opacity-0 pointer-events-none"
|
|
23
|
+
}`}
|
|
24
|
+
onClick={collapse}
|
|
25
|
+
/>
|
|
26
|
+
<div
|
|
27
|
+
className={`hidden md:flex lg:hidden fixed top-0 bottom-0 left-[73px] z-30 transition-transform duration-300 ease-in-out overflow-visible ${
|
|
28
|
+
isExpanded ? "translate-x-0" : "-translate-x-full"
|
|
29
|
+
}`}
|
|
30
|
+
>
|
|
31
|
+
<div
|
|
32
|
+
data-slot="md-sidebar-navigation"
|
|
33
|
+
className={cn("relative w-[273px] h-full flex flex-col p-4 bg-white border-r border-gray-200", className)}
|
|
34
|
+
{...props}
|
|
35
|
+
>
|
|
36
|
+
{isExpanded && (
|
|
37
|
+
<Tooltip>
|
|
38
|
+
<TooltipTrigger asChild>
|
|
39
|
+
<button
|
|
40
|
+
onClick={collapse}
|
|
41
|
+
className="absolute top-[68px] -right-4 size-8 flex items-center justify-center rounded-full border border-gray-200 bg-white hover:bg-gray-100 cursor-pointer transition-colors z-40"
|
|
42
|
+
>
|
|
43
|
+
<IconChevronLeft size={16} className="text-gray-500" />
|
|
44
|
+
</button>
|
|
45
|
+
</TooltipTrigger>
|
|
46
|
+
<TooltipContent side="right">Recolher menu</TooltipContent>
|
|
47
|
+
</Tooltip>
|
|
48
|
+
)}
|
|
49
|
+
{children}
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</>
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { MdSideBarNavigation };
|
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
import Image from "next/image";
|
|
5
|
-
import { IconChevronRight } from "@tabler/icons-react";
|
|
6
|
-
import { Separator } from "../ui/data-display/Separator";
|
|
7
|
-
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/overlay/Tooltip";
|
|
8
|
-
import { cn } from "../../infra/utils/clsx";
|
|
9
|
-
|
|
10
|
-
type NavBarProps = {
|
|
11
|
-
onLogoClick: () => void;
|
|
12
|
-
onAppIconClick?: () => void;
|
|
13
|
-
activeApp?: "gapps" | "gpages";
|
|
14
|
-
showExpandButton?: boolean;
|
|
15
|
-
onExpandClick?: () => void;
|
|
16
|
-
children?: React.ReactNode;
|
|
17
|
-
className?: string;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
function NavBar({
|
|
21
|
-
onLogoClick,
|
|
22
|
-
onAppIconClick,
|
|
23
|
-
activeApp,
|
|
24
|
-
showExpandButton = false,
|
|
25
|
-
onExpandClick,
|
|
26
|
-
children,
|
|
27
|
-
className,
|
|
28
|
-
}: NavBarProps) {
|
|
29
|
-
return (
|
|
30
|
-
<div
|
|
31
|
-
className={cn(
|
|
32
|
-
"hidden md:flex flex-col justify-between h-screen p-4 border-r border-gray-200 overflow-visible z-40 bg-white",
|
|
33
|
-
className,
|
|
34
|
-
)}
|
|
35
|
-
>
|
|
36
|
-
<div className="flex flex-col gap-4 items-center mt-[6.5px]">
|
|
37
|
-
{/* GreatApps logo */}
|
|
38
|
-
<div className="relative">
|
|
39
|
-
<Tooltip>
|
|
40
|
-
<TooltipTrigger
|
|
41
|
-
className="cursor-pointer"
|
|
42
|
-
asChild
|
|
43
|
-
onClick={onLogoClick}
|
|
44
|
-
>
|
|
45
|
-
<Image
|
|
46
|
-
src="/icons/great-icon.svg"
|
|
47
|
-
alt="Great Icon"
|
|
48
|
-
width={28}
|
|
49
|
-
height={28}
|
|
50
|
-
/>
|
|
51
|
-
</TooltipTrigger>
|
|
52
|
-
<TooltipContent side="right">Great</TooltipContent>
|
|
53
|
-
</Tooltip>
|
|
54
|
-
<div
|
|
55
|
-
className={cn(
|
|
56
|
-
"absolute -left-[22px] top-1/2 -translate-y-1/2 z-10 w-[3px] h-5 bg-gray-950 rounded-r-xl transition-opacity duration-300",
|
|
57
|
-
activeApp === "gapps" ? "opacity-100" : "opacity-0",
|
|
58
|
-
)}
|
|
59
|
-
/>
|
|
60
|
-
</div>
|
|
61
|
-
|
|
62
|
-
<div className="relative w-full mt-[7.5px]">
|
|
63
|
-
<Separator />
|
|
64
|
-
{showExpandButton && (
|
|
65
|
-
<Tooltip>
|
|
66
|
-
<TooltipTrigger asChild>
|
|
67
|
-
<button
|
|
68
|
-
onClick={onExpandClick}
|
|
69
|
-
className="lg:hidden absolute top-1/2 -translate-y-1/2 right-0 translate-x-[calc(50%+1rem)] size-8 flex items-center justify-center rounded-full border border-gray-200 bg-white hover:bg-gray-100 cursor-pointer transition-colors z-10"
|
|
70
|
-
>
|
|
71
|
-
<IconChevronRight size={16} className="text-gray-500" />
|
|
72
|
-
</button>
|
|
73
|
-
</TooltipTrigger>
|
|
74
|
-
<TooltipContent side="right">Expandir menu</TooltipContent>
|
|
75
|
-
</Tooltip>
|
|
76
|
-
)}
|
|
77
|
-
</div>
|
|
78
|
-
|
|
79
|
-
{/* GreatPages icon */}
|
|
80
|
-
<div className="relative">
|
|
81
|
-
<Tooltip>
|
|
82
|
-
<TooltipTrigger asChild onClick={onAppIconClick}>
|
|
83
|
-
{activeApp === "gpages" ? (
|
|
84
|
-
<div className="size-10 rounded-lg cursor-pointer flex items-center justify-center bg-cyan-100 border-2 border-white ring-2 ring-cyan-300">
|
|
85
|
-
<Image
|
|
86
|
-
src="/icons/icon-navbar.svg"
|
|
87
|
-
alt="GreatPages"
|
|
88
|
-
width={24}
|
|
89
|
-
height={24}
|
|
90
|
-
/>
|
|
91
|
-
</div>
|
|
92
|
-
) : (
|
|
93
|
-
<div className="size-10 flex items-center justify-center rounded-lg cursor-pointer hover:bg-gray-100 transition-colors duration-300">
|
|
94
|
-
<Image
|
|
95
|
-
src="/icons/icon-navbar.svg"
|
|
96
|
-
alt="GreatPages"
|
|
97
|
-
width={28}
|
|
98
|
-
height={28}
|
|
99
|
-
/>
|
|
100
|
-
</div>
|
|
101
|
-
)}
|
|
102
|
-
</TooltipTrigger>
|
|
103
|
-
<TooltipContent side="right">GreatPages</TooltipContent>
|
|
104
|
-
</Tooltip>
|
|
105
|
-
<div
|
|
106
|
-
className={cn(
|
|
107
|
-
"absolute -left-4 top-1/2 -translate-y-1/2 z-10 w-[3px] h-5 bg-cyan-300 rounded-r-xl transition-opacity duration-300",
|
|
108
|
-
activeApp === "gpages" ? "opacity-100" : "opacity-0",
|
|
109
|
-
)}
|
|
110
|
-
/>
|
|
111
|
-
</div>
|
|
112
|
-
</div>
|
|
113
|
-
|
|
114
|
-
<div className="flex flex-col items-center gap-2">{children}</div>
|
|
115
|
-
</div>
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export { NavBar };
|
|
120
|
-
export type { NavBarProps };
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import Image from "next/image";
|
|
5
|
+
import { IconChevronRight } from "@tabler/icons-react";
|
|
6
|
+
import { Separator } from "../ui/data-display/Separator";
|
|
7
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/overlay/Tooltip";
|
|
8
|
+
import { cn } from "../../infra/utils/clsx";
|
|
9
|
+
|
|
10
|
+
type NavBarProps = {
|
|
11
|
+
onLogoClick: () => void;
|
|
12
|
+
onAppIconClick?: () => void;
|
|
13
|
+
activeApp?: "gapps" | "gpages";
|
|
14
|
+
showExpandButton?: boolean;
|
|
15
|
+
onExpandClick?: () => void;
|
|
16
|
+
children?: React.ReactNode;
|
|
17
|
+
className?: string;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
function NavBar({
|
|
21
|
+
onLogoClick,
|
|
22
|
+
onAppIconClick,
|
|
23
|
+
activeApp,
|
|
24
|
+
showExpandButton = false,
|
|
25
|
+
onExpandClick,
|
|
26
|
+
children,
|
|
27
|
+
className,
|
|
28
|
+
}: NavBarProps) {
|
|
29
|
+
return (
|
|
30
|
+
<div
|
|
31
|
+
className={cn(
|
|
32
|
+
"hidden md:flex flex-col justify-between h-screen p-4 border-r border-gray-200 overflow-visible z-40 bg-white",
|
|
33
|
+
className,
|
|
34
|
+
)}
|
|
35
|
+
>
|
|
36
|
+
<div className="flex flex-col gap-4 items-center mt-[6.5px]">
|
|
37
|
+
{/* GreatApps logo */}
|
|
38
|
+
<div className="relative">
|
|
39
|
+
<Tooltip>
|
|
40
|
+
<TooltipTrigger
|
|
41
|
+
className="cursor-pointer"
|
|
42
|
+
asChild
|
|
43
|
+
onClick={onLogoClick}
|
|
44
|
+
>
|
|
45
|
+
<Image
|
|
46
|
+
src="/icons/great-icon.svg"
|
|
47
|
+
alt="Great Icon"
|
|
48
|
+
width={28}
|
|
49
|
+
height={28}
|
|
50
|
+
/>
|
|
51
|
+
</TooltipTrigger>
|
|
52
|
+
<TooltipContent side="right">Great</TooltipContent>
|
|
53
|
+
</Tooltip>
|
|
54
|
+
<div
|
|
55
|
+
className={cn(
|
|
56
|
+
"absolute -left-[22px] top-1/2 -translate-y-1/2 z-10 w-[3px] h-5 bg-gray-950 rounded-r-xl transition-opacity duration-300",
|
|
57
|
+
activeApp === "gapps" ? "opacity-100" : "opacity-0",
|
|
58
|
+
)}
|
|
59
|
+
/>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div className="relative w-full mt-[7.5px]">
|
|
63
|
+
<Separator />
|
|
64
|
+
{showExpandButton && (
|
|
65
|
+
<Tooltip>
|
|
66
|
+
<TooltipTrigger asChild>
|
|
67
|
+
<button
|
|
68
|
+
onClick={onExpandClick}
|
|
69
|
+
className="lg:hidden absolute top-1/2 -translate-y-1/2 right-0 translate-x-[calc(50%+1rem)] size-8 flex items-center justify-center rounded-full border border-gray-200 bg-white hover:bg-gray-100 cursor-pointer transition-colors z-10"
|
|
70
|
+
>
|
|
71
|
+
<IconChevronRight size={16} className="text-gray-500" />
|
|
72
|
+
</button>
|
|
73
|
+
</TooltipTrigger>
|
|
74
|
+
<TooltipContent side="right">Expandir menu</TooltipContent>
|
|
75
|
+
</Tooltip>
|
|
76
|
+
)}
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
{/* GreatPages icon */}
|
|
80
|
+
<div className="relative">
|
|
81
|
+
<Tooltip>
|
|
82
|
+
<TooltipTrigger asChild onClick={onAppIconClick}>
|
|
83
|
+
{activeApp === "gpages" ? (
|
|
84
|
+
<div className="size-10 rounded-lg cursor-pointer flex items-center justify-center bg-cyan-100 border-2 border-white ring-2 ring-cyan-300">
|
|
85
|
+
<Image
|
|
86
|
+
src="/icons/icon-navbar.svg"
|
|
87
|
+
alt="GreatPages"
|
|
88
|
+
width={24}
|
|
89
|
+
height={24}
|
|
90
|
+
/>
|
|
91
|
+
</div>
|
|
92
|
+
) : (
|
|
93
|
+
<div className="size-10 flex items-center justify-center rounded-lg cursor-pointer hover:bg-gray-100 transition-colors duration-300">
|
|
94
|
+
<Image
|
|
95
|
+
src="/icons/icon-navbar.svg"
|
|
96
|
+
alt="GreatPages"
|
|
97
|
+
width={28}
|
|
98
|
+
height={28}
|
|
99
|
+
/>
|
|
100
|
+
</div>
|
|
101
|
+
)}
|
|
102
|
+
</TooltipTrigger>
|
|
103
|
+
<TooltipContent side="right">GreatPages</TooltipContent>
|
|
104
|
+
</Tooltip>
|
|
105
|
+
<div
|
|
106
|
+
className={cn(
|
|
107
|
+
"absolute -left-4 top-1/2 -translate-y-1/2 z-10 w-[3px] h-5 bg-cyan-300 rounded-r-xl transition-opacity duration-300",
|
|
108
|
+
activeApp === "gpages" ? "opacity-100" : "opacity-0",
|
|
109
|
+
)}
|
|
110
|
+
/>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<div className="flex flex-col items-center gap-2">{children}</div>
|
|
115
|
+
</div>
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export { NavBar };
|
|
120
|
+
export type { NavBarProps };
|
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useState } from "react";
|
|
4
|
-
import { IconBell } from '@tabler/icons-react';
|
|
5
|
-
import * as PopoverPrimitive from "@radix-ui/react-popover";
|
|
6
|
-
import { Popover } from "../ui/overlay/Popover";
|
|
7
|
-
import { Button } from "../ui/buttons/Button";
|
|
8
|
-
import NotificationCard from "../widgets/notifications/NotificationCard";
|
|
9
|
-
import { cn } from "../../infra/utils/clsx";
|
|
10
|
-
import { useMessages, useMarkAllMessagesAsRead } from "../../modules/users/hooks/messages.hook";
|
|
11
|
-
import { formatDistanceToNow } from "date-fns";
|
|
12
|
-
import { ptBR } from "date-fns/locale";
|
|
13
|
-
|
|
14
|
-
export interface NotificationsPopoverProps {
|
|
15
|
-
onViewAll?: () => void;
|
|
16
|
-
side?: "top" | "bottom" | "left" | "right";
|
|
17
|
-
align?: "start" | "center" | "end";
|
|
18
|
-
contentClassName?: string;
|
|
19
|
-
badgeClassName?: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function NotificationsPopover({
|
|
23
|
-
onViewAll,
|
|
24
|
-
side,
|
|
25
|
-
align,
|
|
26
|
-
contentClassName,
|
|
27
|
-
badgeClassName = "bg-pages-400",
|
|
28
|
-
}: NotificationsPopoverProps) {
|
|
29
|
-
const [open, setOpen] = useState(false);
|
|
30
|
-
const { data: messagesData } = useMessages({ type: 'notification', readed: true, limit: 5 });
|
|
31
|
-
const { mutate: markAllAsRead } = useMarkAllMessagesAsRead();
|
|
32
|
-
|
|
33
|
-
const messages = messagesData?.data ?? [];
|
|
34
|
-
const totalUnread = messagesData?.totalUnread ?? 0;
|
|
35
|
-
|
|
36
|
-
const handleOpenChange = (isOpen: boolean) => {
|
|
37
|
-
setOpen(isOpen);
|
|
38
|
-
if (isOpen && totalUnread > 0) {
|
|
39
|
-
markAllAsRead();
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
return (
|
|
44
|
-
<Popover open={open} onOpenChange={handleOpenChange}>
|
|
45
|
-
<PopoverPrimitive.Trigger className="cursor-pointer">
|
|
46
|
-
<div
|
|
47
|
-
className={`relative rounded-full p-2.5 ${open ? "bg-gray-100" : "hover:bg-gray-100"}`}
|
|
48
|
-
>
|
|
49
|
-
<IconBell size={20} className="text-gray-500" />
|
|
50
|
-
{totalUnread > 0 && (
|
|
51
|
-
<span
|
|
52
|
-
className={cn(
|
|
53
|
-
"absolute top-2 right-2 size-2.5 rounded-full",
|
|
54
|
-
badgeClassName,
|
|
55
|
-
)}
|
|
56
|
-
/>
|
|
57
|
-
)}
|
|
58
|
-
</div>
|
|
59
|
-
</PopoverPrimitive.Trigger>
|
|
60
|
-
<PopoverPrimitive.Portal>
|
|
61
|
-
<PopoverPrimitive.Content
|
|
62
|
-
className={cn(
|
|
63
|
-
"absolute bottom-2 left-[26px] z-[9999] w-[308px] p-0 pt-4 bg-white rounded-2xl shadow-md border border-gray-200",
|
|
64
|
-
contentClassName,
|
|
65
|
-
)}
|
|
66
|
-
side={side}
|
|
67
|
-
align={align}
|
|
68
|
-
sideOffset={8}
|
|
69
|
-
>
|
|
70
|
-
<span className="paragraph-small-semibold text-gray-950 px-4">
|
|
71
|
-
Últimas notificações
|
|
72
|
-
</span>
|
|
73
|
-
|
|
74
|
-
{messages.length > 0 ? (
|
|
75
|
-
messages.map((message, index) => (
|
|
76
|
-
<NotificationCard
|
|
77
|
-
key={message.id}
|
|
78
|
-
icon={<IconBell size={16} />}
|
|
79
|
-
iconBgColor="bg-gray-100"
|
|
80
|
-
title={message.subject}
|
|
81
|
-
time={formatDistanceToNow(new Date(message.datetime_add), {
|
|
82
|
-
addSuffix: true,
|
|
83
|
-
locale: ptBR,
|
|
84
|
-
})}
|
|
85
|
-
gapPx={6}
|
|
86
|
-
showBorder={index < messages.length - 1}
|
|
87
|
-
/>
|
|
88
|
-
))
|
|
89
|
-
) : (
|
|
90
|
-
<div className="flex flex-col items-center gap-4 pt-[41.5px] pb-[33.5px]">
|
|
91
|
-
<div className="bg-gray-50 rounded-md p-2.5">
|
|
92
|
-
<IconBell size={20} color="var(--color-gray-950)" />
|
|
93
|
-
</div>
|
|
94
|
-
<span className="paragraph-small-medium text-gray-950">
|
|
95
|
-
Sem notificações por enquanto
|
|
96
|
-
</span>
|
|
97
|
-
</div>
|
|
98
|
-
)}
|
|
99
|
-
|
|
100
|
-
{onViewAll && (
|
|
101
|
-
<Button
|
|
102
|
-
variant="secondary"
|
|
103
|
-
className="h-8! mt-2 mb-4 mx-4 paragraph-small-semibold"
|
|
104
|
-
onClick={onViewAll}
|
|
105
|
-
>
|
|
106
|
-
Todas as notificações
|
|
107
|
-
</Button>
|
|
108
|
-
)}
|
|
109
|
-
</PopoverPrimitive.Content>
|
|
110
|
-
</PopoverPrimitive.Portal>
|
|
111
|
-
</Popover>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export { NotificationsPopover };
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { IconBell } from '@tabler/icons-react';
|
|
5
|
+
import * as PopoverPrimitive from "@radix-ui/react-popover";
|
|
6
|
+
import { Popover } from "../ui/overlay/Popover";
|
|
7
|
+
import { Button } from "../ui/buttons/Button";
|
|
8
|
+
import NotificationCard from "../widgets/notifications/NotificationCard";
|
|
9
|
+
import { cn } from "../../infra/utils/clsx";
|
|
10
|
+
import { useMessages, useMarkAllMessagesAsRead } from "../../modules/users/hooks/messages.hook";
|
|
11
|
+
import { formatDistanceToNow } from "date-fns";
|
|
12
|
+
import { ptBR } from "date-fns/locale";
|
|
13
|
+
|
|
14
|
+
export interface NotificationsPopoverProps {
|
|
15
|
+
onViewAll?: () => void;
|
|
16
|
+
side?: "top" | "bottom" | "left" | "right";
|
|
17
|
+
align?: "start" | "center" | "end";
|
|
18
|
+
contentClassName?: string;
|
|
19
|
+
badgeClassName?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function NotificationsPopover({
|
|
23
|
+
onViewAll,
|
|
24
|
+
side,
|
|
25
|
+
align,
|
|
26
|
+
contentClassName,
|
|
27
|
+
badgeClassName = "bg-pages-400",
|
|
28
|
+
}: NotificationsPopoverProps) {
|
|
29
|
+
const [open, setOpen] = useState(false);
|
|
30
|
+
const { data: messagesData } = useMessages({ type: 'notification', readed: true, limit: 5 });
|
|
31
|
+
const { mutate: markAllAsRead } = useMarkAllMessagesAsRead();
|
|
32
|
+
|
|
33
|
+
const messages = messagesData?.data ?? [];
|
|
34
|
+
const totalUnread = messagesData?.totalUnread ?? 0;
|
|
35
|
+
|
|
36
|
+
const handleOpenChange = (isOpen: boolean) => {
|
|
37
|
+
setOpen(isOpen);
|
|
38
|
+
if (isOpen && totalUnread > 0) {
|
|
39
|
+
markAllAsRead();
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<Popover open={open} onOpenChange={handleOpenChange}>
|
|
45
|
+
<PopoverPrimitive.Trigger className="cursor-pointer">
|
|
46
|
+
<div
|
|
47
|
+
className={`relative rounded-full p-2.5 ${open ? "bg-gray-100" : "hover:bg-gray-100"}`}
|
|
48
|
+
>
|
|
49
|
+
<IconBell size={20} className="text-gray-500" />
|
|
50
|
+
{totalUnread > 0 && (
|
|
51
|
+
<span
|
|
52
|
+
className={cn(
|
|
53
|
+
"absolute top-2 right-2 size-2.5 rounded-full",
|
|
54
|
+
badgeClassName,
|
|
55
|
+
)}
|
|
56
|
+
/>
|
|
57
|
+
)}
|
|
58
|
+
</div>
|
|
59
|
+
</PopoverPrimitive.Trigger>
|
|
60
|
+
<PopoverPrimitive.Portal>
|
|
61
|
+
<PopoverPrimitive.Content
|
|
62
|
+
className={cn(
|
|
63
|
+
"absolute bottom-2 left-[26px] z-[9999] w-[308px] p-0 pt-4 bg-white rounded-2xl shadow-md border border-gray-200",
|
|
64
|
+
contentClassName,
|
|
65
|
+
)}
|
|
66
|
+
side={side}
|
|
67
|
+
align={align}
|
|
68
|
+
sideOffset={8}
|
|
69
|
+
>
|
|
70
|
+
<span className="paragraph-small-semibold text-gray-950 px-4">
|
|
71
|
+
Últimas notificações
|
|
72
|
+
</span>
|
|
73
|
+
|
|
74
|
+
{messages.length > 0 ? (
|
|
75
|
+
messages.map((message, index) => (
|
|
76
|
+
<NotificationCard
|
|
77
|
+
key={message.id}
|
|
78
|
+
icon={<IconBell size={16} />}
|
|
79
|
+
iconBgColor="bg-gray-100"
|
|
80
|
+
title={message.subject}
|
|
81
|
+
time={formatDistanceToNow(new Date(message.datetime_add), {
|
|
82
|
+
addSuffix: true,
|
|
83
|
+
locale: ptBR,
|
|
84
|
+
})}
|
|
85
|
+
gapPx={6}
|
|
86
|
+
showBorder={index < messages.length - 1}
|
|
87
|
+
/>
|
|
88
|
+
))
|
|
89
|
+
) : (
|
|
90
|
+
<div className="flex flex-col items-center gap-4 pt-[41.5px] pb-[33.5px]">
|
|
91
|
+
<div className="bg-gray-50 rounded-md p-2.5">
|
|
92
|
+
<IconBell size={20} color="var(--color-gray-950)" />
|
|
93
|
+
</div>
|
|
94
|
+
<span className="paragraph-small-medium text-gray-950">
|
|
95
|
+
Sem notificações por enquanto
|
|
96
|
+
</span>
|
|
97
|
+
</div>
|
|
98
|
+
)}
|
|
99
|
+
|
|
100
|
+
{onViewAll && (
|
|
101
|
+
<Button
|
|
102
|
+
variant="secondary"
|
|
103
|
+
className="h-8! mt-2 mb-4 mx-4 paragraph-small-semibold"
|
|
104
|
+
onClick={onViewAll}
|
|
105
|
+
>
|
|
106
|
+
Todas as notificações
|
|
107
|
+
</Button>
|
|
108
|
+
)}
|
|
109
|
+
</PopoverPrimitive.Content>
|
|
110
|
+
</PopoverPrimitive.Portal>
|
|
111
|
+
</Popover>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export { NotificationsPopover };
|