@greatapps/common 1.0.0
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/handlers/SearchParamsHandler.mjs +23 -0
- package/dist/components/handlers/SearchParamsHandler.mjs.map +1 -0
- package/dist/components/layouts/MainLayout.mjs +60 -0
- package/dist/components/layouts/MainLayout.mjs.map +1 -0
- package/dist/components/layouts/MdSideBarNavigation.mjs +36 -0
- package/dist/components/layouts/MdSideBarNavigation.mjs.map +1 -0
- package/dist/components/layouts/NavBar.mjs +45 -0
- package/dist/components/layouts/NavBar.mjs.map +1 -0
- package/dist/components/layouts/NotificationItem.mjs +7 -0
- package/dist/components/layouts/NotificationItem.mjs.map +1 -0
- package/dist/components/layouts/SideBarNavigation.mjs +22 -0
- package/dist/components/layouts/SideBarNavigation.mjs.map +1 -0
- package/dist/components/ui/buttons/Button.mjs +51 -0
- package/dist/components/ui/buttons/Button.mjs.map +1 -0
- package/dist/components/ui/buttons/CancelButton.mjs +16 -0
- package/dist/components/ui/buttons/CancelButton.mjs.map +1 -0
- package/dist/components/ui/buttons/CopyButton.mjs +34 -0
- package/dist/components/ui/buttons/CopyButton.mjs.map +1 -0
- package/dist/components/ui/data-display/Accordion.mjs +73 -0
- package/dist/components/ui/data-display/Accordion.mjs.map +1 -0
- package/dist/components/ui/data-display/Badge.mjs +41 -0
- package/dist/components/ui/data-display/Badge.mjs.map +1 -0
- package/dist/components/ui/data-display/Card.mjs +91 -0
- package/dist/components/ui/data-display/Card.mjs.map +1 -0
- package/dist/components/ui/data-display/Pagination.mjs +115 -0
- package/dist/components/ui/data-display/Pagination.mjs.map +1 -0
- package/dist/components/ui/data-display/ScrollArea.mjs +60 -0
- package/dist/components/ui/data-display/ScrollArea.mjs.map +1 -0
- package/dist/components/ui/data-display/Separator.mjs +28 -0
- package/dist/components/ui/data-display/Separator.mjs.map +1 -0
- package/dist/components/ui/data-display/Table.mjs +116 -0
- package/dist/components/ui/data-display/Table.mjs.map +1 -0
- package/dist/components/ui/data-display/Tabs.mjs +69 -0
- package/dist/components/ui/data-display/Tabs.mjs.map +1 -0
- package/dist/components/ui/feedback/CircularProgress.mjs +61 -0
- package/dist/components/ui/feedback/CircularProgress.mjs.map +1 -0
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs +49 -0
- package/dist/components/ui/feedback/DefaultCircularProgress.mjs.map +1 -0
- package/dist/components/ui/feedback/Progress.mjs +37 -0
- package/dist/components/ui/feedback/Progress.mjs.map +1 -0
- package/dist/components/ui/feedback/Toast.mjs +73 -0
- package/dist/components/ui/feedback/Toast.mjs.map +1 -0
- package/dist/components/ui/form/Calendar.mjs +203 -0
- package/dist/components/ui/form/Calendar.mjs.map +1 -0
- package/dist/components/ui/form/Checkbox.mjs +33 -0
- package/dist/components/ui/form/Checkbox.mjs.map +1 -0
- package/dist/components/ui/form/DatePicker.mjs +78 -0
- package/dist/components/ui/form/DatePicker.mjs.map +1 -0
- package/dist/components/ui/form/DateRangePicker.mjs +86 -0
- package/dist/components/ui/form/DateRangePicker.mjs.map +1 -0
- package/dist/components/ui/form/Input.mjs +20 -0
- package/dist/components/ui/form/Input.mjs.map +1 -0
- package/dist/components/ui/form/InputOtp.mjs +67 -0
- package/dist/components/ui/form/InputOtp.mjs.map +1 -0
- package/dist/components/ui/form/RadioGroup.mjs +36 -0
- package/dist/components/ui/form/RadioGroup.mjs.map +1 -0
- package/dist/components/ui/form/Select.mjs +172 -0
- package/dist/components/ui/form/Select.mjs.map +1 -0
- package/dist/components/ui/form/Switch.mjs +33 -0
- package/dist/components/ui/form/Switch.mjs.map +1 -0
- package/dist/components/ui/form/Textarea.mjs +19 -0
- package/dist/components/ui/form/Textarea.mjs.map +1 -0
- package/dist/components/ui/overlay/Command.mjs +170 -0
- package/dist/components/ui/overlay/Command.mjs.map +1 -0
- package/dist/components/ui/overlay/Dialog.mjs +131 -0
- package/dist/components/ui/overlay/Dialog.mjs.map +1 -0
- package/dist/components/ui/overlay/Popover.mjs +46 -0
- package/dist/components/ui/overlay/Popover.mjs.map +1 -0
- package/dist/components/ui/overlay/Sheet.mjs +129 -0
- package/dist/components/ui/overlay/Sheet.mjs.map +1 -0
- package/dist/components/ui/overlay/Tooltip.mjs +55 -0
- package/dist/components/ui/overlay/Tooltip.mjs.map +1 -0
- package/dist/hooks/copy-to-clipboard.hook.mjs +39 -0
- package/dist/hooks/copy-to-clipboard.hook.mjs.map +1 -0
- package/dist/index.mjs +57 -0
- package/dist/index.mjs.map +1 -0
- package/dist/infra/api/client.mjs +115 -0
- package/dist/infra/api/client.mjs.map +1 -0
- package/dist/infra/api/types.mjs +31 -0
- package/dist/infra/api/types.mjs.map +1 -0
- package/dist/infra/utils/client-info.mjs +27 -0
- package/dist/infra/utils/client-info.mjs.map +1 -0
- package/dist/infra/utils/clsx.mjs +9 -0
- package/dist/infra/utils/clsx.mjs.map +1 -0
- package/dist/infra/utils/params.mjs +21 -0
- package/dist/infra/utils/params.mjs.map +1 -0
- package/dist/infra/utils/percentage.mjs +20 -0
- package/dist/infra/utils/percentage.mjs.map +1 -0
- package/dist/middlewares/chain.mjs +37 -0
- package/dist/middlewares/chain.mjs.map +1 -0
- package/dist/middlewares/create-auth-middleware.mjs +28 -0
- package/dist/middlewares/create-auth-middleware.mjs.map +1 -0
- package/dist/middlewares/types.mjs +11 -0
- package/dist/middlewares/types.mjs.map +1 -0
- package/dist/middlewares/validate-session.mjs +92 -0
- package/dist/middlewares/validate-session.mjs.map +1 -0
- package/dist/modules/auth/actions/login.action.mjs +11 -0
- package/dist/modules/auth/actions/login.action.mjs.map +1 -0
- package/dist/modules/auth/actions/logout.action.mjs +11 -0
- package/dist/modules/auth/actions/logout.action.mjs.map +1 -0
- package/dist/modules/auth/actions/register.action.mjs +9 -0
- package/dist/modules/auth/actions/register.action.mjs.map +1 -0
- package/dist/modules/auth/actions/validate-session.action.mjs +44 -0
- package/dist/modules/auth/actions/validate-session.action.mjs.map +1 -0
- package/dist/modules/auth/hooks/login.hook.mjs +12 -0
- package/dist/modules/auth/hooks/login.hook.mjs.map +1 -0
- package/dist/modules/auth/hooks/logout.hook.mjs +12 -0
- package/dist/modules/auth/hooks/logout.hook.mjs.map +1 -0
- package/dist/modules/auth/hooks/register.hook.mjs +12 -0
- package/dist/modules/auth/hooks/register.hook.mjs.map +1 -0
- package/dist/modules/auth/hooks/useUserQuery.mjs +48 -0
- package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -0
- package/dist/modules/auth/schema.mjs +1 -0
- package/dist/modules/auth/schema.mjs.map +1 -0
- package/dist/modules/auth/services/auth.service.mjs +163 -0
- package/dist/modules/auth/services/auth.service.mjs.map +1 -0
- package/dist/modules/users/action/find-user-by-id.action.mjs +21 -0
- package/dist/modules/users/action/find-user-by-id.action.mjs.map +1 -0
- package/dist/modules/users/schema.mjs +11 -0
- package/dist/modules/users/schema.mjs.map +1 -0
- package/dist/modules/users/services/user.service.mjs +50 -0
- package/dist/modules/users/services/user.service.mjs.map +1 -0
- package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs +19 -0
- package/dist/modules/whitelabel/actions/find-whitelabel.action.mjs.map +1 -0
- package/dist/modules/whitelabel/schema.mjs +1 -0
- package/dist/modules/whitelabel/schema.mjs.map +1 -0
- package/dist/modules/whitelabel/services/whitelabel.service.mjs +62 -0
- package/dist/modules/whitelabel/services/whitelabel.service.mjs.map +1 -0
- package/dist/providers/auth.provider.mjs +84 -0
- package/dist/providers/auth.provider.mjs.map +1 -0
- package/dist/providers/query.provider.mjs +37 -0
- package/dist/providers/query.provider.mjs.map +1 -0
- package/dist/providers/whitelabel.provider.mjs +33 -0
- package/dist/providers/whitelabel.provider.mjs.map +1 -0
- package/dist/store/useMdSidebarStore.mjs +11 -0
- package/dist/store/useMdSidebarStore.mjs.map +1 -0
- package/package.json +68 -0
- package/src/components/handlers/SearchParamsHandler.tsx +61 -0
- package/src/components/layouts/MainLayout.tsx +59 -0
- package/src/components/layouts/MdSideBarNavigation.tsx +39 -0
- package/src/components/layouts/NavBar.tsx +79 -0
- package/src/components/layouts/NotificationItem.tsx +26 -0
- package/src/components/layouts/SideBarNavigation.tsx +22 -0
- package/src/components/ui/buttons/Button.tsx +55 -0
- package/src/components/ui/buttons/CancelButton.tsx +12 -0
- package/src/components/ui/buttons/CopyButton.tsx +47 -0
- package/src/components/ui/data-display/Accordion.tsx +79 -0
- package/src/components/ui/data-display/Badge.tsx +45 -0
- package/src/components/ui/data-display/Card.tsx +91 -0
- package/src/components/ui/data-display/Pagination.tsx +124 -0
- package/src/components/ui/data-display/ScrollArea.tsx +57 -0
- package/src/components/ui/data-display/Separator.tsx +27 -0
- package/src/components/ui/data-display/Table.tsx +115 -0
- package/src/components/ui/data-display/Tabs.tsx +65 -0
- package/src/components/ui/feedback/CircularProgress.tsx +75 -0
- package/src/components/ui/feedback/DefaultCircularProgress.tsx +53 -0
- package/src/components/ui/feedback/Progress.tsx +38 -0
- package/src/components/ui/feedback/Toast.tsx +99 -0
- package/src/components/ui/form/Calendar.tsx +226 -0
- package/src/components/ui/form/Checkbox.tsx +31 -0
- package/src/components/ui/form/DatePicker.tsx +97 -0
- package/src/components/ui/form/DateRangePicker.tsx +108 -0
- package/src/components/ui/form/Input.tsx +18 -0
- package/src/components/ui/form/InputOtp.tsx +78 -0
- package/src/components/ui/form/RadioGroup.tsx +43 -0
- package/src/components/ui/form/Select.tsx +195 -0
- package/src/components/ui/form/Switch.tsx +30 -0
- package/src/components/ui/form/Textarea.tsx +17 -0
- package/src/components/ui/overlay/Command.tsx +183 -0
- package/src/components/ui/overlay/Dialog.tsx +146 -0
- package/src/components/ui/overlay/Popover.tsx +47 -0
- package/src/components/ui/overlay/Sheet.tsx +145 -0
- package/src/components/ui/overlay/Tooltip.tsx +60 -0
- package/src/hooks/copy-to-clipboard.hook.tsx +52 -0
- package/src/index.ts +50 -0
- package/src/infra/api/client.ts +142 -0
- package/src/infra/api/types.ts +79 -0
- package/src/infra/utils/client-info.ts +35 -0
- package/src/infra/utils/clsx.ts +6 -0
- package/src/infra/utils/params.ts +27 -0
- package/src/infra/utils/percentage.ts +42 -0
- package/src/middlewares/chain.ts +45 -0
- package/src/middlewares/create-auth-middleware.ts +38 -0
- package/src/middlewares/types.ts +24 -0
- package/src/middlewares/validate-session.ts +116 -0
- package/src/modules/auth/actions/login.action.ts +11 -0
- package/src/modules/auth/actions/logout.action.ts +11 -0
- package/src/modules/auth/actions/register.action.ts +8 -0
- package/src/modules/auth/actions/validate-session.action.ts +51 -0
- package/src/modules/auth/hooks/login.hook.tsx +10 -0
- package/src/modules/auth/hooks/logout.hook.tsx +10 -0
- package/src/modules/auth/hooks/register.hook.tsx +10 -0
- package/src/modules/auth/hooks/useUserQuery.ts +49 -0
- package/src/modules/auth/schema.ts +220 -0
- package/src/modules/auth/services/auth.service.ts +225 -0
- package/src/modules/users/action/find-user-by-id.action.ts +25 -0
- package/src/modules/users/schema.ts +79 -0
- package/src/modules/users/services/user.service.ts +63 -0
- package/src/modules/whitelabel/actions/find-whitelabel.action.ts +20 -0
- package/src/modules/whitelabel/schema.ts +49 -0
- package/src/modules/whitelabel/services/whitelabel.service.ts +77 -0
- package/src/providers/auth.provider.tsx +113 -0
- package/src/providers/query.provider.tsx +52 -0
- package/src/providers/whitelabel.provider.tsx +44 -0
- package/src/store/useMdSidebarStore.ts +15 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import * as PopoverPrimitive from "@radix-ui/react-popover";
|
|
4
|
+
import { cn } from "../../../infra/utils/clsx";
|
|
5
|
+
function Popover({
|
|
6
|
+
...props
|
|
7
|
+
}) {
|
|
8
|
+
return /* @__PURE__ */ React.createElement(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
|
|
9
|
+
}
|
|
10
|
+
function PopoverTrigger({
|
|
11
|
+
...props
|
|
12
|
+
}) {
|
|
13
|
+
return /* @__PURE__ */ React.createElement(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
|
|
14
|
+
}
|
|
15
|
+
function PopoverContent({
|
|
16
|
+
className,
|
|
17
|
+
align = "center",
|
|
18
|
+
sideOffset = 4,
|
|
19
|
+
...props
|
|
20
|
+
}) {
|
|
21
|
+
return /* @__PURE__ */ React.createElement(PopoverPrimitive.Portal, null, /* @__PURE__ */ React.createElement(
|
|
22
|
+
PopoverPrimitive.Content,
|
|
23
|
+
{
|
|
24
|
+
"data-slot": "popover-content",
|
|
25
|
+
align,
|
|
26
|
+
sideOffset,
|
|
27
|
+
className: cn(
|
|
28
|
+
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-[1001] w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden",
|
|
29
|
+
className
|
|
30
|
+
),
|
|
31
|
+
...props
|
|
32
|
+
}
|
|
33
|
+
));
|
|
34
|
+
}
|
|
35
|
+
function PopoverAnchor({
|
|
36
|
+
...props
|
|
37
|
+
}) {
|
|
38
|
+
return /* @__PURE__ */ React.createElement(PopoverPrimitive.Anchor, { "data-slot": "popover-anchor", ...props });
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
Popover,
|
|
42
|
+
PopoverAnchor,
|
|
43
|
+
PopoverContent,
|
|
44
|
+
PopoverTrigger
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=Popover.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/overlay/Popover.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { cn } from \"../../../infra/utils/clsx\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-[1001] w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />\n}\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n"],"mappings":";AAEA,YAAY,WAAW;AACvB,YAAY,sBAAsB;AAClC,SAAS,UAAU;AAEnB,SAAS,QAAQ;AAAA,EACf,GAAG;AACL,GAAuD;AACrD,SAAO,oCAAC,iBAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO;AAC/D;AAEA,SAAS,eAAe;AAAA,EACtB,GAAG;AACL,GAA0D;AACxD,SAAO,oCAAC,iBAAiB,SAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,GAAG;AACL,GAA0D;AACxD,SACE,oCAAC,iBAAiB,QAAjB,MACC;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN,CACF;AAEJ;AAEA,SAAS,cAAc;AAAA,EACrB,GAAG;AACL,GAAyD;AACvD,SAAO,oCAAC,iBAAiB,QAAjB,EAAwB,aAAU,kBAAkB,GAAG,OAAO;AACxE;","names":[]}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import * as SheetPrimitive from "@radix-ui/react-dialog";
|
|
4
|
+
import { XIcon } from "lucide-react";
|
|
5
|
+
import { cn } from "../../../infra/utils/clsx";
|
|
6
|
+
function Sheet({ ...props }) {
|
|
7
|
+
return /* @__PURE__ */ React.createElement(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
|
|
8
|
+
}
|
|
9
|
+
function SheetTrigger({
|
|
10
|
+
...props
|
|
11
|
+
}) {
|
|
12
|
+
return /* @__PURE__ */ React.createElement(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
|
|
13
|
+
}
|
|
14
|
+
function SheetClose({
|
|
15
|
+
...props
|
|
16
|
+
}) {
|
|
17
|
+
return /* @__PURE__ */ React.createElement(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props });
|
|
18
|
+
}
|
|
19
|
+
function SheetPortal({
|
|
20
|
+
...props
|
|
21
|
+
}) {
|
|
22
|
+
return /* @__PURE__ */ React.createElement(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
|
|
23
|
+
}
|
|
24
|
+
function SheetOverlay({
|
|
25
|
+
className,
|
|
26
|
+
...props
|
|
27
|
+
}) {
|
|
28
|
+
return /* @__PURE__ */ React.createElement(
|
|
29
|
+
SheetPrimitive.Overlay,
|
|
30
|
+
{
|
|
31
|
+
"data-slot": "sheet-overlay",
|
|
32
|
+
className: cn(
|
|
33
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-[1000] bg-black/50",
|
|
34
|
+
className
|
|
35
|
+
),
|
|
36
|
+
...props
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
function SheetContent({
|
|
41
|
+
className,
|
|
42
|
+
children,
|
|
43
|
+
side = "right",
|
|
44
|
+
showCloseButton = true,
|
|
45
|
+
...props
|
|
46
|
+
}) {
|
|
47
|
+
return /* @__PURE__ */ React.createElement(SheetPortal, null, /* @__PURE__ */ React.createElement(SheetOverlay, null), /* @__PURE__ */ React.createElement(
|
|
48
|
+
SheetPrimitive.Content,
|
|
49
|
+
{
|
|
50
|
+
"data-slot": "sheet-content",
|
|
51
|
+
className: cn(
|
|
52
|
+
"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-[1000] flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
|
|
53
|
+
side === "right" && "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",
|
|
54
|
+
side === "left" && "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",
|
|
55
|
+
side === "top" && "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",
|
|
56
|
+
side === "bottom" && "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",
|
|
57
|
+
className
|
|
58
|
+
),
|
|
59
|
+
...props
|
|
60
|
+
},
|
|
61
|
+
children,
|
|
62
|
+
showCloseButton && /* @__PURE__ */ React.createElement(
|
|
63
|
+
SheetPrimitive.Close,
|
|
64
|
+
{
|
|
65
|
+
"data-slot": "sheet-close",
|
|
66
|
+
className: "absolute top-3 right-3 hover:cursor-pointer flex size-8 items-center justify-center rounded-lg p-2 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-950 focus:outline-none"
|
|
67
|
+
},
|
|
68
|
+
/* @__PURE__ */ React.createElement(XIcon, { className: "size-[18px]" }),
|
|
69
|
+
/* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Close")
|
|
70
|
+
)
|
|
71
|
+
));
|
|
72
|
+
}
|
|
73
|
+
function SheetHeader({ className, ...props }) {
|
|
74
|
+
return /* @__PURE__ */ React.createElement(
|
|
75
|
+
"div",
|
|
76
|
+
{
|
|
77
|
+
"data-slot": "sheet-header",
|
|
78
|
+
className: cn("flex flex-col gap-1.5 p-4", className),
|
|
79
|
+
...props
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
function SheetFooter({ className, ...props }) {
|
|
84
|
+
return /* @__PURE__ */ React.createElement(
|
|
85
|
+
"div",
|
|
86
|
+
{
|
|
87
|
+
"data-slot": "sheet-footer",
|
|
88
|
+
className: cn("mt-auto flex flex-col gap-2 p-4", className),
|
|
89
|
+
...props
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
function SheetTitle({
|
|
94
|
+
className,
|
|
95
|
+
...props
|
|
96
|
+
}) {
|
|
97
|
+
return /* @__PURE__ */ React.createElement(
|
|
98
|
+
SheetPrimitive.Title,
|
|
99
|
+
{
|
|
100
|
+
"data-slot": "sheet-title",
|
|
101
|
+
className: cn("text-foreground font-semibold", className),
|
|
102
|
+
...props
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
function SheetDescription({
|
|
107
|
+
className,
|
|
108
|
+
...props
|
|
109
|
+
}) {
|
|
110
|
+
return /* @__PURE__ */ React.createElement(
|
|
111
|
+
SheetPrimitive.Description,
|
|
112
|
+
{
|
|
113
|
+
"data-slot": "sheet-description",
|
|
114
|
+
className: cn("text-muted-foreground text-sm", className),
|
|
115
|
+
...props
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
export {
|
|
120
|
+
Sheet,
|
|
121
|
+
SheetClose,
|
|
122
|
+
SheetContent,
|
|
123
|
+
SheetDescription,
|
|
124
|
+
SheetFooter,
|
|
125
|
+
SheetHeader,
|
|
126
|
+
SheetTitle,
|
|
127
|
+
SheetTrigger
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=Sheet.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/overlay/Sheet.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\nimport { cn } from \"../../../infra/utils/clsx\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-[1000] bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-[1000] flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close\n data-slot=\"sheet-close\"\n className=\"absolute top-3 right-3 hover:cursor-pointer flex size-8 items-center justify-center rounded-lg p-2 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-950 focus:outline-none\"\n >\n <XIcon className=\"size-[18px]\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n"],"mappings":";AAEA,YAAY,WAAW;AACvB,YAAY,oBAAoB;AAChC,SAAS,aAAa;AACtB,SAAS,UAAU;AAEnB,SAAS,MAAM,EAAE,GAAG,MAAM,GAAqD;AAC7E,SAAO,oCAAC,eAAe,MAAf,EAAoB,aAAU,SAAS,GAAG,OAAO;AAC3D;AAEA,SAAS,aAAa;AAAA,EACpB,GAAG;AACL,GAAwD;AACtD,SAAO,oCAAC,eAAe,SAAf,EAAuB,aAAU,iBAAiB,GAAG,OAAO;AACtE;AAEA,SAAS,WAAW;AAAA,EAClB,GAAG;AACL,GAAsD;AACpD,SAAO,oCAAC,eAAe,OAAf,EAAqB,aAAU,eAAe,GAAG,OAAO;AAClE;AAEA,SAAS,YAAY;AAAA,EACnB,GAAG;AACL,GAAuD;AACrD,SAAO,oCAAC,eAAe,QAAf,EAAsB,aAAU,gBAAgB,GAAG,OAAO;AACpE;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA,GAAG;AACL,GAAwD;AACtD,SACE;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,GAAG;AACL,GAGG;AACD,SACE,oCAAC,mBACC,oCAAC,kBAAa,GACd;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA,SAAS,WACP;AAAA,QACF,SAAS,UACP;AAAA,QACF,SAAS,SACP;AAAA,QACF,SAAS,YACP;AAAA,QACF;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEH;AAAA,IACA,mBACC;AAAA,MAAC,eAAe;AAAA,MAAf;AAAA,QACC,aAAU;AAAA,QACV,WAAU;AAAA;AAAA,MAEV,oCAAC,SAAM,WAAU,eAAc;AAAA,MAC/B,oCAAC,UAAK,WAAU,aAAU,OAAK;AAAA,IACjC;AAAA,EAEJ,CACF;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,6BAA6B,SAAS;AAAA,MACnD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,mCAAmC,SAAS;AAAA,MACzD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,GAAG;AACL,GAAsD;AACpD,SACE;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,SACE;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
4
|
+
import { cn } from "../../../infra/utils/clsx";
|
|
5
|
+
function TooltipProvider({
|
|
6
|
+
delayDuration = 0,
|
|
7
|
+
...props
|
|
8
|
+
}) {
|
|
9
|
+
return /* @__PURE__ */ React.createElement(
|
|
10
|
+
TooltipPrimitive.Provider,
|
|
11
|
+
{
|
|
12
|
+
"data-slot": "tooltip-provider",
|
|
13
|
+
delayDuration,
|
|
14
|
+
...props
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
function Tooltip({
|
|
19
|
+
...props
|
|
20
|
+
}) {
|
|
21
|
+
return /* @__PURE__ */ React.createElement(TooltipProvider, null, /* @__PURE__ */ React.createElement(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props }));
|
|
22
|
+
}
|
|
23
|
+
function TooltipTrigger({
|
|
24
|
+
...props
|
|
25
|
+
}) {
|
|
26
|
+
return /* @__PURE__ */ React.createElement(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
|
|
27
|
+
}
|
|
28
|
+
function TooltipContent({
|
|
29
|
+
className,
|
|
30
|
+
sideOffset = 0,
|
|
31
|
+
children,
|
|
32
|
+
...props
|
|
33
|
+
}) {
|
|
34
|
+
return /* @__PURE__ */ React.createElement(TooltipPrimitive.Portal, null, /* @__PURE__ */ React.createElement(
|
|
35
|
+
TooltipPrimitive.Content,
|
|
36
|
+
{
|
|
37
|
+
"data-slot": "tooltip-content",
|
|
38
|
+
sideOffset,
|
|
39
|
+
className: cn(
|
|
40
|
+
"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
|
|
41
|
+
className
|
|
42
|
+
),
|
|
43
|
+
...props
|
|
44
|
+
},
|
|
45
|
+
children,
|
|
46
|
+
/* @__PURE__ */ React.createElement(TooltipPrimitive.Arrow, { className: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]" })
|
|
47
|
+
));
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
Tooltip,
|
|
51
|
+
TooltipContent,
|
|
52
|
+
TooltipProvider,
|
|
53
|
+
TooltipTrigger
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=Tooltip.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/overlay/Tooltip.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\nimport { cn } from \"../../../infra/utils/clsx\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n"],"mappings":";AAEA,YAAY,WAAW;AACvB,YAAY,sBAAsB;AAClC,SAAS,UAAU;AAEnB,SAAS,gBAAgB;AAAA,EACvB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAA2D;AACzD,SACE;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf,GAAG;AACL,GAAuD;AACrD,SACE,oCAAC,uBACC,oCAAC,iBAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO,CACxD;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB,GAAG;AACL,GAA0D;AACxD,SAAO,oCAAC,iBAAiB,SAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAA0D;AACxD,SACE,oCAAC,iBAAiB,QAAjB,MACC;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEH;AAAA,IACD,oCAAC,iBAAiB,OAAjB,EAAuB,WAAU,oGAAmG;AAAA,EACvI,CACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useState, useCallback, useRef, useEffect } from "react";
|
|
2
|
+
function useCopyToClipboard({
|
|
3
|
+
feedbackDuration = 2e3,
|
|
4
|
+
onSuccess,
|
|
5
|
+
onError
|
|
6
|
+
} = {}) {
|
|
7
|
+
const [isCopied, setIsCopied] = useState(false);
|
|
8
|
+
const timeoutRef = useRef(null);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
return () => {
|
|
11
|
+
if (timeoutRef.current) {
|
|
12
|
+
clearTimeout(timeoutRef.current);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}, []);
|
|
16
|
+
const copy = useCallback(
|
|
17
|
+
async (text) => {
|
|
18
|
+
if (timeoutRef.current) {
|
|
19
|
+
clearTimeout(timeoutRef.current);
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
await navigator.clipboard.writeText(text);
|
|
23
|
+
setIsCopied(true);
|
|
24
|
+
onSuccess?.();
|
|
25
|
+
timeoutRef.current = setTimeout(() => {
|
|
26
|
+
setIsCopied(false);
|
|
27
|
+
}, feedbackDuration);
|
|
28
|
+
} catch (error) {
|
|
29
|
+
onError?.(error instanceof Error ? error : new Error("Failed to copy"));
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
[feedbackDuration, onSuccess, onError]
|
|
33
|
+
);
|
|
34
|
+
return { isCopied, copy };
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
useCopyToClipboard as default
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=copy-to-clipboard.hook.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/copy-to-clipboard.hook.tsx"],"sourcesContent":["import { useState, useCallback, useRef, useEffect } from \"react\";\n\ninterface UseCopyToClipboardOptions {\n feedbackDuration?: number;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseCopyToClipboardReturn {\n isCopied: boolean;\n copy: (text: string) => Promise<void>;\n}\n\nexport default function useCopyToClipboard({\n feedbackDuration = 2000,\n onSuccess,\n onError,\n}: UseCopyToClipboardOptions = {}): UseCopyToClipboardReturn {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n const copy = useCallback(\n async (text: string) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n try {\n await navigator.clipboard.writeText(text);\n setIsCopied(true);\n onSuccess?.();\n\n timeoutRef.current = setTimeout(() => {\n setIsCopied(false);\n }, feedbackDuration);\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error(\"Failed to copy\"));\n }\n },\n [feedbackDuration, onSuccess, onError],\n );\n\n return { isCopied, copy };\n}\n"],"mappings":"AAAA,SAAS,UAAU,aAAa,QAAQ,iBAAiB;AAa1C,SAAR,mBAAoC;AAAA,EACzC,mBAAmB;AAAA,EACnB;AAAA,EACA;AACF,IAA+B,CAAC,GAA6B;AAC3D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,aAAa,OAA8B,IAAI;AAErD,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,OAAO;AAAA,IACX,OAAO,SAAiB;AACtB,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAEA,UAAI;AACF,cAAM,UAAU,UAAU,UAAU,IAAI;AACxC,oBAAY,IAAI;AAChB,oBAAY;AAEZ,mBAAW,UAAU,WAAW,MAAM;AACpC,sBAAY,KAAK;AAAA,QACnB,GAAG,gBAAgB;AAAA,MACrB,SAAS,OAAO;AACd,kBAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,gBAAgB,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,WAAW,OAAO;AAAA,EACvC;AAEA,SAAO,EAAE,UAAU,KAAK;AAC1B;","names":[]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export * from "./modules/auth/schema";
|
|
2
|
+
export * from "./modules/users/schema";
|
|
3
|
+
export * from "./modules/whitelabel/schema";
|
|
4
|
+
export * from "./infra/api/types";
|
|
5
|
+
export * from "./providers/query.provider";
|
|
6
|
+
export * from "./providers/auth.provider";
|
|
7
|
+
export * from "./providers/whitelabel.provider";
|
|
8
|
+
import { useUserQuery, useUserValidateSession, useInvalidateUser, useSetUserData, USER_QUERY_KEY } from "./modules/auth/hooks/useUserQuery";
|
|
9
|
+
import { QueryProvider } from "./providers/query.provider";
|
|
10
|
+
import { apiClient, ApiClient } from "./infra/api/client";
|
|
11
|
+
import { authService } from "./modules/auth/services/auth.service";
|
|
12
|
+
import { whitelabelService } from "./modules/whitelabel/services/whitelabel.service";
|
|
13
|
+
import { findWhitelabel } from "./modules/whitelabel/actions/find-whitelabel.action";
|
|
14
|
+
import { createAuthMiddleware } from "./middlewares/create-auth-middleware";
|
|
15
|
+
import { createMiddlewareChain } from "./middlewares/chain";
|
|
16
|
+
import { continueChain, stopChain } from "./middlewares/types";
|
|
17
|
+
import { validateSessionAction } from "./modules/auth/actions/validate-session.action";
|
|
18
|
+
import { cn } from "./infra/utils/clsx";
|
|
19
|
+
import { getClientInfoFromRequest } from "./infra/utils/client-info";
|
|
20
|
+
import { buildQueryParams } from "./infra/utils/params";
|
|
21
|
+
import { MainLayout, MainLayoutContent, MainLayoutSpacer, MainLayoutMain } from "./components/layouts/MainLayout";
|
|
22
|
+
import { NavBar } from "./components/layouts/NavBar";
|
|
23
|
+
import { SideBarNavigation } from "./components/layouts/SideBarNavigation";
|
|
24
|
+
import { MdSideBarNavigation } from "./components/layouts/MdSideBarNavigation";
|
|
25
|
+
import { NotificationItem } from "./components/layouts/NotificationItem";
|
|
26
|
+
import { useMdSidebarStore } from "./store/useMdSidebarStore";
|
|
27
|
+
export {
|
|
28
|
+
ApiClient,
|
|
29
|
+
MainLayout,
|
|
30
|
+
MainLayoutContent,
|
|
31
|
+
MainLayoutMain,
|
|
32
|
+
MainLayoutSpacer,
|
|
33
|
+
MdSideBarNavigation,
|
|
34
|
+
NavBar,
|
|
35
|
+
NotificationItem,
|
|
36
|
+
QueryProvider,
|
|
37
|
+
SideBarNavigation,
|
|
38
|
+
USER_QUERY_KEY,
|
|
39
|
+
apiClient,
|
|
40
|
+
authService,
|
|
41
|
+
buildQueryParams,
|
|
42
|
+
cn,
|
|
43
|
+
continueChain,
|
|
44
|
+
createAuthMiddleware,
|
|
45
|
+
createMiddlewareChain,
|
|
46
|
+
findWhitelabel,
|
|
47
|
+
getClientInfoFromRequest,
|
|
48
|
+
stopChain,
|
|
49
|
+
useInvalidateUser,
|
|
50
|
+
useMdSidebarStore,
|
|
51
|
+
useSetUserData,
|
|
52
|
+
useUserQuery,
|
|
53
|
+
useUserValidateSession,
|
|
54
|
+
validateSessionAction,
|
|
55
|
+
whitelabelService
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Types\nexport * from './modules/auth/schema';\nexport * from './modules/users/schema';\nexport * from './modules/whitelabel/schema';\nexport * from './infra/api/types';\n\n// Contexts\nexport * from './providers/query.provider';\nexport * from './providers/auth.provider';\nexport * from './providers/whitelabel.provider';\n\n// Hooks\nexport { useUserQuery, useUserValidateSession, useInvalidateUser, useSetUserData, USER_QUERY_KEY } from './modules/auth/hooks/useUserQuery';\n\n// Providers\nexport { QueryProvider } from './providers/query.provider';\n\n// API Client\nexport { apiClient, ApiClient } from './infra/api/client';\n\n// Services\nexport { authService } from './modules/auth/services/auth.service';\nexport { whitelabelService } from './modules/whitelabel/services/whitelabel.service';\n\n// Actions\nexport { findWhitelabel } from './modules/whitelabel/actions/find-whitelabel.action';\n\n// Middleware\nexport { createAuthMiddleware } from './middlewares/create-auth-middleware';\nexport { createMiddlewareChain } from './middlewares/chain';\nexport { continueChain, stopChain } from './middlewares/types';\nexport type { MiddlewareFunction, MiddlewareConfig, MiddlewareResult } from './middlewares/types';\nexport { validateSessionAction } from './modules/auth/actions/validate-session.action';\n\n// Utils\nexport { cn } from './infra/utils/clsx';\nexport { getClientInfoFromRequest } from './infra/utils/client-info';\nexport { buildQueryParams } from './infra/utils/params';\n\n// Layout\nexport { MainLayout, MainLayoutContent, MainLayoutSpacer, MainLayoutMain } from './components/layouts/MainLayout';\nexport { NavBar } from './components/layouts/NavBar';\nexport type { NavBarProps } from './components/layouts/NavBar';\nexport { SideBarNavigation } from './components/layouts/SideBarNavigation';\nexport { MdSideBarNavigation } from './components/layouts/MdSideBarNavigation';\nexport { NotificationItem } from './components/layouts/NotificationItem';\nexport type { NotificationItemProps } from './components/layouts/NotificationItem';\n\n// Store\nexport { useMdSidebarStore } from './store/useMdSidebarStore';\n"],"mappings":"AACA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,SAAS,cAAc,wBAAwB,mBAAmB,gBAAgB,sBAAsB;AAGxG,SAAS,qBAAqB;AAG9B,SAAS,WAAW,iBAAiB;AAGrC,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAGlC,SAAS,sBAAsB;AAG/B,SAAS,4BAA4B;AACrC,SAAS,6BAA6B;AACtC,SAAS,eAAe,iBAAiB;AAEzC,SAAS,6BAA6B;AAGtC,SAAS,UAAU;AACnB,SAAS,gCAAgC;AACzC,SAAS,wBAAwB;AAGjC,SAAS,YAAY,mBAAmB,kBAAkB,sBAAsB;AAChF,SAAS,cAAc;AAEvB,SAAS,yBAAyB;AAClC,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AAIjC,SAAS,yBAAyB;","names":[]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import "server-only";
|
|
2
|
+
import { ApiError } from "./types";
|
|
3
|
+
import { findWhitelabel } from "../../modules/whitelabel/actions/find-whitelabel.action";
|
|
4
|
+
const API_BASE_URL = process.env.R3_API_URL || "https://r3-api.greatapps.dev.br";
|
|
5
|
+
const API_VERSION = "v1";
|
|
6
|
+
const API_LOCALE = "pt-br";
|
|
7
|
+
class ApiClient {
|
|
8
|
+
async buildUrl(endpoint, whiteLabelId) {
|
|
9
|
+
const url = `${API_BASE_URL}/${API_VERSION}/${API_LOCALE}/${whiteLabelId}${endpoint}`;
|
|
10
|
+
console.log("[ApiClient] buildUrl", {
|
|
11
|
+
baseURL: API_BASE_URL,
|
|
12
|
+
whiteLabelId,
|
|
13
|
+
endpoint,
|
|
14
|
+
fullUrl: url
|
|
15
|
+
});
|
|
16
|
+
return url;
|
|
17
|
+
}
|
|
18
|
+
async getDefaultHeaders(token) {
|
|
19
|
+
console.log("[ApiClient] getDefaultHeaders", {
|
|
20
|
+
token: token.substring(0, 20) + "..."
|
|
21
|
+
});
|
|
22
|
+
const headers = {
|
|
23
|
+
"Content-Type": "application/json",
|
|
24
|
+
authorization: token
|
|
25
|
+
};
|
|
26
|
+
return headers;
|
|
27
|
+
}
|
|
28
|
+
async request(endpoint, config = {}) {
|
|
29
|
+
console.log("[ApiClient] request called", { endpoint, method: config.method });
|
|
30
|
+
const { timeout = 3e4, ...fetchConfig } = config;
|
|
31
|
+
const controller = new AbortController();
|
|
32
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
33
|
+
try {
|
|
34
|
+
console.log("[ApiClient] Building URL and headers...");
|
|
35
|
+
const { id, token } = await findWhitelabel();
|
|
36
|
+
const [url, defaultHeaders] = await Promise.all([
|
|
37
|
+
this.buildUrl(endpoint, id),
|
|
38
|
+
this.getDefaultHeaders(token)
|
|
39
|
+
]);
|
|
40
|
+
console.log("[ApiClient] Fetching", {
|
|
41
|
+
url,
|
|
42
|
+
method: fetchConfig.method,
|
|
43
|
+
headers: defaultHeaders
|
|
44
|
+
});
|
|
45
|
+
const response = await fetch(url, {
|
|
46
|
+
...fetchConfig,
|
|
47
|
+
headers: {
|
|
48
|
+
...defaultHeaders,
|
|
49
|
+
...fetchConfig.headers
|
|
50
|
+
},
|
|
51
|
+
signal: controller.signal
|
|
52
|
+
});
|
|
53
|
+
clearTimeout(timeoutId);
|
|
54
|
+
console.log("[ApiClient] Response received", { status: response.status, ok: response.ok });
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
const errorData = await response.json().catch(() => ({}));
|
|
57
|
+
console.error("[ApiClient] Request failed", { status: response.status, errorData });
|
|
58
|
+
throw new ApiError(
|
|
59
|
+
errorData.message || `HTTP error ${response.status}`,
|
|
60
|
+
errorData.code || "HTTP_ERROR",
|
|
61
|
+
response.status
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
const data = await response.json();
|
|
65
|
+
console.log("[ApiClient] Request successful", { hasData: !!data });
|
|
66
|
+
return data;
|
|
67
|
+
} catch (error) {
|
|
68
|
+
clearTimeout(timeoutId);
|
|
69
|
+
console.error("[ApiClient] Request error", { error });
|
|
70
|
+
if (error instanceof ApiError) {
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
if (error instanceof Error) {
|
|
74
|
+
if (error.name === "AbortError") {
|
|
75
|
+
throw new ApiError("Tempo de requisi\xE7\xE3o excedido", "TIMEOUT", 408);
|
|
76
|
+
}
|
|
77
|
+
throw new ApiError(error.message, "NETWORK_ERROR", 0);
|
|
78
|
+
}
|
|
79
|
+
throw new ApiError("Erro desconhecido", "UNKNOWN_ERROR", 500);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async get(endpoint, config) {
|
|
83
|
+
return this.request(endpoint, { ...config, method: "GET" });
|
|
84
|
+
}
|
|
85
|
+
async post(endpoint, data, config) {
|
|
86
|
+
return this.request(endpoint, {
|
|
87
|
+
...config,
|
|
88
|
+
method: "POST",
|
|
89
|
+
body: data ? JSON.stringify(data) : void 0
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async put(endpoint, data, config) {
|
|
93
|
+
return this.request(endpoint, {
|
|
94
|
+
...config,
|
|
95
|
+
method: "PUT",
|
|
96
|
+
body: data ? JSON.stringify(data) : void 0
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async patch(endpoint, data, config) {
|
|
100
|
+
return this.request(endpoint, {
|
|
101
|
+
...config,
|
|
102
|
+
method: "PATCH",
|
|
103
|
+
body: data ? JSON.stringify(data) : void 0
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async delete(endpoint, config) {
|
|
107
|
+
return this.request(endpoint, { ...config, method: "DELETE" });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const apiClient = new ApiClient();
|
|
111
|
+
export {
|
|
112
|
+
ApiClient,
|
|
113
|
+
apiClient
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=client.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/infra/api/client.ts"],"sourcesContent":["import 'server-only';\r\nimport { ApiError } from './types';\r\nimport { findWhitelabel } from '../../modules/whitelabel/actions/find-whitelabel.action';\r\n\r\nconst API_BASE_URL = process.env.R3_API_URL || 'https://r3-api.greatapps.dev.br';\r\nconst API_VERSION = 'v1';\r\nconst API_LOCALE = 'pt-br';\r\n\r\ninterface RequestConfig extends RequestInit {\r\n timeout?: number;\r\n}\r\n\r\nclass ApiClient {\r\n private async buildUrl(endpoint: string, whiteLabelId: number): Promise<string> {\r\n const url = `${API_BASE_URL}/${API_VERSION}/${API_LOCALE}/${whiteLabelId}${endpoint}`;\r\n console.log('[ApiClient] buildUrl', {\r\n baseURL: API_BASE_URL,\r\n whiteLabelId,\r\n endpoint,\r\n fullUrl: url,\r\n });\r\n return url;\r\n }\r\n\r\n private async getDefaultHeaders(token: string): Promise<HeadersInit> {\r\n console.log('[ApiClient] getDefaultHeaders', {\r\n token: token.substring(0, 20) + '...',\r\n });\r\n\r\n const headers: HeadersInit = {\r\n 'Content-Type': 'application/json',\r\n authorization: token,\r\n };\r\n\r\n return headers;\r\n }\r\n\r\n async request<T>(endpoint: string, config: RequestConfig = {}): Promise<T> {\r\n console.log('[ApiClient] request called', { endpoint, method: config.method });\r\n\r\n const { timeout = 30000, ...fetchConfig } = config;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n try {\r\n console.log('[ApiClient] Building URL and headers...');\r\n\r\n const { id, token } = await findWhitelabel();\r\n\r\n const [url, defaultHeaders] = await Promise.all([\r\n this.buildUrl(endpoint, id),\r\n this.getDefaultHeaders(token),\r\n ]);\r\n\r\n console.log('[ApiClient] Fetching', {\r\n url,\r\n method: fetchConfig.method,\r\n headers: defaultHeaders,\r\n });\r\n\r\n const response = await fetch(url, {\r\n ...fetchConfig,\r\n headers: {\r\n ...defaultHeaders,\r\n ...fetchConfig.headers,\r\n },\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n console.log('[ApiClient] Response received', { status: response.status, ok: response.ok });\r\n\r\n if (!response.ok) {\r\n const errorData = (await response.json().catch(() => ({}))) as Record<string, unknown>;\r\n console.error('[ApiClient] Request failed', { status: response.status, errorData });\r\n throw new ApiError(\r\n (errorData.message as string) || `HTTP error ${response.status}`,\r\n (errorData.code as string) || 'HTTP_ERROR',\r\n response.status\r\n );\r\n }\r\n\r\n const data = (await response.json()) as T;\r\n console.log('[ApiClient] Request successful', { hasData: !!data });\r\n return data;\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n console.error('[ApiClient] Request error', { error });\r\n\r\n if (error instanceof ApiError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error) {\r\n if (error.name === 'AbortError') {\r\n throw new ApiError('Tempo de requisição excedido', 'TIMEOUT', 408);\r\n }\r\n throw new ApiError(error.message, 'NETWORK_ERROR', 0);\r\n }\r\n\r\n throw new ApiError('Erro desconhecido', 'UNKNOWN_ERROR', 500);\r\n }\r\n }\r\n\r\n async get<T>(endpoint: string, config?: RequestConfig): Promise<T> {\r\n return this.request<T>(endpoint, { ...config, method: 'GET' });\r\n }\r\n\r\n async post<T>(endpoint: string, data?: unknown, config?: RequestConfig): Promise<T> {\r\n return this.request<T>(endpoint, {\r\n ...config,\r\n method: 'POST',\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n }\r\n\r\n async put<T>(endpoint: string, data?: unknown, config?: RequestConfig): Promise<T> {\r\n return this.request<T>(endpoint, {\r\n ...config,\r\n method: 'PUT',\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n }\r\n\r\n async patch<T>(endpoint: string, data?: unknown, config?: RequestConfig): Promise<T> {\r\n return this.request<T>(endpoint, {\r\n ...config,\r\n method: 'PATCH',\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n }\r\n\r\n async delete<T>(endpoint: string, config?: RequestConfig): Promise<T> {\r\n return this.request<T>(endpoint, { ...config, method: 'DELETE' });\r\n }\r\n}\r\n\r\nexport { ApiClient };\r\nexport const apiClient = new ApiClient();\r\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import z from "zod";
|
|
2
|
+
const PaginationParamsSchema = z.object({
|
|
3
|
+
page: z.number().min(1).optional().default(20),
|
|
4
|
+
limit: z.number().optional().default(20)
|
|
5
|
+
});
|
|
6
|
+
const SearchParamsSchema = z.object({
|
|
7
|
+
search: z.string().optional()
|
|
8
|
+
});
|
|
9
|
+
const SortParamsSchema = z.object({
|
|
10
|
+
sort: z.string().optional()
|
|
11
|
+
});
|
|
12
|
+
class ApiError extends Error {
|
|
13
|
+
code;
|
|
14
|
+
statusCode;
|
|
15
|
+
constructor(message, code = "UNKNOWN_ERROR", statusCode = 500) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = "ApiError";
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.statusCode = statusCode;
|
|
20
|
+
}
|
|
21
|
+
static isApiError(error) {
|
|
22
|
+
return error instanceof ApiError;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
ApiError,
|
|
27
|
+
PaginationParamsSchema,
|
|
28
|
+
SearchParamsSchema,
|
|
29
|
+
SortParamsSchema
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/infra/api/types.ts"],"sourcesContent":["import z from 'zod';\r\n\r\nexport const PaginationParamsSchema = z.object({\r\n page: z.number().min(1).optional().default(20),\r\n limit: z.number().optional().default(20),\r\n});\r\n\r\nexport interface PaginationParams extends z.infer<typeof PaginationParamsSchema> {}\r\n\r\nexport const SearchParamsSchema = z.object({\r\n search: z.string().optional(),\r\n});\r\n\r\nexport interface SearchParams extends z.infer<typeof SearchParamsSchema> {}\r\n\r\nexport const SortParamsSchema = z.object({\r\n sort: z.string().optional(),\r\n});\r\n\r\nexport interface SortParams extends z.infer<typeof SortParamsSchema> {}\r\n\r\nexport interface ApiSuccessResult<T> {\r\n status: 1;\r\n data?: T;\r\n}\r\n\r\nexport interface ApiPaginatedSuccessResult<T> extends Omit<ApiSuccessResult<T>, 'data'> {\r\n data: T[];\r\n total: number;\r\n}\r\n\r\nexport interface ApiErrorResult {\r\n status: 0;\r\n message: string;\r\n}\r\n\r\nexport type ApiActionResult<T> = ApiSuccessResult<T> | ApiErrorResult;\r\nexport type ApiPaginatedActionResult<T> = ApiPaginatedSuccessResult<T> | ApiErrorResult;\r\n\r\nexport interface SuccessResult<T> {\r\n success: true;\r\n data?: T;\r\n total?: number;\r\n}\r\n\r\nexport interface PaginatedSuccessResult<T> extends Omit<SuccessResult<T>, 'data'> {\r\n data: T[];\r\n total: number;\r\n}\r\n\r\nexport interface ErrorResult {\r\n success: false;\r\n error?: string;\r\n}\r\n\r\nexport type ActionResult<T> = SuccessResult<T> | ErrorResult;\r\nexport type PaginatedActionResult<T> = PaginatedSuccessResult<T> | ErrorResult;\r\n\r\nexport class ApiError extends Error {\r\n public readonly code: string;\r\n public readonly statusCode: number;\r\n\r\n constructor(message: string, code: string = 'UNKNOWN_ERROR', statusCode: number = 500) {\r\n super(message);\r\n this.name = 'ApiError';\r\n this.code = code;\r\n this.statusCode = statusCode;\r\n }\r\n\r\n static isApiError(error: unknown): error is ApiError {\r\n return error instanceof ApiError;\r\n }\r\n}\r\n\r\nexport interface ApiResponse<T = unknown> {\r\n status: 0 | 1;\r\n message?: string;\r\n data?: T;\r\n}\r\n"],"mappings":"AAAA,OAAO,OAAO;AAEP,MAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EAC7C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;AACzC,CAAC;AAIM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAIM,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,MAAM,EAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAyCM,MAAM,iBAAiB,MAAM;AAAA,EAClB;AAAA,EACA;AAAA,EAEhB,YAAY,SAAiB,OAAe,iBAAiB,aAAqB,KAAK;AACrF,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,OAAO,WAAW,OAAmC;AACnD,WAAO,iBAAiB;AAAA,EAC1B;AACF;","names":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { headers } from "next/headers";
|
|
2
|
+
async function getClientInfoFromRequest(request) {
|
|
3
|
+
let headerStore;
|
|
4
|
+
if (request) {
|
|
5
|
+
headerStore = request.headers;
|
|
6
|
+
} else {
|
|
7
|
+
const nextHeaders = await headers();
|
|
8
|
+
headerStore = nextHeaders;
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
location: {
|
|
12
|
+
continent: headerStore.get("cf-ipcountry") || headerStore.get("x-vercel-ip-country") || "Unknown",
|
|
13
|
+
country: headerStore.get("x-vercel-ip-country") || "Unknown",
|
|
14
|
+
region: headerStore.get("x-vercel-ip-country-region") || "Unknown",
|
|
15
|
+
city: headerStore.get("x-vercel-ip-city") || "Unknown",
|
|
16
|
+
latitude: headerStore.get("x-vercel-ip-latitude") || "0",
|
|
17
|
+
longitude: headerStore.get("x-vercel-ip-longitude") || "0"
|
|
18
|
+
},
|
|
19
|
+
ip: headerStore.get("cf-connecting-ip") || headerStore.get("x-forwarded-for") || headerStore.get("x-real-ip") || "Unknown",
|
|
20
|
+
timezone: headerStore.get("cf-timezone") || "America/Sao_Paulo",
|
|
21
|
+
agent: headerStore.get("user-agent") || "Unknown"
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
getClientInfoFromRequest
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=client-info.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/infra/utils/client-info.ts"],"sourcesContent":["import { headers } from 'next/headers';\r\nimport { NextRequest } from 'next/server';\r\nimport { ClientInfo } from '../../modules/auth/schema';\r\n\r\nexport async function getClientInfoFromRequest(request?: NextRequest): Promise<ClientInfo> {\r\n let headerStore: Headers;\r\n\r\n if (request) {\r\n // Middleware context\r\n headerStore = request.headers;\r\n } else {\r\n // Server action context\r\n const nextHeaders = await headers();\r\n headerStore = nextHeaders as unknown as Headers;\r\n }\r\n\r\n return {\r\n location: {\r\n continent:\r\n headerStore.get('cf-ipcountry') || headerStore.get('x-vercel-ip-country') || 'Unknown',\r\n country: headerStore.get('x-vercel-ip-country') || 'Unknown',\r\n region: headerStore.get('x-vercel-ip-country-region') || 'Unknown',\r\n city: headerStore.get('x-vercel-ip-city') || 'Unknown',\r\n latitude: headerStore.get('x-vercel-ip-latitude') || '0',\r\n longitude: headerStore.get('x-vercel-ip-longitude') || '0',\r\n },\r\n ip:\r\n headerStore.get('cf-connecting-ip') ||\r\n headerStore.get('x-forwarded-for') ||\r\n headerStore.get('x-real-ip') ||\r\n 'Unknown',\r\n timezone: headerStore.get('cf-timezone') || 'America/Sao_Paulo',\r\n agent: headerStore.get('user-agent') || 'Unknown',\r\n };\r\n}\r\n"],"mappings":"AAAA,SAAS,eAAe;AAIxB,eAAsB,yBAAyB,SAA4C;AACzF,MAAI;AAEJ,MAAI,SAAS;AAEX,kBAAc,QAAQ;AAAA,EACxB,OAAO;AAEL,UAAM,cAAc,MAAM,QAAQ;AAClC,kBAAc;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,MACR,WACE,YAAY,IAAI,cAAc,KAAK,YAAY,IAAI,qBAAqB,KAAK;AAAA,MAC/E,SAAS,YAAY,IAAI,qBAAqB,KAAK;AAAA,MACnD,QAAQ,YAAY,IAAI,4BAA4B,KAAK;AAAA,MACzD,MAAM,YAAY,IAAI,kBAAkB,KAAK;AAAA,MAC7C,UAAU,YAAY,IAAI,sBAAsB,KAAK;AAAA,MACrD,WAAW,YAAY,IAAI,uBAAuB,KAAK;AAAA,IACzD;AAAA,IACA,IACE,YAAY,IAAI,kBAAkB,KAClC,YAAY,IAAI,iBAAiB,KACjC,YAAY,IAAI,WAAW,KAC3B;AAAA,IACF,UAAU,YAAY,IAAI,aAAa,KAAK;AAAA,IAC5C,OAAO,YAAY,IAAI,YAAY,KAAK;AAAA,EAC1C;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/infra/utils/clsx.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"mappings":"AAAA,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
function buildQueryParams(params) {
|
|
2
|
+
if (!params) {
|
|
3
|
+
return "";
|
|
4
|
+
}
|
|
5
|
+
const queryParams = new URLSearchParams();
|
|
6
|
+
for (const [key, value] of Object.entries(params)) {
|
|
7
|
+
if (value === null || value === void 0 || value === "") {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
if (Array.isArray(value)) {
|
|
11
|
+
queryParams.set(key, value.join(","));
|
|
12
|
+
} else {
|
|
13
|
+
queryParams.set(key, value.toString());
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return queryParams.toString();
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
buildQueryParams
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=params.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/infra/utils/params.ts"],"sourcesContent":["export function buildQueryParams(\r\n params?: Record<\r\n string,\r\n string | number | boolean | Date | null | undefined | string[] | number[] | boolean[] | Date[]\r\n >\r\n) {\r\n if (!params) {\r\n return '';\r\n }\r\n\r\n const queryParams = new URLSearchParams();\r\n\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value === null || value === undefined || value === '') {\r\n continue;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n queryParams.set(key, value.join(','));\r\n } else {\r\n\r\n queryParams.set(key, value.toString());\r\n }\r\n }\r\n\r\n return queryParams.toString();\r\n}\r\n"],"mappings":"AAAO,SAAS,iBACd,QAIA;AACA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,IAAI,gBAAgB;AAExC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,IAAI;AACzD;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,kBAAY,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,IACtC,OAAO;AAEL,kBAAY,IAAI,KAAK,MAAM,SAAS,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,SAAO,YAAY,SAAS;AAC9B;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const calculatePercentage = (current, total) => {
|
|
2
|
+
if (total === 0) return 0;
|
|
3
|
+
return current / total * 100;
|
|
4
|
+
};
|
|
5
|
+
const calculateCircumference = (radius) => {
|
|
6
|
+
return 2 * Math.PI * radius;
|
|
7
|
+
};
|
|
8
|
+
const calculateCircularProgressOffset = (percentage, circumference) => {
|
|
9
|
+
return circumference - percentage / 100 * circumference;
|
|
10
|
+
};
|
|
11
|
+
const calculateRadius = (size, strokeWidth) => {
|
|
12
|
+
return (size - strokeWidth) / 2;
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
calculateCircularProgressOffset,
|
|
16
|
+
calculateCircumference,
|
|
17
|
+
calculatePercentage,
|
|
18
|
+
calculateRadius
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=percentage.mjs.map
|