176 lines
5.9 KiB
TypeScript
176 lines
5.9 KiB
TypeScript
import {useCallback} from 'react'
|
|
import {View} from 'react-native'
|
|
import {msg} from '@lingui/core/macro'
|
|
import {useLingui} from '@lingui/react'
|
|
import {Trans} from '@lingui/react/macro'
|
|
import {type NativeStackScreenProps} from '@react-navigation/native-stack'
|
|
|
|
import {type CommonNavigatorParams} from '#/lib/routes/types'
|
|
import {useUpdateActorDeclaration} from '#/state/queries/messages/actor-declaration'
|
|
import {useProfileQuery} from '#/state/queries/profile'
|
|
import {useSession} from '#/state/session'
|
|
import {atoms as a} from '#/alf'
|
|
import {Admonition} from '#/components/Admonition'
|
|
import {AgeRestrictedScreen} from '#/components/ageAssurance/AgeRestrictedScreen'
|
|
import {useAgeAssuranceCopy} from '#/components/ageAssurance/useAgeAssuranceCopy'
|
|
import {Divider} from '#/components/Divider'
|
|
import * as Toggle from '#/components/forms/Toggle'
|
|
import * as Layout from '#/components/Layout'
|
|
import * as Toast from '#/components/Toast'
|
|
import {Text} from '#/components/Typography'
|
|
import {IS_NATIVE} from '#/env'
|
|
import {useBackgroundNotificationPreferences} from '../../../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider'
|
|
|
|
type AllowIncoming = 'all' | 'none' | 'following'
|
|
|
|
type Props = NativeStackScreenProps<CommonNavigatorParams, 'MessagesSettings'>
|
|
|
|
export function MessagesSettingsScreen(props: Props) {
|
|
const {_} = useLingui()
|
|
const aaCopy = useAgeAssuranceCopy()
|
|
|
|
return (
|
|
<AgeRestrictedScreen
|
|
screenTitle={_(msg`Chat settings`)}
|
|
infoText={aaCopy.chatsInfoText}>
|
|
<MessagesSettingsScreenInner {...props} />
|
|
</AgeRestrictedScreen>
|
|
)
|
|
}
|
|
|
|
export function MessagesSettingsScreenInner({}: Props) {
|
|
const {_} = useLingui()
|
|
const {currentAccount} = useSession()
|
|
const {data: profile} = useProfileQuery({
|
|
did: currentAccount!.did,
|
|
})
|
|
const {preferences, setPref} = useBackgroundNotificationPreferences()
|
|
|
|
const {mutate: updateDeclaration} = useUpdateActorDeclaration({
|
|
onError: () => {
|
|
Toast.show(_(msg`Failed to update settings`), {
|
|
type: 'error',
|
|
})
|
|
},
|
|
})
|
|
|
|
const onSelectMessagesFrom = useCallback(
|
|
(keys: string[]) => {
|
|
const key = keys[0]
|
|
if (!key) return
|
|
updateDeclaration(key as AllowIncoming)
|
|
},
|
|
[updateDeclaration],
|
|
)
|
|
|
|
const onSelectSoundSetting = useCallback(
|
|
(keys: string[]) => {
|
|
const key = keys[0]
|
|
if (!key) return
|
|
setPref('playSoundChat', key === 'enabled')
|
|
},
|
|
[setPref],
|
|
)
|
|
|
|
return (
|
|
<Layout.Screen testID="messagesSettingsScreen">
|
|
<Layout.Header.Outer>
|
|
<Layout.Header.BackButton />
|
|
<Layout.Header.Content>
|
|
<Layout.Header.TitleText>
|
|
<Trans>Chat Settings</Trans>
|
|
</Layout.Header.TitleText>
|
|
</Layout.Header.Content>
|
|
<Layout.Header.Slot />
|
|
</Layout.Header.Outer>
|
|
<Layout.Content>
|
|
<View style={[a.p_lg, a.gap_md]}>
|
|
<Text style={[a.text_lg, a.font_semi_bold]}>
|
|
<Trans>Allow new messages from</Trans>
|
|
</Text>
|
|
<Toggle.Group
|
|
label={_(msg`Allow new messages from`)}
|
|
type="radio"
|
|
values={[
|
|
(profile?.associated?.chat?.allowIncoming as AllowIncoming) ??
|
|
'following',
|
|
]}
|
|
onChange={onSelectMessagesFrom}>
|
|
<View>
|
|
<Toggle.Item
|
|
name="all"
|
|
label={_(msg`Everyone`)}
|
|
style={[a.justify_between, a.py_sm]}>
|
|
<Toggle.LabelText>
|
|
<Trans>Everyone</Trans>
|
|
</Toggle.LabelText>
|
|
<Toggle.Radio />
|
|
</Toggle.Item>
|
|
<Toggle.Item
|
|
name="following"
|
|
label={_(msg`Users I follow`)}
|
|
style={[a.justify_between, a.py_sm]}>
|
|
<Toggle.LabelText>
|
|
<Trans>Users I follow</Trans>
|
|
</Toggle.LabelText>
|
|
<Toggle.Radio />
|
|
</Toggle.Item>
|
|
<Toggle.Item
|
|
name="none"
|
|
label={_(
|
|
msg({context: 'allow messages from', message: `No one`}),
|
|
)}
|
|
style={[a.justify_between, a.py_sm]}>
|
|
<Toggle.LabelText>
|
|
<Trans context="allow messages from">No one</Trans>
|
|
</Toggle.LabelText>
|
|
<Toggle.Radio />
|
|
</Toggle.Item>
|
|
</View>
|
|
</Toggle.Group>
|
|
<Admonition type="tip">
|
|
<Trans>
|
|
You can continue ongoing conversations regardless of which setting
|
|
you choose.
|
|
</Trans>
|
|
</Admonition>
|
|
{IS_NATIVE && (
|
|
<>
|
|
<Divider style={a.my_md} />
|
|
<Text style={[a.text_lg, a.font_semi_bold]}>
|
|
<Trans>Notification Sounds</Trans>
|
|
</Text>
|
|
<Toggle.Group
|
|
label={_(msg`Notification sounds`)}
|
|
type="radio"
|
|
values={[preferences.playSoundChat ? 'enabled' : 'disabled']}
|
|
onChange={onSelectSoundSetting}>
|
|
<View>
|
|
<Toggle.Item
|
|
name="enabled"
|
|
label={_(msg`Enabled`)}
|
|
style={[a.justify_between, a.py_sm]}>
|
|
<Toggle.LabelText>
|
|
<Trans>Enabled</Trans>
|
|
</Toggle.LabelText>
|
|
<Toggle.Radio />
|
|
</Toggle.Item>
|
|
<Toggle.Item
|
|
name="disabled"
|
|
label={_(msg`Disabled`)}
|
|
style={[a.justify_between, a.py_sm]}>
|
|
<Toggle.LabelText>
|
|
<Trans>Disabled</Trans>
|
|
</Toggle.LabelText>
|
|
<Toggle.Radio />
|
|
</Toggle.Item>
|
|
</View>
|
|
</Toggle.Group>
|
|
</>
|
|
)}
|
|
</View>
|
|
</Layout.Content>
|
|
</Layout.Screen>
|
|
)
|
|
}
|