Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
import { useLayoutEffect, useMemo, type ReactNode } from 'react';
|
|
|
|
import {
|
|
AppLockChromeContext,
|
|
registerAppAppLockRuntime,
|
|
type AppAppLockRuntime,
|
|
} from '../../state/appRuntimeBridge';
|
|
|
|
export type AppLockRuntimePublisherProps = {
|
|
/** App-lock runtime owned by `AppLockGate` (index.tsx render prop). */
|
|
appLock: AppAppLockRuntime;
|
|
/** `settings.appLockSettings.enabled` from the gate's settings instance. */
|
|
appLockEnabled: boolean;
|
|
children?: ReactNode;
|
|
};
|
|
|
|
/**
|
|
* Publishes the gate-owned app-lock runtime the same way SettingsPublisher
|
|
* publishes settings: the full runtime goes on the `appRuntimeBridge` slot for
|
|
* imperative callers (`getAppAppLockRuntime()`), and a narrow memoized chrome
|
|
* slice goes on context so TopTabs / AppSideEffects re-render only when the
|
|
* lock state actually changes — the full runtime changes identity on every
|
|
* gate render.
|
|
*/
|
|
export function AppLockRuntimePublisher({
|
|
appLock,
|
|
appLockEnabled,
|
|
children,
|
|
}: AppLockRuntimePublisherProps) {
|
|
useLayoutEffect(() => {
|
|
registerAppAppLockRuntime(appLock);
|
|
}, [appLock]);
|
|
|
|
// Only a real unmount clears the slot; see VaultPublisher for why.
|
|
useLayoutEffect(() => () => {
|
|
registerAppAppLockRuntime(null);
|
|
}, []);
|
|
|
|
const chrome = useMemo(
|
|
() => ({
|
|
appLockEnabled,
|
|
locked: appLock.locked,
|
|
initialized: appLock.initialized,
|
|
}),
|
|
[appLockEnabled, appLock.locked, appLock.initialized],
|
|
);
|
|
|
|
return (
|
|
<AppLockChromeContext.Provider value={chrome}>
|
|
{children}
|
|
</AppLockChromeContext.Provider>
|
|
);
|
|
}
|