aethex-studio/store/editor-zustand.ts

56 lines
1.8 KiB
TypeScript

import { create } from 'zustand';
export interface FileTab {
id: string;
name: string;
content: string;
}
interface EditorState {
openTabs: FileTab[];
activeTabId: string | null;
files: FileTab[];
openFile: (file: FileTab) => void;
closeTab: (id: string) => void;
setActiveTab: (id: string) => void;
setFiles: (files: FileTab[]) => void;
updateFileContent: (id: string, content: string) => void;
}
export const useEditorStore = create<EditorState>((set: any, get: any) => ({
openTabs: [],
activeTabId: null,
files: [
{ id: '1', name: 'main.lua', content: '-- Main Lua file\nprint("Hello, AeThex!")' },
{ id: '2', name: 'utils.lua', content: '-- Utility functions\nfunction greet(name)\n print("Hello, " .. name)\nend' },
],
openFile: (file: FileTab) => {
const { openTabs } = get();
if (!openTabs.find((f: FileTab) => f.id === file.id)) {
set((state: EditorState) => ({
openTabs: [...state.openTabs, file],
activeTabId: file.id,
}));
} else {
set({ activeTabId: file.id });
}
},
closeTab: (id: string) => {
set((state: EditorState) => {
const newTabs = state.openTabs.filter((f: FileTab) => f.id !== id);
let newActive = state.activeTabId;
if (state.activeTabId === id) {
newActive = newTabs.length > 0 ? newTabs[newTabs.length - 1].id : null;
}
return { openTabs: newTabs, activeTabId: newActive };
});
},
setActiveTab: (id: string) => set({ activeTabId: id }),
setFiles: (files: FileTab[]) => set({ files }),
updateFileContent: (id: string, content: string) => {
set((state: EditorState) => ({
files: state.files.map((f: FileTab) => f.id === id ? { ...f, content } : f),
openTabs: state.openTabs.map((f: FileTab) => f.id === id ? { ...f, content } : f),
}));
},
}));