generated from pengx17/logseq-plugin-template-react
-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
useAppState.tsx
69 lines (61 loc) · 1.94 KB
/
useAppState.tsx
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
import { AppUserConfigs } from '@logseq/libs/dist/LSPlugin.user';
import React, { useCallback, useContext, useMemo } from 'react';
import { TaskEntityObject } from '../models/TaskEntity';
import getAnytimeTaskQuery from '../querys/anytime';
import getScheduledTaskQuery from '../querys/scheduled';
import getTodayTaskQuery from '../querys/today';
import useTaskQuery from './useTaskQuery';
import useUserConfigs, { DEFAULT_USER_CONFIGS } from './useUserConfigs';
export interface IAppState {
userConfigs: AppUserConfigs,
tasks: {
today: TaskEntityObject[],
scheduled: TaskEntityObject[],
anytime: TaskEntityObject[],
},
refresh(): void,
}
const AppStateContext = React.createContext<IAppState>({
userConfigs: DEFAULT_USER_CONFIGS,
tasks: {
today: [],
scheduled: [],
anytime: [],
},
refresh: () => {},
});
const useAppState = () => {
const appState = useContext(AppStateContext);
return appState;
};
export const withAppState = <P extends {}>(
WrapComponent: React.ComponentType<P>,
) => {
const WithAppState: typeof WrapComponent = (props) => {
const userConfigs = useUserConfigs();
const todayTask = useTaskQuery(getTodayTaskQuery());
const scheduledTask = useTaskQuery(getScheduledTaskQuery());
const anytimeTask = useTaskQuery(getAnytimeTaskQuery());
const refresh = useCallback(() => {
todayTask.mutate();
scheduledTask.mutate();
anytimeTask.mutate();
}, [todayTask, scheduledTask, anytimeTask]);
const state = useMemo(() => ({
userConfigs,
tasks: {
today: todayTask.data || [],
scheduled: scheduledTask.data || [],
anytime: anytimeTask.data || [],
},
refresh,
}), [userConfigs, todayTask, scheduledTask, anytimeTask, refresh]);
return (
<AppStateContext.Provider value={state}>
<WrapComponent {...props} />
</AppStateContext.Provider>
);
};
return WithAppState;
};
export default useAppState;