diff --git a/package.json b/package.json index c9a2c974c2..090256c006 100644 --- a/package.json +++ b/package.json @@ -119,6 +119,7 @@ "@types/lodash.throttle": "^4.1.9", "@types/node": "^20.14.3", "@zxing/text-encoding": "^0.9.0", + "abortcontroller-polyfill": "^1.7.8", "array.prototype.findlast": "^1.2.3", "await-lock": "^2.2.2", "babel-plugin-transform-remove-console": "^6.9.4", @@ -130,6 +131,7 @@ "email-validator": "^2.0.4", "emoji-mart": "^5.5.2", "emoji-regex": "^10.4.0", + "event-target-polyfill": "^0.0.4", "eventemitter3": "^5.0.1", "expo": "53.0.11", "expo-application": "~6.1.4", diff --git a/src/App.native.tsx b/src/App.native.tsx index 87429d8458..56bb3dd442 100644 --- a/src/App.native.tsx +++ b/src/App.native.tsx @@ -93,7 +93,7 @@ beginResolveGeolocation() function InnerApp() { const [isReady, setIsReady] = React.useState(false) const {currentAccount} = useSession() - const {resumeSession} = useSessionApi() + const {resumeSession, resumeSessionOauth} = useSessionApi() const theme = useColorModeTheme() const {_} = useLingui() const hasCheckedReferrer = useStarterPackEntry() @@ -103,7 +103,11 @@ function InnerApp() { async function onLaunch(account?: SessionAccount) { try { if (account) { - await resumeSession(account) + if (true) { + await resumeSessionOauth(account) + } else { + await resumeSession(account) + } } else { await tryFetchGates(undefined, 'prefer-fresh-gates') } @@ -115,7 +119,7 @@ function InnerApp() { } const account = readLastActiveAccount() onLaunch(account) - }, [resumeSession]) + }, [resumeSession, resumeSessionOauth]) useEffect(() => { return listenSessionDropped(() => { diff --git a/src/App.web.tsx b/src/App.web.tsx index 04de8529ff..0a8c2dd18b 100644 --- a/src/App.web.tsx +++ b/src/App.web.tsx @@ -72,7 +72,7 @@ beginResolveGeolocation() function InnerApp() { const [isReady, setIsReady] = React.useState(false) const {currentAccount} = useSession() - const {resumeSession} = useSessionApi() + const {resumeSession, resumeSessionOauth} = useSessionApi() const theme = useColorModeTheme() const {_} = useLingui() const hasCheckedReferrer = useStarterPackEntry() @@ -82,7 +82,11 @@ function InnerApp() { async function onLaunch(account?: SessionAccount) { try { if (account) { - await resumeSession(account) + if (true) { + await resumeSessionOauth(account) + } else { + await resumeSession(account) + } } } catch (e) { logger.error(`session: resumeSession failed`, {message: e}) @@ -92,7 +96,7 @@ function InnerApp() { } const account = readLastActiveAccount() onLaunch(account) - }, [resumeSession]) + }, [resumeSession, resumeSessionOauth]) useEffect(() => { return listenSessionDropped(() => { diff --git a/src/lib/hooks/useAccountSwitcher.ts b/src/lib/hooks/useAccountSwitcher.ts index 22eb348f2e..e54b5c1518 100644 --- a/src/lib/hooks/useAccountSwitcher.ts +++ b/src/lib/hooks/useAccountSwitcher.ts @@ -4,16 +4,16 @@ import {useLingui} from '@lingui/react' import {logger} from '#/logger' import {isWeb} from '#/platform/detection' -import {SessionAccount, useSessionApi} from '#/state/session' +import {type SessionAccount, useSessionApi} from '#/state/session' import {useLoggedOutViewControls} from '#/state/shell/logged-out' import * as Toast from '#/view/com/util/Toast' import {logEvent} from '../statsig/statsig' -import {LogEvents} from '../statsig/statsig' +import {type LogEvents} from '../statsig/statsig' export function useAccountSwitcher() { const [pendingDid, setPendingDid] = useState(null) const {_} = useLingui() - const {resumeSession} = useSessionApi() + const {resumeSession, resumeSessionOauth} = useSessionApi() const {requestSwitchToAccount} = useLoggedOutViewControls() const onPressSwitchAccount = useCallback( @@ -36,7 +36,11 @@ export function useAccountSwitcher() { // So we change the URL ourselves. The navigator will pick it up on remount. history.pushState(null, '', '/') } - await resumeSession(account) + if (true) { + await resumeSessionOauth(account) + } else { + await resumeSession(account) + } logEvent('account:loggedIn', {logContext, withPassword: false}) Toast.show(_(msg`Signed in as @${account.handle}`)) } else { @@ -59,7 +63,7 @@ export function useAccountSwitcher() { setPendingDid(null) } }, - [_, resumeSession, requestSwitchToAccount, pendingDid], + [_, resumeSession, resumeSessionOauth, requestSwitchToAccount, pendingDid], ) return {onPressSwitchAccount, pendingDid} diff --git a/src/platform/polyfills.ts b/src/platform/polyfills.ts index bb17630067..88d2ffb4b3 100644 --- a/src/platform/polyfills.ts +++ b/src/platform/polyfills.ts @@ -1,5 +1,7 @@ import 'react-native-url-polyfill/auto' import 'fast-text-encoding' +import 'abortcontroller-polyfill/dist/polyfill-patch-fetch' +import 'event-target-polyfill' export {} /** diff --git a/src/screens/Login/ChooseAccountForm.tsx b/src/screens/Login/ChooseAccountForm.tsx index 9765786ecf..885ae21a79 100644 --- a/src/screens/Login/ChooseAccountForm.tsx +++ b/src/screens/Login/ChooseAccountForm.tsx @@ -5,7 +5,7 @@ import {useLingui} from '@lingui/react' import {logEvent} from '#/lib/statsig/statsig' import {logger} from '#/logger' -import {SessionAccount, useSession, useSessionApi} from '#/state/session' +import {type SessionAccount, useSession, useSessionApi} from '#/state/session' import {useLoggedOutViewControls} from '#/state/shell/logged-out' import * as Toast from '#/view/com/util/Toast' import {atoms as a} from '#/alf' @@ -24,7 +24,7 @@ export const ChooseAccountForm = ({ const [pendingDid, setPendingDid] = React.useState(null) const {_} = useLingui() const {currentAccount} = useSession() - const {resumeSession} = useSessionApi() + const {resumeSession, resumeSessionOauth} = useSessionApi() const {setShowLoggedOut} = useLoggedOutViewControls() const onSelect = React.useCallback( @@ -45,7 +45,11 @@ export const ChooseAccountForm = ({ } try { setPendingDid(account.did) - await resumeSession(account) + if (true) { + resumeSessionOauth(account) + } else { + await resumeSession(account) + } logEvent('account:loggedIn', { logContext: 'ChooseAccountForm', withPassword: false, @@ -64,6 +68,7 @@ export const ChooseAccountForm = ({ [ currentAccount, resumeSession, + resumeSessionOauth, pendingDid, onSelectAccount, setShowLoggedOut, diff --git a/src/state/session/index.tsx b/src/state/session/index.tsx index f74c82ed8b..f39762b1bd 100644 --- a/src/state/session/index.tsx +++ b/src/state/session/index.tsx @@ -272,7 +272,11 @@ export function Provider({children}: React.PropsWithChildren<{}>) { ) if (syncedAccount && syncedAccount.refreshJwt) { if (syncedAccount.did !== state.currentAgentState.did) { - resumeSession(syncedAccount) + if (true) { + resumeSessionOauth(syncedAccount) + } else { + resumeSession(syncedAccount) + } } else { const agent = state.currentAgentState.agent as BskyAgent const prevSession = agent.session @@ -286,7 +290,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) { } } }) - }, [state, resumeSession]) + }, [state, resumeSession, resumeSessionOauth]) const stateContext = React.useMemo( () => ({ @@ -335,7 +339,8 @@ export function Provider({children}: React.PropsWithChildren<{}>) { addSessionDebugLog({type: 'agent:switch', prevAgent, nextAgent: agent}) // We never reuse agents so let's fully neutralize the previous one. // This ensures it won't try to consume any refresh tokens. - prevAgent.dispose() + // TODO: this is a hack! + prevAgent.dispose?.() } }, [agent]) diff --git a/yarn.lock b/yarn.lock index 6884900f1a..6052cfca9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8070,6 +8070,11 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" +abortcontroller-polyfill@^1.7.8: + version "1.7.8" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz#fe8d4370403f02e2aa37e3d2b0b178bae9d83f49" + integrity sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ== + accepts@^1.3.7, accepts@^1.3.8, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -11153,6 +11158,11 @@ etcd3@^1.1.2: bignumber.js "^9.1.1" cockatiel "^3.1.1" +event-target-polyfill@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/event-target-polyfill/-/event-target-polyfill-0.0.4.tgz#060ee66e85aaedc76b6fa66079782dcc11cba496" + integrity sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ== + event-target-shim@^5.0.0, event-target-shim@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"