Bluesky app fork with some witchin' additions 💫

use an env var for configurable proxy header (#8863)

authored by

hailey and committed by
GitHub
a1ed59e0 39c6984c

+108 -41
+3
.env.example
··· 16 # Enable debug logs for specific logger instances 17 EXPO_PUBLIC_LOG_DEBUG=session 18 19 # Chat service DID 20 EXPO_PUBLIC_CHAT_PROXY_DID= 21
··· 16 # Enable debug logs for specific logger instances 17 EXPO_PUBLIC_LOG_DEBUG=session 18 19 + # Bluesky appview DID 20 + EXPO_PUBLIC_BLUESKY_PROXY_DID= 21 + 22 # Chat service DID 23 EXPO_PUBLIC_CHAT_PROXY_DID= 24
+6
src/env/common.ts
··· 63 export const LOG_DEBUG: string = process.env.EXPO_PUBLIC_LOG_DEBUG || '' 64 65 /** 66 * The DID of the chat service to proxy to 67 */ 68 export const CHAT_PROXY_DID: Did =
··· 63 export const LOG_DEBUG: string = process.env.EXPO_PUBLIC_LOG_DEBUG || '' 64 65 /** 66 + * The DID of the Bluesky appview to proxy to 67 + */ 68 + export const BLUESKY_PROXY_DID: Did = 69 + process.env.EXPO_PUBLIC_BLUESKY_PROXY_DID || 'did:web:api.bsky.app' 70 + 71 + /** 72 * The DID of the chat service to proxy to 73 */ 74 export const CHAT_PROXY_DID: Did =
+13
src/lib/constants.ts
··· 1 import {type Insets, Platform} from 'react-native' 2 import {type AppBskyActorDefs} from '@atproto/api' 3 4 export const LOCAL_DEV_SERVICE = 5 Platform.OS === 'android' ? 'http://10.0.2.2:2583' : 'http://localhost:2583' 6 export const STAGING_SERVICE = 'https://staging.bsky.dev' ··· 210 export const PUBLIC_STAGING_APPVIEW_DID = 'did:web:api.staging.bsky.dev' 211 212 export const DEV_ENV_APPVIEW = `http://localhost:2584` // always the same 213 214 export const webLinks = { 215 tos: `https://bsky.social/about/support/tos`,
··· 1 import {type Insets, Platform} from 'react-native' 2 import {type AppBskyActorDefs} from '@atproto/api' 3 4 + import {type ProxyHeaderValue} from '#/state/session/agent' 5 + import {BLUESKY_PROXY_DID, CHAT_PROXY_DID} from '#/env' 6 + 7 export const LOCAL_DEV_SERVICE = 8 Platform.OS === 'android' ? 'http://10.0.2.2:2583' : 'http://localhost:2583' 9 export const STAGING_SERVICE = 'https://staging.bsky.dev' ··· 213 export const PUBLIC_STAGING_APPVIEW_DID = 'did:web:api.staging.bsky.dev' 214 215 export const DEV_ENV_APPVIEW = `http://localhost:2584` // always the same 216 + 217 + export const BLUESKY_PROXY_HEADER: ProxyHeaderValue = `${BLUESKY_PROXY_DID}#bsky_appview` 218 + 219 + export const BLUESKY_SERVICE_HEADERS = { 220 + 'atproto-proxy': BLUESKY_PROXY_HEADER, 221 + } 222 + 223 + export const DM_SERVICE_HEADERS = { 224 + 'atproto-proxy': `${CHAT_PROXY_DID}#bsky_chat`, 225 + } 226 227 export const webLinks = { 228 tos: `https://bsky.social/about/support/tos`,
+3 -3
src/screens/Login/ForgotPasswordForm.tsx
··· 1 import React, {useState} from 'react' 2 import {ActivityIndicator, Keyboard, View} from 'react-native' 3 - import {ComAtprotoServerDescribeServer} from '@atproto/api' 4 - import {BskyAgent} from '@atproto/api' 5 import {msg, Trans} from '@lingui/macro' 6 import {useLingui} from '@lingui/react' 7 import * as EmailValidator from 'email-validator' ··· 9 import {isNetworkError} from '#/lib/strings/errors' 10 import {cleanError} from '#/lib/strings/errors' 11 import {logger} from '#/logger' 12 import {atoms as a, useTheme} from '#/alf' 13 import {Button, ButtonText} from '#/components/Button' 14 import {FormError} from '#/components/forms/FormError' ··· 55 setIsProcessing(true) 56 57 try { 58 - const agent = new BskyAgent({service: serviceUrl}) 59 await agent.com.atproto.server.requestPasswordReset({email}) 60 onEmailSent() 61 } catch (e: any) {
··· 1 import React, {useState} from 'react' 2 import {ActivityIndicator, Keyboard, View} from 'react-native' 3 + import {type ComAtprotoServerDescribeServer} from '@atproto/api' 4 import {msg, Trans} from '@lingui/macro' 5 import {useLingui} from '@lingui/react' 6 import * as EmailValidator from 'email-validator' ··· 8 import {isNetworkError} from '#/lib/strings/errors' 9 import {cleanError} from '#/lib/strings/errors' 10 import {logger} from '#/logger' 11 + import {Agent} from '#/state/session/agent' 12 import {atoms as a, useTheme} from '#/alf' 13 import {Button, ButtonText} from '#/components/Button' 14 import {FormError} from '#/components/forms/FormError' ··· 55 setIsProcessing(true) 56 57 try { 58 + const agent = new Agent(null, {service: serviceUrl}) 59 await agent.com.atproto.server.requestPasswordReset({email}) 60 onEmailSent() 61 } catch (e: any) {
+2 -2
src/screens/Login/SetNewPasswordForm.tsx
··· 1 import {useState} from 'react' 2 import {ActivityIndicator, View} from 'react-native' 3 - import {BskyAgent} from '@atproto/api' 4 import {msg, Trans} from '@lingui/macro' 5 import {useLingui} from '@lingui/react' 6 ··· 9 import {cleanError} from '#/lib/strings/errors' 10 import {checkAndFormatResetCode} from '#/lib/strings/password' 11 import {logger} from '#/logger' 12 import {atoms as a, useTheme} from '#/alf' 13 import {Button, ButtonText} from '#/components/Button' 14 import {FormError} from '#/components/forms/FormError' ··· 63 setIsProcessing(true) 64 65 try { 66 - const agent = new BskyAgent({service: serviceUrl}) 67 await agent.com.atproto.server.resetPassword({ 68 token: formattedCode, 69 password,
··· 1 import {useState} from 'react' 2 import {ActivityIndicator, View} from 'react-native' 3 import {msg, Trans} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' 5 ··· 8 import {cleanError} from '#/lib/strings/errors' 9 import {checkAndFormatResetCode} from '#/lib/strings/password' 10 import {logger} from '#/logger' 11 + import {Agent} from '#/state/session/agent' 12 import {atoms as a, useTheme} from '#/alf' 13 import {Button, ButtonText} from '#/components/Button' 14 import {FormError} from '#/components/forms/FormError' ··· 63 setIsProcessing(true) 64 65 try { 66 + const agent = new Agent(null, {service: serviceUrl}) 67 await agent.com.atproto.server.resetPassword({ 68 token: formattedCode, 69 password,
+1 -1
src/state/messages/convo/agent.ts
··· 10 import {nanoid} from 'nanoid/non-secure' 11 12 import {networkRetry} from '#/lib/async/retry' 13 import {isNetworkError} from '#/lib/strings/errors' 14 import {Logger} from '#/logger' 15 import {isNative} from '#/platform/detection' ··· 33 } from '#/state/messages/convo/types' 34 import {type MessagesEventBus} from '#/state/messages/events/agent' 35 import {type MessagesEventBusError} from '#/state/messages/events/types' 36 - import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' 37 38 const logger = Logger.create(Logger.Context.ConversationAgent) 39
··· 10 import {nanoid} from 'nanoid/non-secure' 11 12 import {networkRetry} from '#/lib/async/retry' 13 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 14 import {isNetworkError} from '#/lib/strings/errors' 15 import {Logger} from '#/logger' 16 import {isNative} from '#/platform/detection' ··· 34 } from '#/state/messages/convo/types' 35 import {type MessagesEventBus} from '#/state/messages/events/agent' 36 import {type MessagesEventBusError} from '#/state/messages/events/types' 37 38 const logger = Logger.create(Logger.Context.ConversationAgent) 39
+1 -1
src/state/messages/events/agent.ts
··· 3 import {nanoid} from 'nanoid/non-secure' 4 5 import {networkRetry} from '#/lib/async/retry' 6 import {isNetworkError} from '#/lib/strings/errors' 7 import {Logger} from '#/logger' 8 import { ··· 17 type MessagesEventBusParams, 18 MessagesEventBusStatus, 19 } from '#/state/messages/events/types' 20 - import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' 21 22 const logger = Logger.create(Logger.Context.DMsAgent) 23
··· 3 import {nanoid} from 'nanoid/non-secure' 4 5 import {networkRetry} from '#/lib/async/retry' 6 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 7 import {isNetworkError} from '#/lib/strings/errors' 8 import {Logger} from '#/logger' 9 import { ··· 18 type MessagesEventBusParams, 19 MessagesEventBusStatus, 20 } from '#/state/messages/events/types' 21 22 const logger = Logger.create(Logger.Context.DMsAgent) 23
+4 -3
src/state/queries/handle-availability.ts
··· 1 - import {Agent, ComAtprotoTempCheckHandleAvailability} from '@atproto/api' 2 import {useQuery} from '@tanstack/react-query' 3 4 import { ··· 10 import {logger} from '#/logger' 11 import {useDebouncedValue} from '#/components/live/utils' 12 import * as bsky from '#/types/bsky' 13 14 export const RQKEY_handleAvailability = ( 15 handle: string, ··· 74 }, 75 ) { 76 if (serviceDid === BSKY_SERVICE_DID) { 77 - const agent = new Agent({service: BSKY_SERVICE}) 78 // entryway has a special API for handle availability 79 const {data} = await agent.com.atproto.temp.checkHandleAvailability({ 80 handle, ··· 109 } 110 } else { 111 // 3rd party PDSes won't have this API so just try and resolve the handle 112 - const agent = new Agent({service: PUBLIC_BSKY_SERVICE}) 113 try { 114 const res = await agent.resolveHandle({ 115 handle,
··· 1 + import {ComAtprotoTempCheckHandleAvailability} from '@atproto/api' 2 import {useQuery} from '@tanstack/react-query' 3 4 import { ··· 10 import {logger} from '#/logger' 11 import {useDebouncedValue} from '#/components/live/utils' 12 import * as bsky from '#/types/bsky' 13 + import {Agent} from '../session/agent' 14 15 export const RQKEY_handleAvailability = ( 16 handle: string, ··· 75 }, 76 ) { 77 if (serviceDid === BSKY_SERVICE_DID) { 78 + const agent = new Agent(null, {service: BSKY_SERVICE}) 79 // entryway has a special API for handle availability 80 const {data} = await agent.com.atproto.temp.checkHandleAvailability({ 81 handle, ··· 110 } 111 } else { 112 // 3rd party PDSes won't have this API so just try and resolve the handle 113 + const agent = new Agent(null, {service: PUBLIC_BSKY_SERVICE}) 114 try { 115 const res = await agent.resolveHandle({ 116 handle,
+5 -2
src/state/queries/messages/accept-conversation.ts
··· 1 - import {ChatBskyConvoAcceptConvo, ChatBskyConvoListConvos} from '@atproto/api' 2 import {useMutation, useQueryClient} from '@tanstack/react-query' 3 4 import {logger} from '#/logger' 5 import {useAgent} from '#/state/session' 6 - import {DM_SERVICE_HEADERS} from './const' 7 import { 8 RQKEY as CONVO_LIST_KEY, 9 RQKEY_ROOT as CONVO_LIST_ROOT_KEY,
··· 1 + import { 2 + type ChatBskyConvoAcceptConvo, 3 + type ChatBskyConvoListConvos, 4 + } from '@atproto/api' 5 import {useMutation, useQueryClient} from '@tanstack/react-query' 6 7 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 8 import {logger} from '#/logger' 9 import {useAgent} from '#/state/session' 10 import { 11 RQKEY as CONVO_LIST_KEY, 12 RQKEY_ROOT as CONVO_LIST_ROOT_KEY,
-5
src/state/queries/messages/const.ts
··· 1 - import {CHAT_PROXY_DID} from '#/env' 2 - 3 - export const DM_SERVICE_HEADERS = { 4 - 'atproto-proxy': `${CHAT_PROXY_DID}#bsky_chat`, 5 - }
···
+4 -4
src/state/queries/messages/conversation.ts
··· 1 - import {ChatBskyConvoDefs} from '@atproto/api' 2 import { 3 - QueryClient, 4 useMutation, 5 useQuery, 6 useQueryClient, 7 } from '@tanstack/react-query' 8 9 import {STALE} from '#/state/queries' 10 - import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' 11 import {useOnMarkAsRead} from '#/state/queries/messages/list-conversations' 12 import {useAgent} from '#/state/session' 13 import { 14 - ConvoListQueryData, 15 getConvoFromQueryData, 16 RQKEY_ROOT as LIST_CONVOS_KEY, 17 } from './list-conversations'
··· 1 + import {type ChatBskyConvoDefs} from '@atproto/api' 2 import { 3 + type QueryClient, 4 useMutation, 5 useQuery, 6 useQueryClient, 7 } from '@tanstack/react-query' 8 9 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 10 import {STALE} from '#/state/queries' 11 import {useOnMarkAsRead} from '#/state/queries/messages/list-conversations' 12 import {useAgent} from '#/state/session' 13 import { 14 + type ConvoListQueryData, 15 getConvoFromQueryData, 16 RQKEY_ROOT as LIST_CONVOS_KEY, 17 } from './list-conversations'
+1 -1
src/state/queries/messages/get-convo-availability.ts
··· 1 import {useQuery} from '@tanstack/react-query' 2 3 - import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' 4 import {useAgent} from '#/state/session' 5 import {STALE} from '..' 6
··· 1 import {useQuery} from '@tanstack/react-query' 2 3 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 4 import {useAgent} from '#/state/session' 5 import {STALE} from '..' 6
+2 -2
src/state/queries/messages/get-convo-for-members.ts
··· 1 - import {ChatBskyConvoGetConvoForMembers} from '@atproto/api' 2 import {useMutation, useQueryClient} from '@tanstack/react-query' 3 4 import {logger} from '#/logger' 5 - import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' 6 import {useAgent} from '#/state/session' 7 import {precacheConvoQuery} from './conversation' 8
··· 1 + import {type ChatBskyConvoGetConvoForMembers} from '@atproto/api' 2 import {useMutation, useQueryClient} from '@tanstack/react-query' 3 4 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 5 import {logger} from '#/logger' 6 import {useAgent} from '#/state/session' 7 import {precacheConvoQuery} from './conversation' 8
+5 -2
src/state/queries/messages/leave-conversation.ts
··· 1 import {useMemo} from 'react' 2 - import {ChatBskyConvoLeaveConvo, ChatBskyConvoListConvos} from '@atproto/api' 3 import { 4 useMutation, 5 useMutationState, 6 useQueryClient, 7 } from '@tanstack/react-query' 8 9 import {logger} from '#/logger' 10 - import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' 11 import {useAgent} from '#/state/session' 12 import {RQKEY_ROOT as CONVO_LIST_KEY} from './list-conversations' 13
··· 1 import {useMemo} from 'react' 2 + import { 3 + type ChatBskyConvoLeaveConvo, 4 + type ChatBskyConvoListConvos, 5 + } from '@atproto/api' 6 import { 7 useMutation, 8 useMutationState, 9 useQueryClient, 10 } from '@tanstack/react-query' 11 12 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 13 import {logger} from '#/logger' 14 import {useAgent} from '#/state/session' 15 import {RQKEY_ROOT as CONVO_LIST_KEY} from './list-conversations' 16
+1 -1
src/state/queries/messages/list-conversations.tsx
··· 13 } from '@tanstack/react-query' 14 import throttle from 'lodash.throttle' 15 16 import {useCurrentConvoId} from '#/state/messages/current-convo-id' 17 import {useMessagesEventBus} from '#/state/messages/events' 18 import {useModerationOpts} from '#/state/preferences/moderation-opts' 19 - import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' 20 import {useAgent, useSession} from '#/state/session' 21 import {useLeftConvos} from './leave-conversation' 22
··· 13 } from '@tanstack/react-query' 14 import throttle from 'lodash.throttle' 15 16 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 17 import {useCurrentConvoId} from '#/state/messages/current-convo-id' 18 import {useMessagesEventBus} from '#/state/messages/events' 19 import {useModerationOpts} from '#/state/preferences/moderation-opts' 20 import {useAgent, useSession} from '#/state/session' 21 import {useLeftConvos} from './leave-conversation' 22
+9 -5
src/state/queries/messages/mute-conversation.ts
··· 1 import { 2 - ChatBskyConvoDefs, 3 - ChatBskyConvoListConvos, 4 - ChatBskyConvoMuteConvo, 5 } from '@atproto/api' 6 - import {InfiniteData, useMutation, useQueryClient} from '@tanstack/react-query' 7 8 - import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' 9 import {useAgent} from '#/state/session' 10 import {RQKEY as CONVO_KEY} from './conversation' 11 import {RQKEY_ROOT as CONVO_LIST_KEY} from './list-conversations'
··· 1 import { 2 + type ChatBskyConvoDefs, 3 + type ChatBskyConvoListConvos, 4 + type ChatBskyConvoMuteConvo, 5 } from '@atproto/api' 6 + import { 7 + type InfiniteData, 8 + useMutation, 9 + useQueryClient, 10 + } from '@tanstack/react-query' 11 12 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 13 import {useAgent} from '#/state/session' 14 import {RQKEY as CONVO_KEY} from './conversation' 15 import {RQKEY_ROOT as CONVO_LIST_KEY} from './list-conversations'
+2 -2
src/state/queries/messages/update-all-read.ts
··· 1 - import {ChatBskyConvoListConvos} from '@atproto/api' 2 import {useMutation, useQueryClient} from '@tanstack/react-query' 3 4 import {logger} from '#/logger' 5 - import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' 6 import {useAgent} from '#/state/session' 7 import {RQKEY as CONVO_LIST_KEY} from './list-conversations' 8
··· 1 + import {type ChatBskyConvoListConvos} from '@atproto/api' 2 import {useMutation, useQueryClient} from '@tanstack/react-query' 3 4 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 5 import {logger} from '#/logger' 6 import {useAgent} from '#/state/session' 7 import {RQKEY as CONVO_LIST_KEY} from './list-conversations' 8
+3 -2
src/state/queries/service.ts
··· 1 - import {BskyAgent} from '@atproto/api' 2 import {useQuery} from '@tanstack/react-query' 3 4 const RQKEY_ROOT = 'service' 5 export const RQKEY = (serviceUrl: string) => [RQKEY_ROOT, serviceUrl] ··· 8 return useQuery({ 9 queryKey: RQKEY(serviceUrl), 10 queryFn: async () => { 11 - const agent = new BskyAgent({service: serviceUrl}) 12 const res = await agent.com.atproto.server.describeServer() 13 return res.data 14 },
··· 1 import {useQuery} from '@tanstack/react-query' 2 + 3 + import {Agent} from '../session/agent' 4 5 const RQKEY_ROOT = 'service' 6 export const RQKEY = (serviceUrl: string) => [RQKEY_ROOT, serviceUrl] ··· 9 return useQuery({ 10 queryKey: RQKEY(serviceUrl), 11 queryFn: async () => { 12 + const agent = new Agent(null, {service: serviceUrl}) 13 const res = await agent.com.atproto.server.describeServer() 14 return res.data 15 },
+41 -3
src/state/session/agent.ts
··· 1 - import {AtpSessionData, AtpSessionEvent, BskyAgent} from '@atproto/api' 2 import {TID} from '@atproto/common-web' 3 4 import {networkRetry} from '#/lib/async/retry' 5 import { 6 BSKY_SERVICE, 7 DISCOVER_SAVED_FEED, 8 IS_PROD_SERVICE, ··· 19 configureModerationForAccount, 20 configureModerationForGuest, 21 } from './moderation' 22 - import {SessionAccount} from './types' 23 import {isSessionExpired, isSignupQueued} from './util' 24 25 export function createPublicAgent() { 26 configureModerationForGuest() // Side effect but only relevant for tests 27 - return new BskyAppAgent({service: PUBLIC_BSKY_SERVICE}) 28 } 29 30 export async function createAgentAndResume( ··· 61 } 62 } 63 64 return agent.prepare(gates, moderation, onSessionChange) 65 } 66 ··· 93 const account = agentToSessionAccountOrThrow(agent) 94 const gates = tryFetchGates(account.did, 'prefer-fresh-gates') 95 const moderation = configureModerationForAccount(agent, account) 96 return agent.prepare(gates, moderation, onSessionChange) 97 } 98 ··· 180 logger.error(e, {message: `session: failed snoozeEmailConfirmationPrompt`}) 181 } 182 183 return agent.prepare(gates, moderation, onSessionChange) 184 } 185 ··· 234 } 235 } 236 237 // Not exported. Use factories above to create it. 238 let realFetch = globalThis.fetch 239 class BskyAppAgent extends BskyAgent { 240 persistSessionHandler: ((event: AtpSessionEvent) => void) | undefined =
··· 1 + import { 2 + Agent as BaseAgent, 3 + type AtprotoServiceType, 4 + type AtpSessionData, 5 + type AtpSessionEvent, 6 + BskyAgent, 7 + type Did, 8 + } from '@atproto/api' 9 + import {type FetchHandler} from '@atproto/api/dist/agent' 10 + import {type SessionManager} from '@atproto/api/dist/session-manager' 11 import {TID} from '@atproto/common-web' 12 + import {type FetchHandlerOptions} from '@atproto/xrpc' 13 14 import {networkRetry} from '#/lib/async/retry' 15 import { 16 + BLUESKY_PROXY_HEADER, 17 BSKY_SERVICE, 18 DISCOVER_SAVED_FEED, 19 IS_PROD_SERVICE, ··· 30 configureModerationForAccount, 31 configureModerationForGuest, 32 } from './moderation' 33 + import {type SessionAccount} from './types' 34 import {isSessionExpired, isSignupQueued} from './util' 35 36 + export type ProxyHeaderValue = `${Did}#${AtprotoServiceType}` 37 + 38 export function createPublicAgent() { 39 configureModerationForGuest() // Side effect but only relevant for tests 40 + 41 + const agent = new BskyAppAgent({service: PUBLIC_BSKY_SERVICE}) 42 + agent.configureProxy(BLUESKY_PROXY_HEADER) 43 + return agent 44 } 45 46 export async function createAgentAndResume( ··· 77 } 78 } 79 80 + agent.configureProxy(BLUESKY_PROXY_HEADER) 81 + 82 return agent.prepare(gates, moderation, onSessionChange) 83 } 84 ··· 111 const account = agentToSessionAccountOrThrow(agent) 112 const gates = tryFetchGates(account.did, 'prefer-fresh-gates') 113 const moderation = configureModerationForAccount(agent, account) 114 + 115 + agent.configureProxy(BLUESKY_PROXY_HEADER) 116 + 117 return agent.prepare(gates, moderation, onSessionChange) 118 } 119 ··· 201 logger.error(e, {message: `session: failed snoozeEmailConfirmationPrompt`}) 202 } 203 204 + agent.configureProxy(BLUESKY_PROXY_HEADER) 205 + 206 return agent.prepare(gates, moderation, onSessionChange) 207 } 208 ··· 257 } 258 } 259 260 + export class Agent extends BaseAgent { 261 + constructor( 262 + proxyHeader: ProxyHeaderValue | null, 263 + options: SessionManager | FetchHandler | FetchHandlerOptions, 264 + ) { 265 + super(options) 266 + if (proxyHeader) { 267 + this.configureProxy(proxyHeader) 268 + } 269 + } 270 + } 271 + 272 // Not exported. Use factories above to create it. 273 + // WARN: In the factories above, we _manually set a proxy header_ for the agent after we do whatever it is we are supposed to do. 274 + // Ideally, we wouldn't be doing this. However, since there is so much logic that requires making calls to the PDS right now, it 275 + // feels safer to just let those run as-is and set the header afterward. 276 let realFetch = globalThis.fetch 277 class BskyAppAgent extends BskyAgent { 278 persistSessionHandler: ((event: AtpSessionEvent) => void) | undefined =
+1 -1
src/view/com/modals/DeleteAccount.tsx
··· 10 import {msg, Trans} from '@lingui/macro' 11 import {useLingui} from '@lingui/react' 12 13 import {usePalette} from '#/lib/hooks/usePalette' 14 import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 15 import {cleanError} from '#/lib/strings/errors' ··· 17 import {useTheme} from '#/lib/ThemeContext' 18 import {isAndroid, isWeb} from '#/platform/detection' 19 import {useModalControls} from '#/state/modals' 20 - import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' 21 import {useAgent, useSession, useSessionApi} from '#/state/session' 22 import {atoms as a, useTheme as useNewTheme} from '#/alf' 23 import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfo} from '#/components/icons/CircleInfo'
··· 10 import {msg, Trans} from '@lingui/macro' 11 import {useLingui} from '@lingui/react' 12 13 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 14 import {usePalette} from '#/lib/hooks/usePalette' 15 import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 16 import {cleanError} from '#/lib/strings/errors' ··· 18 import {useTheme} from '#/lib/ThemeContext' 19 import {isAndroid, isWeb} from '#/platform/detection' 20 import {useModalControls} from '#/state/modals' 21 import {useAgent, useSession, useSessionApi} from '#/state/session' 22 import {atoms as a, useTheme as useNewTheme} from '#/alf' 23 import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfo} from '#/components/icons/CircleInfo'
+1 -1
src/view/com/notifications/NotificationFeedItem.tsx
··· 31 import {useQueryClient} from '@tanstack/react-query' 32 33 import {MAX_POST_LINES} from '#/lib/constants' 34 import {useAnimatedValue} from '#/lib/hooks/useAnimatedValue' 35 import {usePalette} from '#/lib/hooks/usePalette' 36 import {makeProfileLink} from '#/lib/routes/links' ··· 41 import {niceDate} from '#/lib/strings/time' 42 import {s} from '#/lib/styles' 43 import {logger} from '#/logger' 44 - import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' 45 import {type FeedNotification} from '#/state/queries/notifications/feed' 46 import {unstableCacheProfileView} from '#/state/queries/unstable-profile-cache' 47 import {useAgent} from '#/state/session'
··· 31 import {useQueryClient} from '@tanstack/react-query' 32 33 import {MAX_POST_LINES} from '#/lib/constants' 34 + import {DM_SERVICE_HEADERS} from '#/lib/constants' 35 import {useAnimatedValue} from '#/lib/hooks/useAnimatedValue' 36 import {usePalette} from '#/lib/hooks/usePalette' 37 import {makeProfileLink} from '#/lib/routes/links' ··· 42 import {niceDate} from '#/lib/strings/time' 43 import {s} from '#/lib/styles' 44 import {logger} from '#/logger' 45 import {type FeedNotification} from '#/state/queries/notifications/feed' 46 import {unstableCacheProfileView} from '#/state/queries/unstable-profile-cache' 47 import {useAgent} from '#/state/session'