Files
HellreigN/frontend/src/modules/terminal/store/useTerminalStore.ts
T
nikita 2bc3da21fd
ci-front / build (push) Successful in 2m19s
feat: launch scripts
2026-04-05 06:54:33 +03:00

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,
};
}),
}));