@flyyer/use-googlefonts
Version:
React hook to dynamically load Google Fonts v2 during execution.
145 lines (120 loc) • 4.85 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var react = require('react');
var FontFaceObserver = require('fontfaceobserver');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var FontFaceObserver__default = /*#__PURE__*/_interopDefaultLegacy(FontFaceObserver);
function unwrapExports (x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
}
function createCommonjsModule(fn, module) {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
var prod = createCommonjsModule(function (module, exports) {
Object.defineProperty(exports, '__esModule', { value: true });
var createCommonQuery = function createCommonQuery(_ref) {
var family = _ref.family,
styles = _ref.styles;
var sFamily = family.replace(/ +/g, "+");
styles.forEach(function (style, i, a) {
if (!Array.isArray(style)) {
//not an array
if (style.length > 3) {
//declarative
if (style.length === 6) {
a[i] = '1,400';
return;
} //italic
if (style.length === 7) {
a[i] = '0,400';
return;
} //regular
if (style.length === 9) {
a[i] = '1,' + style.substring(0, 3);
return;
} //NNNitalic
if (style.length === 8) {
a[i] = '0,' + style;
return;
} //NNN..NNN
if (style.length === 14) {
a[i] = '1,' + style.substring(0, 8);
return;
} //NNN..NNNitalic
} else {
//number only
a[i] = '0,' + style;
}
} else {
//array
a[i] = (Boolean(style[1]) ? 1 : 0) + ',' + style[0];
}
});
return "family=".concat(sFamily, ":ital,wght@").concat(styles.sort().join(";"), "&");
};
var assembleCommon = function assembleCommon(families, display) {
return 'https://fonts.googleapis.com/css2?' + families.map(function (familyStyles) {
return createCommonQuery(familyStyles);
}).join('') + 'display=' + (display || 'auto');
};
var assembleFull = function assembleFull() {
throw 'Not yet developed';
};
exports.assembleCommon = assembleCommon;
exports.assembleFull = assembleFull;
});
unwrapExports(prod);
var prod_1 = prod.assembleCommon;
prod.assembleFull;
exports.GoogleFontsStatus = void 0;
(function (GoogleFontsStatus) {
GoogleFontsStatus[GoogleFontsStatus["LOADING"] = 0] = "LOADING";
GoogleFontsStatus[GoogleFontsStatus["LOADED"] = 1] = "LOADED";
GoogleFontsStatus[GoogleFontsStatus["FAILED"] = -1] = "FAILED";
})(exports.GoogleFontsStatus || (exports.GoogleFontsStatus = {}));
var defaultOptions = {
display: "swap",
};
/**
* Load fonts from `fonts` argument by creating a single URL which will be appended to the `<head/>` of the document as `<link href={} rel="stylesheet" />`.
*
* If there is any change in the arguments the current `<link />` will be removed and replaced by the new tag.
*
* Get the operation status (and `error` if present) via the `status` attribute of the returned object.
*/
function useGoogleFonts(fonts, options) {
if (options === void 0) { options = defaultOptions; }
var _a = react.useState(exports.GoogleFontsStatus.LOADING), status = _a[0], setStatus = _a[1];
var _b = react.useState(), error = _b[0], setError = _b[1];
var href = fonts && fonts.length > 0 && options.display ? prod_1(fonts, options.display) : undefined;
react.useEffect(function () {
if (!href)
return;
var link = document.createElement("link");
link.href = href;
// link.crossOrigin = ""; // TODO: improve performance?
link.rel = "stylesheet";
document.head.appendChild(link);
// TODO: what if deps changes and the previous promise resolves?
var promises = fonts.map(function (font) { return new FontFaceObserver__default['default'](font.family).load(); });
Promise.all(promises)
.then(function () {
setError(undefined);
setStatus(exports.GoogleFontsStatus.LOADED);
})
.catch(function (err) {
setError(err);
setStatus(exports.GoogleFontsStatus.FAILED);
});
return function () {
setError(undefined);
setStatus(exports.GoogleFontsStatus.LOADING);
document.head.removeChild(link);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [href]); // `fonts` dependency is not required since `href` depends on `fonts`
return { href: href, status: status, error: error };
}
exports.defaultOptions = defaultOptions;
exports.useGoogleFonts = useGoogleFonts;
//# sourceMappingURL=use-googlefonts.es5.js.map