import { WalletApi, CashoutMethodOut } from "@/api_fsb"; import type { RootState } from "@/store"; import { PayloadAction, createSlice, createEntityAdapter, } from "@reduxjs/toolkit"; import { bpid } from "@/lib/utils"; import { createAsyncThunk } from "@reduxjs/toolkit"; // Entity adapter for normalized storage const cashoutMethodsAdapter = createEntityAdapter({ selectId: (model: CashoutMethodOut) => model.id!, sortComparer: (a, b) => { return (a.min_value ?? 0) - (b.min_value ?? 0); }, }); export const fetchCashoutMethods = createAsyncThunk( "cashoutMethodsSlice/fetchCashoutMethods", async (bpuid: string) => { console.log("cashoutMethodsSlice/fetchCashoutMethods"); const res = await new WalletApi().getCashoutMethodsProductIdCashoutMethodsGet( bpid, bpuid, ); return res.data.cashout_methods as CashoutMethodOut[]; }, ); interface CashoutMethodClientState { is_active?: boolean; is_expanded?: boolean; } const withClientDefaults = (method: CashoutMethodOut): CashoutMethodEntity => ({ ...method, is_active: false, is_expanded: false, }); type CashoutMethodEntity = CashoutMethodOut & CashoutMethodClientState; const cashoutMethodsSlice = createSlice({ name: "cashoutMethods", initialState: cashoutMethodsAdapter.getInitialState(), reducers: { addCashoutMethod: (state, action: PayloadAction) => { cashoutMethodsAdapter.addOne(state, withClientDefaults(action.payload)); }, addCashoutMethods: (state, action: PayloadAction) => { cashoutMethodsAdapter.addMany( state, action.payload.map(withClientDefaults), ); }, upsertCashoutMethod: (state, action: PayloadAction) => { cashoutMethodsAdapter.upsertOne( state, withClientDefaults(action.payload), ); }, }, }); export const { addCashoutMethod, addCashoutMethods, upsertCashoutMethod } = cashoutMethodsSlice.actions; export const cashoutMethodsSelectors = cashoutMethodsAdapter.getSelectors( (state: RootState) => state.cashoutMethods, ); export const selectAllCashoutMethods = ( state: RootState, ): CashoutMethodOut[] => { return cashoutMethodsSelectors.selectAll(state) ?? []; }; export default cashoutMethodsSlice.reducer;