"use client"; import React, { useEffect, useState } from "react"; import { AdminHeader, AlertBanner, Modal, ConfirmDeleteModal, getClientToken } from "../_components/AdminComponents"; import { adminGetResearchAreas, adminCreateResearchArea, adminUpdateResearchArea, adminDeleteResearchArea, AdminResearchArea, } from "../../../lib/adminApi"; export default function AdminResearchAreasPage() { const [areas, setAreas] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [successMsg, setSuccessMsg] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [editingArea, setEditingArea] = useState(null); const [formData, setFormData] = useState({ name_en: "", name_kr: "", display_order: 0, }); const [isSubmitting, setIsSubmitting] = useState(false); const [deletingId, setDeletingId] = useState(null); const loadAreas = async () => { try { setIsLoading(true); setError(null); const data = await adminGetResearchAreas(); setAreas(data); } catch (err: any) { setError(err?.message || "Failed to load research areas."); } finally { setIsLoading(false); } }; useEffect(() => { loadAreas(); }, []); const handleOpenCreate = () => { setEditingArea(null); setFormData({ name_en: "", name_kr: "", display_order: areas.length + 1, }); setIsModalOpen(true); }; const handleOpenEdit = (a: AdminResearchArea) => { setEditingArea(a); setFormData({ name_en: a.name_en, name_kr: a.name_kr || "", display_order: a.display_order, }); setIsModalOpen(true); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const token = getClientToken(); if (!token) { setError("Unauthorized. Please log in."); return; } const payload = { name_en: formData.name_en.trim(), name_kr: formData.name_kr.trim() || undefined, display_order: Number(formData.display_order) || 0, }; setIsSubmitting(true); setError(null); try { if (editingArea) { await adminUpdateResearchArea(token, editingArea.id, payload); setSuccessMsg(`Research Area "${payload.name_en}" updated successfully.`); } else { await adminCreateResearchArea(token, payload); setSuccessMsg(`Research Area "${payload.name_en}" created successfully.`); } setIsModalOpen(false); await loadAreas(); } catch (err: any) { setError(err?.message || "Failed to save research area."); } finally { setIsSubmitting(false); } }; const handleConfirmDelete = async () => { if (!deletingId) return; const token = getClientToken(); if (!token) { setError("Unauthorized. Please log in."); return; } setIsSubmitting(true); try { await adminDeleteResearchArea(token, deletingId); setSuccessMsg("Research Area deleted successfully."); setDeletingId(null); await loadAreas(); } catch (err: any) { setError(err?.message || "Failed to delete research area."); } finally { setIsSubmitting(false); } }; return (
+ Add New Area } /> {error && setError(null)} />} {successMsg && setSuccessMsg(null)} />} {isLoading ? (
Loading research areas...
) : (
{areas.length === 0 ? ( ) : ( areas.map((a) => ( )) )}
Order English Name Korean Name Actions
No research areas found.
{a.display_order} {a.name_en} {a.name_kr || "—"}
)} {/* Modal */} setIsModalOpen(false)} >
setFormData({ ...formData, name_en: e.target.value })} placeholder="e.g. Optical Wireless Communications" required className="w-full px-3 py-2 text-sm border border-line rounded bg-ivory text-ink focus:outline-none focus:ring-1 focus:ring-cobalt" />
setFormData({ ...formData, name_kr: e.target.value })} placeholder="e.g. 광무선 통신" className="w-full px-3 py-2 text-sm border border-line rounded bg-ivory text-ink focus:outline-none focus:ring-1 focus:ring-cobalt" />
setFormData({ ...formData, display_order: Number(e.target.value) })} className="w-full px-3 py-2 text-sm border border-line rounded bg-ivory text-ink focus:outline-none focus:ring-1 focus:ring-cobalt" />
setDeletingId(null)} onConfirm={handleConfirmDelete} isSubmitting={isSubmitting} title="Delete Research Area" description="Are you sure you want to delete this research area keyword?" />
); }