返回 presentation-ai
credenza.tsx
根目录 / src / components / ui / credenza.tsx
1 "use client";
2
3 import type * as React from "react";
4
5 import {
6 Dialog,
7 DialogClose,
8 DialogContent,
9 DialogDescription,
10 DialogFooter,
11 DialogHeader,
12 DialogTitle,
13 DialogTrigger,
14 } from "@/components/ui/dialog";
15 import {
16 Drawer,
17 DrawerClose,
18 DrawerContent,
19 DrawerDescription,
20 DrawerFooter,
21 DrawerHeader,
22 DrawerTitle,
23 DrawerTrigger,
24 } from "@/components/ui/drawer";
25 import { useMediaQuery } from "@/hooks/globals/useMediaQuery";
26 import { cn } from "@/lib/utils";
27
28 type DialogProps = React.ComponentProps<typeof Dialog>;
29 type DrawerProps = React.ComponentProps<typeof Drawer>;
30 type DialogTriggerProps = React.ComponentProps<typeof DialogTrigger>;
31 type DialogContentProps = React.ComponentProps<typeof DialogContent>;
32 type DrawerContentProps = React.ComponentProps<typeof DrawerContent>;
33 type DialogCloseProps = React.ComponentProps<typeof DialogClose>;
34 type DialogDescriptionProps = React.ComponentProps<typeof DialogDescription>;
35 type DialogHeaderProps = React.ComponentProps<typeof DialogHeader>;
36 type DialogTitleProps = React.ComponentProps<typeof DialogTitle>;
37 type DialogFooterProps = React.ComponentProps<typeof DialogFooter>;
38
39 type CredenzaProps = DialogProps & DrawerProps;
40 type CredenzaTriggerProps = DialogTriggerProps;
41 type CredenzaContentProps = DialogContentProps & DrawerContentProps;
42 type CredenzaCloseProps = DialogCloseProps;
43 type CredenzaDescriptionProps = DialogDescriptionProps;
44 type CredenzaHeaderProps = DialogHeaderProps;
45 type CredenzaTitleProps = DialogTitleProps;
46 type CredenzaFooterProps = DialogFooterProps;
47
48 const desktop = "(min-width: 768px)";
49
50 const Credenza = ({ children, ...props }: CredenzaProps) => {
51 const isDesktop = useMediaQuery(desktop);
52 const CredenzaComponent = isDesktop ? Dialog : Drawer;
53
54 return <CredenzaComponent {...props}>{children}</CredenzaComponent>;
55 };
56
57 const CredenzaTrigger = ({ children, ...props }: CredenzaTriggerProps) => {
58 const isDesktop = useMediaQuery(desktop);
59 const TriggerComponent = isDesktop ? DialogTrigger : DrawerTrigger;
60
61 return <TriggerComponent {...props}>{children}</TriggerComponent>;
62 };
63
64 const CredenzaClose = ({ children, ...props }: CredenzaCloseProps) => {
65 const isDesktop = useMediaQuery(desktop);
66 const CloseComponent = isDesktop ? DialogClose : DrawerClose;
67
68 return <CloseComponent {...props}>{children}</CloseComponent>;
69 };
70
71 const CredenzaContent = ({ children, ...props }: CredenzaContentProps) => {
72 const isDesktop = useMediaQuery(desktop);
73 const ContentComponent = isDesktop ? DialogContent : DrawerContent;
74
75 return <ContentComponent {...props}>{children}</ContentComponent>;
76 };
77
78 const CredenzaDescription = ({
79 children,
80 ...props
81 }: CredenzaDescriptionProps) => {
82 const isDesktop = useMediaQuery(desktop);
83 const DescriptionComponent = isDesktop
84 ? DialogDescription
85 : DrawerDescription;
86
87 return <DescriptionComponent {...props}>{children}</DescriptionComponent>;
88 };
89
90 const CredenzaHeader = ({ children, ...props }: CredenzaHeaderProps) => {
91 const isDesktop = useMediaQuery(desktop);
92 const HeaderComponent = isDesktop ? DialogHeader : DrawerHeader;
93
94 return <HeaderComponent {...props}>{children}</HeaderComponent>;
95 };
96
97 const CredenzaTitle = ({ children, ...props }: CredenzaTitleProps) => {
98 const isDesktop = useMediaQuery(desktop);
99 const TitleComponent = isDesktop ? DialogTitle : DrawerTitle;
100
101 return <TitleComponent {...props}>{children}</TitleComponent>;
102 };
103
104 const CredenzaBody = ({
105 className,
106 children,
107 ...props
108 }: React.HTMLAttributes<HTMLDivElement>) => {
109 return (
110 <div className={cn("px-4 md:px-0", className)} {...props}>
111 {children}
112 </div>
113 );
114 };
115
116 const CredenzaFooter = ({ children, ...props }: CredenzaFooterProps) => {
117 const isDesktop = useMediaQuery(desktop);
118 const FooterComponent = isDesktop ? DialogFooter : DrawerFooter;
119
120 return <FooterComponent {...props}>{children}</FooterComponent>;
121 };
122
123 export {
124 Credenza,
125 CredenzaBody,
126 CredenzaClose,
127 CredenzaContent,
128 CredenzaDescription,
129 CredenzaFooter,
130 CredenzaHeader,
131 CredenzaTitle,
132 CredenzaTrigger,
133 };
134
134 lines Plain Text