Bluesky app fork with some witchin' additions 💫

feat: toggle url handle/did

lets one toggle between using handles and dids in the url (when navigating as well as when sharing a link).

requires app restart (should reload automatically)

authored by shi.gg and committed by tangled.org 0b742059 4033a993

+106 -70
+12 -1
src/lib/routes/links.ts
··· 1 1 import {type AppBskyGraphDefs, AtUri} from '@atproto/api' 2 2 3 + import {isInvalidHandle, isValidHandle} from '#/lib/strings/handles' 4 + import * as persisted from '#/state/persisted' 5 + 3 6 export function makeProfileLink( 4 7 info: { 5 8 did: string ··· 7 10 }, 8 11 ...segments: string[] 9 12 ) { 10 - return [`/profile`, info.did, ...segments].join('/') 13 + const useHandle = persisted.get('useHandleInLinks') ?? false 14 + const identifier = 15 + useHandle && 16 + info.handle && 17 + !isInvalidHandle(info.handle) && 18 + isValidHandle(info.handle) 19 + ? info.handle 20 + : info.did 21 + return [`/profile`, identifier, ...segments].join('/') 11 22 } 12 23 13 24 export function makeCustomFeedLink(
+18
src/screens/Settings/RunesSettings.tsx
··· 132 132 useSetTranslationServicePreference, 133 133 useTranslationServicePreference, 134 134 } from '#/state/preferences/translation-service-preference' 135 + import { 136 + useHandleInLinks, 137 + useSetHandleInLinks, 138 + } from '#/state/preferences/use-handle-in-links' 135 139 import {useProfilesQuery} from '#/state/queries/profile' 136 140 import * as SettingsList from '#/screens/Settings/components/SettingsList' 137 141 import {atoms as a, useBreakpoints} from '#/alf' ··· 710 714 const showLinkInHandle = useShowLinkInHandle() 711 715 const setShowLinkInHandle = useSetShowLinkInHandle() 712 716 717 + const handleInLinks = useHandleInLinks() 718 + const setHandleInLinks = useSetHandleInLinks() 719 + 713 720 const translationServicePreference = useTranslationServicePreference() 714 721 const setTranslationServicePreference = useSetTranslationServicePreference() 715 722 ··· 748 755 style={[a.w_full]}> 749 756 <Toggle.LabelText style={[a.flex_1]}> 750 757 <Trans>Redirect through go.bsky.app</Trans> 758 + </Toggle.LabelText> 759 + <Toggle.Platform /> 760 + </Toggle.Item> 761 + <Toggle.Item 762 + name="use_handle_in_links" 763 + label={_(msg`Use handles in profile links instead of DIDs (requires restart)`)} 764 + value={handleInLinks ?? false} 765 + onChange={value => setHandleInLinks(value)} 766 + style={[a.w_full]}> 767 + <Toggle.LabelText style={[a.flex_1]}> 768 + <Trans>Use handles in profile links instead of DIDs</Trans> 751 769 </Toggle.LabelText> 752 770 <Toggle.Platform /> 753 771 </Toggle.Item>
+4
src/state/persisted/schema.ts
··· 191 191 openRouterApiKey: z.string().optional(), 192 192 openRouterModel: z.string().optional(), 193 193 194 + useHandleInLinks: z.boolean().optional(), 195 + 194 196 /** @deprecated */ 195 197 mutedThreads: z.array(z.string()), 196 198 trendingDisabled: z.boolean().optional(), ··· 306 308 307 309 openRouterApiKey: undefined, 308 310 openRouterModel: DEFAULT_ALT_TEXT_AI_MODEL, 311 + 312 + useHandleInLinks: false, 309 313 310 314 postReplacement: { 311 315 enabled: false,
+72 -69
src/state/preferences/index.tsx
··· 43 43 import {Provider as SubtitlesProvider} from './subtitles' 44 44 import {Provider as TranslationServicePreferenceProvider} from './translation-service-preference' 45 45 import {Provider as TrendingSettingsProvider} from './trending' 46 + import {Provider as UseHandleInLinksProvider} from './use-handle-in-links' 46 47 import {Provider as UsedStarterPacksProvider} from './used-starter-packs' 47 48 48 49 export { ··· 97 98 <DeerVerificationProvider> 98 99 <NoDiscoverProvider> 99 100 <ShowLinkInHandleProvider> 100 - <LargeAltBadgeProvider> 101 - <ExternalEmbedsProvider> 102 - <HiddenPostsProvider> 103 - <HighQualityImagesProvider> 104 - <InAppBrowserProvider> 105 - <DisableHapticsProvider> 106 - <AutoplayProvider> 107 - <UsedStarterPacksProvider> 108 - <SubtitlesProvider> 109 - <TrendingSettingsProvider> 110 - <RepostCarouselProvider> 111 - <KawaiiProvider> 112 - <HideFeedsPromoTabProvider> 113 - <DisableViaRepostNotificationProvider> 114 - <DisableLikesMetricsProvider> 115 - <DisableRepostsMetricsProvider> 116 - <DisableQuotesMetricsProvider> 117 - <DisableSavesMetricsProvider> 118 - <DisableReplyMetricsProvider> 119 - <DisableFollowersMetricsProvider> 120 - <DisableFollowingMetricsProvider> 121 - <DisableFollowedByMetricsProvider> 122 - <DisablePostsMetricsProvider> 123 - <HideSimilarAccountsRecommProvider> 124 - <HideUnreplyablePostsProvider> 125 - <EnableSquareAvatarsProvider> 126 - <EnableSquareButtonsProvider> 127 - <PostNameReplacementProvider> 128 - <DisableVerifyEmailReminderProvider> 129 - <TranslationServicePreferenceProvider> 130 - <OpenRouterProvider> 131 - <DisableComposerPromptProvider> 132 - <DiscoverContextEnabledProvider> 133 - { 134 - children 135 - } 136 - </DiscoverContextEnabledProvider> 137 - </DisableComposerPromptProvider> 138 - </OpenRouterProvider> 139 - </TranslationServicePreferenceProvider> 140 - </DisableVerifyEmailReminderProvider> 141 - </PostNameReplacementProvider> 142 - </EnableSquareButtonsProvider> 143 - </EnableSquareAvatarsProvider> 144 - </HideUnreplyablePostsProvider> 145 - </HideSimilarAccountsRecommProvider> 146 - </DisablePostsMetricsProvider> 147 - </DisableFollowedByMetricsProvider> 148 - </DisableFollowingMetricsProvider> 149 - </DisableFollowersMetricsProvider> 150 - </DisableReplyMetricsProvider> 151 - </DisableSavesMetricsProvider> 152 - </DisableQuotesMetricsProvider> 153 - </DisableRepostsMetricsProvider> 154 - </DisableLikesMetricsProvider> 155 - </DisableViaRepostNotificationProvider> 156 - </HideFeedsPromoTabProvider> 157 - </KawaiiProvider> 158 - </RepostCarouselProvider> 159 - </TrendingSettingsProvider> 160 - </SubtitlesProvider> 161 - </UsedStarterPacksProvider> 162 - </AutoplayProvider> 163 - </DisableHapticsProvider> 164 - </InAppBrowserProvider> 165 - </HighQualityImagesProvider> 166 - </HiddenPostsProvider> 167 - </ExternalEmbedsProvider> 168 - </LargeAltBadgeProvider> 101 + <UseHandleInLinksProvider> 102 + <LargeAltBadgeProvider> 103 + <ExternalEmbedsProvider> 104 + <HiddenPostsProvider> 105 + <HighQualityImagesProvider> 106 + <InAppBrowserProvider> 107 + <DisableHapticsProvider> 108 + <AutoplayProvider> 109 + <UsedStarterPacksProvider> 110 + <SubtitlesProvider> 111 + <TrendingSettingsProvider> 112 + <RepostCarouselProvider> 113 + <KawaiiProvider> 114 + <HideFeedsPromoTabProvider> 115 + <DisableViaRepostNotificationProvider> 116 + <DisableLikesMetricsProvider> 117 + <DisableRepostsMetricsProvider> 118 + <DisableQuotesMetricsProvider> 119 + <DisableSavesMetricsProvider> 120 + <DisableReplyMetricsProvider> 121 + <DisableFollowersMetricsProvider> 122 + <DisableFollowingMetricsProvider> 123 + <DisableFollowedByMetricsProvider> 124 + <DisablePostsMetricsProvider> 125 + <HideSimilarAccountsRecommProvider> 126 + <HideUnreplyablePostsProvider> 127 + <EnableSquareAvatarsProvider> 128 + <EnableSquareButtonsProvider> 129 + <PostNameReplacementProvider> 130 + <DisableVerifyEmailReminderProvider> 131 + <TranslationServicePreferenceProvider> 132 + <OpenRouterProvider> 133 + <DisableComposerPromptProvider> 134 + <DiscoverContextEnabledProvider> 135 + { 136 + children 137 + } 138 + </DiscoverContextEnabledProvider> 139 + </DisableComposerPromptProvider> 140 + </OpenRouterProvider> 141 + </TranslationServicePreferenceProvider> 142 + </DisableVerifyEmailReminderProvider> 143 + </PostNameReplacementProvider> 144 + </EnableSquareButtonsProvider> 145 + </EnableSquareAvatarsProvider> 146 + </HideUnreplyablePostsProvider> 147 + </HideSimilarAccountsRecommProvider> 148 + </DisablePostsMetricsProvider> 149 + </DisableFollowedByMetricsProvider> 150 + </DisableFollowingMetricsProvider> 151 + </DisableFollowersMetricsProvider> 152 + </DisableReplyMetricsProvider> 153 + </DisableSavesMetricsProvider> 154 + </DisableQuotesMetricsProvider> 155 + </DisableRepostsMetricsProvider> 156 + </DisableLikesMetricsProvider> 157 + </DisableViaRepostNotificationProvider> 158 + </HideFeedsPromoTabProvider> 159 + </KawaiiProvider> 160 + </RepostCarouselProvider> 161 + </TrendingSettingsProvider> 162 + </SubtitlesProvider> 163 + </UsedStarterPacksProvider> 164 + </AutoplayProvider> 165 + </DisableHapticsProvider> 166 + </InAppBrowserProvider> 167 + </HighQualityImagesProvider> 168 + </HiddenPostsProvider> 169 + </ExternalEmbedsProvider> 170 + </LargeAltBadgeProvider> 171 + </UseHandleInLinksProvider> 169 172 </ShowLinkInHandleProvider> 170 173 </NoDiscoverProvider> 171 174 </DeerVerificationProvider>