Bluesky app fork with some witchin' additions 馃挮
at main 162 lines 5.7 kB view raw
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}