76 lines
1.7 KiB
TypeScript
76 lines
1.7 KiB
TypeScript
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,
|
|
};
|
|
}),
|
|
}));
|