@shopify/react-network
Version:
A collection of components that allow you to set common HTTP headers from within your React application
68 lines (63 loc) • 2.43 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
var acceptLanguageParser = require('accept-language-parser');
var network = require('@shopify/network');
var reactEffect = require('@shopify/react-effect');
var context = require('./context.js');
const NO_UNIVERSAL_PROVIDER_WARNING = 'Could not find serialized network context. Ensure that your app is rendering <NetworkUniversalProvider /> above in your tree';
function useNetworkEffect(perform) {
const network = React.useContext(context.NetworkContext);
reactEffect.useServerEffect(() => {
if (network != null) {
return perform(network);
}
}, network === null || network === void 0 ? void 0 : network.effect);
}
function useCspDirective(directive, source) {
useNetworkEffect(network => network.addCspDirective(directive, source));
}
function useRequestHeader(header) {
const manager = useNetworkManager();
const details = React.useContext(context.NetworkUniversalContext);
if (manager) {
// Server-side: get it directly from network context
return manager.getHeader(header);
} else if (details) {
// Client-side: get it from serialized universal context
return details.headers[header.toLowerCase()];
} else {
// No server-side network context and no universal context provider
// eslint-disable-next-line no-console
console.warn(NO_UNIVERSAL_PROVIDER_WARNING);
return undefined;
}
}
function useHeader(header, value) {
useNetworkEffect(network => network.setHeader(header, value));
}
function useNetworkManager() {
return React.useContext(context.NetworkContext);
}
function useStatus(code) {
useNetworkEffect(network => network.addStatusCode(code));
}
function useRedirect(url, status) {
useNetworkEffect(network => network.redirectTo(url, status));
}
function useAcceptLanguage(fallback = {
code: 'en',
quality: 1.0
}) {
const acceptsLanguages = useRequestHeader(network.Header.AcceptLanguage);
const locales = acceptsLanguages ? acceptLanguageParser.parse(acceptsLanguages) : [fallback];
return locales;
}
exports.useAcceptLanguage = useAcceptLanguage;
exports.useCspDirective = useCspDirective;
exports.useHeader = useHeader;
exports.useNetworkEffect = useNetworkEffect;
exports.useNetworkManager = useNetworkManager;
exports.useRedirect = useRedirect;
exports.useRequestHeader = useRequestHeader;
exports.useStatus = useStatus;