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