import { faArrowLeft, faBoxOpen, faLayerGroup, faPen, faPlus, faSpinner, faTrash, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useCallback, useEffect, useState } from "react"; import { Link } from "wouter"; import { ApiClientError, apiClient } from "../api"; import { CreateNoteTypeModal } from "../components/CreateNoteTypeModal"; import { DeleteNoteTypeModal } from "../components/DeleteNoteTypeModal"; import { EditNoteTypeModal } from "../components/EditNoteTypeModal"; interface NoteType { id: string; name: string; frontTemplate: string; backTemplate: string; isReversible: boolean; createdAt: string; updatedAt: string; } export function NoteTypesPage() { const [noteTypes, setNoteTypes] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [editingNoteType, setEditingNoteType] = useState(null); const [deletingNoteType, setDeletingNoteType] = useState( null, ); const fetchNoteTypes = useCallback(async () => { setIsLoading(true); setError(null); try { const authHeader = apiClient.getAuthHeader(); if (!authHeader) { throw new ApiClientError("Not authenticated", 401); } const res = await fetch("/api/note-types", { headers: authHeader, }); if (!res.ok) { const errorBody = await res.json().catch(() => ({})); throw new ApiClientError( (errorBody as { error?: string }).error || `Request failed with status ${res.status}`, res.status, ); } const data = await res.json(); setNoteTypes(data.noteTypes); } catch (err) { if (err instanceof ApiClientError) { setError(err.message); } else { setError("Failed to load note types. Please try again."); } } finally { setIsLoading(false); } }, []); useEffect(() => { fetchNoteTypes(); }, [fetchNoteTypes]); return (
{/* Header */}
{/* Main Content */}
{/* Section Header */}

Note types define how your cards are structured

{/* Loading State */} {isLoading && (
)} {/* Error State */} {error && (
{error}
)} {/* Empty State */} {!isLoading && !error && noteTypes.length === 0 && (

No note types yet

Create a note type to define how your cards are structured

)} {/* Note Type List */} {!isLoading && !error && noteTypes.length > 0 && (
{noteTypes.map((noteType, index) => (
Front: {noteType.frontTemplate} Back: {noteType.backTemplate} {noteType.isReversible && ( Reversible )}
))}
)}
{/* Modals */} setIsCreateModalOpen(false)} onNoteTypeCreated={fetchNoteTypes} /> setEditingNoteType(null)} onNoteTypeUpdated={fetchNoteTypes} /> setDeletingNoteType(null)} onNoteTypeDeleted={fetchNoteTypes} />
); }