diff --git a/lib/hooks/invite-links.js b/lib/hooks/invite-links.js --- a/lib/hooks/invite-links.js +++ b/lib/hooks/invite-links.js @@ -199,6 +199,7 @@ +resolve: () => mixed, +reject: () => mixed, +communityID: string, + +threadID: ?string, }>(null); const timeoutRef = React.useRef(); @@ -214,6 +215,7 @@ | 'add_keyserver' | 'auth_to_keyserver' | 'join_community' + | 'join_thread' | 'finished', >('inactive'); @@ -251,10 +253,16 @@ resolve: resolveAndClearTimeout, reject: rejectAndClearTimeout, communityID, + threadID: verificationResponse.thread?.id, }); setStep('add_keyserver'); }); - }, [communityID, keyserverID, setLinkStatus]); + }, [ + communityID, + keyserverID, + setLinkStatus, + verificationResponse.thread?.id, + ]); React.useEffect(() => { void (async () => { @@ -320,6 +328,53 @@ }); void dispatchActionPromise(joinThreadActionTypes, joinThreadPromise); + try { + await joinThreadPromise; + setStep('join_thread'); + } catch (e) { + setLinkStatus(status => (status === 'valid' ? 'invalid' : status)); + ongoingJoinData.reject(); + setOngoingJoinData(null); + } + })(); + }, [ + calendarQuery, + callJoinThread, + dispatchActionPromise, + inviteSecret, + ongoingJoinData, + setLinkStatus, + step, + ]); + + React.useEffect(() => { + void (async () => { + if (!ongoingJoinData || step !== 'join_thread') { + return; + } + const threadID = ongoingJoinData.threadID; + if (!threadID) { + setStep('finished'); + ongoingJoinData.resolve(); + setOngoingJoinData(null); + return; + } + + const query = calendarQuery(); + const joinThreadPromise = callJoinThread({ + threadID, + calendarQuery: { + startDate: query.startDate, + endDate: query.endDate, + filters: [ + ...query.filters, + { type: 'threads', threadIDs: [threadID] }, + ], + }, + inviteLinkSecret: inviteSecret, + }); + void dispatchActionPromise(joinThreadActionTypes, joinThreadPromise); + try { await joinThreadPromise; setStep('finished'); @@ -346,18 +401,24 @@ if (step !== 'finished') { return; } - const threadID = verificationResponse.community?.id; - if (!threadID || !threadInfos[threadID]) { + const joinedThreadID = verificationResponse.thread?.id; + if (joinedThreadID && threadInfos[joinedThreadID]) { + navigateToThread(threadInfos[joinedThreadID]); + return; + } + const joinedCommunityID = verificationResponse.community?.id; + if (!joinedCommunityID || !threadInfos[joinedCommunityID]) { closeModal(); return; } - navigateToThread(threadInfos[threadID]); + navigateToThread(threadInfos[joinedCommunityID]); }, [ closeModal, navigateToThread, step, threadInfos, verificationResponse.community?.id, + verificationResponse.thread?.id, ]); let joinLoadingStatus: LoadingStatus = 'inactive';