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 ( <>

Incoming friend request

); } if ( otherUserInfo.relationshipStatus === userRelationshipStatus.REQUEST_SENT ) { return (
); } return (
); - }, [otherUserInfo, friendUser, threadInfo, unfriendUser]); + }, [ + otherUserInfo, + friendUser, + isLoadingFriendUser, + threadInfo, + unfriendUser, + isLoadingUnfriendUser, + ]); return userProfileActionButtons; } export default UserProfileActionButtons;