mirror of
https://github.com/block/buzz.git
synced 2026-11-01 15:01:12 +00:00
Signed-off-by: Taylor Ho <taylorkmho@gmail.com> Co-authored-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co>
53 lines
1.4 KiB
TypeScript
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));
|
|
}
|