import { Box, Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, TextField, Typography, useTheme, } from '@mui/material'; import { useContext, useEffect, useState } from 'react'; import { getBaseApiReact, MyContext } from '../../App'; import { Spacer } from '../../common/Spacer'; import { executeEvent, subscribeToEvent, unsubscribeFromEvent, } from '../../utils/events'; import { validateAddress } from '../../utils/validateAddress'; import { getNameInfo, requestQueueMemberNames } from './Group'; import { useModal } from '../../common/useModal'; import { isOpenBlockedModalAtom } from '../../atoms/global'; import InfoIcon from '@mui/icons-material/Info'; import { useAtom } from 'jotai'; import { useTranslation } from 'react-i18next'; export const BlockedUsersModal = () => { const theme = useTheme(); const { t } = useTranslation(['auth', 'core', 'group']); const [isOpenBlockedModal, setIsOpenBlockedModal] = useAtom( isOpenBlockedModalAtom ); const [hasChanged, setHasChanged] = useState(false); const [value, setValue] = useState(''); const [addressesWithNames, setAddressesWithNames] = useState({}); const { isShow, onCancel, onOk, show, message } = useModal(); const { getAllBlockedUsers, removeBlockFromList, addToBlockList, setOpenSnackGlobal, setInfoSnackCustom, } = useContext(MyContext); const [blockedUsers, setBlockedUsers] = useState({ addresses: {}, names: {}, }); const fetchBlockedUsers = () => { setBlockedUsers(getAllBlockedUsers()); }; useEffect(() => { if (!isOpenBlockedModal) return; fetchBlockedUsers(); }, [isOpenBlockedModal]); const getNames = async () => { // const validApi = await findUsableApi(); const addresses = Object.keys(blockedUsers?.addresses); const addressNames = {}; const getMemNames = addresses.map(async (address) => { const name = await requestQueueMemberNames.enqueue(() => { return getNameInfo(address); }); if (name) { addressNames[address] = name; } return true; }); await Promise.all(getMemNames); setAddressesWithNames(addressNames); }; const blockUser = async (e, user?: string) => { try { const valUser = user || value; if (!valUser) return; const isAddress = validateAddress(valUser); let userName = null; let userAddress = null; if (isAddress) { userAddress = valUser; const name = await getNameInfo(valUser); if (name) { userName = name; } } if (!isAddress) { const response = await fetch(`${getBaseApiReact()}/names/${valUser}`); const data = await response.json(); if (!data?.owner) throw new Error( t('auth:message.error.name_not_existing', { postProcess: 'capitalizeFirstChar', }) ); if (data?.owner) { userAddress = data.owner; userName = valUser; } } if (!userName) { await addToBlockList(userAddress, null); fetchBlockedUsers(); setHasChanged(true); executeEvent('updateChatMessagesWithBlocks', true); setValue(''); return; } const responseModal = await show({ userName, userAddress, }); if (responseModal === 'both') { await addToBlockList(userAddress, userName); } else if (responseModal === 'address') { await addToBlockList(userAddress, null); } else if (responseModal === 'name') { await addToBlockList(null, userName); } fetchBlockedUsers(); setHasChanged(true); setValue(''); if (user) { setIsOpenBlockedModal(false); } if (responseModal === 'both' || responseModal === 'address') { executeEvent('updateChatMessagesWithBlocks', true); } } catch (error) { setOpenSnackGlobal(true); setInfoSnackCustom({ type: 'error', message: error?.message || t('auth:message.error.unable_block_user', { postProcess: 'capitalizeFirstChar', }), }); } }; const blockUserFromOutsideModalFunc = (e) => { const user = e.detail?.user; setIsOpenBlockedModal(true); blockUser(null, user); }; useEffect(() => { subscribeToEvent('blockUserFromOutside', blockUserFromOutsideModalFunc); return () => { unsubscribeFromEvent( 'blockUserFromOutside', blockUserFromOutsideModalFunc ); }; }, []); return ( {t('auth:blocked_users', { postProcess: 'capitalizeFirstChar' })} { setValue(e.target.value); }} /> {Object.entries(blockedUsers?.addresses).length > 0 && ( <> {t('auth:message.generic.blocked_addresses', { postProcess: 'capitalizeFirstChar', })} )} {Object.entries(blockedUsers?.addresses || {})?.map( ([key, value]) => { return ( {addressesWithNames[key] || key} ); } )} {Object.entries(blockedUsers?.names).length > 0 && ( <> {t('core:message.generic.blocked_names', { postProcess: 'capitalizeFirstChar', })} )} {Object.entries(blockedUsers?.names || {})?.map(([key, value]) => { return ( {key} ); })} {t('auth:message.generic.decide_block', { postProcess: 'capitalizeFirstChar', })} {t('auth:message.generic.blocking', { name: message?.userName || message?.userAddress, postProcess: 'capitalizeFirstChar', })} {' '} {t('auth:message.generic.choose_block', { postProcess: 'capitalizeFirstChar', })} ); };