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 {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 * as Toast from '#/components/Toast'
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`), {
41 type: 'error',
42 })
43 },
44 })
45
46 const onSelectMessagesFrom = useCallback(
47 (keys: string[]) => {
48 const key = keys[0]
49 if (!key) return
50 updateDeclaration(key as AllowIncoming)
51 },
52 [updateDeclaration],
53 )
54
55 const onSelectSoundSetting = useCallback(
56 (keys: string[]) => {
57 const key = keys[0]
58 if (!key) return
59 setPref('playSoundChat', key === 'enabled')
60 },
61 [setPref],
62 )
63
64 return (
65 <Layout.Screen testID="messagesSettingsScreen">
66 <Layout.Header.Outer>
67 <Layout.Header.BackButton />
68 <Layout.Header.Content>
69 <Layout.Header.TitleText>
70 <Trans>Chat Settings</Trans>
71 </Layout.Header.TitleText>
72 </Layout.Header.Content>
73 <Layout.Header.Slot />
74 </Layout.Header.Outer>
75 <Layout.Content>
76 <View style={[a.p_lg, a.gap_md]}>
77 <Text style={[a.text_lg, a.font_semi_bold]}>
78 <Trans>Allow new messages from</Trans>
79 </Text>
80 <Toggle.Group
81 label={_(msg`Allow new messages from`)}
82 type="radio"
83 values={[
84 (profile?.associated?.chat?.allowIncoming as AllowIncoming) ??
85 'following',
86 ]}
87 onChange={onSelectMessagesFrom}>
88 <View>
89 <Toggle.Item
90 name="all"
91 label={_(msg`Everyone`)}
92 style={[a.justify_between, a.py_sm]}>
93 <Toggle.LabelText>
94 <Trans>Everyone</Trans>
95 </Toggle.LabelText>
96 <Toggle.Radio />
97 </Toggle.Item>
98 <Toggle.Item
99 name="following"
100 label={_(msg`Users I follow`)}
101 style={[a.justify_between, a.py_sm]}>
102 <Toggle.LabelText>
103 <Trans>Users I follow</Trans>
104 </Toggle.LabelText>
105 <Toggle.Radio />
106 </Toggle.Item>
107 <Toggle.Item
108 name="none"
109 label={_(
110 msg({context: 'allow messages from', message: `No one`}),
111 )}
112 style={[a.justify_between, a.py_sm]}>
113 <Toggle.LabelText>
114 <Trans context="allow messages from">No one</Trans>
115 </Toggle.LabelText>
116 <Toggle.Radio />
117 </Toggle.Item>
118 </View>
119 </Toggle.Group>
120 <Admonition type="tip">
121 <Trans>
122 You can continue ongoing conversations regardless of which setting
123 you choose.
124 </Trans>
125 </Admonition>
126 {IS_NATIVE && (
127 <>
128 <Divider style={a.my_md} />
129 <Text style={[a.text_lg, a.font_semi_bold]}>
130 <Trans>Notification Sounds</Trans>
131 </Text>
132 <Toggle.Group
133 label={_(msg`Notification sounds`)}
134 type="radio"
135 values={[preferences.playSoundChat ? 'enabled' : 'disabled']}
136 onChange={onSelectSoundSetting}>
137 <View>
138 <Toggle.Item
139 name="enabled"
140 label={_(msg`Enabled`)}
141 style={[a.justify_between, a.py_sm]}>
142 <Toggle.LabelText>
143 <Trans>Enabled</Trans>
144 </Toggle.LabelText>
145 <Toggle.Radio />
146 </Toggle.Item>
147 <Toggle.Item
148 name="disabled"
149 label={_(msg`Disabled`)}
150 style={[a.justify_between, a.py_sm]}>
151 <Toggle.LabelText>
152 <Trans>Disabled</Trans>
153 </Toggle.LabelText>
154 <Toggle.Radio />
155 </Toggle.Item>
156 </View>
157 </Toggle.Group>
158 </>
159 )}
160 </View>
161 </Layout.Content>
162 </Layout.Screen>
163 )
164}