Commit Graph

2209 Commits

Author SHA1 Message Date
lebaudantoine 4b393e28ca ️(frontend) memoize the ActiveSpeaker component
Memoize the ActiveSpeaker component used in the push-to-talk
component so it does not re-render on unrelated parent updates when
its props have not changed.
2026-07-24 18:31:47 +02:00
lebaudantoine 8dc1bacc38 🚚(frontend) move chat-related code into a feature folder
Reorganize all chat-related code elements into a dedicated feature
folder, so chat components, hooks and helpers are grouped together
and easier to locate.
2026-07-24 18:31:47 +02:00
lebaudantoine 97a9735c0b ️(frontend) avoid subscribing to full local participant changes
Subscribing to the whole local participant caused re-renders on
every local participant update, even when the consumer only cared
about a specific attribute.

Narrow the subscription so only the relevant attributes trigger a
re-render.
2026-07-24 18:31:47 +02:00
lebaudantoine d2e13cc826 ️(frontend) push video resolution subscription down the tree
Move the video resolution subscription down into a lower component
so it no longer re-renders the whole Videoconference component on
every resolution change.

The overall approach still needs validation, but this already avoids
the top-level re-render and is a clear improvement over the current
behavior.i
2026-07-24 18:31:47 +02:00
lebaudantoine 183b0fc697 ️(frontend) narrow canPublishTrack subscription to permissions
canPublishTrack was mistakenly subscribing to the whole local
participant changes, so every component using this hook re-rendered
on any local participant update, not only on permission changes.

Fix it to subscribe only to the permission attributes.
2026-07-24 18:31:47 +02:00
lebaudantoine b7be0eabb0 ️(frontend) render full-screen warning only for the local participant
Restrict the full-screen warning to the local participant tile.

Previously, mounting it on every participant tile meant that when
the local participant toggled their camera or microphone, the
warning re-evaluated and triggered a re-render on every tile.
2026-07-24 18:31:47 +02:00
lebaudantoine f21c4c91ed ️(frontend) optimize participant metadata rendering on raised hand
Push state down into the participant metadata subtree so a raised
hand change no longer re-renders the whole metadata block.

Use the children-as-props pattern so only the item actually related
to the raised hand re-renders when its state changes.

This also better encapsulates the color-update logic tied to the
raised-hand state.
2026-07-24 18:31:47 +02:00
lebaudantoine 5f52fa8d8d ️(frontend) minimize observables consumed by useRaisedHandPosition
useRaisedHandPosition is called on every participant tile, so any
unnecessary subscription in it multiplies re-renders across the
whole conference.

Reduce the number of events subscribed to for remote participants
to the strict minimum, while keeping the subscription to the
relevant attributes of the local participant intact.
2026-07-24 18:31:47 +02:00
lebaudantoine 9420fed563 ️(frontend) encapsulate participant metadata in a boundary component
Encapsulate the participant metadata rendering in a clear boundary
component, especially by pushing the raised-hand logic down into a
dedicated child.

This way, when a participant raises their hand, only the child
component re-renders instead of the whole ParticipantTile.
2026-07-24 18:31:47 +02:00
lebaudantoine 4598aafa23 ️(frontend) narrow chat event subscriptions to reduce re-renders
Reduce the set of events the chat subscribes to, keeping only those
that actually affect its rendering.

This avoids frequent re-renders triggered by unrelated events on
the room or participants.
2026-07-24 18:31:47 +02:00
lebaudantoine 94abdfc0f9 ️(frontend) read pinned track imperatively in ParticipantTile
In the participant tile, there is no need to read the pinned track
through a Valtio snapshot, which would trigger a re-render every
time the pinned track changes, for every participant tile.

Switch to an imperative read of the store to avoid these unnecessary
re-renders.
2026-07-24 18:31:47 +02:00
lebaudantoine 56a8f72e39 🚚(frontend) move participant tile components into a feature folder
Reorganize all components related to the participant tile into a
dedicated feature folder, so the code organization is clearer and
related components are grouped together.
2026-07-24 18:31:47 +02:00
lebaudantoine 86fcc2c7fe ♻️(frontend) drop useSettingsDialogs hook
The useSettingsDialogs hook only encapsulated Valtio store
manipulation that should be declared at the module level. Keeping it
as a hook triggered unnecessary re-renders in components that used
it, subscribing to the store.

Remove the hook and use the store actions directly at the module
level.
2026-07-24 18:31:47 +02:00
lebaudantoine 0a0306b0a2 ♻️(frontend) move keyboard shortcut registration to a leaf
Move the keyboard shortcut registration down into the
SettingsDialogProvider leaf component, so shortcut-related
re-renders no longer bubble up and re-render the whole
Videoconference component.
2026-07-24 18:31:47 +02:00
lebaudantoine c00fcc78e1 ️(frontend) narrow participant event subscriptions in admin panel
Reduce the set of participant change events the admin side panel
subscribes to, so it only re-renders on events that actually affect
its display.
2026-07-24 18:31:47 +02:00
lebaudantoine 39a59d1b35 ️(frontend) narrow ParticipantToggle event subscriptions
Reduce the set of events the ParticipantToggle subscribes to, so it
does not re-render on every LocalParticipant event but only on the
ones that actually affect its rendering.
2026-07-24 18:31:47 +02:00
lebaudantoine f4493d412f ♻️(frontend) turn ConnectionObserver hook into a leaf component
Refactor the connection observer, previously a hook consumed inside
the Videoconference component, into a dedicated leaf component in
the tree.

This avoids re-rendering the whole Videoconference component every
time the connection state changes; only the leaf reacts to it.
2026-07-24 18:31:47 +02:00
lebaudantoine e1457604ee ️(frontend) memoize the ParticipantName component
Memoize the ParticipantName component so it does not re-render on
unrelated parent updates when its props have not changed.
2026-07-24 18:31:47 +02:00
lebaudantoine bf6351e838 ️(frontend) memoize the KeyboardShortcutHint component
The KeyboardShortcutHint component only renders a string and has no
reason to re-render on unrelated updates. Memoize it to skip those
re-renders.
2026-07-24 18:31:47 +02:00
lebaudantoine aba5fca655 ️(frontend) memoize the Avatar component
The Avatar component is simple and stateless. Memoize it to avoid
unnecessary re-renders when its props have not changed.
2026-07-24 18:31:47 +02:00
lebaudantoine acb583b14f ️(frontend) narrow chat participant list update events
Reduce the set of events that trigger an update of the participant
list in the chat, keeping only those relevant to display: attribute
and name changes.

This avoids unnecessary re-renders when other, unrelated participant
events fire.
2026-07-24 18:31:47 +02:00
lebaudantoine fb3a54a224 ️(frontend) virtualize chat messages to reduce DOM size
At this stage, the chat is kept mounted in the DOM at all times to
preserve state and keep receiving new messages. As a consequence,
every chat message ends up rendered in the DOM, which can bloat it
significantly in large meetings with hundreds of participants
exchanging messages.

Virtualize the chat message list so only the few messages actually
visible are rendered in the DOM.

The fact that the chat is always mounted in the DOM will be
addressed in a later commit.
2026-07-24 18:31:47 +02:00
lebaudantoine 8cd6496b5b ♻️(frontend) move InviteDialog state down the React tree
The InviteDialog open state was managed very high in the React tree,
which triggered a re-render of the whole conference tree whenever
the dialog was opened or closed.

Push the state down to a narrower component to limit the scope of
re-renders.

Part of a broader effort to isolate as much as possible what should
re-render, so we can then focus on tackling the real performance
issues.
2026-07-24 18:31:47 +02:00
lebaudantoine 63a7de402b ♻️(frontend) extract pinned track a11y announcement into a leaf component
Extract the code responsible for announcing pinned track changes
(for accessibility) into a well-scoped leaf component.

Previously, calling the useScreenReaderAnnounce hook inside
StageLayout triggered a re-render of the whole layout subtree.
Encapsulating the announcement logic in a narrow component keeps
those re-renders local to that leaf.
2026-07-24 18:31:47 +02:00
lebaudantoine f842cc340e ♻️(frontend) vendor pinned track context using a Valtio store
Vendor the pinned track context and its associated hook from
LiveKit, and switch the underlying state management to a Valtio
store.

The LiveKit ContextProvider was injected high in the tree, so any
pinned track change triggered a re-render of a large portion of the
app. With a Valtio store, only the parts of the app that actually
subscribe to the pinned track or need to pin one re-render when
present in the DOM.
2026-07-24 18:31:47 +02:00
lebaudantoine 8c235571eb ♻️(frontend) isolate track rendering in a StageLayout component
Move track manipulation into a leaf component to avoid re-rendering
the whole videoconference tree when a track update occurs.

The new StageLayout component is now responsible for rendering the
video tracks in the relevant layout, while the Videoconference
component keeps the responsibility of building the overall
conference view.

We save re-rendering the ControlBar for every track/layout changes
for example.
2026-07-24 18:31:47 +02:00
lebaudantoine d6f39e602d 🚚(frontend) move focus layout component to the layout feature
Reorganize the codebase so the focus layout component lives in the
layout feature folder, alongside the other layout-related code.
2026-07-24 18:31:47 +02:00
Arnaud Robin 0c0b2f2616 (frontend) add configurable documentation link
Expose a room options Documentation link via FRONTEND_DOCUMENTATION_URL
so deployers can set or hide it.
2026-07-24 18:21:26 +02:00
Florent Chehab a5b79afde1 ⚰️(summary) cleaned tasks failure handling
Code in task failure was assuming that the failure
signal would be called on retry which is not the case.
2026-07-24 12:07:44 +02:00
Florent Chehab 052d3c1b22 (summary) report exception type in failure analytics
We know capture also the exception type that was raised
in failure analytics to provide more insights about what happened.
2026-07-24 10:14:59 +02:00
Florent Chehab dff5aa9575 🐛(summary) properly detect if task will be retried
In previous version, webhook may not be called in case of failure,
because the task wouldn't be actually retried.
We know check the exception raised against the auto_retry for
config.
Analytics capture also happens in case of definitive failure.
2026-07-24 10:02:39 +02:00
Florent Chehab ded93bf24f 🐛(summary) retry on RequestException instead of HTTPError
Request may fail for other reasons than HTTPError (ConnectionError for
instance). This change switches to the more generalized error for the
retry logic on call webhook & transcribe audio
2026-07-24 09:58:58 +02:00
leo 5ba1885411 (transcription) fix broken speaker assignment tests
Fix broken speaker assignement tests following #1522.
2026-07-22 14:23:10 +02:00
snyk-bot 273af221e6 ⬆️(frontend) upgrade livekit-client from 2.19.2 to 2.20.0
Snyk has created this PR to upgrade livekit-client from 2.19.2 to 2.20.0.

See this package in npm:
livekit-client

See this project in Snyk:
https://app.eu.snyk.io/org/lasuite-dinum-default/project/96ea03d8-8d09-493d-86bf-363f274e129e?utm_source=github&utm_medium=referral&page=upgrade-pr
2026-07-21 19:00:04 +02:00
snyk-bot e8d6aba306 ⬆️(frontend) upgrade @tanstack/react-query from 5.101.0 to 5.101.1
Snyk has created this PR to upgrade @tanstack/react-query from 5.101.0 to 5.101.1.

See this package in npm:
@tanstack/react-query

See this project in Snyk:
https://app.eu.snyk.io/org/lasuite-dinum-default/project/96ea03d8-8d09-493d-86bf-363f274e129e?utm_source=github&utm_medium=referral&page=upgrade-pr
2026-07-21 18:41:15 +02:00
snyk-bot 449503208a ⬆️(frontend) upgrade posthog-js from 1.391.2 to 1.395.0
Snyk has created this PR to upgrade posthog-js from 1.391.2 to 1.395.0.

See this package in npm:
posthog-js

See this project in Snyk:
https://app.eu.snyk.io/org/lasuite-dinum-default/project/96ea03d8-8d09-493d-86bf-363f274e129e?utm_source=github&utm_medium=referral&page=upgrade-pr
2026-07-21 18:34:52 +02:00
snyk-bot 7eb3553bea ⬆️(frontend) upgrade i18next from 26.3.1 to 26.3.2
Snyk has created this PR to upgrade i18next from 26.3.1 to 26.3.2.

See this package in npm:
i18next

See this project in Snyk:
https://app.eu.snyk.io/org/lasuite-dinum-default/project/af693e79-8c43-4c09-ab65-60580515c9e8?utm_source=github&utm_medium=referral&page=upgrade-pr
2026-07-21 18:24:25 +02:00
snyk-bot f0356af365 ⬆️(frontend) upgrade @mediapipe/tasks-vision from 0.10.14 to 0.10.35
Snyk has created this PR to upgrade @mediapipe/tasks-vision from 0.10.14 to 0.10.35.

See this package in npm:
@mediapipe/tasks-vision

See this project in Snyk:
https://app.eu.snyk.io/org/lasuite-dinum-default/project/96ea03d8-8d09-493d-86bf-363f274e129e?utm_source=github&utm_medium=referral&page=upgrade-pr
2026-07-21 18:19:26 +02:00
leo 9921ef9d09 🐛(transcription) fix silent fail of speaker assignment
Fix bug introduced by #1362 which caused speaker assignment to
silently fail. Bug was due to change in input variable type.
2026-07-21 18:16:23 +02:00
lebaudantoine 68e999a037 🔖(minor) bump release to 1.24.0 v1.24.0 2026-07-21 18:01:20 +02:00
lebaudantoine 34103bf326 🩹(agents) announce the update of uv.lock via prepare-release script
Announce it among the other files. Minor issue.
2026-07-21 18:01:20 +02:00
lebaudantoine e273ac9e43 🔖(helm) release chart 0.0.27 2026-07-21 17:26:01 +02:00
Florent Chehab adcdbc0695 🐛(summary) whisper call error handling
* Consider that HTTP 400 errors are due to corrupted
audio files by  default.
* Properly reraise the http error otherwise so that
the retry mechanism actually works.
2026-07-21 12:05:06 +02:00
lebaudantoine 8f9008f1e0 🔖(addons) remove the beta tag
Promote the addon to a stable v1 release.
2026-07-21 10:30:00 +02:00
lebaudantoine 9320a1af0c (addon) show add-in tools when creating meetings in shared calendars
The existing manifest was not exposing the add-in tools when
creating a meeting in a shared calendar. Amend the manifest with the
missing instructions so the add-in shows up in that context as well.

Manifest changes generated with Claude's assistance.
2026-07-21 10:30:00 +02:00
David Wagner e3827970c8 (docs) Fix CSS theming env var name
While here, also mention *where* this env var should be set.
2026-07-20 12:38:07 +02:00
lebaudantoine ab707d866f 🩹(backend) fix the mail-builder step in docker
Upgrading mjml now requires node >=22. I forgot to update the step,
responsible to build the mail template in the production image.
2026-07-13 11:32:46 +02:00
snyk-bot dac0b9c000 ⬆️(frontend) upgrade react-aria related dependencies
Initiated by Snyk.
2026-07-13 11:32:46 +02:00
Cyril 53cc8642eb ️(frontend) fix focus restore when switching side panels
restore trigger focus on panel switch while panel remains open
2026-07-11 16:08:57 +02:00
Cyril c8d9d2fea8 ️(frontend) focus side panel container on open
Focus aside on side panel open so screen readers announce the aria-label
2026-07-11 16:08:57 +02:00