Add reaction indicator.

This commit is contained in:
Half-Shot
2024-11-01 14:34:33 +00:00
parent 80b40b6b00
commit edc4142fb1
4 changed files with 62 additions and 21 deletions

View File

@@ -11,6 +11,7 @@ import "@formatjs/intl-durationformat/polyfill";
import { DurationFormat } from "@formatjs/intl-durationformat";
import styles from "./RaisedHandIndicator.module.css";
import { ReactionIndicator } from "./ReactionIndicator";
const durationFormatter = new DurationFormat(undefined, {
minutesDisplay: "always",
@@ -54,22 +55,9 @@ export function RaisedHandIndicator({
if (raisedHandTime) {
return (
<div
className={classNames(styles.raisedHandWidget, {
[styles.raisedHandWidgetLarge]: !minature,
})}
>
<div
className={classNames(styles.raisedHand, {
[styles.raisedHandLarge]: !minature,
})}
>
<span role="img" aria-label="raised hand">
</span>
</div>
<ReactionIndicator emoji="✋" minature={minature}>
{showTimer && <p>{raisedHandDuration}</p>}
</div>
</ReactionIndicator>
);
}

View File

@@ -0,0 +1,40 @@
/*
Copyright 2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
*/
import { PropsWithChildren, ReactNode } from "react";
import classNames from "classnames";
import "@formatjs/intl-durationformat/polyfill";
import styles from "./RaisedHandIndicator.module.css";
export function ReactionIndicator({
emoji,
minature,
children,
}: PropsWithChildren<{
minature?: boolean;
emoji: string;
}>): ReactNode {
return (
<div
className={classNames(styles.raisedHandWidget, {
[styles.raisedHandWidgetLarge]: !minature,
})}
>
<div
className={classNames(styles.raisedHand, {
[styles.raisedHandLarge]: !minature,
})}
>
<span role="img" aria-label="raised hand">
{emoji}
</span>
</div>
{children}
</div>
);
}

View File

@@ -170,3 +170,7 @@ unconditionally select the container so we can use cqmin units */
.fg > button:first-of-type {
grid-area: button;
}
.reactionSet {
display: flex;
}

View File

@@ -20,6 +20,7 @@ import { Avatar } from "../Avatar";
import { RaisedHandIndicator } from "../reactions/RaisedHandIndicator";
import { showHandRaisedTimer, useSetting } from "../settings/settings";
import { ReactionOption } from "../reactions";
import { ReactionIndicator } from "../reactions/ReactionIndicator";
interface Props extends ComponentProps<typeof animated.div> {
className?: string;
@@ -96,15 +97,23 @@ export const MediaView = forwardRef<HTMLDivElement, Props>(
)}
</div>
<div className={styles.fg}>
<RaisedHandIndicator
raisedHandTime={raisedHandTime}
minature={avatarSize < 96}
showTimer={handRaiseTimerVisible}
/>
<div className={styles.reactionSet}>
<RaisedHandIndicator
raisedHandTime={raisedHandTime}
minature={avatarSize < 96}
showTimer={handRaiseTimerVisible}
/>
{currentReaction && (
<ReactionIndicator
minature={avatarSize < 96}
emoji={currentReaction.emoji}
/>
)}
</div>
<div className={styles.nameTag}>
{nameTagLeadingIcon}
<Text as="span" size="sm" weight="medium" className={styles.name}>
{displayName} {currentReaction?.emoji ?? ""}
{displayName}
</Text>
{unencryptedWarning && (
<Tooltip