Bluesky app fork with some witchin' additions 馃挮
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 164 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 {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}