85 lines
2.1 KiB
TypeScript
85 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(
|
|
createLoadDoc({
|
|
docs,
|
|
setLoading,
|
|
setSelectedDoc,
|
|
setDocContent,
|
|
}),
|
|
[docs]
|
|
)
|
|
|
|
useEffect(() => {
|
|
void loadDoc('user-guide')
|
|
}, [loadDoc])
|
|
|
|
return {
|
|
selectedDoc,
|
|
docContent,
|
|
loading,
|
|
loadDoc,
|
|
}
|
|
}
|
|
|
|
function createLoadDoc(params: {
|
|
docs: DocLink[]
|
|
setSelectedDoc: (doc: DocSection) => void
|
|
setDocContent: (value: string) => void
|
|
setLoading: (value: boolean) => void
|
|
}): (docId: DocSection) => Promise<void> {
|
|
return async (docId: DocSection): Promise<void> => {
|
|
const doc = params.docs.find((d) => d.id === docId)
|
|
if (!doc) {
|
|
return
|
|
}
|
|
|
|
params.setLoading(true)
|
|
params.setSelectedDoc(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')}`
|
|
}
|