From e321b0ea7b00f47a5c8552a057edaddbdb5a67ad Mon Sep 17 00:00:00 2001
From: Tarje Lavik <tarje.lavik@gmail.com>
Date: Sun, 10 Oct 2021 14:59:53 +0200
Subject: [PATCH] Add SEO to more pages, inluding [id]

---
 .../fragments/humanMadeObjectFields.js        |  1 +
 web/pages/[...slug].js                        |  8 ++--
 web/pages/aktorer/index.js                    | 41 +++++++++++--------
 web/pages/hendelser/index.js                  | 25 +++++++++++
 web/pages/id/[id].js                          | 29 +++++++++++--
 web/pages/mirador/index.js                    | 25 +++++++++++
 web/pages/register/index.js                   | 26 +++++++++++-
 web/pages/ting/index.js                       | 30 +++++++++++++-
 8 files changed, 159 insertions(+), 26 deletions(-)

diff --git a/web/lib/queries/fragments/humanMadeObjectFields.js b/web/lib/queries/fragments/humanMadeObjectFields.js
index b4c84fb..6eab557 100644
--- a/web/lib/queries/fragments/humanMadeObjectFields.js
+++ b/web/lib/queries/fragments/humanMadeObjectFields.js
@@ -97,6 +97,7 @@ export const humanMadeObjectFields = groq`
       }
     }
   },
+  "excerpt": pt::text(referredToBy[0].body),
   referredToBy[] {
     ...,
     body[] {
diff --git a/web/pages/[...slug].js b/web/pages/[...slug].js
index da688c3..0116014 100644
--- a/web/pages/[...slug].js
+++ b/web/pages/[...slug].js
@@ -39,12 +39,12 @@ export default function Page({ data, preview }) {
 
   // Client-side uses the same query, so we may need to filter it down again
   const page = filterDataToSingleItem(previewData, preview)
+  // console.log(JSON.stringify(page, null, 2))
 
   const openGraphImages = getOpenGraphImages(
     page?.route[0]?.page?.image,
     page?.route[0]?.page?.label,
   )
-  // console.log(JSON.stringify(page, null, 2))
 
   // Notice the optional?.chaining conditionals wrapping every piece of content?
   // This is extremely important as you can't ever rely on a single field
@@ -53,8 +53,10 @@ export default function Page({ data, preview }) {
   return (
     <Layout preview={preview} site={page?.siteSettings}>
       <NextSeo
-        title={`${page?.route[0]?.page?.label} - ${page?.siteSettings?.title}`}
-        description={page?.route[0]?.page?.excerpt ?? page?.siteSettings?.title}
+        title={page?.route[0]?.page?.label}
+        titleTemplate={`%s | ${data?.siteSettings?.title}`}
+        defaultTitle={data?.siteSettings?.title}
+        description={page?.route[0]?.page?.excerpt}
         canonical={`${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/${page?.route[0].slug.current}`}
         openGraph={{
           url: `${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/${page?.route[0].slug.current}`,
diff --git a/web/pages/aktorer/index.js b/web/pages/aktorer/index.js
index 845d411..ab52966 100644
--- a/web/pages/aktorer/index.js
+++ b/web/pages/aktorer/index.js
@@ -1,4 +1,5 @@
 import Head from 'next/head'
+import { NextSeo } from 'next-seo'
 import { imageBuilder } from '../../lib/sanity'
 import { getAllActors } from '../../lib/api'
 import { Grid, Avatar, Box, Heading, Flex, Badge, Container } from '@chakra-ui/react'
@@ -6,27 +7,35 @@ import Layout from '../../components/Layout'
 import Link from '../../components/Link'
 import PortableTextBlock from '../../components/PT/PortableTextBlock'
 import { sortBy } from 'lodash'
+import { getOpenGraphImages } from '../../lib/utils'
 
 export default function Actors({ data, preview }) {
-  /* let actors = data.items.reduce((r, e) => {
-    // get first letter of name of current element
-    let group = e.label[0];
-    // if there is no property in accumulator with this letter create it
-    if(!r[group]) r[group] = {group, children: [e]}
-    // if there is push current element to children array for that letter
-    else r[group].children.push(e);
-    // return accumulator
-    return r;
-  }, {})
-  
-  // since data at this point is an object, to get array of values
-  // we use Object.values method
-  let result = Object.values(actors) */
-
   const sortedItems = sortBy(data.items, 'label.no')
-
+  const openGraphImages = getOpenGraphImages(
+    data?.siteSettings?.openGraph?.image,
+    data?.siteSettings?.title,
+  )
   return (
     <Layout preview={preview} site={data.siteSettings}>
+      <NextSeo
+        title="Aktører"
+        titleTemplate={`%s | ${data?.siteSettings?.title}`}
+        defaultTitle={data?.siteSettings?.title}
+        description={data?.siteSettings?.openGraph?.description}
+        canonical={`${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/register`}
+        openGraph={{
+          url: `${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/register`,
+          title: data?.siteSettings?.title,
+          description: data?.siteSettings?.openGraph?.description,
+          images: openGraphImages,
+          site_name: data?.siteSettings?.title,
+        }}
+        twitter={{
+          handle: '@UiB_UB',
+          site: '@UiB_UB',
+          cardType: 'summary_large_image',
+        }}
+      />
       <Head>
         <title>Aktører</title>
       </Head>
diff --git a/web/pages/hendelser/index.js b/web/pages/hendelser/index.js
index c77ea39..1ea4414 100644
--- a/web/pages/hendelser/index.js
+++ b/web/pages/hendelser/index.js
@@ -1,13 +1,38 @@
 import Head from 'next/head'
+import { NextSeo } from 'next-seo'
 import { orderBy } from 'lodash'
 import { getEvents } from '../../lib/api'
 import Layout from '../../components/Layout'
 import { Container, Heading, SimpleGrid } from '@chakra-ui/react'
 import RenderMergedActivityStreamList from '../../components/ActivityStream/MergedActivityStreamList/RenderMergedActivityStreamList'
+import { getOpenGraphImages } from '../../lib/utils'
 
 export default function Events({ data, preview }) {
+  const openGraphImages = getOpenGraphImages(
+    data?.siteSettings?.openGraph?.image,
+    data?.siteSettings?.title,
+  )
   return (
     <Layout preview={preview} site={data.siteSettings}>
+      <NextSeo
+        title="Hendelser"
+        titleTemplate={`%s | ${data?.siteSettings?.title}`}
+        defaultTitle={data?.siteSettings?.title}
+        description={data?.siteSettings?.openGraph?.description}
+        canonical={`${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/register`}
+        openGraph={{
+          url: `${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/register`,
+          title: data?.siteSettings?.title,
+          description: data?.siteSettings?.openGraph?.description,
+          images: openGraphImages,
+          site_name: data?.siteSettings?.title,
+        }}
+        twitter={{
+          handle: '@UiB_UB',
+          site: '@UiB_UB',
+          cardType: 'summary_large_image',
+        }}
+      />
       <Head>
         <title>Hendelser - {data.siteSettings.title}</title>
       </Head>
diff --git a/web/pages/id/[id].js b/web/pages/id/[id].js
index 411b043..3f5d330 100644
--- a/web/pages/id/[id].js
+++ b/web/pages/id/[id].js
@@ -1,16 +1,18 @@
-import Layout from '../../components/Layout'
-import { getIdPaths, getType } from '../../lib/api'
 import Head from 'next/head'
-import RenderDocument from '../../components/Documents/RenderDocument'
 import { usePreviewSubscription } from '../../lib/sanity'
+import { getClient } from '../../lib/sanity.server'
+import { getIdPaths, getType } from '../../lib/api'
 import {
   groupFields,
   humanMadeObjectFields,
   pageFields,
   siteSettings,
 } from '../../lib/queries/fragments'
-import { getClient } from '../../lib/sanity.server'
 import { linguisticDocumentFields } from '../../lib/queries/fragments/linguisticDocumentFields'
+import { NextSeo } from 'next-seo'
+import Layout from '../../components/Layout'
+import RenderDocument from '../../components/Documents/RenderDocument'
+import { getOpenGraphImages } from '../../lib/utils'
 
 /**
  * Helper function to return the correct version of the document
@@ -43,6 +45,8 @@ export default function Document({ data, preview }) {
   const page = filterDataToSingleItem(previewData, preview)
   // console.log(JSON.stringify(page, null, 2))
 
+  const openGraphImages = getOpenGraphImages(page?.item[0]?.image, page?.item[0]?.label.no)
+
   // Notice the optional?.chaining conditionals wrapping every piece of content?
   // This is extremely important as you can't ever rely on a single field
   // of data existing when Editors are creating new documents.
@@ -50,6 +54,23 @@ export default function Document({ data, preview }) {
 
   return (
     <Layout preview={preview} site={page?.siteSettings}>
+      <NextSeo
+        title={`${page?.item[0]?.label.no} - ${page?.siteSettings?.title}`}
+        description={page?.item[0]?.excerpt}
+        canonical={`${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/${page?.item[0]._id}`}
+        openGraph={{
+          url: `${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/${page?.item[0]._id}`,
+          title: page?.item[0]?.label.no,
+          description: page?.item[0]?.excerpt,
+          images: openGraphImages,
+          site_name: page?.siteSettings?.title,
+        }}
+        twitter={{
+          handle: '@UiB_UB',
+          site: '@UiB_UB',
+          cardType: 'summary_large_image',
+        }}
+      />
       <Head>
         <title>
           {`${page?.item[0]?.label?.no || page?.item[0]?.label}`} - {page.siteSettings.title}
diff --git a/web/pages/mirador/index.js b/web/pages/mirador/index.js
index 1f28b5f..76847f8 100644
--- a/web/pages/mirador/index.js
+++ b/web/pages/mirador/index.js
@@ -2,12 +2,37 @@ import { getSiteSettings } from '../../lib/api'
 import Layout from '../../components/Layout'
 import { Container } from '@chakra-ui/react'
 import dynamic from 'next/dynamic'
+import { NextSeo } from 'next-seo'
+import { getOpenGraphImages } from '../../lib/utils'
 
 const MiradorWithNoSSR = dynamic(() => import('../../components/MiradorViewer'), { ssr: false })
 
 export default function Mirador({ data, preview }) {
+  const openGraphImages = getOpenGraphImages(
+    data?.siteSettings?.openGraph?.image,
+    data?.siteSettings?.title,
+  )
   return (
     <Layout preview={preview} site={data.siteSettings}>
+      <NextSeo
+        title="Hendelser"
+        titleTemplate={`%s | ${data?.siteSettings?.title}`}
+        defaultTitle={data?.siteSettings?.title}
+        description={data?.siteSettings?.openGraph?.description}
+        canonical={`${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/register`}
+        openGraph={{
+          url: `${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/register`,
+          title: data?.siteSettings?.title,
+          description: data?.siteSettings?.openGraph?.description,
+          images: openGraphImages,
+          site_name: data?.siteSettings?.title,
+        }}
+        twitter={{
+          handle: '@UiB_UB',
+          site: '@UiB_UB',
+          cardType: 'summary_large_image',
+        }}
+      />
       <Container h="80vh" my="5" maxW="full">
         <MiradorWithNoSSR
           height="100%"
diff --git a/web/pages/register/index.js b/web/pages/register/index.js
index 323328c..84c700e 100644
--- a/web/pages/register/index.js
+++ b/web/pages/register/index.js
@@ -1,17 +1,41 @@
 import Head from 'next/head'
+import { NextSeo } from 'next-seo'
 import { getRegistry } from '../../lib/api'
 import Layout from '../../components/Layout'
 import { Badge, Heading, Container, List, ListItem, useColorModeValue } from '@chakra-ui/react'
 import Link from '../../components/Link'
 import { sortBy } from 'lodash'
+import { getOpenGraphImages } from '../../lib/utils'
 
 export default function Register({ data, preview }) {
   const tagColor = useColorModeValue('blackAlpha', 'red')
-
   const sortedItems = sortBy(data.items, 'label.no')
+  const openGraphImages = getOpenGraphImages(
+    data?.siteSettings?.openGraph?.image,
+    data?.siteSettings?.title,
+  )
 
   return (
     <Layout preview={preview} site={data.siteSettings}>
+      <NextSeo
+        title="Register"
+        titleTemplate={`%s | ${data?.siteSettings?.title}`}
+        defaultTitle={data?.siteSettings?.title}
+        description={data?.siteSettings?.openGraph?.description}
+        canonical={`${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/register`}
+        openGraph={{
+          url: `${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/register`,
+          title: data?.siteSettings?.title,
+          description: data?.siteSettings?.openGraph?.description,
+          images: openGraphImages,
+          site_name: data?.siteSettings?.title,
+        }}
+        twitter={{
+          handle: '@UiB_UB',
+          site: '@UiB_UB',
+          cardType: 'summary_large_image',
+        }}
+      />
       <Head>
         <title>Register - {data.siteSettings.title}</title>
       </Head>
diff --git a/web/pages/ting/index.js b/web/pages/ting/index.js
index f4e025a..e2574cb 100644
--- a/web/pages/ting/index.js
+++ b/web/pages/ting/index.js
@@ -1,13 +1,39 @@
-import { getAllHumanMadeObjects } from '../../lib/api'
 import Head from 'next/head'
+import { NextSeo } from 'next-seo'
+import { Container, Heading } from '@chakra-ui/react'
+import { getAllHumanMadeObjects } from '../../lib/api'
 import Layout from '../../components/Layout'
 import Cards from '../../components/Cards'
-import { Container, Heading } from '@chakra-ui/react'
+import { getOpenGraphImages } from '../../lib/utils'
 
 export default function Items({ data, preview }) {
   const { items, siteSettings } = data
+  const openGraphImages = getOpenGraphImages(
+    data?.siteSettings?.openGraph?.image,
+    data?.siteSettings?.title,
+  )
+
   return (
     <Layout preview={preview} site={siteSettings}>
+      <NextSeo
+        title="Ting"
+        titleTemplate={`%s | ${data?.siteSettings?.title}`}
+        defaultTitle={data?.siteSettings?.title}
+        description={data?.siteSettings?.openGraph?.description}
+        canonical={`${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/register`}
+        openGraph={{
+          url: `${process.env.NEXT_PUBLIC_DOMAIN}${process.env.NEXT_PUBLIC_BASE_PATH}/register`,
+          title: data?.siteSettings?.title,
+          description: data?.siteSettings?.openGraph?.description,
+          images: openGraphImages,
+          site_name: data?.siteSettings?.title,
+        }}
+        twitter={{
+          handle: '@UiB_UB',
+          site: '@UiB_UB',
+          cardType: 'summary_large_image',
+        }}
+      />
       <Head>
         <title>Ting – {siteSettings.title}</title>
       </Head>
-- 
GitLab