import { ChangeEvent, useState, useRef } from "react"; import Select from "react-select"; import LanguageSelect from "./LanguageSelect"; const requiredFields = [ "title", ]; const suggestedFields = [ "author", ] const otherFields = [ "date", "description", "rights", "belongs-to-collection", "editor", "translator", ]; const possibleFields = [...suggestedFields, ...otherFields]; type Option = { value: string, label: string, }; const baseSettings = { dir: "rtl", "page-progression-direction": "rtl", }; function BookInfoInput({ handleSubmit }: { handleSubmit: (info: { frontmatter: Frontmatter, cover: File | undefined }) => void }) { const coverRef = useRef(null); const [fieldsChosen, setFieldsChosen] = useState(suggestedFields); const [state, setState] = useState({}); const fields = [...requiredFields, ...fieldsChosen]; const availableFields = possibleFields.filter(f => !fieldsChosen.includes(f)); const availableFieldsOptions = availableFields.map((f): Option => ({ value: f, label: f, })); function handleAddField(o: Option) { setFieldsChosen(s => [...s, o.value]); } function handleRemoveField(f: string) { setFieldsChosen(s => s.filter(x => x !== f)); setState(s => { const newS = { ...s }; delete newS[f]; return newS; }); } function handleFieldChange(e: ChangeEvent) { const name = e.target.name; const value = e.target.value; setState(s => ({ ...s, [name]: value, })); } function handleLanguageChange(lang: string | null) { setState(s => { if (!lang) { const { lang, language, ...rest } = s; return rest; } return { ...s, // TODO: using both, but which is proper/necessary? lang, language: lang, }; }); } function submit() { const cover = coverRef.current.files[0] as (File | undefined); const frontmatter = { ...state, ...baseSettings, }; handleSubmit({ frontmatter, cover, }); } return
{fields.map((field) => (
))}
add fields: