-
Notifications
You must be signed in to change notification settings - Fork 44
Expand file tree
/
Copy pathContextStore.tsx
More file actions
125 lines (106 loc) · 2.51 KB
/
ContextStore.tsx
File metadata and controls
125 lines (106 loc) · 2.51 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
119
120
121
122
123
124
125
import type { FC, ReactNode } from 'react';
import {
createContext,
useCallback,
useContext,
useMemo,
useReducer,
} from 'react';
import type { Action, State } from './store.reducer';
import { initialState, storeReducer } from './store.reducer';
interface Context {
state: State;
dispatch: (action: Action) => void;
}
export const ContextStore = createContext<Context>({
state: initialState,
// eslint-disable-next-line @typescript-eslint/no-empty-function
dispatch() {},
});
export const ContextStoreProvider: FC<{ readonly children: ReactNode }> = ({
children,
}) => {
const [state, dispatch] = useReducer(storeReducer, {
...initialState,
});
const contextValue = useMemo(() => {
return { state, dispatch };
}, [state, dispatch]);
return (
<ContextStore.Provider value={contextValue}>
{children}
</ContextStore.Provider>
);
};
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/explicit-function-return-type
export const useProjectsStore = () => {
const {
state: { projects },
dispatch,
} = useContext(ContextStore);
return {
projects,
dispatch,
};
};
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/explicit-function-return-type
export const useProjectStore = (projectPath: string) => {
const { projects, dispatch } = useProjectsStore();
return {
project: projects.find((project) => project.path === projectPath),
dispatch,
};
};
let id = 0;
export const useProjectsJobs = (projectPath: string) => {
const { dispatch } = useProjectStore(projectPath);
const startJob = useCallback(
(description) => {
id += 1;
dispatch({
action: 'jobStarted',
projectPath,
description,
jobId: id,
});
return id;
},
[dispatch, projectPath],
);
const successJob = useCallback(
(jobId: number) => {
dispatch({
action: 'jobSuccess',
projectPath,
jobId,
});
},
[dispatch, projectPath],
);
const failedJob = useCallback(
(jobId: number) => {
dispatch({
action: 'jobSuccess',
projectPath,
jobId,
});
},
[dispatch, projectPath],
);
const removeJob = useCallback(
(jobId: number) => {
dispatch({
action: 'jobRemove',
jobId,
projectPath,
});
},
[dispatch, projectPath],
);
return {
startJob,
successJob,
failedJob,
removeJob,
};
};