import { createReducer } from "@reduxjs/toolkit"; import { addSerializedPair, addSerializedToken, removeSerializedPair, removeSerializedToken, SerializedPair, SerializedToken, } from "./actions"; const currentTimestamp = () => new Date().getTime(); export interface UserState { tokens: { [chainId: number]: { [address: string]: SerializedToken; }; }; pairs: { [chainId: number]: { // keyed by token0Address:token1Address [key: string]: SerializedPair; }; }; timestamp: number; URLWarningVisible: boolean; userSingleHopOnly: boolean; } function pairKey(token0Address: string, token1Address: string) { return `${token0Address};${token1Address}`; } export const initialState: UserState = { tokens: {}, pairs: {}, timestamp: currentTimestamp(), URLWarningVisible: true, userSingleHopOnly: false, }; export default createReducer(initialState, (builder) => builder .addCase(addSerializedToken, (state, { payload: { serializedToken } }) => { if (!state.tokens) { state.tokens = {}; } state.tokens[serializedToken.chainId] = state.tokens[serializedToken.chainId] || {}; state.tokens[serializedToken.chainId][ serializedToken.address ] = serializedToken; state.timestamp = currentTimestamp(); }) .addCase( removeSerializedToken, (state, { payload: { address, chainId } }) => { if (!state.tokens) { state.tokens = {}; } state.tokens[chainId] = state.tokens[chainId] || {}; delete state.tokens[chainId][address]; state.timestamp = currentTimestamp(); } ) .addCase(addSerializedPair, (state, { payload: { serializedPair } }) => { if ( serializedPair.token0.chainId === serializedPair.token1.chainId && serializedPair.token0.address !== serializedPair.token1.address ) { const chainId = serializedPair.token0.chainId; state.pairs[chainId] = state.pairs[chainId] || {}; state.pairs[chainId][ pairKey(serializedPair.token0.address, serializedPair.token1.address) ] = serializedPair; } state.timestamp = currentTimestamp(); }) .addCase( removeSerializedPair, (state, { payload: { chainId, tokenAAddress, tokenBAddress } }) => { if (state.pairs[chainId]) { // just delete both keys if either exists delete state.pairs[chainId][pairKey(tokenAAddress, tokenBAddress)]; delete state.pairs[chainId][pairKey(tokenBAddress, tokenAAddress)]; } state.timestamp = currentTimestamp(); } ) );