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 RelationshipLoaders = { + +isLoadingBlockUser: boolean, + +isLoadingUnblockUser: boolean, + +isLoadingFriendUser: boolean, + +isLoadingUnfriendUser: boolean, +}; + type RelationshipPromptData = { +otherUserInfo: ?UserInfo, +callbacks: RelationshipCallbacks, + +loaders: RelationshipLoaders, }; function useRelationshipPrompt( @@ -48,7 +56,7 @@ : pendingPersonalThreadUserInfo; }); - const callbacks = useRelationshipCallbacks( + const { callbacks, loaders } = useRelationshipCallbacks( otherUserInfo?.id, onErrorCallback, ); @@ -57,15 +65,25 @@ () => ({ otherUserInfo, callbacks, + loaders, }), - [callbacks, otherUserInfo], + [callbacks, loaders, otherUserInfo], ); } function useRelationshipCallbacks( otherUserID?: string, onErrorCallback?: () => void, -): RelationshipCallbacks { +): { + +callbacks: RelationshipCallbacks, + +loaders: RelationshipLoaders, +} { + 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, ); @@ -80,6 +98,11 @@ } catch (e) { onErrorCallback?.(); throw e; + } finally { + setIsLoadingBlockUser(false); + setIsLoadingUnblockUser(false); + setIsLoadingFriendUser(false); + setIsLoadingUnfriendUser(false); } }, [callUpdateRelationships, onErrorCallback, otherUserID], @@ -96,31 +119,48 @@ [dispatchActionPromise, updateRelationship], ); - const blockUser = React.useCallback( - () => onButtonPress(relationshipActions.BLOCK), - [onButtonPress], - ); - const unblockUser = React.useCallback( - () => onButtonPress(relationshipActions.UNBLOCK), - [onButtonPress], - ); - const friendUser = React.useCallback( - () => onButtonPress(relationshipActions.FRIEND), - [onButtonPress], - ); - const unfriendUser = React.useCallback( - () => onButtonPress(relationshipActions.UNFRIEND), - [onButtonPress], - ); + const blockUser = React.useCallback(() => { + setIsLoadingBlockUser(true); + onButtonPress(relationshipActions.BLOCK); + }, [onButtonPress]); + const unblockUser = React.useCallback(() => { + setIsLoadingUnblockUser(true); + onButtonPress(relationshipActions.UNBLOCK); + }, [onButtonPress]); + const friendUser = React.useCallback(() => { + setIsLoadingFriendUser(true); + onButtonPress(relationshipActions.FRIEND); + }, [onButtonPress]); + const unfriendUser = React.useCallback(() => { + setIsLoadingUnfriendUser(true); + onButtonPress(relationshipActions.UNFRIEND); + }, [onButtonPress]); return React.useMemo( () => ({ + callbacks: { + blockUser, + unblockUser, + friendUser, + unfriendUser, + }, + loaders: { + 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) => {