(null)
const [preview, setPreview] = useState(false)
return (
setPreview((p) => !p)}
onFileSelected={(file) => {
const handlers = {
setError,
setUploading,
...(onMediaAdd ? { onMediaAdd } : {}),
...(onBannerChange ? { onBannerChange } : {}),
}
void handleUpload(file, handlers)
}}
uploading={uploading}
error={error}
/>
{preview ? (
) : (
)
}
function MarkdownToolbar({
preview,
onTogglePreview,
onFileSelected,
uploading,
error,
}: {
preview: boolean
onTogglePreview: () => void
onFileSelected: (file: File) => void
uploading: boolean
error: string | null
}) {
return (
{uploading && Upload en cours...}
{error && {error}}
)
}
function MarkdownPreview({ value }: { value: string }) {
return {value}
}
async function handleUpload(
file: File,
handlers: {
setError: (error: string | null) => void
setUploading: (uploading: boolean) => void
onMediaAdd?: (media: MediaRef) => void
onBannerChange?: (url: string) => void
}
) {
handlers.setError(null)
handlers.setUploading(true)
try {
const media = await uploadNip95Media(file)
handlers.onMediaAdd?.(media)
if (media.type === 'image') {
handlers.onBannerChange?.(media.url)
}
} catch (e) {
handlers.setError(e instanceof Error ? e.message : 'Upload failed')
} finally {
handlers.setUploading(false)
}
}