diff --git a/lib/hooks/relationship-prompt.js b/lib/hooks/relationship-prompt.js --- a/lib/hooks/relationship-prompt.js +++ b/lib/hooks/relationship-prompt.js @@ -25,9 +25,17 @@ +unfriendUser: () => void, }; +type RelationshipLoadingState = { + +isLoadingBlockUser: boolean, + +isLoadingUnblockUser: boolean, + +isLoadingFriendUser: boolean, + +isLoadingUnfriendUser: boolean, +}; + type RelationshipPromptData = { +otherUserInfo: ?UserInfo, +callbacks: RelationshipCallbacks, + +loadingState: RelationshipLoadingState, }; function useRelationshipPrompt( @@ -48,7 +56,7 @@ : pendingPersonalThreadUserInfo; }); - const callbacks = useRelationshipCallbacks( + const { callbacks, loadingState } = useRelationshipCallbacks( otherUserInfo?.id, onErrorCallback, ); @@ -57,21 +65,35 @@ () => ({ otherUserInfo, callbacks, + loadingState, }), - [callbacks, otherUserInfo], + [callbacks, loadingState, otherUserInfo], ); } function useRelationshipCallbacks( otherUserID?: string, onErrorCallback?: () => void, -): RelationshipCallbacks { +): { + +callbacks: RelationshipCallbacks, + +loadingState: RelationshipLoadingState, +} { + const [isLoadingBlockUser, setIsLoadingBlockUser] = React.useState(false); + const [isLoadingUnblockUser, setIsLoadingUnblockUser] = React.useState(false); + const [isLoadingFriendUser, setIsLoadingFriendUser] = React.useState(false); + const [isLoadingUnfriendUser, setIsLoadingUnfriendUser] = + React.useState(false); + const callUpdateRelationships = useLegacyAshoatKeyserverCall( serverUpdateRelationships, ); const updateRelationship = React.useCallback( - async (action: TraditionalRelationshipAction) => { + async ( + action: TraditionalRelationshipAction, + setInProgress: boolean => mixed, + ) => { try { + setInProgress(true); invariant(otherUserID, 'Other user info id should be present'); return await callUpdateRelationships({ action, @@ -80,6 +102,8 @@ } catch (e) { onErrorCallback?.(); throw e; + } finally { + setInProgress(false); } }, [callUpdateRelationships, onErrorCallback, otherUserID], @@ -87,40 +111,60 @@ const dispatchActionPromise = useDispatchActionPromise(); const onButtonPress = React.useCallback( - (action: TraditionalRelationshipAction) => { + ( + action: TraditionalRelationshipAction, + setInProgress: boolean => mixed, + ) => { void dispatchActionPromise( updateRelationshipsActionTypes, - updateRelationship(action), + updateRelationship(action, setInProgress), ); }, [dispatchActionPromise, updateRelationship], ); const blockUser = React.useCallback( - () => onButtonPress(relationshipActions.BLOCK), + () => onButtonPress(relationshipActions.BLOCK, setIsLoadingBlockUser), [onButtonPress], ); const unblockUser = React.useCallback( - () => onButtonPress(relationshipActions.UNBLOCK), + () => onButtonPress(relationshipActions.UNBLOCK, setIsLoadingUnblockUser), [onButtonPress], ); const friendUser = React.useCallback( - () => onButtonPress(relationshipActions.FRIEND), + () => onButtonPress(relationshipActions.FRIEND, setIsLoadingFriendUser), [onButtonPress], ); const unfriendUser = React.useCallback( - () => onButtonPress(relationshipActions.UNFRIEND), + () => onButtonPress(relationshipActions.UNFRIEND, setIsLoadingUnfriendUser), [onButtonPress], ); return React.useMemo( () => ({ + callbacks: { + blockUser, + unblockUser, + friendUser, + unfriendUser, + }, + loadingState: { + isLoadingBlockUser, + isLoadingUnblockUser, + isLoadingFriendUser, + isLoadingUnfriendUser, + }, + }), + [ blockUser, - unblockUser, friendUser, + isLoadingBlockUser, + isLoadingFriendUser, + isLoadingUnblockUser, + isLoadingUnfriendUser, + unblockUser, unfriendUser, - }), - [blockUser, friendUser, unblockUser, unfriendUser], + ], ); } diff --git a/web/settings/relationship/block-list-row.react.js b/web/settings/relationship/block-list-row.react.js --- a/web/settings/relationship/block-list-row.react.js +++ b/web/settings/relationship/block-list-row.react.js @@ -14,7 +14,9 @@ function BlockListRow(props: UserRowProps): React.Node { const { userInfo, onMenuVisibilityChange } = props; - const { unblockUser } = useRelationshipCallbacks(userInfo.id); + const { + callbacks: { unblockUser }, + } = useRelationshipCallbacks(userInfo.id); const editIcon = ; const pushUserProfileModal = usePushUserProfileModal(userInfo.id); diff --git a/web/settings/relationship/friend-list-row.react.js b/web/settings/relationship/friend-list-row.react.js --- a/web/settings/relationship/friend-list-row.react.js +++ b/web/settings/relationship/friend-list-row.react.js @@ -21,7 +21,9 @@ function FriendListRow(props: UserRowProps): React.Node { const { userInfo, onMenuVisibilityChange } = props; - const { friendUser, unfriendUser } = useRelationshipCallbacks(userInfo.id); + const { + callbacks: { friendUser, unfriendUser }, + } = useRelationshipCallbacks(userInfo.id); const friendUserCallback = React.useCallback( (event: SyntheticEvent) => {