/
aqa
/
claude-code
Обзор
Документация
Войти
/
aqa
/
claude-code
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
state/AppState.tsx
200 строк
23 KB
kuberwastaken
new initial commit (history rewritten)
01 апр 2026, 14:57
01 апр 2026, 14:57
c1996f2
Код
Авторство
О чём код?
import { c as _c } from "react/compiler-runtime"; import { feature } from 'bun:bundle'; import React, { useContext, useEffect, useEffectEvent, useState, useSyncExternalStore } from 'react'; import { MailboxProvider } from '../context/mailbox.js'; import { useSettingsChange } from '../hooks/useSettingsChange.js'; import { logForDebugging } from '../utils/debug.js'; import { createDisabledBypassPermissionsContext, isBypassPermissionsModeDisabled } from '../utils/permissions/permissionSetup.js'; import { applySettingsChange } from '../utils/settings/applySettingsChange.js'; import type { SettingSource } from '../utils/settings/constants.js'; import { createStore } from './store.js'; // DCE: voice context is ant-only. External builds get a passthrough. /* eslint-disable @typescript-eslint/no-require-imports */ const VoiceProvider: (props: { children: React.ReactNode; }) => React.ReactNode = feature('VOICE_MODE') ? require('../context/voice.js').VoiceProvider : ({ children }) => children; /* eslint-enable @typescript-eslint/no-require-imports */ import { type AppState, type AppStateStore, getDefaultAppState } from './AppStateStore.js'; // TODO: Remove these re-exports once all callers import directly from // ./AppStateStore.js. Kept for back-compat during migration so .ts callers // can incrementally move off the .tsx import and stop pulling React. export { type AppState, type AppStateStore, type CompletionBoundary, getDefaultAppState, IDLE_SPECULATION_STATE, type SpeculationResult, type SpeculationState } from './AppStateStore.js'; export const AppStoreContext = React.createContext<AppStateStore | null>(null); type Props = { children: React.ReactNode; initialState?: AppState; onChangeAppState?: (args: { newState: AppState; oldState: AppState; }) => void; }; const HasAppStateContext = React.createContext<boolean>(false); export function AppStateProvider(t0) { const $ = _c(13); const { children, initialState, onChangeAppState } = t0; const hasAppStateContext = useContext(HasAppStateContext); if (hasAppStateContext) { throw new Error("AppStateProvider can not be nested within another AppStateProvider"); } let t1; if ($[0] !== initialState || $[1] !== onChangeAppState) { t1 = () => createStore(initialState ?? getDefaultAppState(), onChangeAppState); $[0] = initialState; $[1] = onChangeAppState; $[2] = t1; } else { t1 = $[2]; } const [store] = useState(t1); let t2; if ($[3] !== store) { t2 = () => { const { toolPermissionContext } = store.getState(); if (toolPermissionContext.isBypassPermissionsModeAvailable && isBypassPermissionsModeDisabled()) { logForDebugging("Disabling bypass permissions mode on mount (remote settings loaded before mount)"); store.setState(_temp); } }; $[3] = store; $[4] = t2; } else { t2 = $[4]; } let t3; if ($[5] === Symbol.for("react.memo_cache_sentinel")) { t3 = []; $[5] = t3; } else { t3 = $[5]; } useEffect(t2, t3); let t4; if ($[6] !== store.setState) { t4 = source => applySettingsChange(source, store.setState); $[6] = store.setState; $[7] = t4; } else { t4 = $[7]; } const onSettingsChange = useEffectEvent(t4); useSettingsChange(onSettingsChange); let t5; if ($[8] !== children) { t5 = <MailboxProvider><VoiceProvider>{children}</VoiceProvider></MailboxProvider>; $[8] = children; $[9] = t5; } else { t5 = $[9]; } let t6; if ($[10] !== store || $[11] !== t5) { t6 = <HasAppStateContext.Provider value={true}><AppStoreContext.Provider value={store}>{t5}</AppStoreContext.Provider></HasAppStateContext.Provider>; $[10] = store; $[11] = t5; $[12] = t6; } else { t6 = $[12]; } return t6; } function _temp(prev) { return { ...prev, toolPermissionContext: createDisabledBypassPermissionsContext(prev.toolPermissionContext) }; } function useAppStore(): AppStateStore { // eslint-disable-next-line react-hooks/rules-of-hooks const store = useContext(AppStoreContext); if (!store) { throw new ReferenceError('useAppState/useSetAppState cannot be called outside of an <AppStateProvider />'); } return store; } /** * Subscribe to a slice of AppState. Only re-renders when the selected value * changes (compared via Object.is). * * For multiple independent fields, call the hook multiple times: * ``` * const verbose = useAppState(s => s.verbose) * const model = useAppState(s => s.mainLoopModel) * ``` * * Do NOT return new objects from the selector -- Object.is will always see * them as changed. Instead, select an existing sub-object reference: * ``` * const { text, promptId } = useAppState(s => s.promptSuggestion) // good * ``` */ export function useAppState(selector) { const $ = _c(3); const store = useAppStore(); let t0; if ($[0] !== selector || $[1] !== store) { t0 = () => { const state = store.getState(); const selected = selector(state); if (false && state === selected) { throw new Error(`Your selector in \`useAppState(${selector.toString()})\` returned the original state, which is not allowed. You must instead return a property for optimised rendering.`); } return selected; }; $[0] = selector; $[1] = store; $[2] = t0; } else { t0 = $[2]; } const get = t0; return useSyncExternalStore(store.subscribe, get, get); } /** * Get the setAppState updater without subscribing to any state. * Returns a stable reference that never changes -- components using only * this hook will never re-render from state changes. */ export function useSetAppState() { return useAppStore().setState; } /** * Get the store directly (for passing getState/setState to non-React code). */ export function useAppStateStore() { return useAppStore(); } const NOOP_SUBSCRIBE = () => () => {}; /** * Safe version of useAppState that returns undefined if called outside of AppStateProvider. * Useful for components that may be rendered in contexts where AppStateProvider isn't available. */ export function useAppStateMaybeOutsideOfProvider(selector) { const $ = _c(3); const store = useContext(AppStoreContext); let t0; if ($[0] !== selector || $[1] !== store) { t0 = () => store ? selector(store.getState()) : undefined; $[0] = selector; $[1] = store; $[2] = t0; } else { t0 = $[2]; } return useSyncExternalStore(store ? store.subscribe : NOOP_SUBSCRIBE, t0); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiUmVhY3QiLCJ1c2VDb250ZXh0IiwidXNlRWZmZWN0IiwidXNlRWZmZWN0RXZlbnQiLCJ1c2VTdGF0ZSIsInVzZVN5bmNF … [Строка слишком длинная. Вы можете скачать файл]