Show your own name on your tile
Instead of the word "You".
This commit is contained in:
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user