UNPKG

@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
'use strict'; 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;