import React, { useEffect } from "react"; import { MdAdd, MdArrowBack } from "react-icons/md"; import { GoTrash } from "react-icons/go"; import { useIDEStore, initialFiles as defaultInitialFiles, } from "./store/useIDEStore"; import type { FileNode } from "./types"; import { FileExplorer, TabBar, CodeEditor, TitleBar, StatusBar, } from "./components"; import { useThemeStore } from "@/modules/theme-bw/stores/theme.store"; interface IDEProps { initialFiles?: FileNode; onBack?: () => void; } const darkColors = { bg: "#1e1e1e", bgSecondary: "#252526", bgTertiary: "#2d2d30", border: "#3e3e42", textPrimary: "#cccccc", textSecondary: "#858585", accent: "#0e639c", accentHover: "#1177bb", statusBar: "#007acc", }; const lightColors = { bg: "#ffffff", bgSecondary: "#f3f3f3", bgTertiary: "#e8e8e8", border: "#e0e0e0", textPrimary: "#333333", textSecondary: "#616161", accent: "#0e639c", accentHover: "#1177bb", statusBar: "#007acc", }; export const IDE: React.FC = ({ initialFiles: externalFiles, onBack, }: IDEProps = {}) => { const theme = useThemeStore((s) => s.theme); const isDark = theme === "dark"; const c = isDark ? darkColors : lightColors; const files = useIDEStore((state) => state.files); const openFiles = useIDEStore((state) => state.openFiles); const activeFile = useIDEStore((state) => state.activeFile); const createNewProject = useIDEStore((state) => state.createNewProject); const selectFile = useIDEStore((state) => state.selectFile); const updateFileContent = useIDEStore((state) => state.updateFileContent); const saveActiveFile = useIDEStore((state) => state.saveActiveFile); const closeFile = useIDEStore((state) => state.closeFile); const closeAllFiles = useIDEStore((state) => state.closeAllFiles); const closeOtherFiles = useIDEStore((state) => state.closeOtherFiles); const initialize = useIDEStore((state) => state.initialize); const isInitialized = useIDEStore((state) => state.isInitialized); const fetchTree = useIDEStore((state) => state.fetchTree); const fetchInterpreters = useIDEStore((state) => state.fetchInterpreters); // Загружаем интерпретаторы при инициализации useEffect(() => { fetchInterpreters(); }, []); // Обработка Ctrl+S useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if ((e.ctrlKey || e.metaKey) && e.key === "s") { e.preventDefault(); saveActiveFile(); } }; window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, [saveActiveFile]); // При загрузке пробуем загрузить дерево с сервера useEffect(() => { if (!isInitialized) { fetchTree().catch(() => { // Только при ошибке — используем моковые данные const state = useIDEStore.getState(); if (!state.files) { const filesToInit = externalFiles || defaultInitialFiles; initialize(filesToInit); } }); } }, [isInitialized]); // Если проект не открыт if (!files) { return (
{onBack && ( )}
No project open
Create a new project to get started
); } return (
{onBack && ( )} {!onBack &&
} {activeFile ? `${activeFile.name}${activeFile.dirty ? " •" : ""} - ` : ""} {files.name}
{activeFile?.dirty && ( )}
); }; export default IDE;