mirror of
https://github.com/hanzoai/dataroom.git
synced 2026-10-30 18:41:07 +00:00
248 lines
8.2 KiB
TypeScript
248 lines
8.2 KiB
TypeScript
"use client";
|
|
|
|
import { useState } from "react";
|
|
|
|
import {
|
|
Check,
|
|
ClockIcon,
|
|
Copy,
|
|
DownloadIcon,
|
|
ExternalLink,
|
|
FolderLockIcon,
|
|
KeyRoundIcon,
|
|
Mail,
|
|
MailCheckIcon,
|
|
MailIcon,
|
|
ShieldIcon,
|
|
Users,
|
|
} from "lucide-react";
|
|
|
|
import { LinkWithViews } from "@/lib/types";
|
|
|
|
import { Badge } from "@/components/ui/badge";
|
|
import { Button } from "@/components/ui/button";
|
|
import { Separator } from "@/components/ui/separator";
|
|
import {
|
|
Sheet,
|
|
SheetContent,
|
|
SheetFooter,
|
|
SheetHeader,
|
|
SheetTitle,
|
|
} from "@/components/ui/sheet";
|
|
|
|
interface LinkSuccessSheetProps {
|
|
isOpen: boolean;
|
|
setIsOpen: (open: boolean) => void;
|
|
link: LinkWithViews;
|
|
hasCustomPermissions: boolean;
|
|
onCreateAnother: () => void;
|
|
}
|
|
|
|
export default function LinkSuccessSheet({
|
|
isOpen,
|
|
setIsOpen,
|
|
link,
|
|
hasCustomPermissions,
|
|
onCreateAnother,
|
|
}: LinkSuccessSheetProps) {
|
|
const [copied, setCopied] = useState(false);
|
|
|
|
const linkUrl =
|
|
link.domainId && link.slug
|
|
? `https://${link.domainSlug}/${link.slug}`
|
|
: `${process.env.NEXT_PUBLIC_MARKETING_URL}/view/${link.id}`;
|
|
|
|
const copyToClipboard = async () => {
|
|
try {
|
|
await navigator.clipboard.writeText(linkUrl);
|
|
setCopied(true);
|
|
setTimeout(() => setCopied(false), 2000);
|
|
} catch (err) {
|
|
console.error("Failed to copy: ", err);
|
|
}
|
|
};
|
|
|
|
const openLink = () => {
|
|
window.open(linkUrl, "_blank");
|
|
};
|
|
|
|
return (
|
|
<Sheet open={isOpen} onOpenChange={setIsOpen}>
|
|
<SheetContent className="flex w-[90%] flex-col justify-between border-l border-gray-200 bg-background px-4 text-foreground dark:border-gray-800 dark:bg-gray-900 sm:w-[600px] sm:max-w-2xl md:px-5">
|
|
<SheetHeader className="text-start">
|
|
<SheetTitle className="flex items-center gap-2">
|
|
<Check className="h-5 w-5 text-green-600" />
|
|
Link Created Successfully
|
|
</SheetTitle>
|
|
<p className="text-sm text-muted-foreground">
|
|
Your dataroom link has been created and is ready to share.
|
|
</p>
|
|
</SheetHeader>
|
|
|
|
<div className="flex-1 space-y-6 py-6">
|
|
{/* Link Section */}
|
|
<div className="space-y-3">
|
|
<h3 className="text-sm font-medium">Share Link</h3>
|
|
<div className="flex items-center gap-2 rounded-lg border bg-muted/30 p-3">
|
|
<div className="flex-1 truncate font-mono text-sm">{linkUrl}</div>
|
|
<Button
|
|
variant="default"
|
|
size="sm"
|
|
onClick={copyToClipboard}
|
|
className="shrink-0"
|
|
>
|
|
{copied ? (
|
|
<Check className="h-4 w-4" />
|
|
) : (
|
|
<Copy className="h-4 w-4" />
|
|
)}
|
|
{copied ? "Copied" : "Copy"}
|
|
</Button>
|
|
<Button
|
|
variant="outline"
|
|
size="sm"
|
|
onClick={openLink}
|
|
className="shrink-0"
|
|
>
|
|
<ExternalLink className="h-4 w-4" />
|
|
Open
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
|
|
<Separator />
|
|
|
|
{/* Link Configuration Summary */}
|
|
<div className="space-y-4">
|
|
<h3 className="text-sm font-medium">Link Configuration</h3>
|
|
|
|
<div className="grid gap-3">
|
|
<div className="flex items-center justify-between text-sm">
|
|
<span className="flex items-center gap-2 text-muted-foreground">
|
|
<FolderLockIcon className="h-4 w-4" />
|
|
File Permissions
|
|
</span>
|
|
<Badge variant={hasCustomPermissions ? "secondary" : "default"}>
|
|
{hasCustomPermissions ? "Custom Permissions" : "Full Access"}
|
|
</Badge>
|
|
</div>
|
|
|
|
<div className="flex items-center justify-between text-sm">
|
|
<span className="flex items-center gap-2 text-muted-foreground">
|
|
<Users className="h-4 w-4" />
|
|
Viewer Access
|
|
</span>
|
|
<Badge
|
|
variant={link.allowList.length > 0 ? "default" : "secondary"}
|
|
>
|
|
{link.allowList.length > 0
|
|
? "Specified viewers"
|
|
: "Everyone with link"}
|
|
</Badge>
|
|
</div>
|
|
|
|
{link.emailProtected && (
|
|
<div className="flex items-center justify-between text-sm">
|
|
<span className="flex items-center gap-2 text-muted-foreground">
|
|
<MailIcon className="h-4 w-4" />
|
|
Email Protection
|
|
</span>
|
|
<Badge variant="default">Enabled</Badge>
|
|
</div>
|
|
)}
|
|
|
|
{link.emailProtected && (
|
|
<div className="flex items-center justify-between text-sm">
|
|
<span className="flex items-center gap-2 text-muted-foreground">
|
|
<MailCheckIcon className="h-4 w-4" />
|
|
Email Verification
|
|
</span>
|
|
<Badge
|
|
variant={link.emailAuthenticated ? "default" : "secondary"}
|
|
>
|
|
{link.emailAuthenticated ? "Enabled" : "Disabled"}
|
|
</Badge>
|
|
</div>
|
|
)}
|
|
|
|
{link.password && (
|
|
<div className="flex items-center justify-between text-sm">
|
|
<span className="flex items-center gap-2 text-muted-foreground">
|
|
<KeyRoundIcon className="h-4 w-4" />
|
|
Password Protection
|
|
</span>
|
|
<Badge variant="secondary">Enabled</Badge>
|
|
</div>
|
|
)}
|
|
|
|
{link.expiresAt && (
|
|
<div className="flex items-center justify-between text-sm">
|
|
<span className="flex items-center gap-2 text-muted-foreground">
|
|
<ClockIcon className="h-4 w-4" />
|
|
Expiration
|
|
</span>
|
|
<Badge variant="outline">
|
|
{new Date(link.expiresAt).toLocaleDateString()}
|
|
</Badge>
|
|
</div>
|
|
)}
|
|
|
|
<div className="flex items-center justify-between text-sm">
|
|
<span className="flex items-center gap-2 text-muted-foreground">
|
|
<DownloadIcon className="h-4 w-4" />
|
|
Downloads
|
|
</span>
|
|
<Badge variant={link.allowDownload ? "default" : "secondary"}>
|
|
{link.allowDownload ? "Enabled" : "Disabled"}
|
|
</Badge>
|
|
</div>
|
|
|
|
<div className="flex items-center justify-between text-sm">
|
|
<span className="flex items-center gap-2 text-muted-foreground">
|
|
<ShieldIcon className="h-4 w-4" />
|
|
Additional Security
|
|
</span>
|
|
<Badge
|
|
variant={
|
|
link.enableAgreement || link.enableWatermark
|
|
? "default"
|
|
: "secondary"
|
|
}
|
|
>
|
|
{link.enableAgreement || link.enableWatermark
|
|
? "Enabled"
|
|
: "Disabled"}
|
|
</Badge>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<Separator />
|
|
|
|
{/* Future: Invite Members Section */}
|
|
<div className="space-y-3">
|
|
<h3 className="text-sm font-medium text-muted-foreground">
|
|
Invite Members (Coming Soon)
|
|
</h3>
|
|
<div className="rounded-lg border border-dashed border-muted-foreground/25 p-6 text-center">
|
|
<Mail className="mx-auto h-8 w-8 text-muted-foreground/50" />
|
|
<p className="mt-2 text-sm text-muted-foreground">
|
|
Soon you'll be able to invite team members directly via
|
|
email
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<SheetFooter>
|
|
<div className="flex flex-row-reverse items-center gap-2 pt-2">
|
|
<Button type="button" variant="outline" onClick={onCreateAnother}>
|
|
Create Another Link
|
|
</Button>
|
|
</div>
|
|
</SheetFooter>
|
|
</SheetContent>
|
|
</Sheet>
|
|
);
|
|
}
|