1 | import { useTracker } from '@jetshop/core/analytics/Analytics';
|
2 | import { trackPageEvent } from '@jetshop/core/analytics/tracking';
|
3 | import React, { useContext, useEffect } from 'react';
|
4 | import Helmet from 'react-helmet-async';
|
5 | import useWarningInDev from '../hooks/useWarningInDev';
|
6 | import ChannelContext from './ChannelContext';
|
7 | import { useLocation } from 'react-router';
|
8 | import qs from 'qs';
|
9 | function 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 | }
|
19 | const queryParamsWhitelist = ['page'];
|
20 | const 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 | };
|
54 | export default Head;
|
55 |
|
\ | No newline at end of file |