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