import { useMemo, useState } from 'react'
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
import { Button } from '@/components/ui/button'
import { Badge } from '@/components/ui/badge'
import { Separator } from '@/components/ui/separator'
import { useConflictResolution } from '@/hooks/use-conflict-resolution'
import { ConflictIndicator } from '@/components/ConflictIndicator'
import { db } from '@/lib/db'
import conflictCopy from '@/data/conflict-resolution-copy.json'
import {
Flask,
Database,
Warning,
CheckCircle,
ArrowsClockwise,
} from '@phosphor-icons/react'
import { toast } from 'sonner'
const demoCopy = conflictCopy.demo
function DemoHeader() {
return (
{demoCopy.title}
{demoCopy.subtitle}
)
}
function StatusCard({ hasConflicts, stats }: { hasConflicts: boolean; stats: { totalConflicts: number; conflictsByType: Record } }) {
return (
{demoCopy.statusTitle}
{demoCopy.conflictsLabel}
{hasConflicts ? (
{stats.totalConflicts}
) : (
{demoCopy.noneLabel}
)}
{demoCopy.filesLabel}
{stats.conflictsByType.files || 0}
{demoCopy.modelsLabel}
{stats.conflictsByType.models || 0}
)
}
function DemoActionsCard({
hasConflicts,
simulatingConflict,
onSimulate,
onDetect,
onResolveAll,
conflictSummary,
}: {
hasConflicts: boolean
simulatingConflict: boolean
onSimulate: () => void
onDetect: () => void
onResolveAll: () => void
conflictSummary: string
}) {
return (
{demoCopy.demoActionsTitle}
{demoCopy.demoActionsDescription}
{hasConflicts && (
<>
>
)}
{hasConflicts && (
{conflictSummary}
{demoCopy.navigateMessage}
)}
)
}
function ResolutionStrategiesCard() {
return (
{demoCopy.resolutionStrategiesTitle}
{demoCopy.resolutionStrategiesDescription}
{demoCopy.strategyKeepLocalTitle}
{demoCopy.strategyKeepLocalDescription}
{demoCopy.strategyKeepRemoteTitle}
{demoCopy.strategyKeepRemoteDescription}
{demoCopy.strategyMergeBothTitle}
{demoCopy.strategyMergeBothDescription}
{demoCopy.strategyManualEditTitle}
{demoCopy.strategyManualEditDescription}
)
}
function ConflictIndicatorCard() {
return (
{demoCopy.indicatorTitle}
{demoCopy.indicatorDescription}
{demoCopy.badgeVariantLabel}
{demoCopy.compactVariantLabel}
)
}
export function ConflictResolutionDemo() {
const { hasConflicts, stats, detect, resolveAll } = useConflictResolution()
const [simulatingConflict, setSimulatingConflict] = useState(false)
const conflictSummary = useMemo(() => {
const count = stats.totalConflicts
const label = count === 1 ? demoCopy.conflictSingular : demoCopy.conflictPlural
return `${count} ${label} ${demoCopy.detectedSuffix}`
}, [stats.totalConflicts])
const simulateConflict = async () => {
setSimulatingConflict(true)
try {
const testFile = {
id: 'demo-conflict-file',
name: 'example.ts',
path: '/src/example.ts',
content: 'const local = "This is the local version"',
language: 'typescript',
updatedAt: Date.now(),
}
await db.put('files', testFile)
toast.info(demoCopy.toastLocalCreated)
await new Promise(resolve => setTimeout(resolve, 1000))
toast.success(demoCopy.toastSimulationComplete)
} catch (err: any) {
toast.error(err.message || demoCopy.toastSimulationError)
} finally {
setSimulatingConflict(false)
}
}
const handleQuickResolveAll = async () => {
try {
await resolveAll('local')
toast.success(demoCopy.toastResolveAllSuccess)
} catch (err: any) {
toast.error(err.message || demoCopy.toastResolveAllError)
}
}
return (
)
}