diff --git a/web/modals/user-profile/user-profile-avatar-modal.react.js b/web/modals/user-profile/user-profile-avatar-modal.react.js new file mode 100644 index 000000000..8dfb58afe --- /dev/null +++ b/web/modals/user-profile/user-profile-avatar-modal.react.js @@ -0,0 +1,27 @@ +// @flow + +import * as React from 'react'; + +import UserAvatar from '../../avatars/user-avatar.react.js'; +import FullScreenViewModal from '../full-screen-view-modal.react.js'; + +type Props = { + +userID: ?string, +}; + +function UserProfileAvatarModal(props: Props): React.Node { + const { userID } = props; + + const userProfileAvatarModal = React.useMemo( + () => ( + + + + ), + [userID], + ); + + return userProfileAvatarModal; +} + +export default UserProfileAvatarModal; diff --git a/web/modals/user-profile/user-profile.css b/web/modals/user-profile/user-profile.css index 159662fac..3d956ae01 100644 --- a/web/modals/user-profile/user-profile.css +++ b/web/modals/user-profile/user-profile.css @@ -1,52 +1,56 @@ .container { padding: 0 32px 32px; width: 552px; max-width: 80vw; } .userInfoContainer { display: flex; align-items: center; margin-bottom: 24px; } +.userAvatarContainer:hover { + cursor: pointer; +} + .usernameContainer { padding-left: 16px; } .usernameText { font-size: var(--xxl-font-24); color: var(--fg); font-weight: 500; } .copyUsernameContainer { display: flex; align-items: center; color: var(--purple-link); margin-top: 8px; } .copyUsernameContainer:hover { cursor: pointer; } .copyUsernameText { font-size: var(--xs-font-12); margin-left: 4px; } .multiButtonRowContainer { display: flex; column-gap: 8px; } .actionButton { column-gap: 8px; flex: 1; } .incomingFriendRequestText { color: var(--fg); margin: 24px 0 8px 0; } diff --git a/web/modals/user-profile/user-profile.react.js b/web/modals/user-profile/user-profile.react.js index 9b2d26564..d16300110 100644 --- a/web/modals/user-profile/user-profile.react.js +++ b/web/modals/user-profile/user-profile.react.js @@ -1,88 +1,99 @@ // @flow import * as React from 'react'; +import { useModalContext } from 'lib/components/modal-provider.react.js'; import SWMansionIcon from 'lib/components/SWMansionIcon.react.js'; import { relationshipBlockedInEitherDirection } from 'lib/shared/relationship-utils.js'; import { stringForUserExplicit } from 'lib/shared/user-utils.js'; import type { UserProfileThreadInfo } from 'lib/types/thread-types'; import type { UserInfo } from 'lib/types/user-types'; import sleep from 'lib/utils/sleep.js'; import UserProfileActionButtons from './user-profile-action-buttons.react.js'; +import UserProfileAvatarModal from './user-profile-avatar-modal.react.js'; import css from './user-profile.css'; import UserAvatar from '../../avatars/user-avatar.react.js'; type Props = { +userInfo: ?UserInfo, +userProfileThreadInfo: ?UserProfileThreadInfo, }; function UserProfile(props: Props): React.Node { const { userInfo, userProfileThreadInfo } = props; + const { pushModal } = useModalContext(); + const usernameText = stringForUserExplicit(userInfo); const [usernameCopied, setUsernameCopied] = React.useState(false); + const onClickUserAvatar = React.useCallback(() => { + pushModal(); + }, [pushModal, userInfo?.id]); + const onClickCopyUsername = React.useCallback(async () => { if (usernameCopied) { return; } await navigator.clipboard.writeText(usernameText); setUsernameCopied(true); await sleep(3000); setUsernameCopied(false); }, [usernameCopied, usernameText]); const actionButtons = React.useMemo(() => { if ( !userProfileThreadInfo || relationshipBlockedInEitherDirection(userInfo?.relationshipStatus) ) { return null; } return ( ); }, [userInfo?.relationshipStatus, userProfileThreadInfo]); const userProfile = React.useMemo( () => (
- +
+ +
{usernameText}

{!usernameCopied ? 'Copy username' : 'Username copied!'}

{actionButtons}
), [ actionButtons, onClickCopyUsername, + onClickUserAvatar, userInfo?.id, usernameCopied, usernameText, ], ); return userProfile; } export default UserProfile;