@@ -0,0 +1,75 @@
|
||||
import { create } from "zustand";
|
||||
|
||||
export interface TerminalJob {
|
||||
id: number;
|
||||
scriptPath: string;
|
||||
command: string[];
|
||||
status: number | null;
|
||||
stdout: string;
|
||||
stderr: string;
|
||||
stdin: string;
|
||||
isRunning: boolean;
|
||||
}
|
||||
|
||||
interface TerminalState {
|
||||
jobs: TerminalJob[];
|
||||
isOpen: boolean;
|
||||
activeJobId: number | null;
|
||||
|
||||
openTerminal: () => void;
|
||||
closeTerminal: () => void;
|
||||
addJob: (job: Omit<TerminalJob, "status" | "stdout" | "stderr" | "isRunning">) => void;
|
||||
updateJob: (id: number, updates: Partial<TerminalJob>) => void;
|
||||
setActiveJob: (id: number | null) => void;
|
||||
clearJobs: () => void;
|
||||
removeJob: (id: number) => void;
|
||||
}
|
||||
|
||||
export const useTerminalStore = create<TerminalState>((set) => ({
|
||||
jobs: [],
|
||||
isOpen: false,
|
||||
activeJobId: null,
|
||||
|
||||
openTerminal: () => set({ isOpen: true }),
|
||||
|
||||
closeTerminal: () => set({ isOpen: false }),
|
||||
|
||||
addJob: (job) =>
|
||||
set((state) => ({
|
||||
jobs: [
|
||||
...state.jobs,
|
||||
{
|
||||
...job,
|
||||
status: null,
|
||||
stdout: "",
|
||||
stderr: "",
|
||||
stdin: "",
|
||||
isRunning: true,
|
||||
},
|
||||
],
|
||||
activeJobId: job.id,
|
||||
})),
|
||||
|
||||
updateJob: (id, updates) =>
|
||||
set((state) => ({
|
||||
jobs: state.jobs.map((j) => (j.id === id ? { ...j, ...updates } : j)),
|
||||
})),
|
||||
|
||||
setActiveJob: (id) => set({ activeJobId: id }),
|
||||
|
||||
clearJobs: () => set({ jobs: [], activeJobId: null }),
|
||||
|
||||
removeJob: (id) =>
|
||||
set((state) => {
|
||||
const newJobs = state.jobs.filter((j) => j.id !== id);
|
||||
return {
|
||||
jobs: newJobs,
|
||||
activeJobId:
|
||||
state.activeJobId === id
|
||||
? newJobs.length > 0
|
||||
? newJobs[newJobs.length - 1].id
|
||||
: null
|
||||
: state.activeJobId,
|
||||
};
|
||||
}),
|
||||
}));
|
||||
Reference in New Issue
Block a user