Show your own name on your tile

Instead of the word "You".
This commit is contained in:
Robin
2024-08-01 15:46:14 -04:00
parent f89342713a
commit 00d8100dfe
5 changed files with 20 additions and 36 deletions

View File

@@ -161,7 +161,6 @@
"exit_full_screen": "Exit full screen", "exit_full_screen": "Exit full screen",
"full_screen": "Full screen", "full_screen": "Full screen",
"mute_for_me": "Mute for me", "mute_for_me": "Mute for me",
"sfu_participant_local": "You",
"volume": "Volume" "volume": "Volume"
} }
} }

View File

@@ -45,28 +45,14 @@ import {
startWith, startWith,
switchMap, switchMap,
} from "rxjs"; } from "rxjs";
import { useTranslation } from "react-i18next";
import { useEffect } from "react"; import { useEffect } from "react";
import { ViewModel } from "./ViewModel"; import { ViewModel } from "./ViewModel";
import { useReactiveState } from "../useReactiveState"; import { useReactiveState } from "../useReactiveState";
import { alwaysShowSelf } from "../settings/settings"; import { alwaysShowSelf } from "../settings/settings";
export interface NameData {
/**
* The display name of the participant.
*/
displayName: string;
/**
* The text to be shown on the participant's name tag.
*/
nameTag: string;
}
// TODO: Move this naming logic into the view model // TODO: Move this naming logic into the view model
export function useNameData(vm: MediaViewModel): NameData { export function useDisplayName(vm: MediaViewModel): string {
const { t } = useTranslation();
const [displayName, setDisplayName] = useReactiveState( const [displayName, setDisplayName] = useReactiveState(
() => vm.member?.rawDisplayName ?? "[👻]", () => vm.member?.rawDisplayName ?? "[👻]",
[vm.member], [vm.member],
@@ -83,11 +69,8 @@ export function useNameData(vm: MediaViewModel): NameData {
}; };
} }
}, [vm.member, setDisplayName]); }, [vm.member, setDisplayName]);
const nameTag = vm.local
? t("video_tile.sfu_participant_local")
: displayName;
return { displayName, nameTag }; return displayName;
} }
function observeTrackReference( function observeTrackReference(

View File

@@ -46,7 +46,7 @@ import { useObservableEagerState } from "observable-hooks";
import styles from "./GridTile.module.css"; import styles from "./GridTile.module.css";
import { import {
UserMediaViewModel, UserMediaViewModel,
useNameData, useDisplayName,
LocalUserMediaViewModel, LocalUserMediaViewModel,
RemoteUserMediaViewModel, RemoteUserMediaViewModel,
} from "../state/MediaViewModel"; } from "../state/MediaViewModel";
@@ -60,7 +60,6 @@ interface TileProps {
targetWidth: number; targetWidth: number;
targetHeight: number; targetHeight: number;
displayName: string; displayName: string;
nameTag: string;
showSpeakingIndicators: boolean; showSpeakingIndicators: boolean;
} }
@@ -79,7 +78,7 @@ const UserMediaTile = forwardRef<HTMLDivElement, UserMediaTileProps>(
menuStart, menuStart,
menuEnd, menuEnd,
className, className,
nameTag, displayName,
...props ...props
}, },
ref, ref,
@@ -134,12 +133,12 @@ const UserMediaTile = forwardRef<HTMLDivElement, UserMediaTileProps>(
className={styles.muteIcon} className={styles.muteIcon}
/> />
} }
nameTag={nameTag} displayName={displayName}
primaryButton={ primaryButton={
<Menu <Menu
open={menuOpen} open={menuOpen}
onOpenChange={setMenuOpen} onOpenChange={setMenuOpen}
title={nameTag} title={displayName}
trigger={ trigger={
<button aria-label={t("common.options")}> <button aria-label={t("common.options")}>
<OverflowHorizontalIcon aria-hidden width={20} height={20} /> <OverflowHorizontalIcon aria-hidden width={20} height={20} />
@@ -156,7 +155,7 @@ const UserMediaTile = forwardRef<HTMLDivElement, UserMediaTileProps>(
); );
return ( return (
<ContextMenu title={nameTag} trigger={tile} hasAccessibleAlternative> <ContextMenu title={displayName} trigger={tile} hasAccessibleAlternative>
{menu} {menu}
</ContextMenu> </ContextMenu>
); );
@@ -282,7 +281,7 @@ interface GridTileProps {
export const GridTile = forwardRef<HTMLDivElement, GridTileProps>( export const GridTile = forwardRef<HTMLDivElement, GridTileProps>(
({ vm, onOpenProfile, ...props }, ref) => { ({ vm, onOpenProfile, ...props }, ref) => {
const nameData = useNameData(vm); const displayName = useDisplayName(vm);
if (vm instanceof LocalUserMediaViewModel) { if (vm instanceof LocalUserMediaViewModel) {
return ( return (
@@ -290,12 +289,19 @@ export const GridTile = forwardRef<HTMLDivElement, GridTileProps>(
ref={ref} ref={ref}
vm={vm} vm={vm}
onOpenProfile={onOpenProfile} onOpenProfile={onOpenProfile}
displayName={displayName}
{...props} {...props}
{...nameData}
/> />
); );
} else { } else {
return <RemoteUserMediaTile ref={ref} vm={vm} {...props} {...nameData} />; return (
<RemoteUserMediaTile
ref={ref}
vm={vm}
displayName={displayName}
{...props}
/>
);
} }
}, },
); );

View File

@@ -39,7 +39,6 @@ interface Props extends ComponentProps<typeof animated.div> {
videoEnabled: boolean; videoEnabled: boolean;
unencryptedWarning: boolean; unencryptedWarning: boolean;
nameTagLeadingIcon?: ReactNode; nameTagLeadingIcon?: ReactNode;
nameTag: string;
displayName: string; displayName: string;
primaryButton?: ReactNode; primaryButton?: ReactNode;
} }
@@ -58,7 +57,6 @@ export const MediaView = forwardRef<HTMLDivElement, Props>(
videoEnabled, videoEnabled,
unencryptedWarning, unencryptedWarning,
nameTagLeadingIcon, nameTagLeadingIcon,
nameTag,
displayName, displayName,
primaryButton, primaryButton,
...props ...props
@@ -100,7 +98,7 @@ export const MediaView = forwardRef<HTMLDivElement, Props>(
<div className={styles.nameTag}> <div className={styles.nameTag}>
{nameTagLeadingIcon} {nameTagLeadingIcon}
<Text as="span" size="sm" weight="medium" className={styles.name}> <Text as="span" size="sm" weight="medium" className={styles.name}>
{nameTag} {displayName}
</Text> </Text>
{unencryptedWarning && ( {unencryptedWarning && (
<Tooltip <Tooltip

View File

@@ -44,7 +44,7 @@ import {
MediaViewModel, MediaViewModel,
ScreenShareViewModel, ScreenShareViewModel,
UserMediaViewModel, UserMediaViewModel,
useNameData, useDisplayName,
} from "../state/MediaViewModel"; } from "../state/MediaViewModel";
import { useInitial } from "../useInitial"; import { useInitial } from "../useInitial";
import { useMergedRefs } from "../useMergedRefs"; import { useMergedRefs } from "../useMergedRefs";
@@ -60,7 +60,6 @@ interface SpotlightItemBaseProps {
video: TrackReferenceOrPlaceholder; video: TrackReferenceOrPlaceholder;
member: RoomMember | undefined; member: RoomMember | undefined;
unencryptedWarning: boolean; unencryptedWarning: boolean;
nameTag: string;
displayName: string; displayName: string;
} }
@@ -125,7 +124,7 @@ const SpotlightItem = forwardRef<HTMLDivElement, SpotlightItemProps>(
({ vm, targetWidth, targetHeight, intersectionObserver, snap }, theirRef) => { ({ vm, targetWidth, targetHeight, intersectionObserver, snap }, theirRef) => {
const ourRef = useRef<HTMLDivElement | null>(null); const ourRef = useRef<HTMLDivElement | null>(null);
const ref = useMergedRefs(ourRef, theirRef); const ref = useMergedRefs(ourRef, theirRef);
const { displayName, nameTag } = useNameData(vm); const displayName = useDisplayName(vm);
const video = useObservableEagerState(vm.video); const video = useObservableEagerState(vm.video);
const unencryptedWarning = useObservableEagerState(vm.unencryptedWarning); const unencryptedWarning = useObservableEagerState(vm.unencryptedWarning);
@@ -153,7 +152,6 @@ const SpotlightItem = forwardRef<HTMLDivElement, SpotlightItemProps>(
video, video,
member: vm.member, member: vm.member,
unencryptedWarning, unencryptedWarning,
nameTag,
displayName, displayName,
}; };