import type { Article } from '@/types/nostr' import type { ArticleDraft } from '@/lib/articlePublisherTypes' import { EditPanel } from '../UserArticlesEditPanel' import { UserArticlesView } from '../UserArticlesList' import type { UserArticlesController } from './types' type UserArticlesLayoutProps = { controller: UserArticlesController loading: boolean error: string | null showEmptyMessage: boolean currentPubkey: string | null onSelectSeries?: ((seriesId: string | undefined) => void) | undefined } export function UserArticlesLayout(props: UserArticlesLayoutProps): React.ReactElement { const { editPanelProps, listProps } = createLayoutProps(props.controller, props) return (
) } function createLayoutProps(controller: UserArticlesController, view: UserArticlesLayoutProps): { editPanelProps: EditPanelProps; listProps: UserArticlesListProps } { return { editPanelProps: buildEditPanelProps(controller), listProps: buildListProps(controller, view) } } type EditPanelProps = { draft: ArticleDraft | null editingArticleId: string | null loading: boolean error: string | null onCancel: () => void onDraftChange: (draft: ArticleDraft) => void onSubmit: () => Promise } function buildEditPanelProps(controller: UserArticlesController): EditPanelProps { return { draft: controller.editingDraft, editingArticleId: controller.editingArticleId, loading: controller.loading, error: controller.error, onCancel: controller.cancelEditing, onDraftChange: controller.updateDraft, onSubmit: controller.handleEditSubmit, } } type UserArticlesListProps = { articles: Article[] loading: boolean error: string | null showEmptyMessage: boolean unlockedArticles: Set onUnlock: (article: Article) => void onEdit: (article: Article) => void onDelete: (article: Article) => void editingArticleId: string | null currentPubkey: string | null pendingDeleteId: string | null requestDelete: (articleId: string) => void onSelectSeries?: ((seriesId: string | undefined) => void) | undefined } function buildListProps(controller: UserArticlesController, view: UserArticlesLayoutProps): UserArticlesListProps { const handlers = buildUserArticlesHandlers(controller) return { articles: controller.localArticles, loading: view.loading, error: view.error, showEmptyMessage: view.showEmptyMessage, unlockedArticles: controller.unlockedArticles, onUnlock: handlers.onUnlock, onEdit: handlers.onEdit, onDelete: handlers.onDelete, editingArticleId: controller.editingArticleId, currentPubkey: view.currentPubkey, pendingDeleteId: controller.pendingDeleteId, requestDelete: controller.requestDelete, ...(view.onSelectSeries ? { onSelectSeries: view.onSelectSeries } : {}), } } function buildUserArticlesHandlers(controller: UserArticlesController): { onUnlock: (article: Article) => void; onEdit: (article: Article) => void; onDelete: (article: Article) => void } { return { onUnlock: (a: Article): void => void controller.handleUnlock(a), onEdit: (a: Article): void => void controller.startEditing(a), onDelete: (a: Article): void => void controller.handleDelete(a), } }