Skip to content

Commit 5d88c52

Browse files
Half-Shotmgcmfkwp
authored
Support for generic reactions (#2708)
* Initial support for Hand Raise feature Signed-off-by: Milton Moura <[email protected]> * Refactored to use reaction and redaction events Signed-off-by: Milton Moura <[email protected]> * Replacing button svg with raised hand emoji Signed-off-by: Milton Moura <[email protected]> * SpotlightTile should not duplicate the raised hand Signed-off-by: Milton Moura <[email protected]> * Update src/room/useRaisedHands.tsx Element Call recently changed to AGPL-3.0 * Use relations to load existing reactions when joining the call Signed-off-by: Milton Moura <[email protected]> * Links to sha commit of matrix-js-sdk that exposes the call membership event id and refactors some async code Signed-off-by: Milton Moura <[email protected]> * Removing RaiseHand.svg * Check for reaction & redaction capabilities in widget mode Signed-off-by: Milton Moura <[email protected]> * Fix failing GridTile test Signed-off-by: Milton Moura <[email protected]> * Center align hand raise. * Add support for displaying the duration of a raised hand. * Add a sound for when a hand is raised. * Refactor raised hand indicator and add tests. * lint * Refactor into own files. * Redact the right thing. * Tidy up useEffect * Lint tests * Remove extra layer * Add better sound. (woosh) * Add a small mode for spotlight * Fix timestamp calculation on relaod. * Fix call border resizing video * lint * Fix and update tests * Allow timer to be configurable. * Add preferences tab for choosing to enable timer. * Drop border from raised hand icon * Handle cases when a new member event happens. * Prevent infinite loop * Major refactor to support various state problems. * Tidy up and finish test rewrites * Add some explanation comments. * Even more comments. * Use proper duration formatter * Remove rerender * Fix redactions not working because they pick up events in transit. * More tidying * Use deferred value * linting * Add tests for cases where we got a reaction from someone else. * Be even less brittle. * Transpose border to GridTile. * First PoC for reactions * hide menu by default * Add lightbulb. * Add reaction indicator. * Add sounds. * Tidy up + add support for floating emoji. * Linting and general stability improvements. * Subscribe to the ecall reaction event type. * fix import * Center emoji picker * Overflow buttons when screen is too narrow * lint * Add settings for disabling animations / sounds. * Make vertical divider more visually distinct. * Make event listener more resillient. * lint * Fix some tests. * Remove old raised hand component * Add new icon * Update text * Update compound hand raised icon. * Add deer. * Fix case where you could send larger strings as emoji * Const the active time. * Document time in css. * Add rock emoji * Add licence file. * Add type def for custom reaction type. * better reaction description * Factor out reactions test structure to utils file. * Add tests for ReactionToggleButton * Add keyboard shortcuts for reaction sending. * type tidyups * lint * Add tests for ReactionAudioRenderer * lint * prettier * i18n sort * final lint? * Preload reaction sounds to prevent delays. * Update rock sounds * add onclick back * Fix test * lint * simplify * Tweak line height * modal impl * Modal refactor attempts. * Remove closed menu test since we're using Modal. * Swap icon, make mobile view better. * Fix mobile view for emoji picker. * Use Intl.Segmenter * Clear timeouts on component close. * Remove useless useCallback * Use prefers-reduced-motion * Add toggle for raise hand. * Add lower hand text * Add lower motion mode. * Decomplicate className system for Modal * Add error for failured to send reaction. * i18n * Spacing for emoji buttons search * Remove unrequired media query * Fix generic sound not playing. * Clear reactions if we're clearing timeouts. * Fix tests * Relabel lower hand * More translations * Add comments on reaction interface * Move polyfill. * lint * Replace deer sound * Another attempt to fix the sizing of the reactions * cleanup * fix button * fix --------- Signed-off-by: Milton Moura <[email protected]> Co-authored-by: Milton Moura <[email protected]> Co-authored-by: fkwp <[email protected]>
1 parent 5b94dd6 commit 5d88c52

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+2000
-387
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
"@babel/preset-react": "^7.22.15",
2626
"@babel/preset-typescript": "^7.23.0",
2727
"@formatjs/intl-durationformat": "^0.6.1",
28+
"@formatjs/intl-segmenter": "^11.7.3",
2829
"@livekit/components-core": "^0.11.0",
2930
"@livekit/components-react": "^2.0.0",
3031
"@opentelemetry/api": "^1.4.0",
@@ -57,7 +58,7 @@
5758
"@typescript-eslint/eslint-plugin": "^8.0.0",
5859
"@typescript-eslint/parser": "^8.0.0",
5960
"@use-gesture/react": "^10.2.11",
60-
"@vector-im/compound-design-tokens": "^1.0.0",
61+
"@vector-im/compound-design-tokens": "^1.9.1",
6162
"@vector-im/compound-web": "^6.0.0",
6263
"@vitejs/plugin-basic-ssl": "^1.0.1",
6364
"@vitejs/plugin-react": "^4.0.1",

public/locales/en-GB/app.json

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@
44
},
55
"action": {
66
"close": "Close",
7+
"close_search": "Close search",
78
"copy_link": "Copy link",
89
"edit": "Edit",
910
"go": "Go",
1011
"invite": "Invite",
12+
"lower_hand": "Lower hand",
1113
"no": "No",
14+
"open_search": "Open search",
15+
"pick_reaction": "Pick reaction",
16+
"raise_hand": "Raise hand",
17+
"raise_hand_or_send_reaction": "Raise hand or send reaction",
1218
"register": "Register",
1319
"remove": "Remove",
1420
"sign_in": "Sign in",
@@ -55,8 +61,10 @@
5561
"password": "Password",
5662
"preferences": "Preferences",
5763
"profile": "Profile",
58-
"raise_hand": "Raise hand",
64+
"reaction": "Reaction",
65+
"search": "Search",
5966
"settings": "Settings",
67+
"something_went_wrong": "Something went wrong",
6068
"unencrypted": "Not encrypted",
6169
"username": "Username",
6270
"video": "Video"
@@ -120,6 +128,7 @@
120128
"rageshake_sending": "Sending…",
121129
"rageshake_sending_logs": "Sending debug logs…",
122130
"rageshake_sent": "Thanks!",
131+
"reaction_search": "Search reactions…",
123132
"recaptcha_caption": "This site is protected by ReCAPTCHA and the Google <2>Privacy Policy</2> and <6>Terms of Service</6> apply.<9></9>By clicking \"Register\", you agree to our <12>End User Licensing Agreement (EULA)</12>",
124133
"recaptcha_dismissed": "Recaptcha dismissed",
125134
"recaptcha_not_loaded": "Recaptcha not loaded",
@@ -147,6 +156,13 @@
147156
"feedback_tab_title": "Feedback",
148157
"more_tab_title": "More",
149158
"opt_in_description": "<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.",
159+
"preferences_tab": {
160+
"reactions_play_sound_description": "Play a sound effect when anyone sends a reaction into a call.",
161+
"reactions_play_sound_label": "Play reaction sounds",
162+
"reactions_show_description": "Show reactions",
163+
"reactions_show_label": "Show an animation when anyone sends a reaction.",
164+
"reactions_title": "Reactions"
165+
},
150166
"preferences_tab_body": "Here you can configure extra options for an improved experience",
151167
"preferences_tab_h4": "Preferences",
152168
"preferences_tab_show_hand_raised_timer_description": "Show a timer when a participant raises their hand",

src/@types/matrix-js-sdk.d.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
Copyright 2024 New Vector Ltd.
3+
4+
SPDX-License-Identifier: AGPL-3.0-only
5+
Please see LICENSE in the repository root for full details.
6+
*/
7+
8+
import {
9+
ElementCallReactionEventType,
10+
ECallReactionEventContent,
11+
} from "../reactions";
12+
13+
// Extend Matrix JS SDK types via Typescript declaration merging to support unspecced event fields and types
14+
declare module "matrix-js-sdk/src/types" {
15+
export interface TimelineEvents {
16+
[ElementCallReactionEventType]: ECallReactionEventContent;
17+
}
18+
}

src/Modal.tsx

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,21 @@ import { useMediaQuery } from "./useMediaQuery";
2727

2828
export interface Props {
2929
title: string;
30+
/**
31+
* Hide the modal header. Used for smaller popups where the context is readily apparent.
32+
* A title should still be specified for users using assistive technology.
33+
*/
34+
hideHeader?: boolean;
3035
children: ReactNode;
3136
className?: string;
37+
/**
38+
* Class name to be used when in drawer mode (touchscreen).
39+
*/
40+
classNameDrawer?: string;
41+
/**
42+
* Class name to be used when in modal mode (desktop).
43+
*/
44+
classNameModal?: string;
3245
/**
3346
* The controlled open state of the modal.
3447
*/
@@ -54,8 +67,11 @@ export interface Props {
5467
*/
5568
export const Modal: FC<Props> = ({
5669
title,
70+
hideHeader,
5771
children,
5872
className,
73+
classNameDrawer,
74+
classNameModal,
5975
open,
6076
onDismiss,
6177
tabbed,
@@ -84,6 +100,7 @@ export const Modal: FC<Props> = ({
84100
<Drawer.Content
85101
className={classNames(
86102
className,
103+
classNameDrawer,
87104
overlayStyles.overlay,
88105
styles.modal,
89106
styles.drawer,
@@ -109,6 +126,28 @@ export const Modal: FC<Props> = ({
109126
</Drawer.Root>
110127
);
111128
} else {
129+
const titleNode = (
130+
<DialogTitle asChild>
131+
<Heading as="h2" weight="semibold" size="md">
132+
{title}
133+
</Heading>
134+
</DialogTitle>
135+
);
136+
const header = (
137+
<div className={styles.header}>
138+
{titleNode}
139+
{onDismiss !== undefined && (
140+
<DialogClose
141+
className={styles.close}
142+
data-testid="modal_close"
143+
aria-label={t("action.close")}
144+
>
145+
<CloseIcon width={20} height={20} />
146+
</DialogClose>
147+
)}
148+
</div>
149+
);
150+
112151
return (
113152
<DialogRoot open={open} onOpenChange={onOpenChange}>
114153
<DialogPortal>
@@ -126,6 +165,7 @@ export const Modal: FC<Props> = ({
126165
<Glass
127166
className={classNames(
128167
className,
168+
classNameModal,
129169
overlayStyles.overlay,
130170
overlayStyles.animate,
131171
styles.modal,
@@ -134,22 +174,10 @@ export const Modal: FC<Props> = ({
134174
)}
135175
>
136176
<div className={styles.content}>
137-
<div className={styles.header}>
138-
<DialogTitle asChild>
139-
<Heading as="h2" weight="semibold" size="md">
140-
{title}
141-
</Heading>
142-
</DialogTitle>
143-
{onDismiss !== undefined && (
144-
<DialogClose
145-
className={styles.close}
146-
data-testid="modal_close"
147-
aria-label={t("action.close")}
148-
>
149-
<CloseIcon width={20} height={20} />
150-
</DialogClose>
151-
)}
152-
</div>
177+
{!hideHeader ? header : null}
178+
{hideHeader ? (
179+
<VisuallyHidden asChild>{titleNode}</VisuallyHidden>
180+
) : null}
153181
<div className={styles.body}>{children}</div>
154182
</div>
155183
</Glass>

src/button/RaisedHandToggleButton.tsx

Lines changed: 0 additions & 126 deletions
This file was deleted.

0 commit comments

Comments
 (0)