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.

Tweak to auto-like what you repost

I heard it's common etiquette. Nevertheless, it is disabled by default
to avoid surprising users.

authored by

Vika and committed by tangled.org d081c3aa 09e0dff3

+195 -95
+14
src/components/PostControls/index.tsx
··· 34 34 import * as Skele from '#/components/Skeleton' 35 35 import * as Toast from '#/components/Toast' 36 36 import {useAnalytics} from '#/analytics' 37 + import {useAutoLikeOnRepost} from '../../state/preferences/auto-like-on-repost.tsx' 37 38 import {BookmarkButton} from './BookmarkButton' 38 39 import { 39 40 PostControlButton, ··· 114 115 const disableReplyMetrics = useDisableReplyMetrics() 115 116 const disableQuotesMetrics = useDisableQuotesMetrics() 116 117 118 + const autoLikeOnRepost = useAutoLikeOnRepost() 119 + 117 120 const onPressToggleLike = async () => { 118 121 if (isBlocked) { 119 122 Toast.show(l`Cannot interact with a blocked user`, { ··· 162 165 reqId, 163 166 }) 164 167 await queueRepost() 168 + setHasLikeIconBeenToggled(true) 169 + if (!post.viewer?.like && autoLikeOnRepost) { 170 + sendInteraction({ 171 + item: post.uri, 172 + event: 'app.bsky.feed.defs#interactionLike', 173 + feedContext, 174 + reqId, 175 + }) 176 + captureAction(ProgressGuideAction.Like) 177 + await queueLike() 178 + } 165 179 } else { 166 180 await queueUnrepost() 167 181 }
+18
src/screens/Settings/RunesSettings.tsx
··· 172 172 import {InlineLinkText} from '#/components/Link' 173 173 import {Text} from '#/components/Typography' 174 174 import {IS_WEB} from '#/env' 175 + import { 176 + useAutoLikeOnRepost, 177 + useSetAutoLikeOnRepost, 178 + } from '../../state/preferences/auto-like-on-repost.tsx' 175 179 import {SearchProfileCard} from '../Search/components/SearchProfileCard' 176 180 177 181 type Props = NativeStackScreenProps<CommonNavigatorParams> ··· 829 833 const setOpenRouterModelControl = Dialog.useDialogControl() 830 834 const openRouterConfigured = useOpenRouterConfigured() 831 835 836 + const autoLikeOnRepost = useAutoLikeOnRepost() 837 + const setAutoLikeOnRepost = useSetAutoLikeOnRepost() 838 + 832 839 return ( 833 840 <Layout.Screen> 834 841 <Layout.Header.Outer> ··· 1096 1103 longer to load and use more bandwidth. 1097 1104 </Trans> 1098 1105 </Admonition> 1106 + <Toggle.Item 1107 + name="auto_like_on_repost" 1108 + label={_(msg`Auto-like what you repost`)} 1109 + value={autoLikeOnRepost} 1110 + onChange={value => setAutoLikeOnRepost(value)} 1111 + style={[a.w_full]}> 1112 + <Toggle.LabelText style={[a.flex_1]}> 1113 + <Trans>Auto-like what you repost</Trans> 1114 + </Toggle.LabelText> 1115 + <Toggle.Platform /> 1116 + </Toggle.Item> 1099 1117 <Toggle.Item 1100 1118 name="hide_feeds_promo_tab" 1101 1119 label={_(msg`Hide "Feeds ✨" tab when only one feed is selected`)}
+4
src/state/persisted/schema.ts
··· 208 208 mutedThreads: z.array(z.string()), 209 209 trendingDisabled: z.boolean().optional(), 210 210 trendingVideoDisabled: z.boolean().optional(), 211 + 212 + autoLikeOnRepost: z.boolean().optional(), 211 213 }) 212 214 export type Schema = z.infer<typeof schema> 213 215 ··· 333 335 postName: 'skeet', 334 336 postsName: 'skeets', 335 337 }, 338 + 339 + autoLikeOnRepost: false, 336 340 } 337 341 338 342 export function tryParse(rawData: string): Schema | undefined {
+61
src/state/preferences/auto-like-on-repost.tsx
··· 1 + import { 2 + createContext, 3 + useCallback, 4 + useContext, 5 + useEffect, 6 + useState, 7 + } from 'react' 8 + 9 + import * as persisted from '#/state/persisted' 10 + 11 + type StateContext = persisted.Schema['autoLikeOnRepost'] 12 + type SetContext = (v: persisted.Schema['autoLikeOnRepost']) => void 13 + 14 + const stateContext = createContext<StateContext>( 15 + persisted.defaults.autoLikeOnRepost, 16 + ) 17 + stateContext.displayName = 'AutoLikeOnRepostStateContext' 18 + const setContext = createContext<SetContext>( 19 + (_: persisted.Schema['autoLikeOnRepost']) => {}, 20 + ) 21 + setContext.displayName = 'AutoLikeOnRepostStateContext' 22 + 23 + export function Provider({children}: React.PropsWithChildren<{}>) { 24 + const [state, setState] = useState(persisted.get('autoLikeOnRepost')) 25 + 26 + const setStateWrapped = useCallback( 27 + (autoLikeOnRepost: persisted.Schema['autoLikeOnRepost']) => { 28 + setState(autoLikeOnRepost) 29 + persisted.write('autoLikeOnRepost', autoLikeOnRepost) 30 + }, 31 + [setState], 32 + ) 33 + 34 + useEffect(() => { 35 + return persisted.onUpdate('autoLikeOnRepost', nextAutoLikeOnRepost => { 36 + setState(nextAutoLikeOnRepost) 37 + }) 38 + }, [setStateWrapped]) 39 + 40 + return ( 41 + <stateContext.Provider value={state}> 42 + <setContext.Provider value={setStateWrapped}> 43 + {children} 44 + </setContext.Provider> 45 + </stateContext.Provider> 46 + ) 47 + } 48 + 49 + export function useAutoLikeOnRepost() { 50 + return useContext(stateContext) 51 + } 52 + 53 + export function useSetAutoLikeOnRepost() { 54 + return useContext(setContext) 55 + } 56 + 57 + export function getAutoLikeOnRepost() { 58 + return ( 59 + persisted.get('autoLikeOnRepost') || persisted.defaults.autoLikeOnRepost! 60 + ) 61 + }
+98 -95
src/state/preferences/index.tsx
··· 1 1 import {Provider as AltTextRequiredProvider} from './alt-text-required' 2 + import {Provider as AutoLikeOnRepostProvider} from './auto-like-on-repost' 2 3 import {Provider as AutoplayProvider} from './autoplay' 3 4 import {Provider as ConstellationProvider} from './constellation-enabled' 4 5 import {Provider as ConstellationInstanceProvider} from './constellation-instance' ··· 91 92 return ( 92 93 <LanguagesProvider> 93 94 <AltTextRequiredProvider> 94 - <ExternalShareButtonsProvider> 95 - <GoLinksProvider> 96 - <NoAppLabelersProvider> 97 - <DirectFetchRecordsProvider> 98 - <ConstellationProvider> 99 - <ConstellationInstanceProvider> 100 - <DeerVerificationProvider> 101 - <PdsLabelProvider> 102 - <NoDiscoverProvider> 103 - <ShowLinkInHandleProvider> 104 - <UseHandleInLinksProvider> 105 - <LargeAltBadgeProvider> 106 - <ExternalEmbedsProvider> 107 - <HiddenPostsProvider> 108 - <HighQualityImagesProvider> 109 - <ImageCdnHostProvider> 110 - <InAppBrowserProvider> 111 - <DisableHapticsProvider> 112 - <AutoplayProvider> 113 - <UsedStarterPacksProvider> 114 - <SubtitlesProvider> 115 - <TrendingSettingsProvider> 116 - <RepostCarouselProvider> 117 - <KawaiiProvider> 118 - <HideFeedsPromoTabProvider> 119 - <DisableViaRepostNotificationProvider> 120 - <DisableLikesMetricsProvider> 121 - <DisableRepostsMetricsProvider> 122 - <DisableQuotesMetricsProvider> 123 - <DisableSavesMetricsProvider> 124 - <DisableReplyMetricsProvider> 125 - <DisableFollowersMetricsProvider> 126 - <DisableFollowingMetricsProvider> 127 - <DisableFollowedByMetricsProvider> 128 - <DisablePostsMetricsProvider> 129 - <ShowFollowsYouBadgeProvider> 130 - <HideSimilarAccountsRecommProvider> 131 - <HideUnreplyablePostsProvider> 132 - <EnableSquareAvatarsProvider> 133 - <EnableSquareButtonsProvider> 134 - <PostNameReplacementProvider> 135 - <DisableVerifyEmailReminderProvider> 136 - <TranslationServicePreferenceProvider> 137 - <OpenRouterProvider> 138 - <DisableComposerPromptProvider> 139 - <DiscoverContextEnabledProvider> 140 - { 141 - children 142 - } 143 - </DiscoverContextEnabledProvider> 144 - </DisableComposerPromptProvider> 145 - </OpenRouterProvider> 146 - </TranslationServicePreferenceProvider> 147 - </DisableVerifyEmailReminderProvider> 148 - </PostNameReplacementProvider> 149 - </EnableSquareButtonsProvider> 150 - </EnableSquareAvatarsProvider> 151 - </HideUnreplyablePostsProvider> 152 - </HideSimilarAccountsRecommProvider> 153 - </ShowFollowsYouBadgeProvider> 154 - </DisablePostsMetricsProvider> 155 - </DisableFollowedByMetricsProvider> 156 - </DisableFollowingMetricsProvider> 157 - </DisableFollowersMetricsProvider> 158 - </DisableReplyMetricsProvider> 159 - </DisableSavesMetricsProvider> 160 - </DisableQuotesMetricsProvider> 161 - </DisableRepostsMetricsProvider> 162 - </DisableLikesMetricsProvider> 163 - </DisableViaRepostNotificationProvider> 164 - </HideFeedsPromoTabProvider> 165 - </KawaiiProvider> 166 - </RepostCarouselProvider> 167 - </TrendingSettingsProvider> 168 - </SubtitlesProvider> 169 - </UsedStarterPacksProvider> 170 - </AutoplayProvider> 171 - </DisableHapticsProvider> 172 - </InAppBrowserProvider> 173 - </ImageCdnHostProvider> 174 - </HighQualityImagesProvider> 175 - </HiddenPostsProvider> 176 - </ExternalEmbedsProvider> 177 - </LargeAltBadgeProvider> 178 - </UseHandleInLinksProvider> 179 - </ShowLinkInHandleProvider> 180 - </NoDiscoverProvider> 181 - </PdsLabelProvider> 182 - </DeerVerificationProvider> 183 - </ConstellationInstanceProvider> 184 - </ConstellationProvider> 185 - </DirectFetchRecordsProvider> 186 - </NoAppLabelersProvider> 187 - </GoLinksProvider> 188 - </ExternalShareButtonsProvider> 95 + <AutoLikeOnRepostProvider> 96 + <ExternalShareButtonsProvider> 97 + <GoLinksProvider> 98 + <NoAppLabelersProvider> 99 + <DirectFetchRecordsProvider> 100 + <ConstellationProvider> 101 + <ConstellationInstanceProvider> 102 + <DeerVerificationProvider> 103 + <PdsLabelProvider> 104 + <NoDiscoverProvider> 105 + <ShowLinkInHandleProvider> 106 + <UseHandleInLinksProvider> 107 + <LargeAltBadgeProvider> 108 + <ExternalEmbedsProvider> 109 + <HiddenPostsProvider> 110 + <HighQualityImagesProvider> 111 + <ImageCdnHostProvider> 112 + <InAppBrowserProvider> 113 + <DisableHapticsProvider> 114 + <AutoplayProvider> 115 + <UsedStarterPacksProvider> 116 + <SubtitlesProvider> 117 + <TrendingSettingsProvider> 118 + <RepostCarouselProvider> 119 + <KawaiiProvider> 120 + <HideFeedsPromoTabProvider> 121 + <DisableViaRepostNotificationProvider> 122 + <DisableLikesMetricsProvider> 123 + <DisableRepostsMetricsProvider> 124 + <DisableQuotesMetricsProvider> 125 + <DisableSavesMetricsProvider> 126 + <DisableReplyMetricsProvider> 127 + <DisableFollowersMetricsProvider> 128 + <DisableFollowingMetricsProvider> 129 + <DisableFollowedByMetricsProvider> 130 + <DisablePostsMetricsProvider> 131 + <ShowFollowsYouBadgeProvider> 132 + <HideSimilarAccountsRecommProvider> 133 + <HideUnreplyablePostsProvider> 134 + <EnableSquareAvatarsProvider> 135 + <EnableSquareButtonsProvider> 136 + <PostNameReplacementProvider> 137 + <DisableVerifyEmailReminderProvider> 138 + <TranslationServicePreferenceProvider> 139 + <OpenRouterProvider> 140 + <DisableComposerPromptProvider> 141 + <DiscoverContextEnabledProvider> 142 + { 143 + children 144 + } 145 + </DiscoverContextEnabledProvider> 146 + </DisableComposerPromptProvider> 147 + </OpenRouterProvider> 148 + </TranslationServicePreferenceProvider> 149 + </DisableVerifyEmailReminderProvider> 150 + </PostNameReplacementProvider> 151 + </EnableSquareButtonsProvider> 152 + </EnableSquareAvatarsProvider> 153 + </HideUnreplyablePostsProvider> 154 + </HideSimilarAccountsRecommProvider> 155 + </ShowFollowsYouBadgeProvider> 156 + </DisablePostsMetricsProvider> 157 + </DisableFollowedByMetricsProvider> 158 + </DisableFollowingMetricsProvider> 159 + </DisableFollowersMetricsProvider> 160 + </DisableReplyMetricsProvider> 161 + </DisableSavesMetricsProvider> 162 + </DisableQuotesMetricsProvider> 163 + </DisableRepostsMetricsProvider> 164 + </DisableLikesMetricsProvider> 165 + </DisableViaRepostNotificationProvider> 166 + </HideFeedsPromoTabProvider> 167 + </KawaiiProvider> 168 + </RepostCarouselProvider> 169 + </TrendingSettingsProvider> 170 + </SubtitlesProvider> 171 + </UsedStarterPacksProvider> 172 + </AutoplayProvider> 173 + </DisableHapticsProvider> 174 + </InAppBrowserProvider> 175 + </ImageCdnHostProvider> 176 + </HighQualityImagesProvider> 177 + </HiddenPostsProvider> 178 + </ExternalEmbedsProvider> 179 + </LargeAltBadgeProvider> 180 + </UseHandleInLinksProvider> 181 + </ShowLinkInHandleProvider> 182 + </NoDiscoverProvider> 183 + </PdsLabelProvider> 184 + </DeerVerificationProvider> 185 + </ConstellationInstanceProvider> 186 + </ConstellationProvider> 187 + </DirectFetchRecordsProvider> 188 + </NoAppLabelersProvider> 189 + </GoLinksProvider> 190 + </ExternalShareButtonsProvider> 191 + </AutoLikeOnRepostProvider> 189 192 </AltTextRequiredProvider> 190 193 </LanguagesProvider> 191 194 )