diff --git a/src/frontend/src/features/rooms/livekit/components/controls/Participants/ParticipantListItem.tsx b/src/frontend/src/features/rooms/livekit/components/controls/Participants/ParticipantListItem.tsx
new file mode 100644
index 00000000..ed90260b
--- /dev/null
+++ b/src/frontend/src/features/rooms/livekit/components/controls/Participants/ParticipantListItem.tsx
@@ -0,0 +1,63 @@
+import { css } from '@/styled-system/css'
+
+import { HStack } from '@/styled-system/jsx'
+import { Text } from '@/primitives/Text'
+import { useTranslation } from 'react-i18next'
+import { Avatar } from '@/components/Avatar'
+import { getParticipantColor } from '@/features/rooms/utils/getParticipantColor'
+import { Participant } from 'livekit-client'
+import { isLocal } from '@/utils/livekit'
+
+type ParticipantListItemProps = {
+ participant: Participant
+}
+
+export const ParticipantListItem = ({
+ participant,
+}: ParticipantListItemProps) => {
+ const { t } = useTranslation('rooms')
+ const name = participant.name || participant.identity
+
+ return (
+
+
+
+
+ {name}
+
+ {isLocal(participant) && (
+
+ ({t('participants.you')})
+
+ )}
+
+
+ )
+}
diff --git a/src/frontend/src/features/rooms/livekit/components/controls/Participants/ParticipantsList.tsx b/src/frontend/src/features/rooms/livekit/components/controls/Participants/ParticipantsList.tsx
index 0fe88848..dd82ba5c 100644
--- a/src/frontend/src/features/rooms/livekit/components/controls/Participants/ParticipantsList.tsx
+++ b/src/frontend/src/features/rooms/livekit/components/controls/Participants/ParticipantsList.tsx
@@ -3,15 +3,13 @@ import { useParticipants } from '@livekit/components-react'
import { Heading } from 'react-aria-components'
import { Box, Button, Div } from '@/primitives'
-import { HStack, VStack } from '@/styled-system/jsx'
-import { Text, text } from '@/primitives/Text'
+import { text } from '@/primitives/Text'
import { RiCloseLine } from '@remixicon/react'
-import { capitalize } from '@/utils/capitalize'
import { participantsStore } from '@/stores/participants'
import { useTranslation } from 'react-i18next'
import { allParticipantRoomEvents } from '@/features/rooms/livekit/constants/events'
-import { Avatar } from '@/components/Avatar'
-import { getParticipantColor } from '@/features/rooms/utils/getParticipantColor'
+import { ParticipantListItem } from '@/features/rooms/livekit/components/controls/Participants/ParticipantListItem'
+import { VStack } from '@/styled-system/jsx'
// TODO: Optimize rendering performance, especially for longer participant lists, even though they are generally short.
export const ParticipantsList = () => {
@@ -24,18 +22,16 @@ export const ParticipantsList = () => {
updateOnlyOn: allParticipantRoomEvents,
})
- const formattedParticipants = participants.map((participant) => ({
- name: participant.name || participant.identity,
- id: participant.identity,
- color: getParticipantColor(participant),
- }))
-
- const sortedRemoteParticipants = formattedParticipants
+ const sortedRemoteParticipants = participants
.slice(1)
- .sort((a, b) => a.name.localeCompare(b.name))
+ .sort((participantA, participantB) => {
+ const nameA = participantA.name || participantA.identity
+ const nameB = participantB.name || participantB.identity
+ return nameA.localeCompare(nameB)
+ })
- const allParticipants = [
- formattedParticipants[0], // first participant returned by the hook, is always the local one
+ const sortedParticipants = [
+ participants[0], // first participant returned by the hook, is always the local one
...sortedRemoteParticipants,
]
@@ -74,7 +70,7 @@ export const ParticipantsList = () => {
- {participants?.length > 0 && (
+ {sortedParticipants?.length > 0 && (
{
display: 'flex',
})}
>
- {allParticipants.map((participant, index) => (
-
-
-
-
- {capitalize(participant.name)}
-
- {index === 0 && (
-
- ({t('participants.you')})
-
- )}
-
-
+ {sortedParticipants.map((participant) => (
+
))}
)}
diff --git a/src/frontend/src/utils/livekit.ts b/src/frontend/src/utils/livekit.ts
index ae1c6d86..cd37e731 100644
--- a/src/frontend/src/utils/livekit.ts
+++ b/src/frontend/src/utils/livekit.ts
@@ -1,4 +1,10 @@
-import { getBrowser, LogLevel, setLogLevel } from 'livekit-client'
+import {
+ getBrowser,
+ LocalParticipant,
+ LogLevel,
+ Participant,
+ setLogLevel,
+} from 'livekit-client'
export const silenceLiveKitLogs = (shouldSilenceLogs: boolean) => {
setLogLevel(shouldSilenceLogs ? LogLevel.silent : LogLevel.debug)
@@ -15,3 +21,7 @@ export function isChromiumBased(): boolean {
export function isSafari(): boolean {
return getBrowser()?.name === 'Safari'
}
+
+export function isLocal(p: Participant) {
+ return p instanceof LocalParticipant
+}