react-native-actions-sheet
Version:
A Cross Platform(Android & iOS) ActionSheet with a robust and flexible api, native performance and zero dependency code for react native. Create anything you want inside ActionSheet.
155 lines (154 loc) • 6.61 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
import { createContext, useCallback, useContext, useState } from 'react';
import { Animated } from 'react-native';
export var useRouter = function (_a) {
var onNavigate = _a.onNavigate, onNavigateBack = _a.onNavigateBack, initialRoute = _a.initialRoute, routes = _a.routes, getRef = _a.getRef, routeOpacity = _a.routeOpacity;
var _b = useState([]), stack = _b[0], setStack = _b[1];
var currentRoute = stack === null || stack === void 0 ? void 0 : stack[stack.length - 1];
var animate = useCallback(function (snap, opacity, delay) {
if (snap === void 0) { snap = 0; }
if (opacity === void 0) { opacity = 0; }
if (delay === void 0) { delay = 0; }
getRef === null || getRef === void 0 ? void 0 : getRef().snapToRelativeOffset(snap);
Animated.timing(routeOpacity, {
toValue: opacity,
duration: 150,
useNativeDriver: true,
delay: delay,
}).start();
}, [getRef, routeOpacity]);
var navigate = useCallback(function (name, params, snap) {
animate(snap || 20, 0);
setTimeout(function () {
setStack(function (state) {
var next = routes === null || routes === void 0 ? void 0 : routes.find(function (route) { return route.name === name; });
if (!next) {
animate(0, 1);
return state;
}
var currentIndex = state.findIndex(function (route) { return route.name === next.name; });
if (currentIndex > -1) {
var nextStack = __spreadArray([], state, true);
nextStack.splice(currentIndex, 1);
return __spreadArray(__spreadArray([], nextStack, true), [__assign(__assign({}, next), { params: params || next.params })], false);
}
onNavigate === null || onNavigate === void 0 ? void 0 : onNavigate(next.name);
animate(0, 1, 150);
return __spreadArray(__spreadArray([], state, true), [__assign(__assign({}, next), { params: params || next.params })], false);
});
}, 100);
}, [animate, routes, onNavigate]);
var initialNavigation = function () {
if (!routes)
return;
if (initialRoute) {
var route = routes === null || routes === void 0 ? void 0 : routes.find(function (rt) { return rt.name === initialRoute; });
if (route) {
setStack([route]);
}
}
else {
setStack([routes[0]]);
}
Animated.timing(routeOpacity, {
toValue: 1,
duration: 150,
useNativeDriver: true,
}).start();
};
var goBack = function (name, snap) {
getRef === null || getRef === void 0 ? void 0 : getRef().snapToRelativeOffset(snap || -10);
animate(snap || -10, 0);
setTimeout(function () {
setStack(function (state) {
var _a, _b;
var next = routes === null || routes === void 0 ? void 0 : routes.find(function (route) { return route.name === name; });
if (state.length === 1) {
close();
animate(0, 1);
return state;
}
if (!next) {
var nextStack = __spreadArray([], state, true);
nextStack.pop();
if (currentRoute) {
onNavigateBack === null || onNavigateBack === void 0 ? void 0 : onNavigateBack((_a = nextStack[nextStack.length - 1]) === null || _a === void 0 ? void 0 : _a.name);
animate(0, 1, 150);
}
return nextStack;
}
var currentIndex = stack.findIndex(function (route) { return route.name === next.name; });
if (currentIndex > -1) {
var nextStack = __spreadArray([], state, true);
nextStack.splice(currentIndex);
onNavigateBack === null || onNavigateBack === void 0 ? void 0 : onNavigateBack((_b = nextStack[nextStack.length - 1]) === null || _b === void 0 ? void 0 : _b.name);
animate(0, 1, 150);
return __spreadArray(__spreadArray([], nextStack, true), [next], false);
}
animate(0, 1, 150);
onNavigateBack === null || onNavigateBack === void 0 ? void 0 : onNavigateBack(next.name);
return __spreadArray(__spreadArray([], stack, true), [next], false);
});
}, 100);
};
var close = function () {
var _a;
(_a = getRef === null || getRef === void 0 ? void 0 : getRef()) === null || _a === void 0 ? void 0 : _a.hide();
};
var popToTop = function () {
if (!stack[0]) {
return;
}
goBack(stack[0].name);
};
var canGoBack = function () {
return stack && stack.length > 1;
};
return {
currentRoute: currentRoute,
navigate: navigate,
goBack: goBack,
close: close,
popToTop: popToTop,
hasRoutes: function () { return routes && routes.length > 0; },
stack: stack,
initialNavigation: initialNavigation,
canGoBack: canGoBack,
};
};
export var RouterContext = createContext(undefined);
/**
* A hook that you can use to control the router.
*/
export function useSheetRouter(
//@ts-ignore
id) {
return useContext(RouterContext);
}
export var RouterParamsContext = createContext(undefined);
/**
* A hook that returns the params for current navigation route.
*/
export function useSheetRouteParams(id, routeKey) {
var context = useContext(RouterParamsContext);
return context;
}