react-native-theme-switch-animation
Version:
A Plug & Play Animations for Switching (Dark/Light) Themes. 🌖
88 lines (87 loc) • 3.83 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _reactNative = require("react-native");
var _ThemeSwitchAnimationListener = _interopRequireDefault(require("./ThemeSwitchAnimationListener"));
var _helpers = require("./helpers");
var _module2 = _interopRequireDefault(require("./module"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const IS_SUPPORTED_PLATFORM = _reactNative.Platform.OS === 'android' || _reactNative.Platform.OS === 'ios';
let ThemeSwitchAnimation = null;
let switchFunction = () => {};
let localAnimationConfig = {
type: 'fade',
duration: 500
};
if (IS_SUPPORTED_PLATFORM) {
ThemeSwitchAnimation = _module2.default;
const themeSwitchAnimationListener = new _ThemeSwitchAnimationListener.default();
themeSwitchAnimationListener.addEventListener(() => {
setTimeout(() => {
if (switchFunction) {
switchFunction();
if (localAnimationConfig) {
unfreezeWrapper();
}
}
});
});
}
const switchTheme = ({
switchThemeFunction: incomingSwitchThemeFunction,
animationConfig
}) => {
if (IS_SUPPORTED_PLATFORM) {
localAnimationConfig = animationConfig || localAnimationConfig;
ThemeSwitchAnimation.freezeScreen((animationConfig === null || animationConfig === void 0 ? void 0 : animationConfig.captureType) || 'layer');
switchFunction = incomingSwitchThemeFunction;
} else {
incomingSwitchThemeFunction();
}
};
const unfreezeWrapper = () => {
const defaultRatio = 0.5;
setImmediate(() => {
if (localAnimationConfig.type === 'circular' || localAnimationConfig.type === 'inverted-circular') {
if ('cx' in localAnimationConfig.startingPoint && 'cy' in localAnimationConfig.startingPoint) {
var _localAnimationConfig;
const {
cx,
cy
} = (_localAnimationConfig = localAnimationConfig) === null || _localAnimationConfig === void 0 ? void 0 : _localAnimationConfig.startingPoint;
const {
width: SCREEN_WIDTH,
height: SCREEN_HEIGHT
} = _reactNative.Dimensions.get('screen');
if ((0, _helpers.validateCoordinates)(cx, SCREEN_WIDTH, 'cx') && (0, _helpers.validateCoordinates)(cy, SCREEN_HEIGHT, 'cy')) {
const cxRatio = (0, _helpers.calculateRatio)(cx, SCREEN_WIDTH);
const cyRatio = (0, _helpers.calculateRatio)(cy, SCREEN_HEIGHT);
ThemeSwitchAnimation.unfreezeScreen(localAnimationConfig.type, localAnimationConfig.duration, cxRatio, cyRatio);
} else {
// cleanup
ThemeSwitchAnimation.unfreezeScreen('fade', 200, 0.5, 0.5);
}
} else if ('cxRatio' in localAnimationConfig.startingPoint && 'cyRatio' in localAnimationConfig.startingPoint) {
var _localAnimationConfig2;
const {
cxRatio,
cyRatio
} = (_localAnimationConfig2 = localAnimationConfig) === null || _localAnimationConfig2 === void 0 ? void 0 : _localAnimationConfig2.startingPoint;
if ((0, _helpers.validateCoordinates)(cxRatio, 1, 'cxRatio') && (0, _helpers.validateCoordinates)(cyRatio, 1, 'cyRatio')) {
const cxRatioActual = (0, _helpers.calculateActualRation)(cxRatio);
const cyRatioActual = (0, _helpers.calculateActualRation)(cyRatio);
ThemeSwitchAnimation.unfreezeScreen(localAnimationConfig.type, localAnimationConfig.duration, cxRatioActual, cyRatioActual);
} else {
// cleanup
ThemeSwitchAnimation.unfreezeScreen('fade', 500, 0.5, 0.5);
}
}
} else {
ThemeSwitchAnimation.unfreezeScreen(localAnimationConfig.type, localAnimationConfig.duration, defaultRatio, defaultRatio);
}
});
};
var _default = exports.default = switchTheme;
//# sourceMappingURL=index.js.map