@fruits-chain/react-native-xiaoshu
Version:
🌈 React Native UI library
103 lines (102 loc) • 3.77 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useElevator = exports.ElevatorContextProvider = void 0;
var _react = _interopRequireWildcard(require("react"));
var _useDebounceFn = _interopRequireDefault(require("../hooks/useDebounceFn.js"));
var _jsxRuntime = require("react/jsx-runtime");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
const ElevatorContext = /*#__PURE__*/(0, _react.createContext)({
// targetRefMap: {},
// scrollRef: {
// current: null,
// },
elevator: [],
registerTarget: function () {
throw new Error('Function not implemented.');
},
cancelTarget: function () {
throw new Error('Function not implemented.');
},
registerScroll: function () {
throw new Error('Function not implemented.');
}
});
const useElevator = () => (0, _react.useContext)(ElevatorContext);
exports.useElevator = useElevator;
const getTargetRelativeLayout = (target, scroll) => new Promise((resolve, reject) => {
target.current?.measureLayout(scroll.current,
// eslint-disable-next-line max-params
(left, top, width, height) => {
resolve({
left,
top,
width,
height
});
}, reject);
});
const ElevatorContextProvider = ({
children
}) => {
const TargetRefMap = (0, _react.useRef)({});
const ScrollRef = (0, _react.useRef)(null);
const [elevator, setElevator] = (0, _react.useState)([]);
const {
run: initNav
} = (0, _useDebounceFn.default)(() => {
const refs = Object.keys(TargetRefMap.current).map(key => {
return {
label: key,
ref: TargetRefMap.current[key]
};
}).filter(item => !!item.ref);
Promise.all(refs.map(item => getTargetRelativeLayout(item.ref, ScrollRef.current))).then(datas => {
setElevator(datas.map(({
top
}, index) => {
return {
label: refs[index].label,
top
};
}).sort((a, b) => a.top - b.top));
}).catch(() => {
setElevator([]);
});
}, {
wait: 200,
leading: false,
trailing: true
});
const registerScroll = (0, _react.useCallback)(ref => {
if (!ScrollRef.current || ScrollRef.current.current !== ref.current) {
ScrollRef.current = ref;
initNav();
}
}, [initNav]);
const registerTarget = (0, _react.useCallback)((id, ref) => {
TargetRefMap.current[id] = ref;
initNav();
}, [initNav]);
const cancelTarget = (0, _react.useCallback)(id => {
TargetRefMap.current[id] = undefined;
initNav();
}, [initNav]);
const value = (0, _react.useMemo)(() => {
return {
elevator,
registerScroll,
registerTarget,
cancelTarget
};
}, [cancelTarget, elevator, registerScroll, registerTarget]);
return /*#__PURE__*/(0, _jsxRuntime.jsx)(ElevatorContext.Provider, {
value: value,
children: children
});
};
exports.ElevatorContextProvider = ElevatorContextProvider;
//# sourceMappingURL=context.js.map
;