-
Notifications
You must be signed in to change notification settings - Fork 145
Expand file tree
/
Copy pathtests.ts
More file actions
118 lines (99 loc) · 3.02 KB
/
Copy pathtests.ts
File metadata and controls
118 lines (99 loc) · 3.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import { useCallback, useEffect, useRef, useState } from 'react';
import { v4 as uuidv4 } from 'uuid';
import type { LaboratoryOperation } from './operations';
export interface LaboratoryTestTaskBase {
id: string;
next: string | null;
}
export interface LaboratoryTestTaskOperation extends LaboratoryTestTaskBase {
type: 'operation';
data: Pick<LaboratoryOperation, 'id'>;
}
export interface LaboratoryTestTaskUtlity extends LaboratoryTestTaskBase {
type: 'utility';
data: unknown;
}
export type LaboratoryTestTask = LaboratoryTestTaskOperation | LaboratoryTestTaskUtlity;
export interface LaboratoryTest {
id: string;
name: string;
description?: string;
createdAt: string;
tasks: LaboratoryTestTask[];
}
export interface LaboratoryTestState {
tests: LaboratoryTest[];
}
export interface LaboratoryTestActions {
addTest: (test: Omit<LaboratoryTest, 'id' | 'createdAt' | 'tasks'>) => LaboratoryTest;
addTaskToTest: (testId: string, task: Pick<LaboratoryTestTask, 'type' | 'data'>) => void;
deleteTaskFromTest: (testId: string, taskId: string) => void;
deleteTest: (testId: string) => void;
}
export const useTests = (props: {
defaultTests?: LaboratoryTest[];
onTestsChange?: (test: LaboratoryTest[]) => void;
}): LaboratoryTestState & LaboratoryTestActions => {
const [tests, setTests] = useState<LaboratoryTest[]>(props.defaultTests ?? []);
const testRef = useRef<LaboratoryTest[]>(tests);
useEffect(() => {
testRef.current = tests;
}, [tests]);
const addTest = useCallback(
(item: Omit<LaboratoryTest, 'id' | 'createdAt' | 'tasks'>) => {
const newItem: LaboratoryTest = {
...item,
id: uuidv4(),
createdAt: new Date().toISOString(),
tasks: [],
} as LaboratoryTest;
const newTest = [...tests, newItem];
setTests(newTest);
props.onTestsChange?.(newTest);
return newItem;
},
[tests, props],
);
const deleteTest = useCallback(
(testId: string) => {
const newTest = testRef.current.filter(item => item.id !== testId);
setTests(newTest);
props.onTestsChange?.(newTest);
},
[props],
);
const addTaskToTest = useCallback(
(testId: string, task: Pick<LaboratoryTestTask, 'type' | 'data'>) => {
const newTask: LaboratoryTestTask = {
...task,
id: uuidv4(),
next: null,
} as LaboratoryTestTask;
const newTest = testRef.current.map(item =>
item.id === testId ? { ...item, tasks: [...item.tasks, newTask] } : item,
);
setTests(newTest);
props.onTestsChange?.(newTest);
},
[props],
);
const deleteTaskFromTest = useCallback(
(testId: string, taskId: string) => {
const newTest = testRef.current.map(item =>
item.id === testId
? { ...item, tasks: item.tasks.filter(task => task.id !== taskId) }
: item,
);
setTests(newTest);
props.onTestsChange?.(newTest);
},
[props],
);
return {
tests,
addTest,
deleteTest,
addTaskToTest,
deleteTaskFromTest,
};
};