2026-01-10 10:50:47 +01:00

86 lines
2.1 KiB
TypeScript

import { useState, useEffect, useCallback } from 'react'
import { getLocale } from '@/lib/i18n'
export type DocSection = 'user-guide' | 'faq' | 'publishing' | 'payment' | 'fees-and-contributions'
export interface DocLink {
id: DocSection
title: string
file: string
}
export function useDocs(docs: DocLink[]): {
selectedDoc: DocSection
docContent: string
loading: boolean
loadDoc: (docId: DocSection) => Promise<void>
} {
const [selectedDoc, setSelectedDoc] = useState<DocSection>('user-guide')
const [docContent, setDocContent] = useState<string>('')
const [loading, setLoading] = useState(false)
const loadDoc = useCallback(
(docId: DocSection): Promise<void> =>
loadDocImpl({
docId,
docs,
setLoading,
setSelectedDoc,
setDocContent,
}),
[docs]
)
useEffect(() => {
void loadDoc('user-guide')
}, [loadDoc])
return {
selectedDoc,
docContent,
loading,
loadDoc,
}
}
async function loadDocImpl(params: {
docId: DocSection
docs: DocLink[]
setSelectedDoc: (doc: DocSection) => void
setDocContent: (value: string) => void
setLoading: (value: boolean) => void
}): Promise<void> {
const doc = params.docs.find((d) => d.id === params.docId)
if (!doc) {
return
}
params.setLoading(true)
params.setSelectedDoc(params.docId)
try {
const text = await fetchDocContent(doc.file)
params.setDocContent(text)
} catch (error) {
console.error('[useDocs] Error loading doc:', error)
params.setDocContent(await buildDocLoadErrorMarkdown())
} finally {
params.setLoading(false)
}
}
async function fetchDocContent(docFile: string): Promise<string> {
const locale = getLocale()
const response = await globalThis.fetch(`/api/docs/${docFile}?locale=${locale}`)
if (!response.ok) {
throw new Error('DOC_FETCH_FAILED')
}
return response.text()
}
async function buildDocLoadErrorMarkdown(): Promise<string> {
// Import t dynamically to avoid circular dependency
const { t } = await import('@/lib/i18n')
return `# ${t('docs.error')}\n\n${t('docs.error.loadFailed')}`
}