Bluesky app fork with some witchin' additions 💫 witchsky.app
bluesky fork client
117
fork

Configure Feed

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

refactor: Runes settings and replace Other Additions with Extra

- updated toggles in Appearance, Display, Extra, and Impressions settings to use (updated) icons
- update custom post phrase dialog inputs to use defaultValue so editing is easier
- move around some settings
- automatically reload the app when toggling the declaration of default app labelers

+321 -287
+4 -4
src/Navigation.tsx
··· 131 131 import {RunesSettingsScreen} from '#/screens/Settings/RunesSettings' 132 132 import {RunesBadgesSettingsScreen} from '#/screens/Settings/RunesSettings/BadgesSettings' 133 133 import {RunesDisplaySettingsScreen} from '#/screens/Settings/RunesSettings/DisplaySettings' 134 + import {RunesExtraSettingsScreen} from '#/screens/Settings/RunesSettings/ExtraSettings' 134 135 import {RunesImpressionsSettingsScreen} from '#/screens/Settings/RunesSettings/ImpressionsSettings' 135 136 import {RunesInfrastructureSettingsScreen} from '#/screens/Settings/RunesSettings/InfrastructureSettings' 136 137 import {RunesMenusSettingsScreen} from '#/screens/Settings/RunesSettings/MenusSettings' 137 - import {RunesOtherAdditionsSettingsScreen} from '#/screens/Settings/RunesSettings/OtherAdditionsSettings' 138 138 import {RunesUsabilitySettingsScreen} from '#/screens/Settings/RunesSettings/UsabilitySettings' 139 139 import {SettingsScreen} from '#/screens/Settings/Settings' 140 140 import {ThreadPreferencesScreen} from '#/screens/Settings/ThreadPreferences' ··· 463 463 options={{title: title(msg`Infrastructure`), requireAuth: true}} 464 464 /> 465 465 <Stack.Screen 466 - name="RunesOtherAdditionsSettings" 467 - getComponent={() => RunesOtherAdditionsSettingsScreen} 468 - options={{title: title(msg`Other additions`), requireAuth: true}} 466 + name="RunesExtraSettings" 467 + getComponent={() => RunesExtraSettingsScreen} 468 + options={{title: title(msg`Extra settings`), requireAuth: true}} 469 469 /> 470 470 <Stack.Screen 471 471 name="AppearanceSettings"
+1 -1
src/lib/routes/types.ts
··· 58 58 RunesUsabilitySettings: undefined 59 59 RunesDisplaySettings: undefined 60 60 RunesInfrastructureSettings: undefined 61 - RunesOtherAdditionsSettings: undefined 61 + RunesExtraSettings: undefined 62 62 AccountSettings: undefined 63 63 AutomationLabelSettings: undefined 64 64 PetLabelSettings: undefined
+1 -1
src/routes.ts
··· 55 55 RunesUsabilitySettings: '/settings/runes/usability', 56 56 RunesDisplaySettings: '/settings/runes/display', 57 57 RunesInfrastructureSettings: '/settings/runes/infrastructure', 58 - RunesOtherAdditionsSettings: '/settings/runes/other-additions', 58 + RunesExtraSettings: '/settings/runes/extra', 59 59 AppearanceSettings: '/settings/appearance', 60 60 AppearanceColorThemeSettings: '/settings/appearance/color-theme', 61 61 SavedFeeds: '/settings/saved-feeds',
+36 -42
src/screens/Settings/AppearanceSettings.tsx
··· 28 28 import {type Alf, atoms as a, native, useAlf, useTheme} from '#/alf' 29 29 import * as SegmentedControl from '#/components/forms/SegmentedControl' 30 30 import * as Toggle from '#/components/forms/Toggle' 31 - import {Circle_And_Square_Stroke1_Corner0_Rounded_Filled as SquareIcon} from '#/components/icons/CircleAndSquare' 32 31 import {ColorPalette_Stroke2_Corner0_Rounded as ColorPaletteIcon} from '#/components/icons/ColorPalette' 33 32 import {type Props as SVGIconProps} from '#/components/icons/common' 34 33 import {Moon_Stroke2_Corner0_Rounded as MoonIcon} from '#/components/icons/Moon' 34 + import {Person_Stroke2_Corner0_Rounded as PersonIcon} from '#/components/icons/Person' 35 35 import {Phone_Stroke2_Corner0_Rounded as PhoneIcon} from '#/components/icons/Phone' 36 36 import {Sparkle_Stroke2_Corner0_Rounded as SparkleIcon} from '#/components/icons/Sparkle' 37 37 import {TextSize_Stroke2_Corner0_Rounded as TextSize} from '#/components/icons/TextSize' 38 38 import {TitleCase_Stroke2_Corner0_Rounded as Aa} from '#/components/icons/TitleCase' 39 + import {Window_Stroke2_Corner2_Rounded as SquareIcon} from '#/components/icons/Window' 39 40 import * as Layout from '#/components/Layout' 40 41 import {Text} from '#/components/Typography' 41 42 import {IS_ANDROID, IS_INTERNAL, IS_NATIVE} from '#/env' ··· 214 215 215 216 <SettingsList.Divider /> 216 217 217 - <SettingsList.Group contentContainerStyle={[a.gap_sm]}> 218 - <SettingsList.ItemIcon icon={SparkleIcon} /> 219 - <SettingsList.ItemText> 220 - <Trans>Logo</Trans> 221 - </SettingsList.ItemText> 222 - <Toggle.Item 223 - name="kawaii_mode" 224 - label={_(msg`Enable kawaii logo`)} 225 - value={kawaiiMode} 226 - onChange={value => setKawaiiMode(value)} 227 - style={[a.w_full]}> 228 - <Toggle.LabelText style={[a.flex_1]}> 218 + <Toggle.Item 219 + name="kawaii_mode" 220 + label={_(msg`Enable kawaii logo`)} 221 + value={kawaiiMode} 222 + onChange={value => setKawaiiMode(value)}> 223 + <SettingsList.Item> 224 + <SettingsList.ItemIcon icon={SparkleIcon} /> 225 + <SettingsList.ItemText> 229 226 <Trans>Enable kawaii logo</Trans> 230 - </Toggle.LabelText> 227 + </SettingsList.ItemText> 231 228 <Toggle.Platform /> 232 - </Toggle.Item> 233 - </SettingsList.Group> 234 - 235 - <SettingsList.Group contentContainerStyle={[a.gap_sm]}> 236 - <SettingsList.ItemIcon icon={SquareIcon} /> 237 - <SettingsList.ItemText> 238 - <Trans>Shapes</Trans> 239 - </SettingsList.ItemText> 240 - <Toggle.Item 241 - name="enable_square_avatars" 242 - label={_(msg`Enable square avatars`)} 243 - value={enableSquareAvatars} 244 - onChange={value => setEnableSquareAvatars(value)} 245 - style={[a.w_full]}> 246 - <Toggle.LabelText style={[a.flex_1]}> 229 + </SettingsList.Item> 230 + </Toggle.Item> 231 + <Toggle.Item 232 + name="enable_square_avatars" 233 + label={_(msg`Enable square avatars`)} 234 + value={enableSquareAvatars} 235 + onChange={value => setEnableSquareAvatars(value)}> 236 + <SettingsList.Item> 237 + <SettingsList.ItemIcon icon={PersonIcon} /> 238 + <SettingsList.ItemText> 247 239 <Trans>Enable square avatars</Trans> 248 - </Toggle.LabelText> 240 + </SettingsList.ItemText> 249 241 <Toggle.Platform /> 250 - </Toggle.Item> 251 - 252 - <Toggle.Item 253 - name="enable_square_buttons" 254 - label={_(msg`Enable square buttons`)} 255 - value={enableSquareButtons} 256 - onChange={value => setEnableSquareButtons(value)} 257 - style={[a.w_full]}> 258 - <Toggle.LabelText style={[a.flex_1]}> 242 + </SettingsList.Item> 243 + </Toggle.Item> 244 + <Toggle.Item 245 + name="enable_square_buttons" 246 + label={_(msg`Enable square buttons`)} 247 + value={enableSquareButtons} 248 + onChange={value => setEnableSquareButtons(value)}> 249 + <SettingsList.Item> 250 + <SettingsList.ItemIcon icon={SquareIcon} /> 251 + <SettingsList.ItemText> 259 252 <Trans>Enable square buttons</Trans> 260 - </Toggle.LabelText> 253 + </SettingsList.ItemText> 261 254 <Toggle.Platform /> 262 - </Toggle.Item> 263 - </SettingsList.Group> 255 + </SettingsList.Item> 256 + </Toggle.Item> 257 + 264 258 {IS_NATIVE && IS_INTERNAL && ( 265 259 <> 266 260 <SettingsList.Divider />
+12 -22
src/screens/Settings/RunesSettings/BadgesSettings.tsx
··· 51 51 52 52 return ( 53 53 <RunesScreenLayout titleText={l`Badges`}> 54 - <SettingsList.Group contentContainerStyle={[a.gap_sm]}> 55 - <SettingsList.ItemIcon icon={VerifiedIcon} /> 56 - <SettingsList.ItemText> 57 - <Trans>Verification</Trans> 58 - </SettingsList.ItemText> 59 - <Toggle.Item 60 - name="custom_verifications" 61 - label={l`Select your own set of trusted verifiers, and operate as a verifier`} 62 - value={deerVerificationEnabled} 63 - onChange={value => setDeerVerificationEnabled(value)} 64 - style={[a.w_full]}> 65 - <Toggle.LabelText style={[a.flex_1]}> 66 - <Trans> 67 - Select your own set of trusted verifiers, and operate as a 68 - verifier 69 - </Trans> 70 - </Toggle.LabelText> 54 + <Toggle.Item 55 + name="custom_verifications" 56 + label={l`Select trusted verifiers and act as one`} 57 + value={deerVerificationEnabled} 58 + onChange={value => setDeerVerificationEnabled(value)}> 59 + <SettingsList.Item> 60 + <SettingsList.ItemIcon icon={VerifiedIcon} /> 61 + <SettingsList.ItemText> 62 + <Trans>Select trusted verifiers and act as one</Trans> 63 + </SettingsList.ItemText> 71 64 <Toggle.Platform /> 72 - </Toggle.Item> 73 - </SettingsList.Group> 74 - 65 + </SettingsList.Item> 66 + </Toggle.Item> 75 67 <SettingsList.Item> 76 68 <Admonition type="warning" style={[a.flex_1]}> 77 69 <Trans> ··· 84 76 </Trans> 85 77 </Admonition> 86 78 </SettingsList.Item> 87 - 88 79 <SettingsList.Item> 89 80 <SettingsList.ItemIcon icon={VerifiedIcon} /> 90 81 <SettingsList.ItemText> ··· 128 119 </Toggle.Item> 129 120 )} 130 121 </SettingsList.Group> 131 - 132 122 {pdsLabelEnabled && ( 133 123 <SettingsList.Item> 134 124 <SettingsList.ItemIcon icon={StarIcon} />
+23 -10
src/screens/Settings/RunesSettings/DisplaySettings.tsx
··· 107 107 const [singular, setSingular] = useState(postReplacement.postName) 108 108 const [plural, setPlural] = useState(postReplacement.postsName) 109 109 const [pluralManuallyEdited, setPluralManuallyEdited] = useState(false) 110 + const [singularInputVersion, setSingularInputVersion] = useState(0) 111 + const [pluralInputVersion, setPluralInputVersion] = useState(0) 112 + 113 + const syncInputValues = ( 114 + nextSingular: string, 115 + nextPlural: string, 116 + manuallyEdited = false, 117 + ) => { 118 + setSingular(nextSingular) 119 + setPlural(nextPlural) 120 + setPluralManuallyEdited(manuallyEdited) 121 + setSingularInputVersion(version => version + 1) 122 + setPluralInputVersion(version => version + 1) 123 + } 110 124 111 125 const submit = async () => { 112 126 setPostReplacement({ ··· 127 141 setSingular(value) 128 142 if (!pluralManuallyEdited) { 129 143 setPlural(`${value}s`) 144 + setPluralInputVersion(version => version + 1) 130 145 } 131 146 } 132 147 ··· 136 151 } 137 152 138 153 const handlePresetSelect = (singularForm: string, pluralForm: string) => { 139 - setSingular(singularForm) 140 - setPlural(pluralForm) 141 - setPluralManuallyEdited(false) 154 + syncInputValues(singularForm, pluralForm) 142 155 } 143 156 144 157 return ( 145 158 <Dialog.Outer 146 159 control={control} 147 160 nativeOptions={{preventExpansion: true}} 148 - onClose={() => { 149 - setSingular(postReplacement.postName) 150 - setPlural(postReplacement.postsName) 151 - setPluralManuallyEdited(false) 152 - }}> 161 + onClose={() => 162 + syncInputValues(postReplacement.postName, postReplacement.postsName) 163 + }> 153 164 <Dialog.Handle /> 154 165 <Dialog.ScrollableInner label={l`Custom post phrase`}> 155 166 <Text style={[a.text_2xl, a.font_bold, a.pb_lg]}> ··· 158 169 159 170 <View style={a.gap_lg}> 160 171 <Dialog.Input 172 + key={`post-replacement-singular-input-${singularInputVersion}`} 161 173 label="Singular form" 162 174 autoFocus 163 175 style={[styles.textInput, pal.border, pal.text]} ··· 165 177 placeholder="skeet" 166 178 placeholderTextColor={pal.colors.textLight} 167 179 accessibilityHint={l`Input the singular form (e.g., "skeet")`} 168 - value={singular} 180 + defaultValue={singular} 169 181 /> 170 182 <View style={[a.flex_row, a.flex_wrap, a.gap_sm]}> 171 183 {[ ··· 190 202 ))} 191 203 </View> 192 204 <Dialog.Input 205 + key={`post-replacement-plural-input-${pluralInputVersion}`} 193 206 label="Plural form" 194 207 style={[styles.textInput, pal.border, pal.text, a.mt_lg]} 195 208 onChangeText={handlePluralChange} 196 209 placeholder="skeets" 197 210 placeholderTextColor={pal.colors.textLight} 198 211 accessibilityHint={l`Input the plural form (e.g., "skeets")`} 199 - value={plural} 212 + defaultValue={plural} 200 213 /> 201 214 202 215 <View style={IS_WEB && [a.flex_row, a.justify_end, a.pt_lg]}>
+111
src/screens/Settings/RunesSettings/ExtraSettings.tsx
··· 1 + import {Trans, useLingui} from '@lingui/react/macro' 2 + 3 + import { 4 + useAutoLikeOnRepost, 5 + useSetAutoLikeOnRepost, 6 + } from '#/state/preferences/auto-like-on-repost.tsx' 7 + import { 8 + useDirectFetchRecords, 9 + useSetDirectFetchRecords, 10 + } from '#/state/preferences/direct-fetch-records' 11 + import { 12 + useDisableViaRepostNotification, 13 + useSetDisableViaRepostNotification, 14 + } from '#/state/preferences/disable-via-repost-notification' 15 + import { 16 + useDiscoverContextEnabled, 17 + useSetDiscoverContextEnabled, 18 + } from '#/state/preferences/discover-context-enabled' 19 + import * as SettingsList from '#/screens/Settings/components/SettingsList' 20 + import {atoms as a} from '#/alf' 21 + import {Admonition} from '#/components/Admonition' 22 + import * as Toggle from '#/components/forms/Toggle' 23 + import {BellRinging_Stroke2_Corner0_Rounded as BellRingingIcon} from '#/components/icons/BellRinging' 24 + import {Eye_Stroke2_Corner0_Rounded as VisibilityIcon} from '#/components/icons/Eye' 25 + import {LikeRepost_Stroke2_Corner2_Rounded as LikeRepostIcon} from '#/components/icons/Heart2' 26 + import {Lab_Stroke2_Corner0_Rounded as BeakerIcon} from '#/components/icons/Lab' 27 + import {RunesScreenLayout} from './components/RunesScreenLayout' 28 + 29 + export function RunesExtraSettingsScreen() { 30 + const {t: l} = useLingui() 31 + 32 + const directFetchRecords = useDirectFetchRecords() 33 + const setDirectFetchRecords = useSetDirectFetchRecords() 34 + 35 + const autoLikeOnRepost = useAutoLikeOnRepost() 36 + const setAutoLikeOnRepost = useSetAutoLikeOnRepost() 37 + 38 + const disableViaRepostNotification = useDisableViaRepostNotification() 39 + const setDisableViaRepostNotification = useSetDisableViaRepostNotification() 40 + 41 + const discoverContextEnabled = useDiscoverContextEnabled() 42 + const setDiscoverContextEnabled = useSetDiscoverContextEnabled() 43 + 44 + return ( 45 + <RunesScreenLayout titleText={l`Extra`}> 46 + <Toggle.Item 47 + name="direct_fetch_records" 48 + label={l`Fetch records directly from PDS to see through quote blocks`} 49 + value={directFetchRecords} 50 + onChange={value => setDirectFetchRecords(value)}> 51 + <SettingsList.Item> 52 + <SettingsList.ItemIcon icon={VisibilityIcon} /> 53 + <SettingsList.ItemText> 54 + <Trans> 55 + Fetch records directly from PDS to see contents of blocked and 56 + detached quotes 57 + </Trans> 58 + </SettingsList.ItemText> 59 + <Toggle.Platform /> 60 + </SettingsList.Item> 61 + </Toggle.Item> 62 + <Toggle.Item 63 + name="auto_like_on_repost" 64 + label={l`Auto-like what you repost`} 65 + value={autoLikeOnRepost} 66 + onChange={value => setAutoLikeOnRepost(value)}> 67 + <SettingsList.Item> 68 + <SettingsList.ItemIcon icon={LikeRepostIcon} /> 69 + <SettingsList.ItemText> 70 + <Trans>Auto-like what you repost</Trans> 71 + </SettingsList.ItemText> 72 + <Toggle.Platform /> 73 + </SettingsList.Item> 74 + </Toggle.Item> 75 + <Toggle.Item 76 + name="disable_via_repost_notification" 77 + label={l`Disable via repost notifications`} 78 + value={disableViaRepostNotification} 79 + onChange={value => setDisableViaRepostNotification(value)}> 80 + <SettingsList.Item> 81 + <SettingsList.ItemIcon icon={BellRingingIcon} /> 82 + <SettingsList.ItemText> 83 + <Trans>Disable via repost notifications</Trans> 84 + </SettingsList.ItemText> 85 + <Toggle.Platform /> 86 + </SettingsList.Item> 87 + </Toggle.Item> 88 + <SettingsList.Item> 89 + <Admonition type="info" style={[a.flex_1]}> 90 + <Trans> 91 + Forcefully disables the notifications other people receive when you 92 + like/repost a post someone else has reposted for privacy. 93 + </Trans> 94 + </Admonition> 95 + </SettingsList.Item> 96 + <Toggle.Item 97 + name="discover_context" 98 + label={l`Show debug context for posts in Discover feed`} 99 + value={discoverContextEnabled} 100 + onChange={value => setDiscoverContextEnabled(value)}> 101 + <SettingsList.Item> 102 + <SettingsList.ItemIcon icon={BeakerIcon} /> 103 + <SettingsList.ItemText> 104 + <Trans>Show debug context for posts in Discover feed</Trans> 105 + </SettingsList.ItemText> 106 + <Toggle.Platform /> 107 + </SettingsList.Item> 108 + </Toggle.Item> 109 + </RunesScreenLayout> 110 + ) 111 + }
+15 -14
src/screens/Settings/RunesSettings/ImpressionsSettings.tsx
··· 43 43 import * as SettingsList from '#/screens/Settings/components/SettingsList' 44 44 import {atoms as a} from '#/alf' 45 45 import * as Toggle from '#/components/forms/Toggle' 46 - import {Eye_Stroke2_Corner0_Rounded as VisibilityIcon} from '#/components/icons/Eye' 46 + import {Person_Stroke2_Corner0_Rounded as PersonIcon} from '#/components/icons/Person' 47 + import {Reply as ReplyIcon} from '#/components/icons/Reply' 47 48 import {RunesScreenLayout} from './components/RunesScreenLayout' 48 49 49 50 export function RunesImpressionsSettingsScreen() { ··· 73 74 return ( 74 75 <RunesScreenLayout titleText={l`Impressions`}> 75 76 <SettingsList.Group contentContainerStyle={[a.gap_sm]}> 76 - <SettingsList.ItemIcon icon={VisibilityIcon} /> 77 + <SettingsList.ItemIcon icon={ReplyIcon} /> 77 78 <SettingsList.ItemText> 78 79 <Trans>Posts</Trans> 79 80 </SettingsList.ItemText> ··· 134 135 </Toggle.Item> 135 136 </SettingsList.Group> 136 137 <SettingsList.Group contentContainerStyle={[a.gap_sm]}> 137 - <SettingsList.ItemIcon icon={VisibilityIcon} /> 138 + <SettingsList.ItemIcon icon={PersonIcon} /> 138 139 <SettingsList.ItemText> 139 140 <Trans>Profiles</Trans> 140 141 </SettingsList.ItemText> ··· 161 162 <Toggle.Platform /> 162 163 </Toggle.Item> 163 164 <Toggle.Item 165 + name="disable_posts_metrics" 166 + label={l`Remove post counts`} 167 + value={disablePostsMetrics} 168 + onChange={value => setDisablePostsMetrics(value)} 169 + style={[a.w_full]}> 170 + <Toggle.LabelText style={[a.flex_1]}> 171 + <Trans>Remove post counts</Trans> 172 + </Toggle.LabelText> 173 + <Toggle.Platform /> 174 + </Toggle.Item> 175 + <Toggle.Item 164 176 name="disable_followed_by_metrics" 165 177 label={l`Remove "followed by" counts`} 166 178 value={disableFollowedByMetrics} ··· 179 191 style={[a.w_full]}> 180 192 <Toggle.LabelText style={[a.flex_1]}> 181 193 <Trans>Show "Follows you" badge</Trans> 182 - </Toggle.LabelText> 183 - <Toggle.Platform /> 184 - </Toggle.Item> 185 - <Toggle.Item 186 - name="disable_posts_metrics" 187 - label={l`Remove post counts`} 188 - value={disablePostsMetrics} 189 - onChange={value => setDisablePostsMetrics(value)} 190 - style={[a.w_full]}> 191 - <Toggle.LabelText style={[a.flex_1]}> 192 - <Trans>Remove post counts</Trans> 193 194 </Toggle.LabelText> 194 195 <Toggle.Platform /> 195 196 </Toggle.Item>
+1 -1
src/screens/Settings/RunesSettings/InfrastructureSettings.tsx
··· 236 236 237 237 <SettingsList.Item> 238 238 <Admonition type="warning" style={[a.flex_1]}> 239 - <Trans>Restart the app after changing this setting.</Trans> 239 + <Trans>Toggling this will reload the app.</Trans> 240 240 </Admonition> 241 241 </SettingsList.Item> 242 242 <SettingsList.Item>
-104
src/screens/Settings/RunesSettings/OtherAdditionsSettings.tsx
··· 1 - import {Trans, useLingui} from '@lingui/react/macro' 2 - 3 - import { 4 - useAutoLikeOnRepost, 5 - useSetAutoLikeOnRepost, 6 - } from '#/state/preferences/auto-like-on-repost.tsx' 7 - import { 8 - useDirectFetchRecords, 9 - useSetDirectFetchRecords, 10 - } from '#/state/preferences/direct-fetch-records' 11 - import { 12 - useDisableViaRepostNotification, 13 - useSetDisableViaRepostNotification, 14 - } from '#/state/preferences/disable-via-repost-notification' 15 - import { 16 - useDiscoverContextEnabled, 17 - useSetDiscoverContextEnabled, 18 - } from '#/state/preferences/discover-context-enabled' 19 - import * as SettingsList from '#/screens/Settings/components/SettingsList' 20 - import {atoms as a} from '#/alf' 21 - import {Admonition} from '#/components/Admonition' 22 - import * as Toggle from '#/components/forms/Toggle' 23 - import {Eye_Stroke2_Corner0_Rounded as VisibilityIcon} from '#/components/icons/Eye' 24 - import {RunesScreenLayout} from './components/RunesScreenLayout' 25 - 26 - export function RunesOtherAdditionsSettingsScreen() { 27 - const {t: l} = useLingui() 28 - 29 - const directFetchRecords = useDirectFetchRecords() 30 - const setDirectFetchRecords = useSetDirectFetchRecords() 31 - 32 - const autoLikeOnRepost = useAutoLikeOnRepost() 33 - const setAutoLikeOnRepost = useSetAutoLikeOnRepost() 34 - 35 - const disableViaRepostNotification = useDisableViaRepostNotification() 36 - const setDisableViaRepostNotification = useSetDisableViaRepostNotification() 37 - 38 - const discoverContextEnabled = useDiscoverContextEnabled() 39 - const setDiscoverContextEnabled = useSetDiscoverContextEnabled() 40 - 41 - return ( 42 - <RunesScreenLayout titleText={l`Other additions`}> 43 - <SettingsList.Group contentContainerStyle={[a.gap_sm]}> 44 - <SettingsList.ItemIcon icon={VisibilityIcon} /> 45 - <SettingsList.ItemText> 46 - <Trans>Extras</Trans> 47 - </SettingsList.ItemText> 48 - <Toggle.Item 49 - name="direct_fetch_records" 50 - label={l`Fetch records directly from PDS to see through quote blocks`} 51 - value={directFetchRecords} 52 - onChange={value => setDirectFetchRecords(value)} 53 - style={[a.w_full]}> 54 - <Toggle.LabelText style={[a.flex_1]}> 55 - <Trans> 56 - Fetch records directly from PDS to see contents of blocked and 57 - detached quotes 58 - </Trans> 59 - </Toggle.LabelText> 60 - <Toggle.Platform /> 61 - </Toggle.Item> 62 - <Toggle.Item 63 - name="auto_like_on_repost" 64 - label={l`Auto-like what you repost`} 65 - value={autoLikeOnRepost} 66 - onChange={value => setAutoLikeOnRepost(value)} 67 - style={[a.w_full]}> 68 - <Toggle.LabelText style={[a.flex_1]}> 69 - <Trans>Auto-like what you repost</Trans> 70 - </Toggle.LabelText> 71 - <Toggle.Platform /> 72 - </Toggle.Item> 73 - <Toggle.Item 74 - name="disable_via_repost_notification" 75 - label={l`Disable via repost notifications`} 76 - value={disableViaRepostNotification} 77 - onChange={value => setDisableViaRepostNotification(value)} 78 - style={[a.w_full]}> 79 - <Toggle.LabelText style={[a.flex_1]}> 80 - <Trans>Disable via repost notifications</Trans> 81 - </Toggle.LabelText> 82 - <Toggle.Platform /> 83 - </Toggle.Item> 84 - <Admonition type="info" style={[a.flex_1]}> 85 - <Trans> 86 - Forcefully disables the notifications other people receive when you 87 - like/repost a post someone else has reposted for privacy. 88 - </Trans> 89 - </Admonition> 90 - <Toggle.Item 91 - name="discover_context" 92 - label={l`Show debug context for posts in Discover feed`} 93 - value={discoverContextEnabled} 94 - onChange={value => setDiscoverContextEnabled(value)} 95 - style={[a.w_full]}> 96 - <Toggle.LabelText style={[a.flex_1]}> 97 - <Trans>Show debug context for posts in Discover feed</Trans> 98 - </Toggle.LabelText> 99 - <Toggle.Platform /> 100 - </Toggle.Item> 101 - </SettingsList.Group> 102 - </RunesScreenLayout> 103 - ) 104 - }
+106 -85
src/screens/Settings/RunesSettings/UsabilitySettings.tsx
··· 33 33 import {atoms as a} from '#/alf' 34 34 import {Admonition} from '#/components/Admonition' 35 35 import * as Toggle from '#/components/forms/Toggle' 36 - import {PaintRoller_Stroke2_Corner2_Rounded as PaintRollerIcon} from '#/components/icons/PaintRoller' 36 + import {ArrowShareRight_Stroke2_Corner2_Rounded as ArrowShareRightIcon} from '#/components/icons/ArrowShareRight' 37 + import {ArrowTopCircle_Stroke2_Corner0_Rounded as ArrowTopIcon} from '#/components/icons/ArrowTopCircle' 38 + import {Envelope_Stroke2_Corner2_Rounded as EnvelopeIcon} from '#/components/icons/Envelope' 39 + import {Eye_Stroke2_Corner2_Rounded as EyeIcon} from '#/components/icons/Eye' 40 + import {EyeSlash_Stroke2_Corner0_Rounded as EyeSlashIcon} from '#/components/icons/EyeSlash' 41 + import {PencilLine_Stroke2_Corner2_Rounded as PencilIcon} from '#/components/icons/Pencil' 42 + import {PersonGroup_Stroke2_Corner2_Rounded as PersonGroupIcon} from '#/components/icons/Person' 43 + import {Reply as ReplyIcon} from '#/components/icons/Reply' 37 44 import {RunesScreenLayout} from './components/RunesScreenLayout' 38 45 39 46 export function RunesUsabilitySettingsScreen() { ··· 65 72 66 73 return ( 67 74 <RunesScreenLayout titleText={l`Usability`}> 68 - <SettingsList.Group contentContainerStyle={[a.gap_sm]}> 69 - <SettingsList.ItemIcon icon={PaintRollerIcon} /> 70 - <SettingsList.ItemText> 71 - <Trans>Debloating</Trans> 72 - </SettingsList.ItemText> 73 - <Toggle.Item 74 - name="use_go_links" 75 - label={l`Redirect through go.bsky.app`} 76 - value={goLinksEnabled ?? false} 77 - onChange={value => setGoLinksEnabled(value)} 78 - style={[a.w_full]}> 79 - <Toggle.LabelText style={[a.flex_1]}> 75 + <Toggle.Item 76 + name="use_go_links" 77 + label={l`Redirect through go.bsky.app`} 78 + value={goLinksEnabled ?? false} 79 + onChange={value => setGoLinksEnabled(value)}> 80 + <SettingsList.Item> 81 + <SettingsList.ItemIcon icon={ArrowShareRightIcon} /> 82 + <SettingsList.ItemText> 80 83 <Trans>Redirect through go.bsky.app</Trans> 81 - </Toggle.LabelText> 84 + </SettingsList.ItemText> 82 85 <Toggle.Platform /> 83 - </Toggle.Item> 84 - <Toggle.Item 85 - name="no_discover_fallback" 86 - label={l`Do not fall back to discover feed`} 87 - value={noDiscoverFallback} 88 - onChange={value => setNoDiscoverFallback(value)} 89 - style={[a.w_full]}> 90 - <Toggle.LabelText style={[a.flex_1]}> 86 + </SettingsList.Item> 87 + </Toggle.Item> 88 + <Toggle.Item 89 + name="no_discover_fallback" 90 + label={l`Do not fall back to discover feed`} 91 + value={noDiscoverFallback} 92 + onChange={value => setNoDiscoverFallback(value)}> 93 + <SettingsList.Item> 94 + <SettingsList.ItemIcon icon={EyeSlashIcon} /> 95 + <SettingsList.ItemText> 91 96 <Trans>Do not fall back to discover feed</Trans> 92 - </Toggle.LabelText> 97 + </SettingsList.ItemText> 93 98 <Toggle.Platform /> 94 - </Toggle.Item> 95 - <Toggle.Item 96 - name="hide_feeds_promo_tab" 97 - label={l`Hide "Feeds ✨" tab when only one feed is selected`} 98 - value={hideFeedsPromoTab} 99 - onChange={value => setHideFeedsPromoTab(value)} 100 - style={[a.w_full]}> 101 - <Toggle.LabelText style={[a.flex_1]}> 99 + </SettingsList.Item> 100 + </Toggle.Item> 101 + <Toggle.Item 102 + name="hide_feeds_promo_tab" 103 + label={l`Hide "Feeds ✨" tab when only one feed is selected`} 104 + value={hideFeedsPromoTab} 105 + onChange={value => setHideFeedsPromoTab(value)}> 106 + <SettingsList.Item> 107 + <SettingsList.ItemIcon icon={EyeIcon} /> 108 + <SettingsList.ItemText> 102 109 <Trans>Hide "Feeds ✨" tab when only one feed is selected</Trans> 103 - </Toggle.LabelText> 110 + </SettingsList.ItemText> 111 + <Toggle.Platform /> 112 + </SettingsList.Item> 113 + </Toggle.Item> 114 + <Toggle.Item 115 + name="disable_similar_accounts_recommendations" 116 + label={l`Disable similar accounts recommendations`} 117 + value={hideSimilarAccountsRecomm} 118 + onChange={value => setHideSimilarAccountsRecomm(value)}> 119 + <SettingsList.Item> 120 + <SettingsList.ItemIcon icon={PersonGroupIcon} /> 121 + <SettingsList.ItemText> 122 + <Trans>Disable similar accounts recommendations</Trans> 123 + </SettingsList.ItemText> 124 + <Toggle.Platform /> 125 + </SettingsList.Item> 126 + </Toggle.Item> 127 + <Toggle.Item 128 + name="disable_composer_prompt" 129 + label={l`Disable composer prompt`} 130 + value={disableComposerPrompt} 131 + onChange={value => setDisableComposerPrompt(value)}> 132 + <SettingsList.Item> 133 + <SettingsList.ItemIcon icon={PencilIcon} /> 134 + <SettingsList.ItemText> 135 + <Trans>Disable composer prompt</Trans> 136 + </SettingsList.ItemText> 104 137 <Toggle.Platform /> 105 - </Toggle.Item> 106 - <Toggle.Item 107 - name="hide_similar_accounts_recommendations" 108 - label={l`Hide similar accounts recommendations`} 109 - value={hideSimilarAccountsRecomm} 110 - onChange={value => setHideSimilarAccountsRecomm(value)} 111 - style={[a.w_full]}> 112 - <Toggle.LabelText style={[a.flex_1]}> 113 - <Trans>Hide similar accounts recommendations</Trans> 114 - </Toggle.LabelText> 138 + </SettingsList.Item> 139 + </Toggle.Item> 140 + <Toggle.Item 141 + name="disable_top_of_feed_button" 142 + label={l`Disable top-of-feed button`} 143 + value={disableTopOfFeedButton ?? false} 144 + onChange={value => setDisableTopOfFeedButton(value)}> 145 + <SettingsList.Item> 146 + <SettingsList.ItemIcon icon={ArrowTopIcon} /> 147 + <SettingsList.ItemText> 148 + <Trans>Disable top-of-feed button</Trans> 149 + </SettingsList.ItemText> 115 150 <Toggle.Platform /> 116 - </Toggle.Item> 117 - <Toggle.Item 118 - name="hide_unreplyable_posts" 119 - label={l`Hide posts that cannot be replied to from feeds`} 120 - value={hideUnreplyablePosts} 121 - onChange={value => setHideUnreplyablePosts(value)} 122 - style={[a.w_full]}> 123 - <Toggle.LabelText style={[a.flex_1]}> 151 + </SettingsList.Item> 152 + </Toggle.Item> 153 + <Toggle.Item 154 + name="hide_unreplyable_posts" 155 + label={l`Hide posts that cannot be replied to from feeds`} 156 + value={hideUnreplyablePosts} 157 + onChange={value => setHideUnreplyablePosts(value)}> 158 + <SettingsList.Item> 159 + <SettingsList.ItemIcon icon={ReplyIcon} /> 160 + <SettingsList.ItemText> 124 161 <Trans>Hide posts that cannot be replied to from feeds</Trans> 125 - </Toggle.LabelText> 162 + </SettingsList.ItemText> 126 163 <Toggle.Platform /> 127 - </Toggle.Item> 164 + </SettingsList.Item> 165 + </Toggle.Item> 166 + <SettingsList.Item> 128 167 <Admonition type="info" style={[a.flex_1]}> 129 168 <Trans> 130 169 Hides posts from feeds where replies are disabled (e.g. due to 131 170 postgates or other restrictions). Does not affect thread views. 132 171 </Trans> 133 172 </Admonition> 134 - <Toggle.Item 135 - name="disable_composer_prompt" 136 - label={l`Disable composer prompt`} 137 - value={disableComposerPrompt} 138 - onChange={value => setDisableComposerPrompt(value)} 139 - style={[a.w_full]}> 140 - <Toggle.LabelText style={[a.flex_1]}> 141 - <Trans>Disable composer prompt</Trans> 142 - </Toggle.LabelText> 143 - <Toggle.Platform /> 144 - </Toggle.Item> 145 - <Toggle.Item 146 - name="disable_top_of_feed_button" 147 - label={l`Disable top-of-feed button`} 148 - value={disableTopOfFeedButton ?? false} 149 - onChange={value => setDisableTopOfFeedButton(value)} 150 - style={[a.w_full]}> 151 - <Toggle.LabelText style={[a.flex_1]}> 152 - <Trans>Disable top-of-feed button</Trans> 153 - </Toggle.LabelText> 154 - <Toggle.Platform /> 155 - </Toggle.Item> 156 - <Toggle.Item 157 - name="disable_verify_email_reminder" 158 - label={l`Disable verify email reminder`} 159 - value={disableVerifyEmailReminder} 160 - onChange={value => setDisableVerifyEmailReminder(value)} 161 - style={[a.w_full]}> 162 - <Toggle.LabelText style={[a.flex_1]}> 173 + </SettingsList.Item> 174 + <Toggle.Item 175 + name="disable_verify_email_reminder" 176 + label={l`Disable verify email reminder`} 177 + value={disableVerifyEmailReminder} 178 + onChange={value => setDisableVerifyEmailReminder(value)}> 179 + <SettingsList.Item> 180 + <SettingsList.ItemIcon icon={EnvelopeIcon} /> 181 + <SettingsList.ItemText> 163 182 <Trans>Disable verify email reminder</Trans> 164 - </Toggle.LabelText> 183 + </SettingsList.ItemText> 165 184 <Toggle.Platform /> 166 - </Toggle.Item> 185 + </SettingsList.Item> 186 + </Toggle.Item> 187 + <SettingsList.Item> 167 188 <Admonition type="warning" style={[a.flex_1]}> 168 189 <Trans> 169 190 This only gets rid of the reminder on app launch, useful if your PDS 170 - does not have email verification setup.&nbsp; This does NOT give 191 + does not have email verification setup.&nbsp;This does NOT give 171 192 access to features locked behind email verification. 172 193 </Trans> 173 194 </Admonition> 174 - </SettingsList.Group> 195 + </SettingsList.Item> 175 196 </RunesScreenLayout> 176 197 ) 177 198 }
+3 -3
src/screens/Settings/RunesSettings/index.tsx
··· 62 62 </SettingsList.ItemText> 63 63 </SettingsList.LinkItem> 64 64 <SettingsList.LinkItem 65 - to="/settings/runes/other-additions" 66 - label={l`Other additions`}> 65 + to="/settings/runes/extra" 66 + label={l`Extra settings `}> 67 67 <SettingsList.ItemIcon icon={BeakerIcon} /> 68 68 <SettingsList.ItemText> 69 - <Trans>Other additions</Trans> 69 + <Trans>Extra</Trans> 70 70 </SettingsList.ItemText> 71 71 </SettingsList.LinkItem> 72 72 </RunesScreenLayout>
+8
src/state/preferences/no-app-labelers.tsx
··· 6 6 useEffect, 7 7 useState, 8 8 } from 'react' 9 + import {reloadAppAsync} from 'expo' 9 10 10 11 import * as persisted from '#/state/persisted' 12 + import {IS_WEB} from '#/env' 11 13 12 14 type StateContext = persisted.Schema['noAppLabelers'] 13 15 type SetContext = (v: persisted.Schema['noAppLabelers']) => void ··· 26 28 (noAppLabelers: persisted.Schema['noAppLabelers']) => { 27 29 setState(noAppLabelers) 28 30 persisted.write('noAppLabelers', noAppLabelers) 31 + 32 + if (IS_WEB) { 33 + window.location.reload() 34 + } else { 35 + void reloadAppAsync() 36 + } 29 37 }, 30 38 [setState], 31 39 )