An ATproto social media client -- with an independent Appview.

feat: substitute header for preferences calls; workaround until POST supported for putPreferences

Changed files
+66 -2
src
env
lib
state
queries
notifications
preferences
+4
src/env/common.ts
··· 67 67 */ 68 68 export const BLUESKY_PROXY_DID: Did = 69 69 process.env.EXPO_PUBLIC_BLUESKY_PROXY_DID || 'did:web:api.shatteredsky.net' 70 + /** 71 + * The DID of the PBLLC Bluesky appview to proxy to 72 + */ 73 + export const PBLLC_BLUESKY_PROXY_DID: Did = 'did:web:api.bsky.app' 70 74 71 75 /** 72 76 * The DID of the chat service to proxy to
+10 -1
src/lib/constants.ts
··· 2 2 import {type AppBskyActorDefs, BSKY_LABELER_DID} from '@atproto/api' 3 3 4 4 import {type ProxyHeaderValue} from '#/state/session/agent' 5 - import {BLUESKY_PROXY_DID, CHAT_PROXY_DID} from '#/env' 5 + import {BLUESKY_PROXY_DID, CHAT_PROXY_DID, PBLLC_BLUESKY_PROXY_DID} from '#/env' 6 6 7 7 export const LOCAL_DEV_SERVICE = 8 8 Platform.OS === 'android' ? 'http://10.0.2.2:2583' : 'http://localhost:2583' ··· 206 206 // temp hack for e2e - esb 207 207 export const BLUESKY_PROXY_HEADER = { 208 208 value: `${BLUESKY_PROXY_DID}#bsky_appview`, 209 + get() { 210 + return this.value as ProxyHeaderValue 211 + }, 212 + set(value: string) { 213 + this.value = value 214 + }, 215 + } 216 + export const PBLLC_BLUESKY_PROXY_HEADER = { 217 + value: `${PBLLC_BLUESKY_PROXY_DID}#bsky_appview`, 209 218 get() { 210 219 return this.value as ProxyHeaderValue 211 220 },
+5
src/state/queries/notifications/settings.ts
··· 7 7 useQueryClient, 8 8 } from '@tanstack/react-query' 9 9 10 + import {BLUESKY_PROXY_HEADER, PBLLC_BLUESKY_PROXY_HEADER} from '#/lib/constants' 10 11 import {logger} from '#/logger' 11 12 import {useAgent} from '#/state/session' 12 13 import * as Toast from '#/view/com/util/Toast' ··· 22 23 return useQuery({ 23 24 queryKey: RQKEY, 24 25 queryFn: async () => { 26 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 25 27 const response = await agent.app.bsky.notification.getPreferences() 28 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 26 29 return response.data.preferences 27 30 }, 28 31 enabled, ··· 36 39 mutationFn: async ( 37 40 update: Partial<AppBskyNotificationDefs.Preferences>, 38 41 ) => { 42 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 39 43 const response = 40 44 await agent.app.bsky.notification.putPreferencesV2(update) 45 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 41 46 return response.data.preferences 42 47 }, 43 48 onMutate: update => {
+47 -1
src/state/queries/preferences/index.ts
··· 6 6 } from '@atproto/api' 7 7 import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' 8 8 9 - import {PROD_DEFAULT_FEED} from '#/lib/constants' 9 + import { 10 + BLUESKY_PROXY_HEADER, 11 + PBLLC_BLUESKY_PROXY_HEADER, 12 + PROD_DEFAULT_FEED, 13 + } from '#/lib/constants' 10 14 import {replaceEqualDeep} from '#/lib/functions' 11 15 import {getAge} from '#/lib/strings/time' 12 16 import {logger} from '#/logger' ··· 45 49 if (!agent.did) { 46 50 return DEFAULT_LOGGED_OUT_PREFERENCES 47 51 } else { 52 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 48 53 const res = await agent.getPreferences() 54 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 49 55 50 56 // save to local storage to ensure there are labels on initial requests 51 57 saveLabelers( ··· 97 103 98 104 return useMutation({ 99 105 mutationFn: async () => { 106 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 100 107 await agent.app.bsky.actor.putPreferences({preferences: []}) 108 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 101 109 // triggers a refetch 102 110 await queryClient.invalidateQueries({ 103 111 queryKey: preferencesQueryKey, ··· 116 124 {label: string; visibility: LabelPreference; labelerDid: string | undefined} 117 125 >({ 118 126 mutationFn: async ({label, visibility, labelerDid}) => { 127 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 119 128 await agent.setContentLabelPref(label, visibility, labelerDid) 129 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 120 130 logger.metric( 121 131 'moderation:changeLabelPreference', 122 132 {preference: visibility}, ··· 144 154 visibility: LabelPreference 145 155 labelerDid?: string 146 156 }) => { 157 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 147 158 await agent.setContentLabelPref(label, visibility, labelerDid) 159 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 148 160 // triggers a refetch 149 161 await queryClient.invalidateQueries({ 150 162 queryKey: preferencesQueryKey, ··· 159 171 160 172 return useMutation<void, unknown, {enabled: boolean}>({ 161 173 mutationFn: async ({enabled}) => { 174 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 162 175 await agent.setAdultContentEnabled(enabled) 176 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 163 177 // triggers a refetch 164 178 await queryClient.invalidateQueries({ 165 179 queryKey: preferencesQueryKey, ··· 174 188 175 189 return useMutation<void, unknown, {birthDate: Date}>({ 176 190 mutationFn: async ({birthDate}: {birthDate: Date}) => { 191 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 177 192 await agent.setPersonalDetails({birthDate: birthDate.toISOString()}) 193 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 178 194 // triggers a refetch 179 195 await queryClient.invalidateQueries({ 180 196 queryKey: preferencesQueryKey, ··· 193 209 * special handling here, merged into `feedViewPrefs` above, since 194 210 * following was previously called `home` 195 211 */ 212 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 196 213 await agent.setFeedViewPrefs('home', prefs) 214 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 197 215 // triggers a refetch 198 216 await queryClient.invalidateQueries({ 199 217 queryKey: preferencesQueryKey, ··· 208 226 209 227 return useMutation<void, unknown, Partial<ThreadViewPreferences>>({ 210 228 mutationFn: async prefs => { 229 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 211 230 await agent.setThreadViewPrefs(prefs) 231 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 212 232 // triggers a refetch 213 233 await queryClient.invalidateQueries({ 214 234 queryKey: preferencesQueryKey, ··· 223 243 224 244 return useMutation<void, unknown, AppBskyActorDefs.SavedFeed[]>({ 225 245 mutationFn: async savedFeeds => { 246 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 226 247 await agent.overwriteSavedFeeds(savedFeeds) 248 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 227 249 // triggers a refetch 228 250 await queryClient.invalidateQueries({ 229 251 queryKey: preferencesQueryKey, ··· 242 264 Pick<AppBskyActorDefs.SavedFeed, 'type' | 'value' | 'pinned'>[] 243 265 >({ 244 266 mutationFn: async savedFeeds => { 267 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 245 268 await agent.addSavedFeeds(savedFeeds) 269 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 246 270 // triggers a refetch 247 271 await queryClient.invalidateQueries({ 248 272 queryKey: preferencesQueryKey, ··· 257 281 258 282 return useMutation<void, unknown, Pick<AppBskyActorDefs.SavedFeed, 'id'>>({ 259 283 mutationFn: async savedFeed => { 284 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 260 285 await agent.removeSavedFeeds([savedFeed.id]) 286 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 261 287 // triggers a refetch 262 288 await queryClient.invalidateQueries({ 263 289 queryKey: preferencesQueryKey, ··· 278 304 forYouFeedConfig: AppBskyActorDefs.SavedFeed | undefined 279 305 discoverFeedConfig: AppBskyActorDefs.SavedFeed | undefined 280 306 }) => { 307 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 281 308 if (forYouFeedConfig) { 282 309 await agent.removeSavedFeeds([forYouFeedConfig.id]) 283 310 } ··· 297 324 }, 298 325 ]) 299 326 } 327 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 300 328 // triggers a refetch 301 329 await queryClient.invalidateQueries({ 302 330 queryKey: preferencesQueryKey, ··· 311 339 312 340 return useMutation<void, unknown, AppBskyActorDefs.SavedFeed[]>({ 313 341 mutationFn: async feeds => { 342 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 314 343 await agent.updateSavedFeeds(feeds) 344 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 315 345 316 346 // triggers a refetch 317 347 await queryClient.invalidateQueries({ ··· 327 357 328 358 return useMutation({ 329 359 mutationFn: async (mutedWords: AppBskyActorDefs.MutedWord[]) => { 360 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 330 361 await agent.upsertMutedWords(mutedWords) 362 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 331 363 // triggers a refetch 332 364 await queryClient.invalidateQueries({ 333 365 queryKey: preferencesQueryKey, ··· 342 374 343 375 return useMutation({ 344 376 mutationFn: async (mutedWord: AppBskyActorDefs.MutedWord) => { 377 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 345 378 await agent.updateMutedWord(mutedWord) 379 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 346 380 // triggers a refetch 347 381 await queryClient.invalidateQueries({ 348 382 queryKey: preferencesQueryKey, ··· 357 391 358 392 return useMutation({ 359 393 mutationFn: async (mutedWord: AppBskyActorDefs.MutedWord) => { 394 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 360 395 await agent.removeMutedWord(mutedWord) 396 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 361 397 // triggers a refetch 362 398 await queryClient.invalidateQueries({ 363 399 queryKey: preferencesQueryKey, ··· 372 408 373 409 return useMutation({ 374 410 mutationFn: async (mutedWords: AppBskyActorDefs.MutedWord[]) => { 411 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 375 412 await agent.removeMutedWords(mutedWords) 413 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 376 414 // triggers a refetch 377 415 await queryClient.invalidateQueries({ 378 416 queryKey: preferencesQueryKey, ··· 387 425 388 426 return useMutation({ 389 427 mutationFn: async (nudges: string | string[]) => { 428 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 390 429 await agent.bskyAppQueueNudges(nudges) 430 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 391 431 // triggers a refetch 392 432 await queryClient.invalidateQueries({ 393 433 queryKey: preferencesQueryKey, ··· 402 442 403 443 return useMutation({ 404 444 mutationFn: async (nudges: string | string[]) => { 445 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 405 446 await agent.bskyAppDismissNudges(nudges) 447 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 406 448 // triggers a refetch 407 449 await queryClient.invalidateQueries({ 408 450 queryKey: preferencesQueryKey, ··· 419 461 mutationFn: async ( 420 462 guide: AppBskyActorDefs.BskyAppProgressGuide | undefined, 421 463 ) => { 464 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 422 465 await agent.bskyAppSetActiveProgressGuide(guide) 466 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 423 467 // triggers a refetch 424 468 await queryClient.invalidateQueries({ 425 469 queryKey: preferencesQueryKey, ··· 434 478 435 479 return useMutation<void, unknown, AppBskyActorDefs.VerificationPrefs>({ 436 480 mutationFn: async prefs => { 481 + agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 437 482 await agent.setVerificationPrefs(prefs) 483 + agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 438 484 if (prefs.hideBadges) { 439 485 logger.metric('verification:settings:hideBadges', {}, {statsig: true}) 440 486 } else {