Files
ThreadNet-Web/src/components/views/elements/FacePile.tsx
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

86 lines
2.6 KiB
TypeScript
Raw Normal View History

2021-03-25 16:15:34 +00:00
/*
2024-09-09 14:57:16 +01:00
Copyright 2024 New Vector Ltd.
2021-03-25 16:15:34 +00:00
Copyright 2021 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
2024-09-09 14:57:16 +01:00
Please see LICENSE files in the repository root for full details.
2021-03-25 16:15:34 +00:00
*/
2025-02-05 13:25:06 +00:00
import React, { type FC, type HTMLAttributes, type ReactNode } from "react";
import { type RoomMember } from "matrix-js-sdk/src/matrix";
2023-08-30 18:55:02 +01:00
import { AvatarStack, Tooltip } from "@vector-im/compound-web";
import classNames from "classnames";
2021-03-25 16:15:34 +00:00
import MemberAvatar from "../avatars/MemberAvatar";
2025-02-05 13:25:06 +00:00
import AccessibleButton, { type ButtonEvent } from "./AccessibleButton";
import { useToggled } from "../rooms/RoomHeader/toggle/useToggled";
import { RightPanelPhases } from "../../../stores/right-panel/RightPanelStorePhases";
2021-03-25 16:15:34 +00:00
interface IProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange"> {
2022-04-20 11:03:33 -04:00
members: RoomMember[];
size: string;
2022-04-20 11:03:33 -04:00
overflow: boolean;
2023-08-30 18:55:02 +01:00
tooltipLabel?: string;
tooltipShortcut?: string;
2022-04-20 11:03:33 -04:00
children?: ReactNode;
viewUserOnClick?: boolean;
onClick?: (e: ButtonEvent) => void | Promise<void>;
2021-03-25 16:15:34 +00:00
}
/**
* A component which displays a list of avatars in a row, with a tooltip showing the names of the users.
*
* Any additional props, not named explicitly here, are passed to the underlying {@link AccessibleButton}.
*/
const FacePile: FC<IProps> = ({
members,
size,
overflow,
tooltipLabel,
tooltipShortcut,
children,
viewUserOnClick = true,
onClick,
...props
}) => {
2022-04-20 11:03:33 -04:00
const faces = members.map(
2023-08-30 18:55:02 +01:00
tooltipLabel
? (m) => <MemberAvatar key={m.userId} member={m} size={size} hideTitle />
2022-05-04 17:02:06 -04:00
: (m) => (
<Tooltip key={m.userId} label={m.name} caption={tooltipShortcut}>
<MemberAvatar member={m} size={size} viewUserOnClick={!onClick && viewUserOnClick} hideTitle />
2023-08-30 18:55:02 +01:00
</Tooltip>
2022-04-20 11:03:33 -04:00
),
);
2022-04-20 11:03:33 -04:00
const pileContents = (
<>
{faces}
2023-09-22 16:31:52 +01:00
{overflow ? <span className="mx_FacePile_more" /> : null}
2022-04-20 11:03:33 -04:00
</>
);
2021-04-22 08:13:03 +01:00
const toggled = useToggled(RightPanelPhases.MemberList);
const classes = classNames({
mx_FacePile: true,
mx_FacePile_toggled: toggled,
});
2023-08-30 18:55:02 +01:00
const content = (
<AccessibleButton {...props} className={classes} onClick={onClick ?? null}>
<AvatarStack>{pileContents}</AvatarStack>
{children}
</AccessibleButton>
);
2023-08-30 18:55:02 +01:00
return tooltipLabel ? (
<Tooltip label={tooltipLabel} caption={tooltipShortcut}>
2023-08-30 18:55:02 +01:00
{content}
</Tooltip>
) : (
content
);
2021-03-25 16:15:34 +00:00
};
export default FacePile;