* fix(list view): avoid re-create `onFocus` function at each render of the child items * fix(room list): update `onFocus` signature * fix(member list): update `onFocus` signature * fix(room list): avoid re-render at the beginning and end of the scroll * test(room list): remove scrolling test and props * test(member list): update member tile view tests * test(room list): update `ListView` focus test * test(member list): add `onFocus` test for member list tile
52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
/*
|
|
Copyright 2024 New Vector Ltd.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
|
|
Please see LICENSE files in the repository root for full details.
|
|
*/
|
|
|
|
import React, { type JSX } from "react";
|
|
|
|
import { useThreePidTileViewModel } from "../../../../viewmodels/memberlist/tiles/ThreePidTileViewModel";
|
|
import { type ThreePIDInvite } from "../../../../../models/rooms/ThreePIDInvite";
|
|
import BaseAvatar from "../../../avatars/BaseAvatar";
|
|
import { MemberTileView } from "./common/MemberTileView";
|
|
import { InvitedIconView } from "./common/InvitedIconView";
|
|
import { type MemberWithSeparator } from "../../../../viewmodels/memberlist/MemberListViewModel";
|
|
|
|
interface Props {
|
|
/**
|
|
* Needed for `onFocus`
|
|
*/
|
|
item: MemberWithSeparator;
|
|
threePidInvite: ThreePIDInvite;
|
|
memberIndex: number;
|
|
memberCount: number;
|
|
focused?: boolean;
|
|
tabIndex?: number;
|
|
onFocus: (item: MemberWithSeparator, e: React.FocusEvent) => void;
|
|
}
|
|
|
|
export function ThreePidInviteTileView(props: Props): JSX.Element {
|
|
const vm = useThreePidTileViewModel(props);
|
|
const av = <BaseAvatar name={vm.name} size="32px" aria-hidden="true" />;
|
|
const iconJsx = <InvitedIconView isThreePid={true} />;
|
|
const name = vm.name;
|
|
|
|
return (
|
|
<MemberTileView
|
|
nameJsx={name}
|
|
avatarJsx={av}
|
|
onClick={vm.onClick}
|
|
memberIndex={props.memberIndex}
|
|
memberCount={props.memberCount}
|
|
ariaLabel={name}
|
|
userLabel={vm.userLabel}
|
|
iconJsx={iconJsx}
|
|
focused={props.focused}
|
|
tabIndex={props.tabIndex}
|
|
onFocus={(e) => props.onFocus(props.item, e)}
|
|
/>
|
|
);
|
|
}
|