• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import { Message } from '../worker/AsyncManager';
2import { AsyncManager } from '../worker/AsyncManager';
3import { EventBusManager } from '../worker/eventbus/EventBusManager';
4import { Log } from '../utils/Log';
5import { applyMiddleware, combineReducers, createStore } from '../redux/core/ohredux/index';
6import { logger } from './middlewares/logger';
7import { reduxWorkerMiddle } from './middlewares/ReduxWorkerMiddle';
8import type { CameraInitState } from './reducers/CameraInitReducer';
9import CameraInitReducer from './reducers/CameraInitReducer';
10import type { ContextState } from './reducers/ContextReducer';
11import ContextReducer from './reducers/ContextReducer';
12import type { CameraState } from './reducers/CameraReducer';
13import CameraReducer from './reducers/CameraReducer';
14import type { PreviewState } from './reducers/PreviewReducer';
15import PreviewReducer from './reducers/PreviewReducer';
16import type { CaptureState } from './reducers/CaptureReducer';
17import CaptureReducer from './reducers/CaptureReducer';
18import type { ModeChangeState } from './reducers/ModeChangeReducer';
19import ModeChangeReducer from './reducers/ModeChangeReducer';
20import type { ModeState } from './reducers/ModeReducer';
21import ModeReducer from './reducers/ModeReducer';
22import type { SettingState } from './reducers/SettingReducer';
23import SettingReducer from './reducers/SettingReducer';
24import type { RecordState } from './reducers/RecordReducer';
25import RecordReducer from './reducers/RecordReducer';
26import type { ZoomState } from './reducers/ZoomReducer';
27import ZoomReducer from './reducers/ZoomReducer';
28import type { ActionData } from './actions/Action';
29import type { CombinedState, Dispatch } from './core/redux';
30import type { MapDispatchProp, MapStateProp } from './core/ohredux/connect';
31
32const TAG = '[store]:';
33const STORE_KEY = 'CAMERA_REDUX_STORE';
34
35export type OhCombinedState = CombinedState<{
36  CameraInitReducer: CameraInitState;
37  ContextReducer: ContextState;
38  CameraReducer: CameraState;
39  PreviewReducer: PreviewState;
40  CaptureReducer: CaptureState;
41  RecordReducer: RecordState;
42  ModeChangeReducer: ModeChangeState;
43  ModeReducer: ModeState
44  SettingReducer: SettingState
45  ZoomReducer: ZoomState
46}>
47
48export interface Unsubscribe {
49  destroy(): void
50}
51
52export type StoreStruct = {
53  getState: () => OhCombinedState,
54  dispatch: Dispatch<ActionData>,
55  subscribe: (mapToProps: MapStateProp | null, mapToDispatch: MapDispatchProp | null) => Unsubscribe | null,
56  connect: (mapStateProp: MapStateProp, mapDispatchProp: MapDispatchProp) => (target: any) => void
57};
58
59export function getStore(): StoreStruct {
60  Log.info(`${TAG} store init.`)
61  if (!AppStorage.Has(STORE_KEY)) {
62    const store = createStore(
63    combineReducers({
64      CameraInitReducer,
65      ContextReducer,
66      CameraReducer,
67      PreviewReducer,
68      CaptureReducer,
69      RecordReducer,
70      ModeChangeReducer,
71      ModeReducer,
72      SettingReducer,
73      ZoomReducer,
74    }),
75    applyMiddleware(logger, reduxWorkerMiddle)
76    )
77    AppStorage.SetOrCreate(STORE_KEY, store)
78    AsyncManager.getInstance().onMessage = (msg: Message) => {
79      const action = { type: '', data: undefined, tag: 'FROM_WORKER' }
80      Log.info(`${TAG} store dispatch msg: ${JSON.stringify(msg)}`)
81      action.type = msg.type
82      action.data = msg.data
83      store.dispatch(action)
84      EventBusManager.getInstance().getEventBus().emit(msg.type, [msg.data])
85    }
86
87  }
88  return AppStorage.Get(STORE_KEY);
89}