mirror of
https://github.com/suitenumerique/meet.git
synced 2026-08-21 23:57:00 +00:00
48c0cb320e
Introduce a telemetry module that exposes a `reportError` helper. Under the hood it forwards errors to PostHog, but the module is the only place that knows about PostHog. Replace `console.error` calls used for error reporting with `reportError`, so the codebase now goes through a single, consistent API for telemetry. This normalizes how errors are reported and makes it straightforward to swap PostHog for another backend later on, without touching every call site.
98 lines
3.0 KiB
TypeScript
98 lines
3.0 KiB
TypeScript
import { A, Badge, Button, DialogProps, Field, H, P } from '@/primitives'
|
|
import { Trans, useTranslation } from 'react-i18next'
|
|
import { useRoomContext } from '@livekit/components-react'
|
|
import { useUser } from '@/features/auth/api/useUser'
|
|
import { css } from '@/styled-system/css'
|
|
import { TabPanel, TabPanelProps } from '@/primitives/Tabs'
|
|
import { HStack } from '@/styled-system/jsx'
|
|
import { useState } from 'react'
|
|
import { LoginButton } from '@/components/LoginButton'
|
|
import { useRenameParticipant } from '@/features/rooms/api/renameParticipant'
|
|
import { saveUsername } from '@/stores/user'
|
|
import { logout } from '@/features/auth/utils/logout'
|
|
import { useConfig } from '@/api/useConfig'
|
|
import { reportError } from '@/features/analytics/telemetry'
|
|
|
|
export type AccountTabProps = Pick<DialogProps, 'onOpenChange'> &
|
|
Pick<TabPanelProps, 'id'>
|
|
|
|
export const AccountTab = ({ id, onOpenChange }: AccountTabProps) => {
|
|
const { t } = useTranslation('settings')
|
|
const room = useRoomContext()
|
|
const { data } = useConfig()
|
|
const { user, isLoggedIn } = useUser()
|
|
|
|
const { renameParticipant } = useRenameParticipant()
|
|
|
|
const [name, setName] = useState(room?.localParticipant.name ?? '')
|
|
const userDisplay =
|
|
user?.full_name && user?.email
|
|
? `${user.full_name} (${user.email})`
|
|
: user?.email
|
|
|
|
const handleOnSubmit = async () => {
|
|
try {
|
|
if (room) await renameParticipant(name)
|
|
saveUsername(name)
|
|
onOpenChange?.(false) // only close on success
|
|
} catch (error) {
|
|
reportError('generic_failure', error, {
|
|
context: 'rename_participant',
|
|
})
|
|
}
|
|
}
|
|
const handleOnCancel = () => {
|
|
if (onOpenChange) onOpenChange(false)
|
|
}
|
|
|
|
return (
|
|
<TabPanel padding={'md'} flex id={id}>
|
|
<H lvl={2}>{t('account.heading')}</H>
|
|
{(!isLoggedIn || data?.authenticated_users_can_edit_display_name) && (
|
|
<Field
|
|
type="text"
|
|
label={t('account.nameLabel')}
|
|
value={name}
|
|
onChange={setName}
|
|
validate={(value) => {
|
|
return !value ? <p>{t('account.nameError')}</p> : null
|
|
}}
|
|
/>
|
|
)}
|
|
<H lvl={2}>{t('account.authentication')}</H>
|
|
{isLoggedIn ? (
|
|
<>
|
|
<P>
|
|
<Trans
|
|
i18nKey="settings:account.currentlyLoggedAs"
|
|
values={{ user: userDisplay }}
|
|
components={[<Badge key="user-badge" />]}
|
|
/>
|
|
</P>
|
|
<P>
|
|
<A onPress={logout}>{t('logout', { ns: 'global' })}</A>
|
|
</P>
|
|
</>
|
|
) : (
|
|
<>
|
|
<P>{t('account.youAreNotLoggedIn')}</P>
|
|
<LoginButton />
|
|
</>
|
|
)}
|
|
<HStack
|
|
className={css({
|
|
marginTop: 'auto',
|
|
marginLeft: 'auto',
|
|
})}
|
|
>
|
|
<Button variant="secondary" onPress={handleOnCancel}>
|
|
{t('cancel', { ns: 'global' })}
|
|
</Button>
|
|
<Button variant={'primary'} onPress={handleOnSubmit}>
|
|
{t('submit', { ns: 'global' })}
|
|
</Button>
|
|
</HStack>
|
|
</TabPanel>
|
|
)
|
|
}
|