import React, { useEffect, useState } from "react"; import { Alert, Box, Button, Chip, MenuItem, Paper, Stack, TextField, Typography } from "@mui/material"; import DeleteOutlineIcon from "@mui/icons-material/DeleteOutline"; import { api, getApiErrorMessage } from "../../api"; import { useConfirm } from "../../confirm"; import { useI18n } from "../../i18n/I18nProvider"; type Evidence = { id: number; category: string; title: string; statement: string; tags: string[]; sourceReference: string | null }; export default function CareerEvidenceBank() { const { t } = useI18n(); const { confirm } = useConfirm(); const [items, setItems] = useState([]); const [title, setTitle] = useState(""); const [statement, setStatement] = useState(""); const [category, setCategory] = useState("achievement"); const [tags, setTags] = useState(""); const [source, setSource] = useState(""); const [error, setError] = useState(null); const [busy, setBusy] = useState(false); const load = () => api.get("/career/evidence").then(r => { setItems(r.data); setError(null); }).catch(e => setError(getApiErrorMessage(e, t("careerEvidenceLoadFailed")))); useEffect(() => { void load(); }, []); // eslint-disable-line react-hooks/exhaustive-deps const add = async () => { setBusy(true); try { const r = await api.post("/career/evidence", { category, title, statement, tags: tags.split(","), sourceType: "manual", sourceReference: source, isVerified: true }); setItems(v => [r.data, ...v]); setTitle(""); setStatement(""); setTags(""); setSource(""); setError(null); } catch (e) { setError(getApiErrorMessage(e, t("careerEvidenceSaveFailed"))); } finally { setBusy(false); } }; const remove = async (item: Evidence) => { if (!(await confirm({ title: t("careerEvidenceDeleteTitle"), message: t("careerEvidenceDeleteMessage", { title: item.title }), confirmLabel: t("deleteAction"), destructive: true }))) return; try { await api.delete(`/career/evidence/${item.id}`); setItems(v => v.filter(x => x.id !== item.id)); } catch (e) { setError(getApiErrorMessage(e, t("careerEvidenceDeleteFailed"))); } }; const categories = ["achievement", "metric", "project", "technology", "responsibility", "example"]; const categoryLabel = (value: string) => t(`careerEvidenceCategory_${value}` as "careerEvidenceCategory_achievement"); return {t("careerEvidenceTitle")}{t("careerEvidenceSubtitle")} {error && void load()}>{t("retry")}}>{error}} {t("careerEvidenceAdd")} setCategory(e.target.value)}>{categories.map(v => {categoryLabel(v)})} setTitle(e.target.value)} /> setStatement(e.target.value)} multiline minRows={3} helperText={t("careerEvidenceTruthHelp")} /> setTags(e.target.value)} helperText={t("careerEvidenceTagsHelp")} /> setSource(e.target.value)} helperText={t("careerEvidenceSourceHelp")} /> {items.length === 0 ? {t("careerEvidenceEmpty")} : items.map(item => {item.title}{categoryLabel(item.category)} ยท {item.sourceReference || t("careerEvidenceManualSource")} {item.statement}{item.tags.map(tag => )} )} ; }