@reactuses/core
Version:
<p align="center"> <a href="https://github.com/childrentime/reactuse"> <img src="https://reactuse.com/img/og.png" alt="ReactUse - Collection of essential React Hooks" width="300"> </a> </p>
107 lines (98 loc) • 3.32 kB
JavaScript
import QRCode from 'qrcode';
import { useLayoutEffect, useEffect, useReducer, useRef, useState } from 'react';
import { isEqual } from 'lodash-es';
process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test';
const isBrowser = typeof window !== 'undefined';
const useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect;
const updateReducer = (num)=>(num + 1) % 1000000;
function useUpdate() {
const [, update] = useReducer(updateReducer, 0);
return update;
}
const useCustomCompareEffect = (effect, deps, depsEqual)=>{
if (process.env.NODE_ENV !== 'production') {
if (!Array.isArray(deps) || !deps.length) {
console.warn('`useCustomCompareEffect` should not be used with no dependencies. Use React.useEffect instead.');
}
if (typeof depsEqual !== 'function') {
console.warn('`useCustomCompareEffect` should be used with depsEqual callback for comparing deps list');
}
}
const ref = useRef(undefined);
const forceUpdate = useUpdate();
if (!ref.current) {
ref.current = deps;
}
useIsomorphicLayoutEffect(()=>{
if (!depsEqual(deps, ref.current)) {
ref.current = deps;
forceUpdate();
}
});
// eslint-disable-next-line react-hooks/exhaustive-deps
useEffect(effect, ref.current);
};
const useDeepCompareEffect = (effect, deps)=>{
if (process.env.NODE_ENV !== 'production') {
if (!Array.isArray(deps) || !deps.length) {
console.warn('`useDeepCompareEffect` should not be used with no dependencies. Use React.useEffect instead.');
}
}
useCustomCompareEffect(effect, deps, isEqual);
};
const defaultOptions = {};
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _async_to_generator(fn) {
return function() {
var self = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
function generateQRCode(text, options) {
return QRCode.toDataURL(text, options);
}
const useQRCode = (text, options = defaultOptions)=>{
const [qrCode, setQRCode] = useState('');
const [error, setError] = useState(null);
useDeepCompareEffect(()=>{
const generate = ()=>_async_to_generator(function*() {
try {
const qrCode = yield generateQRCode(text, options);
setQRCode(qrCode);
} catch (error) {
setError(error);
}
})();
generate();
}, [
text,
options
]);
return {
qrCode,
error
};
};
export { generateQRCode, useQRCode };