import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from '@/components/ui/dialog';
import { DropdownMenuItem } from '@/components/ui/dropdown-menu';
import { authClient } from '@/modules/auth/utils/auth-client';
import { emailProviders } from '@/lib/constants';
import { Button } from '@/components/ui/button';
import { Plus, UserPlus } from 'lucide-react';
import { useLocation } from 'react-router';
import { m } from '@/paraglide/messages';
import { motion } from 'motion/react';
import { cn } from '@/lib/utils';
import { useState } from 'react';
export const AddConnectionDialog = ({
children,
className,
onOpenChange,
}: {
children?: React.ReactNode;
className?: string;
onOpenChange?: (open: boolean) => void;
}) => {
const pathname = useLocation().pathname;
const [open, setOpen] = useState(false);
const handleOpenChange = (newOpen: boolean) => {
setOpen(newOpen);
onOpenChange?.(newOpen);
};
return (
<Dialog open={open} onOpenChange={handleOpenChange}>
<DialogTrigger asChild>
{children || (
<DropdownMenuItem
className={cn('cursor-pointer', className)}
onSelect={(e) => {
e.preventDefault();
setOpen(true);
}}
>
<div className="flex items-center gap-2">
<UserPlus size={16} className="opacity-60" />
<p className="text-[13px] opacity-60">{m['pages.settings.connections.addEmail']()}</p>
</div>
</DropdownMenuItem>
)}
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>{m['pages.settings.connections.connectEmail']()}</DialogTitle>
<DialogDescription>
{m['pages.settings.connections.connectEmailDescription']()}
</DialogDescription>
</DialogHeader>
<motion.div
className="mt-4 grid grid-cols-2 gap-4"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.3 }}
>
{emailProviders.map((provider, index) => {
const Icon = provider.icon;
return (
<motion.div
key=[redacted]
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: index * 0.1, duration: 0.3 }}
whileHover={{ scale: 1.03 }}
whileTap={{ scale: 0.97 }}
>
<Button
variant="outline"
className="h-24 w-full flex-col items-center justify-center gap-2"
onClick={async () =>
await authClient.linkSocial({
provider: provider.providerId,
callbackURL: `${window.location.origin}${pathname}`,
})
}
>
<Icon className="size-6!" />
<span className="text-xs">{provider.name}</span>
</Button>
</motion.div>
);
})}
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: emailProviders.length * 0.1, duration: 0.3 }}
whileHover={{ scale: 1.03 }}
whileTap={{ scale: 0.97 }}
>
<Button
variant="outline"
className="h-24 w-full flex-col items-center justify-center gap-2 border-dashed"
>
<Plus className="h-12 w-12" />
<span className="text-xs">{m['pages.settings.connections.moreComingSoon']()}</span>
</Button>
</motion.div>
</motion.div>
</DialogContent>
</Dialog>
);
};