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

Configure Feed

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

at 6982eb4fb4d44105dc8b44e898d452d4e5d32c82 159 lines 5.5 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={_(msg`No one`)} 107 style={[a.justify_between, a.py_sm]}> 108 <Toggle.LabelText> 109 <Trans>No one</Trans> 110 </Toggle.LabelText> 111 <Toggle.Radio /> 112 </Toggle.Item> 113 </View> 114 </Toggle.Group> 115 <Admonition type="tip"> 116 <Trans> 117 You can continue ongoing conversations regardless of which setting 118 you choose. 119 </Trans> 120 </Admonition> 121 {IS_NATIVE && ( 122 <> 123 <Divider style={a.my_md} /> 124 <Text style={[a.text_lg, a.font_semi_bold]}> 125 <Trans>Notification Sounds</Trans> 126 </Text> 127 <Toggle.Group 128 label={_(msg`Notification sounds`)} 129 type="radio" 130 values={[preferences.playSoundChat ? 'enabled' : 'disabled']} 131 onChange={onSelectSoundSetting}> 132 <View> 133 <Toggle.Item 134 name="enabled" 135 label={_(msg`Enabled`)} 136 style={[a.justify_between, a.py_sm]}> 137 <Toggle.LabelText> 138 <Trans>Enabled</Trans> 139 </Toggle.LabelText> 140 <Toggle.Radio /> 141 </Toggle.Item> 142 <Toggle.Item 143 name="disabled" 144 label={_(msg`Disabled`)} 145 style={[a.justify_between, a.py_sm]}> 146 <Toggle.LabelText> 147 <Trans>Disabled</Trans> 148 </Toggle.LabelText> 149 <Toggle.Radio /> 150 </Toggle.Item> 151 </View> 152 </Toggle.Group> 153 </> 154 )} 155 </View> 156 </Layout.Content> 157 </Layout.Screen> 158 ) 159}