"use client"; import { useOptimistic, useTransition } from "react"; import type { ListShareData, ListShareItem } from "../server/share-queries"; import { toggleShareListItem } from "../server/share-actions"; export function ListSharedView({ data, canWrite, token, }: { data: ListShareData; canWrite: boolean; token: string; }) { const [optimisticItems, setOptimisticItems] = useOptimistic( data.items, (current: ListShareItem[], { id, done }: { id: string; done: boolean }) => current.map((item) => (item.id === id ? { ...item, done } : item)), ); const [, startTransition] = useTransition(); function toggle(item: ListShareItem) { if (!canWrite) return; const next = !item.done; startTransition(async () => { setOptimisticItems({ id: item.id, done: next }); await toggleShareListItem(token, item.id); }); } const open = optimisticItems.filter((i) => !i.done); const done = optimisticItems.filter((i) => i.done); return (

{data.name}

{data.type}

{optimisticItems.length === 0 ? (

This list is empty.

) : (
{open.length > 0 && ( )} {done.length > 0 && (
{done.length} completed
    {done.map((item) => ( ))}
)}
)}
); } function ItemRow({ item, canWrite, onToggle, }: { item: ListShareItem; canWrite: boolean; onToggle: (item: ListShareItem) => void; }) { return (
  • {canWrite ? ( onToggle(item)} /> ) : ( )} {item.text} {item.qty && ( ×{item.qty} )}
  • ); }