UNPKG

@shopify/react-network

Version:

A collection of components that allow you to set common HTTP headers from within your React application

57 lines (54 loc) 2.11 kB
import { useContext } from 'react'; import { parse } from 'accept-language-parser'; import { Header } from '@shopify/network'; import { useServerEffect } from '@shopify/react-effect'; import { NetworkContext, NetworkUniversalContext } from './context.mjs'; 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 = useContext(NetworkContext); 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 = useContext(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 useContext(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(Header.AcceptLanguage); const locales = acceptsLanguages ? parse(acceptsLanguages) : [fallback]; return locales; } export { useAcceptLanguage, useCspDirective, useHeader, useNetworkEffect, useNetworkManager, useRedirect, useRequestHeader, useStatus };