🚸(frontend) explain duplicate identity disconnect on feedback page

Add context to feedback page when user is disconnected for joining with
same identity, which is forbidden by LiveKit. Improves user understanding
of disconnection reasons.
This commit is contained in:
lebaudantoine
2025-07-17 13:36:32 +02:00
parent dac6bfe142
commit d068558c8f
7 changed files with 34 additions and 7 deletions

View File

@@ -127,7 +127,9 @@ export const Conference = ({
})} })}
onDisconnected={(e) => { onDisconnected={(e) => {
if (e == DisconnectReason.CLIENT_INITIATED) { if (e == DisconnectReason.CLIENT_INITIATED) {
navigateTo('feedback') navigateTo('feedback', { duplicateIdentity: false })
} else if (e == DisconnectReason.DUPLICATE_IDENTITY) {
navigateTo('feedback', { duplicateIdentity: true })
} }
}} }}
> >

View File

@@ -3,7 +3,7 @@ import { Button } from '@/primitives'
import { Screen } from '@/layout/Screen' import { Screen } from '@/layout/Screen'
import { Center, HStack, styled, VStack } from '@/styled-system/jsx' import { Center, HStack, styled, VStack } from '@/styled-system/jsx'
import { Rating } from '@/features/rooms/components/Rating.tsx' import { Rating } from '@/features/rooms/components/Rating.tsx'
import { useLocation } from 'wouter' import { useLocation, useSearchParams } from 'wouter'
// fixme - duplicated with home, refactor in a proper style // fixme - duplicated with home, refactor in a proper style
const Heading = styled('h1', { const Heading = styled('h1', {
@@ -16,17 +16,25 @@ const Heading = styled('h1', {
lineHeight: '2.5rem', lineHeight: '2.5rem',
letterSpacing: '0', letterSpacing: '0',
paddingBottom: '2rem', paddingBottom: '2rem',
textAlign: 'center',
}, },
}) })
export const FeedbackRoute = () => { export const FeedbackRoute = () => {
const { t } = useTranslation('rooms') const { t } = useTranslation('rooms')
const [, setLocation] = useLocation() const [, setLocation] = useLocation()
const [searchParams] = useSearchParams()
return ( return (
<Screen layout="centered" footer={false}> <Screen layout="centered" footer={false}>
<Center> <Center>
<VStack> <VStack>
<Heading>{t('feedback.heading')}</Heading> <Heading>
{t(
`feedback.heading.${searchParams.get('duplicateIdentity') ? 'duplicateIdentity' : 'normal'}`
)}
</Heading>
<HStack> <HStack>
<Button variant="secondary" onPress={() => window.history.back()}> <Button variant="secondary" onPress={() => window.history.back()}>
{t('feedback.back')} {t('feedback.back')}

View File

@@ -1,6 +1,9 @@
{ {
"feedback": { "feedback": {
"heading": "Sie haben das Meeting verlassen", "heading": {
"normal": "Sie haben das Meeting verlassen",
"duplicateIdentity": "Sie haben dem Meeting von einem anderen Gerät aus beigetreten"
},
"home": "Zur Startseite zurückkehren", "home": "Zur Startseite zurückkehren",
"back": "Dem Meeting erneut beitreten" "back": "Dem Meeting erneut beitreten"
}, },

View File

@@ -1,6 +1,9 @@
{ {
"feedback": { "feedback": {
"heading": "You have left the meeting", "heading": {
"normal": "You have left the meeting",
"duplicateIdentity": "You have joined the meeting from another device"
},
"home": "Return to home", "home": "Return to home",
"back": "Rejoin the meeting" "back": "Rejoin the meeting"
}, },

View File

@@ -1,6 +1,9 @@
{ {
"feedback": { "feedback": {
"heading": "Vous avez quitté la réunion", "heading": {
"normal": "Vous avez quitté la réunion",
"duplicateIdentity": "Vous avez rejoint la réunion depuis un autre appareil"
},
"home": "Retourner à l'accueil", "home": "Retourner à l'accueil",
"back": "Réintégrer la réunion" "back": "Réintégrer la réunion"
}, },

View File

@@ -1,6 +1,9 @@
{ {
"feedback": { "feedback": {
"heading": "Je hebt de vergadering verlaten", "heading": {
"normal": "Je hebt de vergadering verlaten",
"duplicateIdentity": "U heeft de vergadering via een ander apparaat geopend"
},
"home": "Keer terug naar het hoofdscherm", "home": "Keer terug naar het hoofdscherm",
"back": "Sluit weer bij de vergadering aan" "back": "Sluit weer bij de vergadering aan"
}, },

View File

@@ -43,6 +43,11 @@ export const routes: Record<
feedback: { feedback: {
name: 'feedback', name: 'feedback',
path: '/feedback', path: '/feedback',
to: (params: { duplicateIdentity?: false }) =>
'/feedback' +
(params.duplicateIdentity
? `?duplicateIdentity=${params?.duplicateIdentity}`
: ''),
Component: FeedbackRoute, Component: FeedbackRoute,
}, },
legalTerms: { legalTerms: {