// src/renderer/pages/CommandsPage.tsx // 인스트루먼트 미학: MetalCard + PhosphorText + Led import { useState, useEffect, useCallback } from 'react' import { Box, Button, IconButton, Dialog, DialogTitle, DialogContent, DialogActions, TextField } from '@mui/material' import AddIcon from '@mui/icons-material/Add' import DeleteIcon from '@mui/icons-material/Delete' import EditIcon from '@mui/icons-material/Edit' import { MetalCard, PhosphorText, Led } from '../components/ds' import type { IPCResult } from '@shared/errors' interface CustomInstruction { id: string; name: string; description: string; prompt: string; icon: string; isBuiltin: boolean; order: number } export function CommandsPage(): React.ReactElement { const [instructions, setInstructions] = useState([]) const [loading, setLoading] = useState(true) const [dialogOpen, setDialogOpen] = useState(false) const [editId, setEditId] = useState(null) const [formName, setFormName] = useState('') const [formDesc, setFormDesc] = useState('') const [formPrompt, setFormPrompt] = useState('') const loadData = useCallback(async () => { setLoading(true) try { const ipcResult = await (window.electronAPI as Record & { invoke: (channel: string, ...args: unknown[]) => Promise> }).invoke?.('instruction:getAll') as unknown as IPCResult | undefined if (ipcResult && ipcResult.success) setInstructions(ipcResult.data) } catch { /* noop */ } setLoading(false) }, []) useEffect(() => { loadData() }, [loadData]) const openAdd = () => { setEditId(null); setFormName(''); setFormDesc(''); setFormPrompt(''); setDialogOpen(true) } const openEdit = (inst: CustomInstruction) => { setEditId(inst.id); setFormName(inst.name); setFormDesc(inst.description); setFormPrompt(inst.prompt); setDialogOpen(true) } const handleSave = async () => { setDialogOpen(false); loadData() } return ( LLM INSTRUCTIONS — {instructions.length} COMMANDS {loading ? ( LOADING... ) : instructions.length === 0 ? ( BUILT-IN: TRANSLATE, SUMMARIZE, FORMAL, CODE, FREE ) : ( {instructions.map((inst) => ( {inst.name} {inst.description} openEdit(inst)} sx={{ color: '#77797c', '&:hover': { color: '#f25b29' } }}> {!inst.isBuiltin && ( )} ))} )} setDialogOpen(false)} maxWidth="sm" fullWidth> {editId ? 'Edit Command' : 'Add Command'} setFormName(e.target.value)} fullWidth autoFocus sx={{ mt: 1 }} /> setFormDesc(e.target.value)} fullWidth sx={{ mt: 2 }} /> setFormPrompt(e.target.value)} fullWidth multiline rows={4} sx={{ mt: 2 }} helperText="Use {{text}} for transcribed text" /> ) }