Files
frigate/web/src/components/overlay/dialog/PlatformAwareDialog.tsx
T

137 lines
3.4 KiB
TypeScript
Raw Normal View History

2024-10-15 18:25:59 -06:00
import {
MobilePage,
MobilePageContent,
MobilePageHeader,
MobilePagePortal,
2024-10-15 18:25:59 -06:00
MobilePageTitle,
MobilePageTrigger,
2024-10-15 18:25:59 -06:00
} from "@/components/mobile/MobilePage";
import { Drawer, DrawerContent, DrawerTrigger } from "@/components/ui/drawer";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover";
2024-10-16 07:15:25 -05:00
import {
Sheet,
SheetContent,
SheetDescription,
SheetHeader,
SheetTitle,
SheetTrigger,
} from "@/components/ui/sheet";
2025-11-07 07:53:27 -06:00
import { cn } from "@/lib/utils";
import { isMobile } from "react-device-detect";
2025-11-07 07:53:27 -06:00
import { useRef } from "react";
type PlatformAwareDialogProps = {
trigger: JSX.Element;
content: JSX.Element;
triggerClassName?: string;
contentClassName?: string;
open: boolean;
onOpenChange: (open: boolean) => void;
};
export default function PlatformAwareDialog({
trigger,
content,
triggerClassName = "",
contentClassName = "",
open,
onOpenChange,
}: PlatformAwareDialogProps) {
if (isMobile) {
return (
<Drawer open={open} onOpenChange={onOpenChange}>
<DrawerTrigger asChild>{trigger}</DrawerTrigger>
2025-11-25 07:34:20 -06:00
<DrawerContent className="max-h-[75dvh] overflow-hidden">
<div className={contentClassName}>{content}</div>
</DrawerContent>
</Drawer>
);
}
return (
<Popover open={open} onOpenChange={onOpenChange}>
<PopoverTrigger asChild className={triggerClassName}>
{trigger}
</PopoverTrigger>
<PopoverContent className={contentClassName}>{content}</PopoverContent>
</Popover>
);
}
2024-10-15 18:25:59 -06:00
type PlatformAwareSheetProps = {
trigger: JSX.Element;
2024-10-16 07:15:25 -05:00
title?: string | JSX.Element;
2024-10-15 18:25:59 -06:00
content: JSX.Element;
triggerClassName?: string;
2024-10-16 07:15:25 -05:00
titleClassName?: string;
2024-10-15 18:25:59 -06:00
contentClassName?: string;
open: boolean;
onOpenChange: (open: boolean) => void;
};
export function PlatformAwareSheet({
trigger,
2024-10-16 07:15:25 -05:00
title,
2024-10-15 18:25:59 -06:00
content,
triggerClassName = "",
2024-10-16 07:15:25 -05:00
titleClassName = "",
2024-10-15 18:25:59 -06:00
contentClassName = "",
open,
onOpenChange,
}: PlatformAwareSheetProps) {
2025-11-07 07:53:27 -06:00
const scrollerRef = useRef<HTMLDivElement>(null);
2024-10-15 18:25:59 -06:00
if (isMobile) {
return (
<MobilePage open={open} onOpenChange={onOpenChange}>
<MobilePageTrigger onClick={() => onOpenChange(true)}>
{trigger}
</MobilePageTrigger>
<MobilePagePortal>
2025-11-07 07:53:27 -06:00
<MobilePageContent
className="flex h-full flex-col"
scrollerRef={scrollerRef}
>
2024-10-15 18:25:59 -06:00
<MobilePageHeader
className="mx-2"
onClose={() => onOpenChange(false)}
>
2025-05-14 16:44:06 -06:00
<MobilePageTitle>{title}</MobilePageTitle>
2024-10-15 18:25:59 -06:00
</MobilePageHeader>
2025-11-07 07:53:27 -06:00
<div
ref={scrollerRef}
className={cn("flex-1 overflow-y-auto", contentClassName)}
>
{content}
</div>
2024-10-15 18:25:59 -06:00
</MobilePageContent>
</MobilePagePortal>
</MobilePage>
2024-10-15 18:25:59 -06:00
);
}
return (
<Sheet
open={open}
onOpenChange={onOpenChange}
modal={false}
enableHistoryBack
>
2024-10-15 18:25:59 -06:00
<SheetTrigger asChild className={triggerClassName}>
{trigger}
</SheetTrigger>
2024-10-16 07:15:25 -05:00
<SheetContent className={contentClassName}>
<SheetHeader>
<SheetTitle className={title ? titleClassName : "sr-only"}>
{title ?? ""}
</SheetTitle>
<SheetDescription className="sr-only">Information</SheetDescription>
</SheetHeader>
{content}
</SheetContent>
2024-10-15 18:25:59 -06:00
</Sheet>
);
}