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

Configure Feed

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

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