one
Version:
One is a React framework for web, iOS, and Android apps.
145 lines (143 loc) • 5.71 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 import_jsx_runtime = require("react/jsx-runtime");
var React = __toESM(require("react"), 1);
var import_NativeSafeAreaProvider = require("./NativeSafeAreaProvider.native.js");
var import_getWindowFrame = require("./getWindowFrame.native.js");
var import_InitialWindow = require("./InitialWindow.native.js");
var import_tamaguiSafeArea = require("./tamaguiSafeArea.native.js");
var isDev = process.env.NODE_ENV !== "production";
var SafeAreaInsetsContext = /* @__PURE__ */ React.createContext(null);
if (isDev) {
SafeAreaInsetsContext.displayName = "SafeAreaInsetsContext";
}
var SafeAreaFrameContext = /* @__PURE__ */ React.createContext(null);
if (isDev) {
SafeAreaFrameContext.displayName = "SafeAreaFrameContext";
}
var ZERO_INSETS = {
top: 0,
bottom: 0,
left: 0,
right: 0
};
function SafeAreaProvider(param) {
var { children, initialMetrics, initialSafeAreaInsets, ...others } = param;
var _ref, _ref1, _ref2, _ref3, _ref4;
var parentInsets = useParentSafeAreaInsets();
var parentFrame = useParentSafeAreaFrame();
var isRoot = parentInsets === null;
var [insets, setInsets] = React.useState((_ref = (_ref1 = (_ref2 = initialMetrics === null || initialMetrics === void 0 ? void 0 : initialMetrics.insets) !== null && _ref2 !== void 0 ? _ref2 : initialSafeAreaInsets) !== null && _ref1 !== void 0 ? _ref1 : parentInsets) !== null && _ref !== void 0 ? _ref : ZERO_INSETS);
var [frame, setFrame] = React.useState((_ref3 = (_ref4 = initialMetrics === null || initialMetrics === void 0 ? void 0 : initialMetrics.frame) !== null && _ref4 !== void 0 ? _ref4 : parentFrame) !== null && _ref3 !== void 0 ? _ref3 : (0, import_getWindowFrame.getWindowFrame)());
var onInsetsChange = React.useCallback(function(event) {
var { nativeEvent: { frame: nextFrame, insets: nextInsets } } = event;
if (isRoot && nextFrame) {
(0, import_tamaguiSafeArea.feedTamaguiSafeArea)({
insets: nextInsets,
frame: nextFrame
}, tamaguiHooks);
}
setFrame(function(curFrame) {
if (nextFrame && (nextFrame.height !== curFrame.height || nextFrame.width !== curFrame.width || nextFrame.x !== curFrame.x || nextFrame.y !== curFrame.y)) {
return nextFrame;
}
return curFrame;
});
setInsets(function(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);
}
var NO_INSETS_ERROR = "No safe area value available. Make sure you are rendering `<SafeAreaProvider>` at the top of your app.";
function useSafeAreaInsets() {
var insets = React.useContext(SafeAreaInsetsContext);
if (insets == null) {
throw new Error(NO_INSETS_ERROR);
}
return insets;
}
function useSafeAreaFrame() {
var frame = React.useContext(SafeAreaFrameContext);
if (frame == null) {
throw new Error(NO_INSETS_ERROR);
}
return frame;
}
function withSafeAreaInsets(WrappedComponent) {
return /* @__PURE__ */ React.forwardRef(function(props, ref) {
var insets = useSafeAreaInsets();
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WrappedComponent, {
...props,
insets,
ref
});
});
}
var tamaguiHooks = {
useSafeAreaInsets,
useSafeAreaFrame
};
(0, import_tamaguiSafeArea.feedTamaguiSafeArea)(import_InitialWindow.initialWindowMetrics, tamaguiHooks);
function useSafeArea() {
return useSafeAreaInsets();
}
var SafeAreaConsumer = SafeAreaInsetsContext.Consumer;
var SafeAreaContext = SafeAreaInsetsContext;