forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import {useCallback} from 'react'
2import {View} from 'react-native'
3import {msg, Trans} from '@lingui/macro'
4import {useLingui} from '@lingui/react'
5import {type NativeStackScreenProps} from '@react-navigation/native-stack'
6
7import {type CommonNavigatorParams} from '#/lib/routes/types'
8import {useUpdateActorDeclaration} from '#/state/queries/messages/actor-declaration'
9import {useProfileQuery} from '#/state/queries/profile'
10import {useSession} from '#/state/session'
11import * as Toast from '#/view/com/util/Toast'
12import {atoms as a} from '#/alf'
13import {Admonition} from '#/components/Admonition'
14import {Divider} from '#/components/Divider'
15import * as Toggle from '#/components/forms/Toggle'
16import * as Layout from '#/components/Layout'
17import {Text} from '#/components/Typography'
18import {IS_NATIVE} from '#/env'
19import {useBackgroundNotificationPreferences} from '../../../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider'
20
21type AllowIncoming = 'all' | 'none' | 'following'
22
23type Props = NativeStackScreenProps<CommonNavigatorParams, 'MessagesSettings'>
24
25export function MessagesSettingsScreen(props: Props) {
26 return <MessagesSettingsScreenInner {...props} />
27}
28
29export function MessagesSettingsScreenInner({}: Props) {
30 const {_} = useLingui()
31 const {currentAccount} = useSession()
32 const {data: profile} = useProfileQuery({
33 did: currentAccount!.did,
34 })
35 const {preferences, setPref} = useBackgroundNotificationPreferences()
36
37 const {mutate: updateDeclaration} = useUpdateActorDeclaration({
38 onError: () => {
39 Toast.show(_(msg`Failed to update settings`), 'xmark')
40 },
41 })
42
43 const onSelectMessagesFrom = useCallback(
44 (keys: string[]) => {
45 const key = keys[0]
46 if (!key) return
47 updateDeclaration(key as AllowIncoming)
48 },
49 [updateDeclaration],
50 )
51
52 const onSelectSoundSetting = useCallback(
53 (keys: string[]) => {
54 const key = keys[0]
55 if (!key) return
56 setPref('playSoundChat', key === 'enabled')
57 },
58 [setPref],
59 )
60
61 return (
62 <Layout.Screen testID="messagesSettingsScreen">
63 <Layout.Header.Outer>
64 <Layout.Header.BackButton />
65 <Layout.Header.Content>
66 <Layout.Header.TitleText>
67 <Trans>Chat Settings</Trans>
68 </Layout.Header.TitleText>
69 </Layout.Header.Content>
70 <Layout.Header.Slot />
71 </Layout.Header.Outer>
72 <Layout.Content>
73 <View style={[a.p_lg, a.gap_md]}>
74 <Text style={[a.text_lg, a.font_semi_bold]}>
75 <Trans>Allow new messages from</Trans>
76 </Text>
77 <Toggle.Group
78 label={_(msg`Allow new messages from`)}
79 type="radio"
80 values={[
81 (profile?.associated?.chat?.allowIncoming as AllowIncoming) ??
82 'following',
83 ]}
84 onChange={onSelectMessagesFrom}>
85 <View>
86 <Toggle.Item
87 name="all"
88 label={_(msg`Everyone`)}
89 style={[a.justify_between, a.py_sm]}>
90 <Toggle.LabelText>
91 <Trans>Everyone</Trans>
92 </Toggle.LabelText>
93 <Toggle.Radio />
94 </Toggle.Item>
95 <Toggle.Item
96 name="following"
97 label={_(msg`Users I follow`)}
98 style={[a.justify_between, a.py_sm]}>
99 <Toggle.LabelText>
100 <Trans>Users I follow</Trans>
101 </Toggle.LabelText>
102 <Toggle.Radio />
103 </Toggle.Item>
104 <Toggle.Item
105 name="none"
106 label={_(
107 msg({context: 'allow messages from', message: `No one`}),
108 )}
109 style={[a.justify_between, a.py_sm]}>
110 <Toggle.LabelText>
111 <Trans context="allow messages from">No one</Trans>
112 </Toggle.LabelText>
113 <Toggle.Radio />
114 </Toggle.Item>
115 </View>
116 </Toggle.Group>
117 <Admonition type="tip">
118 <Trans>
119 You can continue ongoing conversations regardless of which setting
120 you choose.
121 </Trans>
122 </Admonition>
123 {IS_NATIVE && (
124 <>
125 <Divider style={a.my_md} />
126 <Text style={[a.text_lg, a.font_semi_bold]}>
127 <Trans>Notification Sounds</Trans>
128 </Text>
129 <Toggle.Group
130 label={_(msg`Notification sounds`)}
131 type="radio"
132 values={[preferences.playSoundChat ? 'enabled' : 'disabled']}
133 onChange={onSelectSoundSetting}>
134 <View>
135 <Toggle.Item
136 name="enabled"
137 label={_(msg`Enabled`)}
138 style={[a.justify_between, a.py_sm]}>
139 <Toggle.LabelText>
140 <Trans>Enabled</Trans>
141 </Toggle.LabelText>
142 <Toggle.Radio />
143 </Toggle.Item>
144 <Toggle.Item
145 name="disabled"
146 label={_(msg`Disabled`)}
147 style={[a.justify_between, a.py_sm]}>
148 <Toggle.LabelText>
149 <Trans>Disabled</Trans>
150 </Toggle.LabelText>
151 <Toggle.Radio />
152 </Toggle.Item>
153 </View>
154 </Toggle.Group>
155 </>
156 )}
157 </View>
158 </Layout.Content>
159 </Layout.Screen>
160 )
161}