UNPKG

2.85 kBJavaScriptView Raw
1import { useTracker } from '@jetshop/core/analytics/Analytics';
2import { trackPageEvent } from '@jetshop/core/analytics/tracking';
3import React, { useContext, useEffect } from 'react';
4import Helmet from 'react-helmet-async';
5import useWarningInDev from '../hooks/useWarningInDev';
6import ChannelContext from './ChannelContext';
7import { useLocation } from 'react-router';
8import qs from 'qs';
9function renderAlternateRoutes(alternateRoute, channelsById) {
10 const channel = channelsById[alternateRoute.channelId];
11 const url = channel.url;
12 const route = alternateRoute.route;
13 const query = channel.defaultLanguage.culture !== alternateRoute.culture
14 ? `?culture=${alternateRoute.culture}`
15 : '';
16 const href = `${url}${route}${query}`;
17 return (React.createElement("link", { key: href + alternateRoute.culture, rel: "alternate", href: href, hrefLang: alternateRoute.alias || alternateRoute.culture }));
18}
19const queryParamsWhitelist = ['page'];
20const Head = ({ data, route }) => {
21 const { search } = useLocation();
22 const queryStringObject = qs.parse(search, { ignoreQueryPrefix: true });
23 Object.keys(queryStringObject).forEach(key => {
24 !queryParamsWhitelist.includes(key) && delete queryStringObject[key];
25 });
26 const whiteListedSearch = qs.stringify(queryStringObject, {
27 addQueryPrefix: true
28 });
29 const { selectedChannel, channelsById } = useContext(ChannelContext);
30 const lang = selectedChannel.language.culture.split('-')[0];
31 const metaTags = (data && data.metaTags) || [];
32 const href = (route === null || route === void 0 ? void 0 : route.canonicalPath) &&
33 `${selectedChannel.url}${route.canonicalPath}${whiteListedSearch}`;
34 useWarningInDev(route && !route.alternateRoutes, `You must include the RouteCrumbFragment in your RouteQuery.gql
35 Please see https://gitlab.jetshop.se/jetshop/flight/blob/master/packages/template-trend/src/components/RouteQuery.gql for an example
36 `);
37 const track = useTracker();
38 useEffect(() => {
39 track(trackPageEvent({
40 pathname: window.location.pathname,
41 title: data.title
42 }));
43 }, [data.title, track]);
44 return (React.createElement(React.Fragment, null,
45 React.createElement(Helmet, null,
46 React.createElement("html", { lang: lang }),
47 data && React.createElement("title", null, data.title),
48 metaTags.map(tag => (React.createElement("meta", { name: tag.name, content: tag.content, key: tag.name }))),
49 route &&
50 route.alternateRoutes &&
51 route.alternateRoutes.map(alternateRoute => renderAlternateRoutes(alternateRoute, channelsById)),
52 href && React.createElement("link", { rel: "canonical", href: href }))));
53};
54export default Head;
55//# sourceMappingURL=Head.js.map
\No newline at end of file