import 'package:meta/meta.dart'; import 'package:redux/redux.dart'; import 'package:redux_persist_flutter/redux_persist_flutter.dart'; import 'package:redux_thunk/redux_thunk.dart'; import 'package:redux_persist/redux_persist.dart'; import 'package:satu/core/redux/actions/journal_actions.dart'; import 'package:satu/core/redux/actions/nav_actions.dart'; import 'package:satu/core/redux/actions/sell_actions.dart'; import 'package:satu/core/redux/reducers/journal_reducer.dart'; import 'package:satu/core/redux/reducers/nav_reducer.dart'; import 'package:satu/core/redux/reducers/sell_reducer.dart'; import 'package:satu/core/redux/reducers/user_reducer.dart'; import 'package:satu/core/redux/state/journal_state.dart'; import 'package:satu/core/redux/state/nav_state.dart'; import 'package:satu/core/redux/state/sell_state.dart'; import 'package:satu/core/redux/state/user_state.dart'; import 'actions/user_actions.dart'; //reducer context AppState appReducer(AppState state, dynamic action) { if (action is SetUserStateAction) { /** UserAction **/ final UserState nextState = userReducer(state.userState!, action); return state.copyWith(userState: nextState); } else if (action is SetNavStateAction) { /** NavAction **/ final NavState nextState = navReducer(state.navState!, action); return state.copyWith(navState: nextState); } else if (action is SetSellStateAction) { /** NavAction **/ final SellState nextState = sellReducer(state.sellState!, action); return state.copyWith(sellState: nextState); } else if (action is SetJournalStateAction) { /** NavAction **/ final JournalState nextState = journalReducer(state.journalState!, action); return state.copyWith(journalState: nextState); } return state; } //Main State @immutable class AppState { const AppState({ this.userState, this.navState, this.sellState, this.journalState, }); final UserState? userState; final NavState? navState; final SellState? sellState; final JournalState? journalState; //stable work AppState copyWith({ UserState? userState, NavState? navState, SellState? sellState, JournalState? journalState, }) { return AppState( userState: userState ?? this.userState, navState: navState ?? this.navState, sellState: sellState ?? this.sellState, journalState: journalState ?? this.journalState, ); } static AppState? fromJson(dynamic json) { return json != null ? AppState( userState: UserState.fromJson(json['userState']), ) : null; } dynamic toJson() { return { 'userState': userState!.toJson(), }; } } class Redux { static Store? _store; static Store? get store { if (_store == null) { throw Exception('store is not initialized'); } else { return _store; } } //blank function just for lint context Future blank() async {} //initial context static Future init() async { // Create Persistor final persist = Persistor( storage: FlutterStorage(), // Or use other engines serializer: JsonSerializer( AppState.fromJson), // Or use other serializers ); final AppState? initialState = await persist.load(); final userStateInitial = UserState.initial(initialState?.userState); final navStateInitial = NavState.initial(); final sellStateInitial = SellState.initial(); final journalStateInitial = JournalState.initial(); _store = Store(appReducer, middleware: [thunkMiddleware, persist.createMiddleware()], initialState: AppState( userState: userStateInitial, navState: navStateInitial, sellState: sellStateInitial, journalState: journalStateInitial, )); } }