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}