import {createReducer, nanoid} from '@reduxjs/toolkit'; import {addPopup, PopupContent, removePopup, toggleWalletModal, toggleSettingsMenu, updateBlockNumber} from './actions'; type PopupList = Array<{ key: string; show: boolean; content: PopupContent; removeAfterMs: number | null; }>; export interface ApplicationState { blockNumber: {[chainId: number]: number}; popupList: PopupList; walletModalOpen: boolean; settingsMenuOpen: boolean; } const initialState: ApplicationState = { blockNumber: {}, popupList: [], walletModalOpen: false, settingsMenuOpen: false, }; export default createReducer(initialState, (builder) => builder .addCase(updateBlockNumber, (state, action) => { const {chainId, blockNumber} = action.payload; if (typeof state.blockNumber[chainId] !== 'number') { state.blockNumber[chainId] = blockNumber; } else { state.blockNumber[chainId] = Math.max(blockNumber, state.blockNumber[chainId]); } }) .addCase(toggleWalletModal, (state) => { state.walletModalOpen = !state.walletModalOpen; }) .addCase(toggleSettingsMenu, (state) => { state.settingsMenuOpen = !state.settingsMenuOpen; }) .addCase(addPopup, (state, {payload: {content, key, removeAfterMs = 15000}}) => { state.popupList = (key ? state.popupList.filter((popup) => popup.key !== key) : state.popupList).concat([ { key: key || nanoid(), show: true, content, removeAfterMs, }, ]); }) .addCase(removePopup, (state, {payload: {key}}) => { state.popupList.forEach((p) => { if (p.key === key) { p.show = false; } }); }), );