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

fix: use a seperate agent instead for alternative atproto-proxy header; avoids what I assume was a race condition

+83 -101
+8 -11
src/state/queries/notifications/settings.ts
··· 7 useQueryClient, 8 } from '@tanstack/react-query' 9 10 - import {BLUESKY_PROXY_HEADER, PBLLC_BLUESKY_PROXY_HEADER} from '#/lib/constants' 11 import {logger} from '#/logger' 12 - import {useAgent} from '#/state/session' 13 import * as Toast from '#/view/com/util/Toast' 14 15 const RQKEY_ROOT = 'notification-settings' ··· 18 export function useNotificationSettingsQuery({ 19 enabled, 20 }: {enabled?: boolean} = {}) { 21 - const agent = useAgent() 22 - 23 return useQuery({ 24 queryKey: RQKEY, 25 queryFn: async () => { 26 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 27 - const response = await agent.app.bsky.notification.getPreferences() 28 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 29 return response.data.preferences 30 }, 31 enabled, 32 }) 33 } 34 export function useNotificationSettingsUpdateMutation() { 35 - const agent = useAgent() 36 const queryClient = useQueryClient() 37 38 return useMutation({ 39 mutationFn: async ( 40 update: Partial<AppBskyNotificationDefs.Preferences>, 41 ) => { 42 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 43 const response = 44 - await agent.app.bsky.notification.putPreferencesV2(update) 45 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 46 return response.data.preferences 47 }, 48 onMutate: update => {
··· 7 useQueryClient, 8 } from '@tanstack/react-query' 9 10 import {logger} from '#/logger' 11 + import {getBskyAppviewAgent as getBskyAppviewAgent} from '#/state/session/appview-agent' 12 import * as Toast from '#/view/com/util/Toast' 13 14 const RQKEY_ROOT = 'notification-settings' ··· 17 export function useNotificationSettingsQuery({ 18 enabled, 19 }: {enabled?: boolean} = {}) { 20 return useQuery({ 21 queryKey: RQKEY, 22 queryFn: async () => { 23 + // Use appview agent which already has PBLLC proxy configured 24 + const bskyAppviewAgent = getBskyAppviewAgent() 25 + const response = 26 + await bskyAppviewAgent.app.bsky.notification.getPreferences() 27 return response.data.preferences 28 }, 29 enabled, 30 }) 31 } 32 export function useNotificationSettingsUpdateMutation() { 33 const queryClient = useQueryClient() 34 35 return useMutation({ 36 mutationFn: async ( 37 update: Partial<AppBskyNotificationDefs.Preferences>, 38 ) => { 39 + // Use appview agent which already has PBLLC proxy configured 40 + const appviewAgent = getBskyAppviewAgent() 41 const response = 42 + await appviewAgent.app.bsky.notification.putPreferencesV2(update) 43 return response.data.preferences 44 }, 45 onMutate: update => {
+48 -90
src/state/queries/preferences/index.ts
··· 6 } from '@atproto/api' 7 import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' 8 9 - import { 10 - BLUESKY_PROXY_HEADER, 11 - PBLLC_BLUESKY_PROXY_HEADER, 12 - PROD_DEFAULT_FEED, 13 - } from '#/lib/constants' 14 import {replaceEqualDeep} from '#/lib/functions' 15 import {getAge} from '#/lib/strings/time' 16 import {logger} from '#/logger' ··· 28 } from '#/state/queries/preferences/types' 29 import {useAgent} from '#/state/session' 30 import {saveLabelers} from '#/state/session/agent-config' 31 32 export * from '#/state/queries/preferences/const' 33 export * from '#/state/queries/preferences/moderation' ··· 49 if (!agent.did) { 50 return DEFAULT_LOGGED_OUT_PREFERENCES 51 } else { 52 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 53 - const res = await agent.getPreferences() 54 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 55 56 // save to local storage to ensure there are labels on initial requests 57 saveLabelers( ··· 99 100 export function useClearPreferencesMutation() { 101 const queryClient = useQueryClient() 102 - const agent = useAgent() 103 104 return useMutation({ 105 mutationFn: async () => { 106 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 107 - await agent.app.bsky.actor.putPreferences({preferences: []}) 108 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 109 // triggers a refetch 110 await queryClient.invalidateQueries({ 111 queryKey: preferencesQueryKey, ··· 115 } 116 117 export function usePreferencesSetContentLabelMutation() { 118 - const agent = useAgent() 119 const queryClient = useQueryClient() 120 121 return useMutation< ··· 124 {label: string; visibility: LabelPreference; labelerDid: string | undefined} 125 >({ 126 mutationFn: async ({label, visibility, labelerDid}) => { 127 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 128 - await agent.setContentLabelPref(label, visibility, labelerDid) 129 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 130 logger.metric( 131 'moderation:changeLabelPreference', 132 {preference: visibility}, ··· 142 143 export function useSetContentLabelMutation() { 144 const queryClient = useQueryClient() 145 - const agent = useAgent() 146 147 return useMutation({ 148 mutationFn: async ({ ··· 154 visibility: LabelPreference 155 labelerDid?: string 156 }) => { 157 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 158 - await agent.setContentLabelPref(label, visibility, labelerDid) 159 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 160 // triggers a refetch 161 await queryClient.invalidateQueries({ 162 queryKey: preferencesQueryKey, ··· 167 168 export function usePreferencesSetAdultContentMutation() { 169 const queryClient = useQueryClient() 170 - const agent = useAgent() 171 172 return useMutation<void, unknown, {enabled: boolean}>({ 173 mutationFn: async ({enabled}) => { 174 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 175 - await agent.setAdultContentEnabled(enabled) 176 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 177 // triggers a refetch 178 await queryClient.invalidateQueries({ 179 queryKey: preferencesQueryKey, ··· 184 185 export function usePreferencesSetBirthDateMutation() { 186 const queryClient = useQueryClient() 187 - const agent = useAgent() 188 189 return useMutation<void, unknown, {birthDate: Date}>({ 190 mutationFn: async ({birthDate}: {birthDate: Date}) => { 191 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 192 - await agent.setPersonalDetails({birthDate: birthDate.toISOString()}) 193 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 194 // triggers a refetch 195 await queryClient.invalidateQueries({ 196 queryKey: preferencesQueryKey, ··· 201 202 export function useSetFeedViewPreferencesMutation() { 203 const queryClient = useQueryClient() 204 - const agent = useAgent() 205 206 return useMutation<void, unknown, Partial<BskyFeedViewPreference>>({ 207 mutationFn: async prefs => { ··· 209 * special handling here, merged into `feedViewPrefs` above, since 210 * following was previously called `home` 211 */ 212 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 213 - await agent.setFeedViewPrefs('home', prefs) 214 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 215 // triggers a refetch 216 await queryClient.invalidateQueries({ 217 queryKey: preferencesQueryKey, ··· 222 223 export function useSetThreadViewPreferencesMutation() { 224 const queryClient = useQueryClient() 225 - const agent = useAgent() 226 227 return useMutation<void, unknown, Partial<ThreadViewPreferences>>({ 228 mutationFn: async prefs => { 229 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 230 - await agent.setThreadViewPrefs(prefs) 231 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 232 // triggers a refetch 233 await queryClient.invalidateQueries({ 234 queryKey: preferencesQueryKey, ··· 239 240 export function useOverwriteSavedFeedsMutation() { 241 const queryClient = useQueryClient() 242 - const agent = useAgent() 243 244 return useMutation<void, unknown, AppBskyActorDefs.SavedFeed[]>({ 245 mutationFn: async savedFeeds => { 246 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 247 - await agent.overwriteSavedFeeds(savedFeeds) 248 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 249 // triggers a refetch 250 await queryClient.invalidateQueries({ 251 queryKey: preferencesQueryKey, ··· 256 257 export function useAddSavedFeedsMutation() { 258 const queryClient = useQueryClient() 259 - const agent = useAgent() 260 261 return useMutation< 262 void, ··· 264 Pick<AppBskyActorDefs.SavedFeed, 'type' | 'value' | 'pinned'>[] 265 >({ 266 mutationFn: async savedFeeds => { 267 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 268 - await agent.addSavedFeeds(savedFeeds) 269 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 270 // triggers a refetch 271 await queryClient.invalidateQueries({ 272 queryKey: preferencesQueryKey, ··· 277 278 export function useRemoveFeedMutation() { 279 const queryClient = useQueryClient() 280 - const agent = useAgent() 281 282 return useMutation<void, unknown, Pick<AppBskyActorDefs.SavedFeed, 'id'>>({ 283 mutationFn: async savedFeed => { 284 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 285 - await agent.removeSavedFeeds([savedFeed.id]) 286 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 287 // triggers a refetch 288 await queryClient.invalidateQueries({ 289 queryKey: preferencesQueryKey, ··· 294 295 export function useReplaceForYouWithDiscoverFeedMutation() { 296 const queryClient = useQueryClient() 297 - const agent = useAgent() 298 299 return useMutation({ 300 mutationFn: async ({ ··· 304 forYouFeedConfig: AppBskyActorDefs.SavedFeed | undefined 305 discoverFeedConfig: AppBskyActorDefs.SavedFeed | undefined 306 }) => { 307 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 308 if (forYouFeedConfig) { 309 - await agent.removeSavedFeeds([forYouFeedConfig.id]) 310 } 311 if (!discoverFeedConfig) { 312 - await agent.addSavedFeeds([ 313 { 314 type: 'feed', 315 value: PROD_DEFAULT_FEED('Discover'), ··· 317 }, 318 ]) 319 } else { 320 - await agent.updateSavedFeeds([ 321 { 322 ...discoverFeedConfig, 323 pinned: true, 324 }, 325 ]) 326 } 327 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 328 // triggers a refetch 329 await queryClient.invalidateQueries({ 330 queryKey: preferencesQueryKey, ··· 335 336 export function useUpdateSavedFeedsMutation() { 337 const queryClient = useQueryClient() 338 - const agent = useAgent() 339 340 return useMutation<void, unknown, AppBskyActorDefs.SavedFeed[]>({ 341 mutationFn: async feeds => { 342 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 343 - await agent.updateSavedFeeds(feeds) 344 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 345 346 // triggers a refetch 347 await queryClient.invalidateQueries({ ··· 353 354 export function useUpsertMutedWordsMutation() { 355 const queryClient = useQueryClient() 356 - const agent = useAgent() 357 358 return useMutation({ 359 mutationFn: async (mutedWords: AppBskyActorDefs.MutedWord[]) => { 360 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 361 - await agent.upsertMutedWords(mutedWords) 362 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 363 // triggers a refetch 364 await queryClient.invalidateQueries({ 365 queryKey: preferencesQueryKey, ··· 370 371 export function useUpdateMutedWordMutation() { 372 const queryClient = useQueryClient() 373 - const agent = useAgent() 374 375 return useMutation({ 376 mutationFn: async (mutedWord: AppBskyActorDefs.MutedWord) => { 377 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 378 - await agent.updateMutedWord(mutedWord) 379 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 380 // triggers a refetch 381 await queryClient.invalidateQueries({ 382 queryKey: preferencesQueryKey, ··· 387 388 export function useRemoveMutedWordMutation() { 389 const queryClient = useQueryClient() 390 - const agent = useAgent() 391 392 return useMutation({ 393 mutationFn: async (mutedWord: AppBskyActorDefs.MutedWord) => { 394 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 395 - await agent.removeMutedWord(mutedWord) 396 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 397 // triggers a refetch 398 await queryClient.invalidateQueries({ 399 queryKey: preferencesQueryKey, ··· 404 405 export function useRemoveMutedWordsMutation() { 406 const queryClient = useQueryClient() 407 - const agent = useAgent() 408 409 return useMutation({ 410 mutationFn: async (mutedWords: AppBskyActorDefs.MutedWord[]) => { 411 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 412 - await agent.removeMutedWords(mutedWords) 413 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 414 // triggers a refetch 415 await queryClient.invalidateQueries({ 416 queryKey: preferencesQueryKey, ··· 421 422 export function useQueueNudgesMutation() { 423 const queryClient = useQueryClient() 424 - const agent = useAgent() 425 426 return useMutation({ 427 mutationFn: async (nudges: string | string[]) => { 428 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 429 - await agent.bskyAppQueueNudges(nudges) 430 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 431 // triggers a refetch 432 await queryClient.invalidateQueries({ 433 queryKey: preferencesQueryKey, ··· 438 439 export function useDismissNudgesMutation() { 440 const queryClient = useQueryClient() 441 - const agent = useAgent() 442 443 return useMutation({ 444 mutationFn: async (nudges: string | string[]) => { 445 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 446 - await agent.bskyAppDismissNudges(nudges) 447 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 448 // triggers a refetch 449 await queryClient.invalidateQueries({ 450 queryKey: preferencesQueryKey, ··· 455 456 export function useSetActiveProgressGuideMutation() { 457 const queryClient = useQueryClient() 458 - const agent = useAgent() 459 460 return useMutation({ 461 mutationFn: async ( 462 guide: AppBskyActorDefs.BskyAppProgressGuide | undefined, 463 ) => { 464 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 465 - await agent.bskyAppSetActiveProgressGuide(guide) 466 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 467 // triggers a refetch 468 await queryClient.invalidateQueries({ 469 queryKey: preferencesQueryKey, ··· 474 475 export function useSetVerificationPrefsMutation() { 476 const queryClient = useQueryClient() 477 - const agent = useAgent() 478 479 return useMutation<void, unknown, AppBskyActorDefs.VerificationPrefs>({ 480 mutationFn: async prefs => { 481 - agent.configureProxy(PBLLC_BLUESKY_PROXY_HEADER.get()) 482 - await agent.setVerificationPrefs(prefs) 483 - agent.configureProxy(BLUESKY_PROXY_HEADER.get()) 484 if (prefs.hideBadges) { 485 logger.metric('verification:settings:hideBadges', {}, {statsig: true}) 486 } else {
··· 6 } from '@atproto/api' 7 import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' 8 9 + import {PROD_DEFAULT_FEED} from '#/lib/constants' 10 import {replaceEqualDeep} from '#/lib/functions' 11 import {getAge} from '#/lib/strings/time' 12 import {logger} from '#/logger' ··· 24 } from '#/state/queries/preferences/types' 25 import {useAgent} from '#/state/session' 26 import {saveLabelers} from '#/state/session/agent-config' 27 + import {getBskyAppviewAgent} from '#/state/session/appview-agent' 28 29 export * from '#/state/queries/preferences/const' 30 export * from '#/state/queries/preferences/moderation' ··· 46 if (!agent.did) { 47 return DEFAULT_LOGGED_OUT_PREFERENCES 48 } else { 49 + const appviewAgent = getBskyAppviewAgent() 50 + const res = await appviewAgent.getPreferences() 51 52 // save to local storage to ensure there are labels on initial requests 53 saveLabelers( ··· 95 96 export function useClearPreferencesMutation() { 97 const queryClient = useQueryClient() 98 99 return useMutation({ 100 mutationFn: async () => { 101 + const appviewAgent = getBskyAppviewAgent() 102 + await appviewAgent.app.bsky.actor.putPreferences({preferences: []}) 103 // triggers a refetch 104 await queryClient.invalidateQueries({ 105 queryKey: preferencesQueryKey, ··· 109 } 110 111 export function usePreferencesSetContentLabelMutation() { 112 const queryClient = useQueryClient() 113 114 return useMutation< ··· 117 {label: string; visibility: LabelPreference; labelerDid: string | undefined} 118 >({ 119 mutationFn: async ({label, visibility, labelerDid}) => { 120 + const appviewAgent = getBskyAppviewAgent() 121 + await appviewAgent.setContentLabelPref(label, visibility, labelerDid) 122 logger.metric( 123 'moderation:changeLabelPreference', 124 {preference: visibility}, ··· 134 135 export function useSetContentLabelMutation() { 136 const queryClient = useQueryClient() 137 138 return useMutation({ 139 mutationFn: async ({ ··· 145 visibility: LabelPreference 146 labelerDid?: string 147 }) => { 148 + const appviewAgent = getBskyAppviewAgent() 149 + await appviewAgent.setContentLabelPref(label, visibility, labelerDid) 150 // triggers a refetch 151 await queryClient.invalidateQueries({ 152 queryKey: preferencesQueryKey, ··· 157 158 export function usePreferencesSetAdultContentMutation() { 159 const queryClient = useQueryClient() 160 161 return useMutation<void, unknown, {enabled: boolean}>({ 162 mutationFn: async ({enabled}) => { 163 + const appviewAgent = getBskyAppviewAgent() 164 + await appviewAgent.setAdultContentEnabled(enabled) 165 // triggers a refetch 166 await queryClient.invalidateQueries({ 167 queryKey: preferencesQueryKey, ··· 172 173 export function usePreferencesSetBirthDateMutation() { 174 const queryClient = useQueryClient() 175 176 return useMutation<void, unknown, {birthDate: Date}>({ 177 mutationFn: async ({birthDate}: {birthDate: Date}) => { 178 + const appviewAgent = getBskyAppviewAgent() 179 + await appviewAgent.setPersonalDetails({ 180 + birthDate: birthDate.toISOString(), 181 + }) 182 // triggers a refetch 183 await queryClient.invalidateQueries({ 184 queryKey: preferencesQueryKey, ··· 189 190 export function useSetFeedViewPreferencesMutation() { 191 const queryClient = useQueryClient() 192 193 return useMutation<void, unknown, Partial<BskyFeedViewPreference>>({ 194 mutationFn: async prefs => { ··· 196 * special handling here, merged into `feedViewPrefs` above, since 197 * following was previously called `home` 198 */ 199 + const appviewAgent = getBskyAppviewAgent() 200 + await appviewAgent.setFeedViewPrefs('home', prefs) 201 // triggers a refetch 202 await queryClient.invalidateQueries({ 203 queryKey: preferencesQueryKey, ··· 208 209 export function useSetThreadViewPreferencesMutation() { 210 const queryClient = useQueryClient() 211 212 return useMutation<void, unknown, Partial<ThreadViewPreferences>>({ 213 mutationFn: async prefs => { 214 + const appviewAgent = getBskyAppviewAgent() 215 + await appviewAgent.setThreadViewPrefs(prefs) 216 // triggers a refetch 217 await queryClient.invalidateQueries({ 218 queryKey: preferencesQueryKey, ··· 223 224 export function useOverwriteSavedFeedsMutation() { 225 const queryClient = useQueryClient() 226 227 return useMutation<void, unknown, AppBskyActorDefs.SavedFeed[]>({ 228 mutationFn: async savedFeeds => { 229 + const appviewAgent = getBskyAppviewAgent() 230 + await appviewAgent.overwriteSavedFeeds(savedFeeds) 231 // triggers a refetch 232 await queryClient.invalidateQueries({ 233 queryKey: preferencesQueryKey, ··· 238 239 export function useAddSavedFeedsMutation() { 240 const queryClient = useQueryClient() 241 242 return useMutation< 243 void, ··· 245 Pick<AppBskyActorDefs.SavedFeed, 'type' | 'value' | 'pinned'>[] 246 >({ 247 mutationFn: async savedFeeds => { 248 + const appviewAgent = getBskyAppviewAgent() 249 + await appviewAgent.addSavedFeeds(savedFeeds) 250 // triggers a refetch 251 await queryClient.invalidateQueries({ 252 queryKey: preferencesQueryKey, ··· 257 258 export function useRemoveFeedMutation() { 259 const queryClient = useQueryClient() 260 261 return useMutation<void, unknown, Pick<AppBskyActorDefs.SavedFeed, 'id'>>({ 262 mutationFn: async savedFeed => { 263 + const appviewAgent = getBskyAppviewAgent() 264 + await appviewAgent.removeSavedFeeds([savedFeed.id]) 265 // triggers a refetch 266 await queryClient.invalidateQueries({ 267 queryKey: preferencesQueryKey, ··· 272 273 export function useReplaceForYouWithDiscoverFeedMutation() { 274 const queryClient = useQueryClient() 275 276 return useMutation({ 277 mutationFn: async ({ ··· 281 forYouFeedConfig: AppBskyActorDefs.SavedFeed | undefined 282 discoverFeedConfig: AppBskyActorDefs.SavedFeed | undefined 283 }) => { 284 + const appviewAgent = getBskyAppviewAgent() 285 if (forYouFeedConfig) { 286 + await appviewAgent.removeSavedFeeds([forYouFeedConfig.id]) 287 } 288 if (!discoverFeedConfig) { 289 + await appviewAgent.addSavedFeeds([ 290 { 291 type: 'feed', 292 value: PROD_DEFAULT_FEED('Discover'), ··· 294 }, 295 ]) 296 } else { 297 + await appviewAgent.updateSavedFeeds([ 298 { 299 ...discoverFeedConfig, 300 pinned: true, 301 }, 302 ]) 303 } 304 // triggers a refetch 305 await queryClient.invalidateQueries({ 306 queryKey: preferencesQueryKey, ··· 311 312 export function useUpdateSavedFeedsMutation() { 313 const queryClient = useQueryClient() 314 315 return useMutation<void, unknown, AppBskyActorDefs.SavedFeed[]>({ 316 mutationFn: async feeds => { 317 + const appviewAgent = getBskyAppviewAgent() 318 + await appviewAgent.updateSavedFeeds(feeds) 319 320 // triggers a refetch 321 await queryClient.invalidateQueries({ ··· 327 328 export function useUpsertMutedWordsMutation() { 329 const queryClient = useQueryClient() 330 331 return useMutation({ 332 mutationFn: async (mutedWords: AppBskyActorDefs.MutedWord[]) => { 333 + const appviewAgent = getBskyAppviewAgent() 334 + await appviewAgent.upsertMutedWords(mutedWords) 335 // triggers a refetch 336 await queryClient.invalidateQueries({ 337 queryKey: preferencesQueryKey, ··· 342 343 export function useUpdateMutedWordMutation() { 344 const queryClient = useQueryClient() 345 346 return useMutation({ 347 mutationFn: async (mutedWord: AppBskyActorDefs.MutedWord) => { 348 + const appviewAgent = getBskyAppviewAgent() 349 + await appviewAgent.updateMutedWord(mutedWord) 350 // triggers a refetch 351 await queryClient.invalidateQueries({ 352 queryKey: preferencesQueryKey, ··· 357 358 export function useRemoveMutedWordMutation() { 359 const queryClient = useQueryClient() 360 361 return useMutation({ 362 mutationFn: async (mutedWord: AppBskyActorDefs.MutedWord) => { 363 + const appviewAgent = getBskyAppviewAgent() 364 + await appviewAgent.removeMutedWord(mutedWord) 365 // triggers a refetch 366 await queryClient.invalidateQueries({ 367 queryKey: preferencesQueryKey, ··· 372 373 export function useRemoveMutedWordsMutation() { 374 const queryClient = useQueryClient() 375 376 return useMutation({ 377 mutationFn: async (mutedWords: AppBskyActorDefs.MutedWord[]) => { 378 + const appviewAgent = getBskyAppviewAgent() 379 + await appviewAgent.removeMutedWords(mutedWords) 380 // triggers a refetch 381 await queryClient.invalidateQueries({ 382 queryKey: preferencesQueryKey, ··· 387 388 export function useQueueNudgesMutation() { 389 const queryClient = useQueryClient() 390 391 return useMutation({ 392 mutationFn: async (nudges: string | string[]) => { 393 + const appviewAgent = getBskyAppviewAgent() 394 + await appviewAgent.bskyAppQueueNudges(nudges) 395 // triggers a refetch 396 await queryClient.invalidateQueries({ 397 queryKey: preferencesQueryKey, ··· 402 403 export function useDismissNudgesMutation() { 404 const queryClient = useQueryClient() 405 406 return useMutation({ 407 mutationFn: async (nudges: string | string[]) => { 408 + const appviewAgent = getBskyAppviewAgent() 409 + await appviewAgent.bskyAppDismissNudges(nudges) 410 // triggers a refetch 411 await queryClient.invalidateQueries({ 412 queryKey: preferencesQueryKey, ··· 417 418 export function useSetActiveProgressGuideMutation() { 419 const queryClient = useQueryClient() 420 421 return useMutation({ 422 mutationFn: async ( 423 guide: AppBskyActorDefs.BskyAppProgressGuide | undefined, 424 ) => { 425 + const appviewAgent = getBskyAppviewAgent() 426 + await appviewAgent.bskyAppSetActiveProgressGuide(guide) 427 // triggers a refetch 428 await queryClient.invalidateQueries({ 429 queryKey: preferencesQueryKey, ··· 434 435 export function useSetVerificationPrefsMutation() { 436 const queryClient = useQueryClient() 437 438 return useMutation<void, unknown, AppBskyActorDefs.VerificationPrefs>({ 439 mutationFn: async prefs => { 440 + const appviewAgent = getBskyAppviewAgent() 441 + await appviewAgent.setVerificationPrefs(prefs) 442 if (prefs.hideBadges) { 443 logger.metric('verification:settings:hideBadges', {}, {statsig: true}) 444 } else {
+27
src/state/session/index.tsx
··· 14 createAgentAndResume, 15 sessionAccountToSession, 16 } from './agent' 17 import {type Action, getInitialState, reducer, type State} from './reducer' 18 19 export {isSignupQueued} from './util' ··· 122 if (signal.aborted) { 123 return 124 } 125 store.dispatch({ 126 type: 'switched-to-account', 127 newAgent: agent, ··· 145 if (signal.aborted) { 146 return 147 } 148 store.dispatch({ 149 type: 'switched-to-account', 150 newAgent: agent, ··· 166 logContext => { 167 addSessionDebugLog({type: 'method:start', method: 'logout'}) 168 cancelPendingTask() 169 store.dispatch({ 170 type: 'logged-out-current-account', 171 }) ··· 185 logContext => { 186 addSessionDebugLog({type: 'method:start', method: 'logout'}) 187 cancelPendingTask() 188 store.dispatch({ 189 type: 'logged-out-every-account', 190 }) ··· 214 if (signal.aborted) { 215 return 216 } 217 store.dispatch({ 218 type: 'switched-to-account', 219 newAgent: agent, ··· 276 const agent = state.currentAgentState.agent as BskyAgent 277 const prevSession = agent.session 278 agent.sessionManager.session = sessionAccountToSession(syncedAccount) 279 addSessionDebugLog({ 280 type: 'agent:patch', 281 agent, ··· 390 } 391 return agent 392 }
··· 14 createAgentAndResume, 15 sessionAccountToSession, 16 } from './agent' 17 + import {getBskyAppviewAgent} from './appview-agent' 18 import {type Action, getInitialState, reducer, type State} from './reducer' 19 20 export {isSignupQueued} from './util' ··· 123 if (signal.aborted) { 124 return 125 } 126 + 127 + // Initialize the appview agent with the account 128 + getBskyAppviewAgent().initializeWithAccount(account) 129 + 130 store.dispatch({ 131 type: 'switched-to-account', 132 newAgent: agent, ··· 150 if (signal.aborted) { 151 return 152 } 153 + 154 + // Initialize the appview agent with the account 155 + getBskyAppviewAgent().initializeWithAccount(account) 156 + 157 store.dispatch({ 158 type: 'switched-to-account', 159 newAgent: agent, ··· 175 logContext => { 176 addSessionDebugLog({type: 'method:start', method: 'logout'}) 177 cancelPendingTask() 178 + 179 + // Clear the appview agent session 180 + getBskyAppviewAgent().clearSession() 181 + 182 store.dispatch({ 183 type: 'logged-out-current-account', 184 }) ··· 198 logContext => { 199 addSessionDebugLog({type: 'method:start', method: 'logout'}) 200 cancelPendingTask() 201 + 202 + // Clear the appview agent session 203 + getBskyAppviewAgent().clearSession() 204 + 205 store.dispatch({ 206 type: 'logged-out-every-account', 207 }) ··· 231 if (signal.aborted) { 232 return 233 } 234 + 235 + // Initialize the appview agent with the account 236 + getBskyAppviewAgent().initializeWithAccount(account) 237 + 238 store.dispatch({ 239 type: 'switched-to-account', 240 newAgent: agent, ··· 297 const agent = state.currentAgentState.agent as BskyAgent 298 const prevSession = agent.session 299 agent.sessionManager.session = sessionAccountToSession(syncedAccount) 300 + 301 + // Also update the appview agent with the current session 302 + getBskyAppviewAgent().initializeWithAccount(syncedAccount) 303 + 304 addSessionDebugLog({ 305 type: 'agent:patch', 306 agent, ··· 415 } 416 return agent 417 } 418 + 419 + // No need to export anything, getAppviewAgent is already imported directly where needed