import { useState } from 'react' import { AppShell } from '#/components/app-shell' import { ColumnEditor } from './column-editor' import { ResearchColumn } from './deck-column' import { type DeckColumn, MAX_COLUMNS, moveColumn } from './model' import { useDeck } from './use-deck' import { useDeckTools } from './webmcp-tools' import './decks.css' export function DeckPage() { const { deck, ready, storageError, save } = useDeck() const [editing, setEditing] = useState<{ id: string } | 'new' | null>(null) const [renaming, setRenaming] = useState(false) const [removed, setRemoved] = useState<{ column: DeckColumn index: number }>() useDeckTools({ deck, ready, storageError, save, onApplied: () => { setEditing(null) setRenaming(false) setRemoved(undefined) }, }) function saveColumn(column: DeckColumn) { save({ ...deck, columns: editing === 'new' ? [...deck.columns, column] : deck.columns.map((current) => current.id === column.id ? column : current, ), }) setEditing(null) } return (

{deck.title}

観点ごとに検索を並べて、投稿を読み比べる。

{!ready ? 'デッキを読み込んでいます…' : storageError ? 'デッキの保存状態を確認してください。' : `このブラウザにデッキの条件を保存 · ${deck.columns.length} / ${MAX_COLUMNS} カラム`}

{storageError ? (

{storageError}

) : null} {renaming ? (
{ event.preventDefault() const title = String( new FormData(event.currentTarget).get('title') ?? '', ).trim() if (!title) return save({ ...deck, title }) setRenaming(false) }} >
) : null} {editing !== null ? ( column.id === editing.id) } onSave={saveColumn} onCancel={() => setEditing(null)} /> ) : null} {removed ? (
「{removed.column.title}」を削除しました。
) : null} {ready && deck.columns.length === 0 && editing === null ? (

最初の観点を追加しましょう。

「日本語での反応」「発表元の投稿」など、調べたい切り口に名前と検索条件を付けてください。

) : null} {ready && deck.columns.length > 0 ? ( // biome-ignore lint/a11y/noNoninteractiveTabindex: Keyboard users must be able to scroll the column board.
{deck.columns.map((column, index) => ( setEditing({ id: column.id })} onMove={(direction) => save(moveColumn(deck, column.id, direction)) } onRemove={() => { setRemoved({ column, index }) save({ ...deck, columns: deck.columns.filter( (current) => current.id !== column.id, ), }) if (typeof editing === 'object' && editing?.id === column.id) setEditing(null) }} /> ))}
) : null}
) }