import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import { api, downloadWithAuth } from '../api' import ConfirmDialog from '../components/ConfirmDialog' import { useAuth } from '../context/AuthContext' import { useI18n } from '../context/I18nContext' import type { TemplateListItem } from '../types' export default function TemplatesPage() { const { user } = useAuth() const { t, formatDate } = useI18n() const [templates, setTemplates] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [deleteTarget, setDeleteTarget] = useState(null) const load = async () => { try { setTemplates(await api.listTemplates()) } catch (err) { setError(err instanceof Error ? err.message : t('errors.loadTemplatesFailed')) } finally { setLoading(false) } } useEffect(() => { load() }, []) const handleDelete = async () => { if (!deleteTarget) return try { await api.deleteTemplate(deleteTarget.id) setTemplates((list) => list.filter((x) => x.id !== deleteTarget.id)) setDeleteTarget(null) } catch (err) { alert(err instanceof Error ? err.message : t('errors.deleteFailed')) } } const handleTogglePublic = async (item: TemplateListItem) => { try { const updated = await api.updateTemplate(item.id, { is_public: !item.is_public }) setTemplates((list) => list.map((x) => x.id === item.id ? { ...x, is_public: updated.is_public } : x, ), ) } catch (err) { alert(err instanceof Error ? err.message : t('errors.updateFailed')) } } const handleDownloadSource = async (item: TemplateListItem) => { try { await downloadWithAuth(api.getTemplateSourceUrl(item.id), item.original_filename) } catch (err) { alert(err instanceof Error ? err.message : t('errors.downloadFailed')) } } const canManage = (item: TemplateListItem) => item.is_owner || user?.role === 'admin' return (
void handleDelete()} onCancel={() => setDeleteTarget(null)} />

{t('templates.title')}

{t('templates.upload')}
{error &&
{error}
} {loading ? (

{t('common.loading')}

) : templates.length === 0 ? (

{t('templates.empty')}

{t('templates.uploadShort')}
) : (
{templates.map((item) => ( ))}
{t('common.name')} {t('common.file')} {t('common.owner')} {t('templates.visibility')} {t('templates.variables')} {t('common.created')} {t('common.actions')}
{item.name} {item.description && (
{item.description}
)}
{item.original_filename} {item.owner_username ?? `#${item.owner_id}`} {item.is_public ? ( {t('visibility.public')} ) : ( {t('visibility.private')} )} {item.variable_count} {formatDate(item.created_at)} {t('templates.fill')} {t('common.view')} {canManage(item) && ( <> )}
)}
) }