react-native-reanimated
Version:
More powerful alternative to Animated library for React Native.
138 lines (137 loc) • 4.11 kB
JavaScript
;
import { ReanimatedError } from '../../../../common';
import { isAngle, isNumber, isNumberArray, isPercentage } from '../../../utils';
export const ERROR_MESSAGES = {
invalidTransform: transform => `Invalid transform property: ${transform}`
};
const parseTransformProperty = transform => {
const [key, valueString] = transform.split(/\(\s*/);
const values = parseValues(valueString.replace(/\)$/g, ''));
switch (key) {
case 'translate':
return parseTranslate(values);
case 'translateX':
return parseTranslateX(values);
case 'translateY':
return parseTranslateY(values);
case 'scale':
return parseScale(values);
case 'scaleX':
return parseScaleX(values);
case 'scaleY':
return parseScaleY(values);
case 'rotate':
case 'rotateX':
case 'rotateY':
case 'rotateZ':
return parseRotate(key, values);
case 'skew':
return parseSkew(values);
case 'skewX':
return parseSkewX(values);
case 'skewY':
return parseSkewY(values);
case 'matrix':
return parseMatrix(values);
default:
return [];
}
};
function parseValues(valueString) {
return valueString.split(',').map(value => {
const trimmedValue = value.trim();
if (['deg', 'rad', '%'].some(unit => trimmedValue.endsWith(unit))) {
return trimmedValue;
}
const numValue = parseFloat(trimmedValue);
return isNaN(numValue) ? trimmedValue : numValue;
});
}
function parseTranslate(values) {
if (values.length > 2) {
return [];
}
const result = parseTranslateX([values[0]]).concat(parseTranslateY([values[1] ?? values[0]]));
return result.length === 2 ? result : [];
}
function parseTranslateX(values) {
return values.length === 1 && (isNumber(values[0]) || isPercentage(values[0])) ? [{
translateX: values[0]
}] : [];
}
function parseTranslateY(values) {
return values.length === 1 && (isNumber(values[0]) || isPercentage(values[0])) ? [{
translateY: values[0]
}] : [];
}
function parseScale(values) {
if (values.length > 2) {
return [];
}
if (values.length === 1) {
return isNumber(values[0]) ? [{
scale: values[0]
}] : [];
}
const result = parseScaleX([values[0]]).concat(parseScaleY([values[1] ?? values[0]]));
return result.length === 2 ? result : [];
}
function parseScaleX(values) {
return values.length === 1 && isNumber(values[0]) ? [{
scaleX: values[0]
}] : [];
}
function parseScaleY(values) {
return values.length === 1 && isNumber(values[0]) ? [{
scaleY: values[0]
}] : [];
}
function parseRotate(key, values) {
return values.length === 1 && (isAngle(values[0]) || values[0] === 0) ? [{
[key]: values[0] === 0 ? '0deg' : values[0]
}] : [];
}
function parseSkew(values) {
if (values.length > 2) {
return [];
}
const result = parseSkewX([values[0]]).concat(parseSkewY([values[1] ?? values[0]]));
return result.length === 2 ? result : [];
}
function parseSkewX(values) {
return values.length === 1 && (isAngle(values[0]) || values[0] === 0) ? [{
skewX: values[0] === 0 ? '0deg' : values[0]
}] : [];
}
function parseSkewY(values) {
return values.length === 1 && (isAngle(values[0]) || values[0] === 0) ? [{
skewY: values[0] === 0 ? '0deg' : values[0]
}] : [];
}
function parseMatrix(values) {
let matrixValues = [];
if (isNumberArray(values)) {
if (values.length === 6) {
// prettier-ignore
matrixValues = [values[0], values[1], 0, 0, values[2], values[3], 0, 0, 0, 0, 1, 0, values[4], values[5], 0, 1];
} else if (values.length === 16) {
matrixValues = values;
}
}
return matrixValues.length > 0 ? [{
matrix: matrixValues
}] : [];
}
export const processTransform = value => {
if (typeof value !== 'string') {
return value;
}
return value.split(/\)\s*/).filter(Boolean).flatMap(part => {
const parsed = parseTransformProperty(part);
if (parsed.length === 0) {
throw new ReanimatedError(ERROR_MESSAGES.invalidTransform(`${part})`));
}
return parsed;
});
};
//# sourceMappingURL=transform.js.map