mirror of
https://github.com/DocNR/POWR.git
synced 2025-04-23 01:01:27 +00:00
161 lines
5.1 KiB
TypeScript
161 lines
5.1 KiB
TypeScript
import * as AlertDialogPrimitive from '@rn-primitives/alert-dialog';
|
|
import * as React from 'react';
|
|
import { Platform, StyleSheet, View, type ViewProps } from 'react-native';
|
|
import Animated, { FadeIn, FadeOut } from 'react-native-reanimated';
|
|
import { buttonTextVariants, buttonVariants } from '@/components/ui/button';
|
|
import { cn } from '@/lib/utils';
|
|
import { TextClassContext } from '@/components/ui/text';
|
|
|
|
const AlertDialog = AlertDialogPrimitive.Root;
|
|
|
|
const AlertDialogTrigger = AlertDialogPrimitive.Trigger;
|
|
|
|
const AlertDialogPortal = AlertDialogPrimitive.Portal;
|
|
|
|
const AlertDialogOverlayWeb = React.forwardRef<
|
|
AlertDialogPrimitive.OverlayRef,
|
|
AlertDialogPrimitive.OverlayProps
|
|
>(({ className, ...props }, ref) => {
|
|
const { open } = AlertDialogPrimitive.useRootContext();
|
|
return (
|
|
<AlertDialogPrimitive.Overlay
|
|
className={cn(
|
|
'z-50 bg-black/80 flex justify-center items-center p-2 absolute top-0 right-0 bottom-0 left-0',
|
|
open ? 'web:animate-in web:fade-in-0' : 'web:animate-out web:fade-out-0',
|
|
className
|
|
)}
|
|
{...props}
|
|
ref={ref}
|
|
/>
|
|
);
|
|
});
|
|
|
|
AlertDialogOverlayWeb.displayName = 'AlertDialogOverlayWeb';
|
|
|
|
const AlertDialogOverlayNative = React.forwardRef<
|
|
AlertDialogPrimitive.OverlayRef,
|
|
AlertDialogPrimitive.OverlayProps
|
|
>(({ className, children, ...props }, ref) => {
|
|
return (
|
|
<AlertDialogPrimitive.Overlay
|
|
style={StyleSheet.absoluteFill}
|
|
className={cn('z-50 bg-black/80 flex justify-center items-center p-2', className)}
|
|
{...props}
|
|
ref={ref}
|
|
asChild
|
|
>
|
|
<Animated.View entering={FadeIn.duration(150)} exiting={FadeOut.duration(150)}>
|
|
{children}
|
|
</Animated.View>
|
|
</AlertDialogPrimitive.Overlay>
|
|
);
|
|
});
|
|
|
|
AlertDialogOverlayNative.displayName = 'AlertDialogOverlayNative';
|
|
|
|
const AlertDialogOverlay = Platform.select({
|
|
web: AlertDialogOverlayWeb,
|
|
default: AlertDialogOverlayNative,
|
|
});
|
|
|
|
const AlertDialogContent = React.forwardRef<
|
|
AlertDialogPrimitive.ContentRef,
|
|
AlertDialogPrimitive.ContentProps & { portalHost?: string }
|
|
>(({ className, portalHost, ...props }, ref) => {
|
|
const { open } = AlertDialogPrimitive.useRootContext();
|
|
|
|
return (
|
|
<AlertDialogPortal hostName={portalHost}>
|
|
<AlertDialogOverlay>
|
|
<AlertDialogPrimitive.Content
|
|
ref={ref}
|
|
className={cn(
|
|
'z-50 max-w-lg gap-4 border border-border bg-background p-6 shadow-lg shadow-foreground/10 web:duration-200 rounded-lg',
|
|
open
|
|
? 'web:animate-in web:fade-in-0 web:zoom-in-95'
|
|
: 'web:animate-out web:fade-out-0 web:zoom-out-95',
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
</AlertDialogOverlay>
|
|
</AlertDialogPortal>
|
|
);
|
|
});
|
|
AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
|
|
|
|
const AlertDialogHeader = ({ className, ...props }: ViewProps) => (
|
|
<View className={cn('flex flex-col gap-2', className)} {...props} />
|
|
);
|
|
AlertDialogHeader.displayName = 'AlertDialogHeader';
|
|
|
|
const AlertDialogFooter = ({ className, ...props }: ViewProps) => (
|
|
<View
|
|
className={cn('flex flex-col-reverse sm:flex-row sm:justify-end gap-2', className)}
|
|
{...props}
|
|
/>
|
|
);
|
|
AlertDialogFooter.displayName = 'AlertDialogFooter';
|
|
|
|
const AlertDialogTitle = React.forwardRef<
|
|
AlertDialogPrimitive.TitleRef,
|
|
AlertDialogPrimitive.TitleProps
|
|
>(({ className, ...props }, ref) => (
|
|
<AlertDialogPrimitive.Title
|
|
ref={ref}
|
|
className={cn('text-lg native:text-xl text-foreground font-semibold', className)}
|
|
{...props}
|
|
/>
|
|
));
|
|
AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
|
|
|
|
const AlertDialogDescription = React.forwardRef<
|
|
AlertDialogPrimitive.DescriptionRef,
|
|
AlertDialogPrimitive.DescriptionProps
|
|
>(({ className, ...props }, ref) => (
|
|
<AlertDialogPrimitive.Description
|
|
ref={ref}
|
|
className={cn('text-sm native:text-base text-muted-foreground', className)}
|
|
{...props}
|
|
/>
|
|
));
|
|
AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
|
|
|
|
const AlertDialogAction = React.forwardRef<
|
|
AlertDialogPrimitive.ActionRef,
|
|
AlertDialogPrimitive.ActionProps
|
|
>(({ className, ...props }, ref) => (
|
|
<TextClassContext.Provider value={buttonTextVariants({ className })}>
|
|
<AlertDialogPrimitive.Action ref={ref} className={cn(buttonVariants(), className)} {...props} />
|
|
</TextClassContext.Provider>
|
|
));
|
|
AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
|
|
|
|
const AlertDialogCancel = React.forwardRef<
|
|
AlertDialogPrimitive.CancelRef,
|
|
AlertDialogPrimitive.CancelProps
|
|
>(({ className, ...props }, ref) => (
|
|
<TextClassContext.Provider value={buttonTextVariants({ className, variant: 'outline' })}>
|
|
<AlertDialogPrimitive.Cancel
|
|
ref={ref}
|
|
className={cn(buttonVariants({ variant: 'outline', className }))}
|
|
{...props}
|
|
/>
|
|
</TextClassContext.Provider>
|
|
));
|
|
AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
|
|
|
|
export {
|
|
AlertDialog,
|
|
AlertDialogAction,
|
|
AlertDialogCancel,
|
|
AlertDialogContent,
|
|
AlertDialogDescription,
|
|
AlertDialogFooter,
|
|
AlertDialogHeader,
|
|
AlertDialogOverlay,
|
|
AlertDialogPortal,
|
|
AlertDialogTitle,
|
|
AlertDialogTrigger,
|
|
};
|