feat: request for tree

This commit is contained in:
nikita
2026-04-05 00:56:48 +03:00
parent 6b82c99d50
commit 07066ec8c0
5 changed files with 359 additions and 162 deletions
+46 -6
View File
@@ -58,19 +58,39 @@ export const IDE: React.FC<IDEProps> = ({
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);
// Инициализация файлов
// Обработка 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) {
const filesToInit = externalFiles || defaultInitialFiles;
initialize(filesToInit);
fetchTree().catch(() => {
// Только при ошибке — используем моковые данные
const state = useIDEStore.getState();
if (!state.files) {
const filesToInit = externalFiles || defaultInitialFiles;
initialize(filesToInit);
}
});
}
}, [isInitialized, externalFiles, initialize]);
}, [isInitialized]);
// Если проект не открыт
if (!files) {
@@ -249,10 +269,30 @@ export const IDE: React.FC<IDEProps> = ({
)}
{!onBack && <div />}
<span style={{ fontWeight: 400 }}>
{activeFile ? `${activeFile.name} - ` : ""}
{activeFile
? `${activeFile.name}${activeFile.dirty ? " •" : ""} - `
: ""}
{files.name}
</span>
<div style={{ width: 60 }} />
<div style={{ display: "flex", alignItems: "center", gap: "8px" }}>
{activeFile?.dirty && (
<button
onClick={saveActiveFile}
style={{
background: "transparent",
border: "none",
color: c.textPrimary,
cursor: "pointer",
fontSize: "11px",
padding: "4px 8px",
borderRadius: "4px",
}}
title="Сохранить (Ctrl+S)"
>
Сохранить
</button>
)}
</div>
</div>
<div style={{ display: "flex", flex: 1, overflow: "hidden" }}>
<div style={{ width: "260px", flexShrink: 0 }}>