'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import toast from 'react-hot-toast'; import { Button, ModalFrame, ModalTitle } from '@/components/ui'; export type ClaimableCounts = { documents: number; audiobooks: number; preferences: number; progress: number; documentSettings: number; folders: number; onboarding: number; }; function toClaimableCounts(value: unknown): ClaimableCounts { const rec = (value && typeof value === 'object') ? (value as Record) : {}; return { documents: Number(rec.documents ?? 0), audiobooks: Number(rec.audiobooks ?? 0), preferences: Number(rec.preferences ?? 0), progress: Number(rec.progress ?? 0), documentSettings: Number(rec.documentSettings ?? 0), folders: Number(rec.folders ?? 0), onboarding: Number(rec.onboarding ?? 0), }; } type ClaimDataModalProps = { isOpen: boolean; claimableCounts: ClaimableCounts; onDismiss: () => void; onClaimed: () => void; }; export default function ClaimDataModal({ isOpen, claimableCounts, onDismiss, onClaimed, }: ClaimDataModalProps) { const router = useRouter(); const [isClaiming, setIsClaiming] = useState(false); const handleClaim = async () => { setIsClaiming(true); try { const res = await fetch('/api/user/claim', { method: 'POST', }); if (res.ok) { const data = await res.json(); const claimed = toClaimableCounts(data?.claimed); toast.success( `Successfully claimed ${claimed.documents} documents, ` + `${claimed.audiobooks} audiobooks, ` + `${claimed.preferences} preference set(s), ` + `${claimed.progress} reading progress record(s), and ` + `${claimed.documentSettings} document setting(s)!`, ); onClaimed(); router.refresh(); return; } const data = await res.json().catch(() => null) as { error?: string } | null; toast.error(data?.error || 'Failed to claim data.'); } catch { toast.error('Failed to claim data.'); } finally { setIsClaiming(false); } }; return ( Existing Data Found

We found existing anonymous data from before auth was enabled. Claim it now to attach it to your account.

Claimable data
  • {claimableCounts.documents} document(s)
  • {claimableCounts.audiobooks} audiobook(s)
  • {claimableCounts.preferences} preference set(s)
  • {claimableCounts.progress} reading progress record(s)
  • {claimableCounts.documentSettings} document setting(s)
  • {claimableCounts.folders} folder(s)
  • {claimableCounts.onboarding} onboarding state record(s)

⚠️ First user to claim this data will own it and revoke access for anyone else.

); }