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) => {