85 lines
3.1 KiB
JavaScript
85 lines
3.1 KiB
JavaScript
import { Platform } from 'react-native';
|
|
// This value must be kept in sync with native side.
|
|
export const SHEET_FIT_TO_CONTENTS = [-1];
|
|
export const SHEET_COMPAT_LARGE = [1.0];
|
|
export const SHEET_COMPAT_MEDIUM = [0.5];
|
|
export const SHEET_COMPAT_ALL = [0.5, 1.0];
|
|
export const SHEET_DIMMED_ALWAYS = -1;
|
|
export function assertDetentsArrayIsSorted(array) {
|
|
for (let i = 1; i < array.length; i++) {
|
|
if (array[i - 1] > array[i]) {
|
|
throw new Error('[RNScreens] The detent array is not sorted in ascending order!');
|
|
}
|
|
}
|
|
}
|
|
|
|
// These exist to transform old 'legacy' values used by the formsheet API to the new API shape.
|
|
// We can get rid of it, once we get rid of support for legacy values: 'large', 'medium', 'all'.
|
|
export function resolveSheetAllowedDetents(allowedDetentsCompat) {
|
|
if (Array.isArray(allowedDetentsCompat)) {
|
|
if (Platform.OS === 'android' && allowedDetentsCompat.length > 3) {
|
|
if (__DEV__) {
|
|
console.warn('[RNScreens] Sheets API on Android do accept only up to 3 values. Any surplus value are ignored.');
|
|
}
|
|
allowedDetentsCompat = allowedDetentsCompat.slice(0, 3);
|
|
}
|
|
if (__DEV__) {
|
|
assertDetentsArrayIsSorted(allowedDetentsCompat);
|
|
}
|
|
return allowedDetentsCompat;
|
|
} else if (allowedDetentsCompat === 'fitToContents') {
|
|
return SHEET_FIT_TO_CONTENTS;
|
|
} else if (allowedDetentsCompat === 'large') {
|
|
return SHEET_COMPAT_LARGE;
|
|
} else if (allowedDetentsCompat === 'medium') {
|
|
return SHEET_COMPAT_MEDIUM;
|
|
} else if (allowedDetentsCompat === 'all') {
|
|
return SHEET_COMPAT_ALL;
|
|
} else {
|
|
// Safe default, only large detent is allowed.
|
|
return SHEET_COMPAT_LARGE;
|
|
}
|
|
}
|
|
export function resolveSheetLargestUndimmedDetent(lud, lastDetentIndex) {
|
|
if (typeof lud === 'number') {
|
|
if (!isIndexInClosedRange(lud, SHEET_DIMMED_ALWAYS, lastDetentIndex)) {
|
|
if (__DEV__) {
|
|
throw new Error("[RNScreens] Provided value of 'sheetLargestUndimmedDetentIndex' prop is out of bounds of 'sheetAllowedDetents' array.");
|
|
}
|
|
// Return default in production
|
|
return SHEET_DIMMED_ALWAYS;
|
|
}
|
|
return lud;
|
|
} else if (lud === 'last') {
|
|
return lastDetentIndex;
|
|
} else if (lud === 'none' || lud === 'all') {
|
|
return SHEET_DIMMED_ALWAYS;
|
|
} else if (lud === 'large') {
|
|
return 1;
|
|
} else if (lud === 'medium') {
|
|
return 0;
|
|
} else {
|
|
// Safe default, every detent is dimmed
|
|
return SHEET_DIMMED_ALWAYS;
|
|
}
|
|
}
|
|
export function resolveSheetInitialDetentIndex(index, lastDetentIndex) {
|
|
if (index === 'last') {
|
|
index = lastDetentIndex;
|
|
} else if (index == null) {
|
|
// Intentional check for undefined & null ^
|
|
index = 0;
|
|
}
|
|
if (!isIndexInClosedRange(index, 0, lastDetentIndex)) {
|
|
if (__DEV__) {
|
|
throw new Error("[RNScreens] Provided value of 'sheetInitialDetentIndex' prop is out of bounds of 'sheetAllowedDetents' array.");
|
|
}
|
|
// Return default in production
|
|
return 0;
|
|
}
|
|
return index;
|
|
}
|
|
function isIndexInClosedRange(value, lowerBound, upperBound) {
|
|
return Number.isInteger(value) && value >= lowerBound && value <= upperBound;
|
|
}
|
|
//# sourceMappingURL=sheet.js.map
|