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