diff --git a/lib/handlers/user-infos-handler.react.js b/lib/handlers/user-infos-handler.react.js index 3f9cd45eb..ff83b2405 100644 --- a/lib/handlers/user-infos-handler.react.js +++ b/lib/handlers/user-infos-handler.react.js @@ -1,34 +1,68 @@ // @flow import * as React from 'react'; +import { + useFindUserIdentities, + findUserIdentitiesActionTypes, +} from '../actions/user-actions.js'; +import { useDispatchActionPromise } from '../utils/redux-promise-utils.js'; import { useSelector } from '../utils/redux-utils.js'; import { relyingOnAuthoritativeKeyserver, usingCommServicesAccessToken, } from '../utils/services-utils.js'; function UserInfosHandler(): React.Node { const userInfos = useSelector(state => state.userStore.userInfos); const userInfosWithMissingUsernames = React.useMemo(() => { const entriesWithoutUsernames = Object.entries(userInfos).filter( ([, value]) => !value.username, ); return Object.fromEntries(entriesWithoutUsernames); }, [userInfos]); + const dispatchActionPromise = useDispatchActionPromise(); + const findUserIdentities = useFindUserIdentities(); + + const requestedIDsRef = React.useRef(new Set()); + React.useEffect(() => { - if (!usingCommServicesAccessToken) { + const newUserIDs = Object.keys(userInfosWithMissingUsernames).filter( + id => !requestedIDsRef.current.has(id), + ); + if (!usingCommServicesAccessToken || newUserIDs.length === 0) { return; } - // 1. TODO: fetch usernames from identity - // 2. Fetch avatars and settings from auth keyserver - if (relyingOnAuthoritativeKeyserver) { - // TODO - } - }, [userInfosWithMissingUsernames]); + const promise = (async () => { + newUserIDs.forEach(id => requestedIDsRef.current.add(id)); + // 1. Fetch usernames from identity + const identities = await findUserIdentities(newUserIDs); + + // 2. Fetch avatars and settings from auth keyserver + if (relyingOnAuthoritativeKeyserver) { + // TODO + } + newUserIDs.forEach(id => requestedIDsRef.current.delete(id)); + + const newUserInfos = []; + for (const id in identities) { + newUserInfos.push({ + id, + username: identities[id].username, + }); + } + return { userInfos: newUserInfos }; + })(); + void dispatchActionPromise(findUserIdentitiesActionTypes, promise); + }, [ + dispatchActionPromise, + findUserIdentities, + userInfos, + userInfosWithMissingUsernames, + ]); } export { UserInfosHandler };