import { useCallback, useMemo } from 'react' import { useDispatch, useSelector } from 'react-redux' import { useActiveWeb3React } from '../../hooks/web3' import { AppDispatch, AppState } from '../index' import { addPopup, ApplicationModal, PopupContent, removePopup, setOpenModal, updateActiveNetworkVersion, } from './actions' import { NetworkInfo } from '../../constants/networks' export function useBlockNumber(): number | undefined { const { chainId } = useActiveWeb3React() return useSelector((state: AppState) => state.gapplication.blockNumber[chainId ?? -1]) } export function useModalOpen(modal: ApplicationModal): boolean { const openModal = useSelector((state: AppState) => state.application.openModal) return openModal === modal } export function useToggleModal(modal: ApplicationModal): () => void { const open = useModalOpen(modal) const dispatch = useDispatch() return useCallback(() => dispatch(setOpenModal(open ? null : modal)), [dispatch, modal, open]) } export function useOpenModal(modal: ApplicationModal): () => void { const dispatch = useDispatch() return useCallback(() => dispatch(setOpenModal(modal)), [dispatch, modal]) } export function useCloseModals(): () => void { const dispatch = useDispatch() return useCallback(() => dispatch(setOpenModal(null)), [dispatch]) } export function useWalletModalToggle(): () => void { return useToggleModal(ApplicationModal.WALLET) } export function useToggleSettingsMenu(): () => void { return useToggleModal(ApplicationModal.SETTINGS) } export function useShowClaimPopup(): boolean { return useModalOpen(ApplicationModal.CLAIM_POPUP) } export function useToggleShowClaimPopup(): () => void { return useToggleModal(ApplicationModal.CLAIM_POPUP) } export function useToggleSelfClaimModal(): () => void { return useToggleModal(ApplicationModal.SELF_CLAIM) } export function useToggleDelegateModal(): () => void { return useToggleModal(ApplicationModal.DELEGATE) } export function useToggleVoteModal(): () => void { return useToggleModal(ApplicationModal.VOTE) } // returns a function that allows adding a popup export function useAddPopup(): (content: PopupContent, key?: string) => void { const dispatch = useDispatch() return useCallback( (content: PopupContent, key?: string) => { dispatch(addPopup({ content, key })) }, [dispatch] ) } // returns a function that allows removing a popup via its key export function useRemovePopup(): (key: string) => void { const dispatch = useDispatch() return useCallback( (key: string) => { dispatch(removePopup({ key })) }, [dispatch] ) } // get the list of active popups export function useActivePopups(): AppState['application']['popupList'] { const list = useSelector((state: AppState) => state.application.popupList) return useMemo(() => list.filter((item) => item.show), [list]) } // returns a function that allows adding a popup export function useActiveNetworkVersion(): [NetworkInfo, (activeNetworkVersion: NetworkInfo) => void] { const dispatch = useDispatch() const activeNetwork = useSelector((state: AppState) => state.application.activeNetworkVersion) const update = useCallback( (activeNetworkVersion: NetworkInfo) => { dispatch(updateActiveNetworkVersion({ activeNetworkVersion })) }, [dispatch] ) return [activeNetwork, update] }