Files
buzz/desktop/src/shared/layout/auxiliaryPanelContext.ts
Taylor Ho e6738c5015 refactor(desktop): centralize auxiliary panel shell (#1343)
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co>
2026-06-29 16:19:48 -06:00

53 lines
1.4 KiB
TypeScript

import * as React from "react";
export type AuxiliaryPanelMode = "docked" | "panel" | "single-panel";
export type AuxiliaryPanelLayout = "standalone" | "split";
export type AuxiliaryPanelContextValue = {
isFloatingOverlay: boolean;
isOverlay: boolean;
isSinglePanelView: boolean;
isSplitLayout: boolean;
layout: AuxiliaryPanelLayout;
mode: AuxiliaryPanelMode;
onClose: () => void;
transparentChrome: boolean;
widthPx: number;
};
export const AuxiliaryPanelContext =
React.createContext<AuxiliaryPanelContextValue | null>(null);
export function requireAuxiliaryPanelContext(
context: AuxiliaryPanelContextValue | null,
): AuxiliaryPanelContextValue {
if (!context) {
throw new Error("useAuxiliaryPanel must be used within AuxiliaryPanel");
}
return context;
}
export function resolveAuxiliaryPanelBodyMode({
context,
mode,
}: {
context: AuxiliaryPanelContextValue | null;
mode?: AuxiliaryPanelMode;
}): AuxiliaryPanelMode {
const resolvedMode = mode ?? context?.mode;
if (resolvedMode == null) {
throw new Error(
"AuxiliaryPanelBody requires `mode` or an AuxiliaryPanel ancestor",
);
}
return resolvedMode;
}
/** Read chrome/layout state from the nearest `AuxiliaryPanel` ancestor. */
export function useAuxiliaryPanel(): AuxiliaryPanelContextValue {
return requireAuxiliaryPanelContext(React.useContext(AuxiliaryPanelContext));
}