From f323fe57065021d8685e9453c4748152b31d8928 Mon Sep 17 00:00:00 2001 From: chyoo Date: Wed, 8 Jul 2026 13:55:26 +0900 Subject: [PATCH] change module delete logic... --- src/renderer/src/App.tsx | 21 ++++++++++++-- .../workspace/ModuleDeleteConfirm.tsx | 28 +++++++++++++++++-- .../src/features/workspace/ModuleListView.tsx | 6 ++-- 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 4d9b872..4237430 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -1486,10 +1486,25 @@ function LocalPcWorkspaceMockup({ prepareRemoteRuntimeModule, onTitlebarNotice }) - const deleteModule = async (module: ModuleRow): Promise => { + const deleteModule = async (module: ModuleRow, options: { deleteRepository?: boolean } = {}): Promise => { setModuleInstallError(null) try { await window.localWorkspace.moduleFiles.delete(module.name, `modules/${module.name}`, clonePathPreview, module.folderName) + if (options.deleteRepository) { + const response = await fetchWithFreshAuth(`${LMS_API_BASE_URL}/studio/repositories`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + courseId: courseKey, + week: weekNumber, + moduleName: module.name, + folderName: module.folderName + }) + }) + if (!response.ok) throw new Error(await response.text()) + } setModuleTabs((tabs) => tabs.filter((tab) => tab.name !== module.name)) if (selectedModule?.name === module.name) { setSelectedModule(null) @@ -1523,7 +1538,7 @@ function LocalPcWorkspaceMockup({ return nextRoots }) await loadAvailableModules() - onTitlebarNotice(`[${module.name}] 삭제되었습니다`, 'info') + onTitlebarNotice(options.deleteRepository ? `[${module.name}] 모듈과 저장소가 삭제되었습니다` : `[${module.name}] 삭제되었습니다`, 'info') } catch (error) { console.error('[modules] delete failed', error) setModuleInstallError(error instanceof Error ? error.message : '모듈 삭제 실패') @@ -2603,7 +2618,7 @@ function LocalPcWorkspaceMockup({ onAddModuleTab={addModuleTabOnly} onOpenSource={openModuleSource} onInstallModule={(module) => void installModule(module)} - onDeleteModule={(module) => void deleteModule(module)} + onDeleteModule={(module, options) => void deleteModule(module, options)} onUpdateModuleParameters={(module, rosParams) => void updateModuleParameters(module, rosParams)} onStartModule={(module) => void runModuleControl(module, 'start')} onStopModule={(module) => void runModuleControl(module, 'stop')} diff --git a/src/renderer/src/features/workspace/ModuleDeleteConfirm.tsx b/src/renderer/src/features/workspace/ModuleDeleteConfirm.tsx index 693b7a2..767f4d2 100644 --- a/src/renderer/src/features/workspace/ModuleDeleteConfirm.tsx +++ b/src/renderer/src/features/workspace/ModuleDeleteConfirm.tsx @@ -1,4 +1,5 @@ import { Trash2 } from 'lucide-react' +import { useState } from 'react' import type React from 'react' type DeletableModule = { @@ -9,7 +10,7 @@ type ModuleDeleteConfirmProps = { dark: boolean module: Module onCancel: () => void - onConfirm: (module: Module) => void + onConfirm: (module: Module, options: { deleteRepository: boolean }) => void } export default function ModuleDeleteConfirm({ @@ -18,6 +19,8 @@ export default function ModuleDeleteConfirm({ onCancel, onConfirm }: ModuleDeleteConfirmProps): React.JSX.Element { + const [deleteRepository, setDeleteRepository] = useState(false) + return (
({

워크스페이스에 설치된 모듈 폴더가 삭제됩니다.

+