@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
JavaScript
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 };