diff --git a/web/chat/relationship-prompt/relationship-prompt-button.js b/web/chat/relationship-prompt/relationship-prompt-button.js
index fc7d2d0fd..979214f2c 100644
--- a/web/chat/relationship-prompt/relationship-prompt-button.js
+++ b/web/chat/relationship-prompt/relationship-prompt-button.js
@@ -1,41 +1,43 @@
// @flow
import { type IconDefinition } from '@fortawesome/fontawesome-common-types';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import classnames from 'classnames';
import * as React from 'react';
import css from './relationship-prompt.css';
import Button, { type ButtonColor } from '../../components/button.react.js';
type Props = {
+text: string,
+icon: IconDefinition,
+buttonColor: ButtonColor,
+onClick: () => void,
+ +isLoading: boolean,
+className?: string,
};
function RelationshipPromptButton(props: Props): React.Node {
- const { text, icon, buttonColor, onClick, className } = props;
+ const { text, icon, buttonColor, onClick, isLoading, className } = props;
const buttonClassName = classnames(css.promptButton, className);
const relationshipPromptButton = React.useMemo(
() => (
),
- [buttonClassName, buttonColor, icon, onClick, text],
+ [buttonClassName, buttonColor, icon, isLoading, onClick, text],
);
return relationshipPromptButton;
}
export default RelationshipPromptButton;
diff --git a/web/chat/relationship-prompt/relationship-prompt.js b/web/chat/relationship-prompt/relationship-prompt.js
index 3b20204c4..1cad3ef72 100644
--- a/web/chat/relationship-prompt/relationship-prompt.js
+++ b/web/chat/relationship-prompt/relationship-prompt.js
@@ -1,117 +1,130 @@
// @flow
import {
faUserMinus,
faUserPlus,
faUserShield,
faUserSlash,
} from '@fortawesome/free-solid-svg-icons';
import * as React from 'react';
import { useRelationshipPrompt } from 'lib/hooks/relationship-prompt.js';
import type { ThreadInfo } from 'lib/types/minimally-encoded-thread-permissions-types.js';
import { userRelationshipStatus } from 'lib/types/relationship-types.js';
import type { UserInfo } from 'lib/types/user-types.js';
import RelationshipPromptButtonContainer from './relationship-prompt-button-container.js';
import RelationshipPromptButton from './relationship-prompt-button.js';
import { buttonThemes } from '../../components/button.react.js';
type Props = {
+pendingPersonalThreadUserInfo: ?UserInfo,
+threadInfo: ThreadInfo,
};
function RelationshipPrompt(props: Props) {
const { threadInfo } = props;
const {
otherUserInfo,
callbacks: { blockUser, unblockUser, friendUser, unfriendUser },
+ loadingState: {
+ isLoadingBlockUser,
+ isLoadingUnblockUser,
+ isLoadingFriendUser,
+ isLoadingUnfriendUser,
+ },
} = useRelationshipPrompt(
threadInfo,
undefined,
props.pendingPersonalThreadUserInfo,
);
if (!otherUserInfo?.username) {
return null;
}
const relationshipStatus = otherUserInfo.relationshipStatus;
if (relationshipStatus === userRelationshipStatus.FRIEND) {
return null;
} else if (relationshipStatus === userRelationshipStatus.BLOCKED_VIEWER) {
return (
);
} else if (
relationshipStatus === userRelationshipStatus.BOTH_BLOCKED ||
relationshipStatus === userRelationshipStatus.BLOCKED_BY_VIEWER
) {
return (
);
} else if (relationshipStatus === userRelationshipStatus.REQUEST_RECEIVED) {
return (
);
} else if (relationshipStatus === userRelationshipStatus.REQUEST_SENT) {
return (
);
} else {
return (
);
}
}
const MemoizedRelationshipPrompt: React.ComponentType =
React.memo(RelationshipPrompt);
export default MemoizedRelationshipPrompt;
diff --git a/web/modals/user-profile/user-profile-action-buttons.react.js b/web/modals/user-profile/user-profile-action-buttons.react.js
index a0cb4c0d0..a78a55d48 100644
--- a/web/modals/user-profile/user-profile-action-buttons.react.js
+++ b/web/modals/user-profile/user-profile-action-buttons.react.js
@@ -1,100 +1,112 @@
// @flow
import { faUserMinus, faUserPlus } from '@fortawesome/free-solid-svg-icons';
import * as React from 'react';
import { useRelationshipPrompt } from 'lib/hooks/relationship-prompt.js';
import type { ThreadInfo } from 'lib/types/minimally-encoded-thread-permissions-types.js';
import { userRelationshipStatus } from 'lib/types/relationship-types.js';
import UserProfileMessageButton from './user-profile-message-button.react.js';
import css from './user-profile.css';
import RelationshipPromptButton from '../../chat/relationship-prompt/relationship-prompt-button.js';
import { buttonThemes } from '../../components/button.react.js';
type Props = {
+threadInfo: ThreadInfo,
};
function UserProfileActionButtons(props: Props): React.Node {
const { threadInfo } = props;
const {
otherUserInfo,
callbacks: { friendUser, unfriendUser },
+ loadingState: { isLoadingFriendUser, isLoadingUnfriendUser },
} = useRelationshipPrompt(threadInfo);
const userProfileActionButtons = React.useMemo(() => {
if (
!otherUserInfo ||
otherUserInfo.relationshipStatus === userRelationshipStatus.FRIEND
) {
return ;
}
if (
otherUserInfo.relationshipStatus ===
userRelationshipStatus.REQUEST_RECEIVED
) {
return (
<>
>
);
}
if (
otherUserInfo.relationshipStatus === userRelationshipStatus.REQUEST_SENT
) {
return (
);
}
return (
);
- }, [otherUserInfo, friendUser, threadInfo, unfriendUser]);
+ }, [
+ otherUserInfo,
+ friendUser,
+ isLoadingFriendUser,
+ threadInfo,
+ unfriendUser,
+ isLoadingUnfriendUser,
+ ]);
return userProfileActionButtons;
}
export default UserProfileActionButtons;