mirror of
https://github.com/binaricat/Netcatty.git
synced 2026-11-09 15:52:14 +00:00
Reconcile the app-lock feature with main's refactored renderer architecture (publishers/hosts/AppShell) and main-process changes: - index.tsx/App.tsx: AppLockGate keeps ownership of useSettingsState and useAppLockState; new AppLockRuntimePublisher publishes the runtime via appRuntimeBridge; SettingsPublisher now binds the gate-owned settings. - AppSideEffects: defer deep links, tray port-forward toggles, global hotkeys and window close commands while locked; flush on unlock. - main.cjs: keep fresh-session re-lock before main's reusable-window fast path; before-quit guard delegates to handleBeforeQuit with main's async plugin-shutdown commitQuit and pending-update cancellation. - globalShortcutBridge: keep locked-state tray redaction on top of main's deferred tray panel show logic. - preload: adopt main's lastPayload replay for terminal popup config (superset of the gate-delay replay fix). - vite config: keep dev CSP plugin, adopt main's warn-only stale optimize-dep handling; electron-builder: keep Windows Hello helper extraResource with main's CLI-controlled arch targets. Co-authored-by: Cursor <cursoragent@cursor.com>
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>
|
|
);
|
|
}
|