one
Version:
One is a React framework for web, iOS, and Android apps.
141 lines (140 loc) • 5.22 kB
JavaScript
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target, mod));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var SafeAreaContext_exports = {};
__export(SafeAreaContext_exports, {
SafeAreaConsumer: () => SafeAreaConsumer,
SafeAreaContext: () => SafeAreaContext,
SafeAreaFrameContext: () => SafeAreaFrameContext,
SafeAreaInsetsContext: () => SafeAreaInsetsContext,
SafeAreaProvider: () => SafeAreaProvider,
useSafeArea: () => useSafeArea,
useSafeAreaFrame: () => useSafeAreaFrame,
useSafeAreaInsets: () => useSafeAreaInsets,
withSafeAreaInsets: () => withSafeAreaInsets
});
module.exports = __toCommonJS(SafeAreaContext_exports);
var React = __toESM(require("react"), 1);
var import_NativeSafeAreaProvider = require("./NativeSafeAreaProvider.cjs");
var import_getWindowFrame = require("./getWindowFrame.cjs");
var import_InitialWindow = require("./InitialWindow.cjs");
var import_tamaguiSafeArea = require("./tamaguiSafeArea.cjs");
var import_jsx_runtime = require("react/jsx-runtime");
const isDev = process.env.NODE_ENV !== "production";
const SafeAreaInsetsContext = React.createContext(null);
if (isDev) {
SafeAreaInsetsContext.displayName = "SafeAreaInsetsContext";
}
const SafeAreaFrameContext = React.createContext(null);
if (isDev) {
SafeAreaFrameContext.displayName = "SafeAreaFrameContext";
}
const ZERO_INSETS = {
top: 0,
bottom: 0,
left: 0,
right: 0
};
function SafeAreaProvider({ children, initialMetrics, initialSafeAreaInsets, ...others }) {
const parentInsets = useParentSafeAreaInsets();
const parentFrame = useParentSafeAreaFrame();
const isRoot = parentInsets === null;
const [insets, setInsets] = React.useState(initialMetrics?.insets ?? initialSafeAreaInsets ?? parentInsets ?? ZERO_INSETS);
const [frame, setFrame] = React.useState(initialMetrics?.frame ?? parentFrame ?? (0, import_getWindowFrame.getWindowFrame)());
const onInsetsChange = React.useCallback((event) => {
const { nativeEvent: { frame: nextFrame, insets: nextInsets } } = event;
if (isRoot && nextFrame) {
(0, import_tamaguiSafeArea.feedTamaguiSafeArea)({
insets: nextInsets,
frame: nextFrame
}, tamaguiHooks);
}
setFrame((curFrame) => {
if (nextFrame && (nextFrame.height !== curFrame.height || nextFrame.width !== curFrame.width || nextFrame.x !== curFrame.x || nextFrame.y !== curFrame.y)) {
return nextFrame;
}
return curFrame;
});
setInsets((curInsets) => {
if (!curInsets || nextInsets.bottom !== curInsets.bottom || nextInsets.left !== curInsets.left || nextInsets.right !== curInsets.right || nextInsets.top !== curInsets.top) {
return nextInsets;
}
return curInsets;
});
}, [isRoot]);
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_NativeSafeAreaProvider.NativeSafeAreaProvider, {
onInsetsChange,
...others,
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SafeAreaFrameContext.Provider, {
value: frame,
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SafeAreaInsetsContext.Provider, {
value: insets,
children
})
})
});
}
function useParentSafeAreaInsets() {
return React.useContext(SafeAreaInsetsContext);
}
function useParentSafeAreaFrame() {
return React.useContext(SafeAreaFrameContext);
}
const NO_INSETS_ERROR = "No safe area value available. Make sure you are rendering `<SafeAreaProvider>` at the top of your app.";
function useSafeAreaInsets() {
const insets = React.useContext(SafeAreaInsetsContext);
if (insets == null) {
throw new Error(NO_INSETS_ERROR);
}
return insets;
}
function useSafeAreaFrame() {
const frame = React.useContext(SafeAreaFrameContext);
if (frame == null) {
throw new Error(NO_INSETS_ERROR);
}
return frame;
}
function withSafeAreaInsets(WrappedComponent) {
return React.forwardRef((props, ref) => {
const insets = useSafeAreaInsets();
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WrappedComponent, {
...props,
insets,
ref
});
});
}
const tamaguiHooks = {
useSafeAreaInsets,
useSafeAreaFrame
};
(0, import_tamaguiSafeArea.feedTamaguiSafeArea)(import_InitialWindow.initialWindowMetrics, tamaguiHooks);
function useSafeArea() {
return useSafeAreaInsets();
}
const SafeAreaConsumer = SafeAreaInsetsContext.Consumer;
const SafeAreaContext = SafeAreaInsetsContext;