Changeset View
Changeset View
Standalone View
Standalone View
lib/actions/user-actions.js
Show First 20 Lines • Show All 78 Lines • ▼ Show 20 Lines | export type KeyserverLogOutInput = { | ||||
+keyserverIDs?: $ReadOnlyArray<string>, | +keyserverIDs?: $ReadOnlyArray<string>, | ||||
}; | }; | ||||
const logOutActionTypes = Object.freeze({ | const logOutActionTypes = Object.freeze({ | ||||
started: 'LOG_OUT_STARTED', | started: 'LOG_OUT_STARTED', | ||||
success: 'LOG_OUT_SUCCESS', | success: 'LOG_OUT_SUCCESS', | ||||
failed: 'LOG_OUT_FAILED', | failed: 'LOG_OUT_FAILED', | ||||
}); | }); | ||||
const logOut = | |||||
const keyserverLogOut = | |||||
( | ( | ||||
callKeyserverEndpoint: CallKeyserverEndpoint, | callKeyserverEndpoint: CallKeyserverEndpoint, | ||||
allKeyserverIDs: $ReadOnlyArray<string>, | allKeyserverIDs: $ReadOnlyArray<string>, | ||||
): ((input: KeyserverLogOutInput) => Promise<KeyserverLogOutResult>) => | ): ((input: KeyserverLogOutInput) => Promise<KeyserverLogOutResult>) => | ||||
async input => { | async input => { | ||||
const { preRequestUserState } = input; | const { preRequestUserState } = input; | ||||
const keyserverIDs = input.keyserverIDs ?? allKeyserverIDs; | const keyserverIDs = input.keyserverIDs ?? allKeyserverIDs; | ||||
const requests: { [string]: {} } = {}; | const requests: { [string]: {} } = {}; | ||||
for (const keyserverID of keyserverIDs) { | for (const keyserverID of keyserverIDs) { | ||||
requests[keyserverID] = {}; | requests[keyserverID] = {}; | ||||
} | } | ||||
let response = null; | let response = null; | ||||
try { | try { | ||||
response = await Promise.race([ | response = await Promise.race([ | ||||
callKeyserverEndpoint('log_out', requests), | callKeyserverEndpoint('log_out', requests), | ||||
(async () => { | (async () => { | ||||
await sleep(500); | await sleep(500); | ||||
throw new Error('log_out took more than 500ms'); | throw new Error('keyserver log_out took more than 500ms'); | ||||
})(), | })(), | ||||
]); | ]); | ||||
} catch {} | } catch {} | ||||
const currentUserInfo = response ? loggedOutUserInfo : null; | const currentUserInfo = response ? loggedOutUserInfo : null; | ||||
return { currentUserInfo, preRequestUserState, keyserverIDs }; | return { currentUserInfo, preRequestUserState, keyserverIDs }; | ||||
}; | }; | ||||
function useLogOut(): ( | function useLogOut(): ( | ||||
keyserverIDs?: $ReadOnlyArray<string>, | keyserverIDs?: $ReadOnlyArray<string>, | ||||
) => Promise<LogOutResult> { | ) => Promise<LogOutResult> { | ||||
const client = React.useContext(IdentityClientContext); | |||||
const identityClient = client?.identityClient; | |||||
const preRequestUserState = useSelector(preRequestUserStateSelector); | const preRequestUserState = useSelector(preRequestUserStateSelector); | ||||
const callKeyserverLogOut = useKeyserverCall(logOut); | const callKeyserverLogOut = useKeyserverCall(keyserverLogOut); | ||||
const commServicesAccessToken = useSelector( | const commServicesAccessToken = useSelector( | ||||
state => state.commServicesAccessToken, | state => state.commServicesAccessToken, | ||||
); | ); | ||||
return React.useCallback( | return React.useCallback( | ||||
async (keyserverIDs?: $ReadOnlyArray<string>) => { | async (keyserverIDs?: $ReadOnlyArray<string>) => { | ||||
const { keyserverIDs: _, ...result } = await callKeyserverLogOut({ | const identityPromise = (async () => { | ||||
if (!usingCommServicesAccessToken) { | |||||
return; | |||||
} | |||||
invariant(identityClient, 'Identity client should be set'); | |||||
try { | |||||
await Promise.race([ | |||||
identityClient.logOut(), | |||||
(async () => { | |||||
await sleep(500); | |||||
throw new Error('identity log_out took more than 500ms'); | |||||
})(), | |||||
]); | |||||
} catch {} | |||||
})(); | |||||
const [{ keyserverIDs: _, ...result }] = await Promise.all([ | |||||
callKeyserverLogOut({ | |||||
preRequestUserState, | preRequestUserState, | ||||
keyserverIDs, | keyserverIDs, | ||||
}); | }), | ||||
identityPromise, | |||||
]); | |||||
return { | return { | ||||
...result, | ...result, | ||||
preRequestUserState: { | preRequestUserState: { | ||||
...result.preRequestUserState, | ...result.preRequestUserState, | ||||
commServicesAccessToken, | commServicesAccessToken, | ||||
}, | }, | ||||
}; | }; | ||||
}, | }, | ||||
[callKeyserverLogOut, commServicesAccessToken, preRequestUserState], | [ | ||||
callKeyserverLogOut, | |||||
commServicesAccessToken, | |||||
identityClient, | |||||
preRequestUserState, | |||||
], | |||||
); | ); | ||||
} | } | ||||
const claimUsernameActionTypes = Object.freeze({ | const claimUsernameActionTypes = Object.freeze({ | ||||
started: 'CLAIM_USERNAME_STARTED', | started: 'CLAIM_USERNAME_STARTED', | ||||
success: 'CLAIM_USERNAME_SUCCESS', | success: 'CLAIM_USERNAME_SUCCESS', | ||||
failed: 'CLAIM_USERNAME_FAILED', | failed: 'CLAIM_USERNAME_FAILED', | ||||
}); | }); | ||||
▲ Show 20 Lines • Show All 712 Lines • Show Last 20 Lines |