import Head from 'next/head'
import { useRouter } from 'next/router'
import { useEffect, useState } from 'react'
import { ArticleEditor } from '@/components/ArticleEditor'
import { useNostrAuth } from '@/hooks/useNostrAuth'
import { getSeriesById } from '@/lib/seriesQueries'
import type { Series } from '@/types/nostr'
import { t } from '@/lib/i18n'
import Image from 'next/image'
function PublishHeader({ series }: { series: Series }): React.ReactElement {
return (
{t('series.publish.title', { series: series.title })} - zapwall.fr
)
}
function SeriesHeader({ series }: { series: Series }): React.ReactElement {
return (
{series.coverUrl && (
)}
{series.title}
{t('series.publish.subtitle')}
)
}
export default function SeriesPublishPage(): React.ReactElement | null {
const router = useRouter()
const { id } = router.query
const seriesId = typeof id === 'string' ? id : ''
const { pubkey } = useNostrAuth()
const { series, loading, error, isAuthor } = useSeriesPublishPageData(seriesId, pubkey ?? null)
if (!seriesId) {
return null
}
if (loading) {
return
}
if (error || !series) {
return { void router.back() }} />
}
if (!isAuthor) {
return { void router.push(`/series/${seriesId}`) }} />
}
return { void router.push(`/series/${seriesId}`) }} onAfterPublish={() => { void router.push(`/series/${seriesId}`) }} />
}
function SeriesPublishLoading(): React.ReactElement {
return (
)
}
function SeriesPublishError(params: { error: string | null; onBack: () => void }): React.ReactElement {
return (
{params.error ?? 'Série introuvable'}
{t('common.back')}
)
}
function SeriesPublishNotAuthor(params: { onBack: () => void }): React.ReactElement {
return (
{t('series.publish.error.notAuthor')}
{t('common.back')}
)
}
function SeriesPublishEditorView(params: { series: Series; seriesId: string; onBack: () => void; onAfterPublish: () => void }): React.ReactElement {
const handlePublishSuccess = (): void => {
setTimeout(() => {
params.onAfterPublish()
}, 2000)
}
return (
<>
{t('common.back')}
{
// Series is already selected and cannot be changed
}}
defaultSeriesId={params.series.id}
/>
>
)
}
function useSeriesPublishPageData(
seriesId: string,
userPubkey: string | null
): {
series: Series | null
loading: boolean
error: string | null
isAuthor: boolean
} {
const [series, setSeries] = useState(null)
const [loading, setLoading] = useState(true)
const [error, setError] = useState(null)
useEffect(() => {
if (!seriesId) {
return
}
const load = async (): Promise => {
setLoading(true)
setError(null)
try {
const s = await getSeriesById(seriesId)
if (!s) {
setError('Série introuvable')
setLoading(false)
return
}
setSeries(s)
} catch (e) {
setError(e instanceof Error ? e.message : 'Erreur lors du chargement de la série')
} finally {
setLoading(false)
}
}
void load()
}, [seriesId])
const isAuthor = series !== null && userPubkey !== null && series.pubkey === userPubkey
return { series, loading, error, isAuthor }
}