import React from 'react' import type { ArticleDraft } from '@/lib/articlePublisher' import type { ArticleCategory } from '@/types/nostr' import { ArticleField } from './ArticleField' import { CategorySelect } from './CategorySelect' import { t } from '@/lib/i18n' interface ArticleFieldsLeftProps { draft: ArticleDraft onDraftChange: (draft: ArticleDraft) => void seriesOptions?: { id: string; title: string }[] | undefined onSelectSeries?: ((seriesId: string | undefined) => void) | undefined } export function ArticleFieldsLeft({ draft, onDraftChange, seriesOptions, onSelectSeries, }: ArticleFieldsLeftProps): React.ReactElement { return (
{seriesOptions && ( )}
) } interface CategoryFieldProps { value: ArticleDraft['category'] onChange: (value: ArticleCategory | undefined) => void } function CategoryField({ value, onChange }: CategoryFieldProps): React.ReactElement { return ( ) } interface BuildCategoryChangeHandlerParams { draft: ArticleDraft onDraftChange: (draft: ArticleDraft) => void } function buildCategoryChangeHandler( params: BuildCategoryChangeHandlerParams ): (value: ArticleCategory | undefined) => void { return (value): void => { if (value !== 'science-fiction' && value !== 'scientific-research' && value !== undefined) { return } if (value) { params.onDraftChange({ ...params.draft, category: value }) return } const { category: _category, ...rest } = params.draft params.onDraftChange(rest) } } function ArticleTitleField({ draft, onDraftChange, }: { draft: ArticleDraft onDraftChange: (draft: ArticleDraft) => void }): React.ReactElement { return ( onDraftChange({ ...draft, title: value as string })} required placeholder={t('article.editor.title.placeholder')} /> ) } function ArticlePreviewField({ draft, onDraftChange, }: { draft: ArticleDraft onDraftChange: (draft: ArticleDraft) => void }): React.ReactElement { return ( onDraftChange({ ...draft, preview: value as string })} required type="textarea" rows={4} placeholder={t('article.editor.preview.placeholder')} helpText={t('article.editor.preview.help')} /> ) } function SeriesSelect({ draft, onDraftChange, seriesOptions, onSelectSeries, }: { draft: ArticleDraft onDraftChange: (draft: ArticleDraft) => void seriesOptions: { id: string; title: string }[] onSelectSeries?: ((seriesId: string | undefined) => void) | undefined }): React.ReactElement { const handleChange = buildSeriesChangeHandler({ draft, onDraftChange, onSelectSeries }) return (
) } interface BuildSeriesChangeHandlerParams { draft: ArticleDraft onDraftChange: (draft: ArticleDraft) => void onSelectSeries?: ((seriesId: string | undefined) => void) | undefined } function buildSeriesChangeHandler( params: BuildSeriesChangeHandlerParams ): (e: React.ChangeEvent) => void { return (e): void => { const value = e.target.value === '' ? undefined : e.target.value if (value) { params.onDraftChange({ ...params.draft, seriesId: value }) params.onSelectSeries?.(value) return } const { seriesId: _seriesId, ...rest } = params.draft params.onDraftChange(rest) params.onSelectSeries?.(undefined) } }