56 lines
1.8 KiB
TypeScript
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),
|
|
}));
|
|
},
|
|
}));
|