Skip to content
This repository was archived by the owner on Feb 27, 2024. It is now read-only.

Commit 690a6ba

Browse files
committed
Merge branch 'feature/33-404-page' into develop
2 parents 4478b6a + 13d4dfd commit 690a6ba

File tree

7 files changed

+288
-89
lines changed

7 files changed

+288
-89
lines changed
Lines changed: 3 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
import queryPostById from '../posts/queryPostById'
2-
import {initializeWpApollo, createWpApolloClient} from '../connector'
32
import queryPageById from '../pages/queryPageById'
43
import {isHierarchicalPostType} from './postTypes'
5-
import formatBlockData from '@/functions/formatBlockData'
64
import queryEventById from '../events/queryEventById'
75
import queryCareerById from '../careers/queryCareerById'
86
import queryServiceById from '../services/queryServiceById'
97
import queryTeamById from '../teams/queryTeamById'
108
import queryPortfolioById from '../portfolios/queryPortfolioById'
119
import queryTestimonialById from '../testimonials/queryTestimonialById'
12-
import formatDefaultSeoData from '@/functions/formatDefaultSeoData'
13-
import getMenus from '../menus/getMenus'
10+
import processPostTypeQuery from './processPostTypeQuery'
1411

1512
/**
1613
* Retrieve single post by specified identifier.
@@ -20,7 +17,7 @@ import getMenus from '../menus/getMenus'
2017
* @param {number | string} id Post identifier.
2118
* @param {string} idType Type of ID.
2219
* @param {string} preview Whether query is for a regular post view (null), a preview check (basic), or full post preview (full).
23-
* @return {object} Object containing Apollo client instance and post data or error object.
20+
* @return {object} Object containing Apollo client instance and post data or error object.
2421
*/
2522
export default async function getPostTypeById(
2623
postType,
@@ -49,77 +46,5 @@ export default async function getPostTypeById(
4946
// Retrieve post type query.
5047
const query = postTypeQuery?.[postType] ?? null
5148

52-
// Get/create Apollo instance.
53-
const apolloClient = preview
54-
? createWpApolloClient(true)
55-
: initializeWpApollo()
56-
57-
// Set up return object.
58-
const response = {
59-
apolloClient,
60-
error: false,
61-
errorMessage: null
62-
}
63-
64-
// If no query is set for given post type, return error message.
65-
if (!query) {
66-
return {
67-
apolloClient,
68-
error: true,
69-
errorMessage: `Post type \`${postType}\` is not supported.`
70-
}
71-
}
72-
73-
// Execute query.
74-
response.post = await apolloClient
75-
.query({query, variables: {id, idType}})
76-
.then((res) => {
77-
const {homepageSettings, siteSeo, menus, ...postData} = res.data
78-
79-
// Retrieve menus.
80-
response.menus = getMenus(menus)
81-
82-
// Retrieve default SEO data.
83-
response.defaultSeo = formatDefaultSeoData({homepageSettings, siteSeo})
84-
85-
const post = postData?.[postType]
86-
87-
// Set error props if data not found.
88-
if (!post) {
89-
response.error = true
90-
response.errorMessage = `An error occurred while trying to retrieve data for ${postType} "${id}."`
91-
92-
return null
93-
}
94-
95-
return post
96-
})
97-
.then(async (post) => {
98-
// Add slug/ID to post.
99-
const newPost = {
100-
...post,
101-
slug: id
102-
}
103-
104-
if ('basic' === preview || !post || !post?.blocksJSON) {
105-
return post
106-
}
107-
108-
// Handle blocks.
109-
newPost.blocks = await formatBlockData(
110-
JSON.parse(newPost.blocksJSON) ?? []
111-
)
112-
113-
delete newPost.blocksJSON
114-
115-
return newPost
116-
})
117-
.catch((error) => {
118-
response.error = true
119-
response.errorMessage = error.message
120-
121-
return null
122-
})
123-
124-
return response
49+
return processPostTypeQuery(postType, id, query, {id, idType}, preview)
12550
}

api/wordpress/_global/getPostTypeStaticProps.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import getPostTypeById from './getPostTypeById'
33
import getPostTypeArchive from './getPostTypeArchive'
44
import {addApolloState} from '@/api/apolloConfig'
55
import getFrontendPage, {frontendPageSeo} from './getFrontendPage'
6+
import getSettingsCustomPage, {customPageQuery} from './getSettingsCustomPage'
67

78
/**
89
* Retrieve static props by post type.
@@ -43,6 +44,20 @@ export default async function getPostTypeStaticProps(
4344
})
4445
}
4546

47+
/* -- Fallback: return error if params missing. -- */
48+
if (!params) {
49+
return '404' !== postType
50+
? {
51+
notFound: true
52+
}
53+
: {
54+
props: {
55+
...sharedProps
56+
},
57+
revalidate
58+
}
59+
}
60+
4661
/* -- Handle dynamic archive display. -- */
4762
if (!Object.keys(params).length) {
4863
const {apolloClient, ...archiveData} = await getPostTypeArchive(postType)
@@ -63,6 +78,31 @@ export default async function getPostTypeStaticProps(
6378
// Handle catch-all routes.
6479
const slug = Array.isArray(params.slug) ? params.slug.join('/') : params.slug
6580

81+
/* -- Handle pages set via Additional Settings. -- */
82+
if (Object.keys(customPageQuery).includes(slug)) {
83+
const {apolloClient, ...pageData} = await getSettingsCustomPage(slug)
84+
85+
// Display 404 error page if error encountered.
86+
if (pageData.error && '404' !== slug) {
87+
return {
88+
notFound: true
89+
}
90+
}
91+
92+
// Remove error prop.
93+
delete pageData?.error
94+
95+
return addApolloState(apolloClient, {
96+
props: {
97+
...pageData,
98+
...sharedProps
99+
},
100+
revalidate
101+
})
102+
}
103+
104+
/* -- Handle dynamic posts. -- */
105+
66106
// Get post identifier (ID or slug).
67107
const postId = Number.isInteger(Number(slug)) ? Number(slug) : slug
68108

@@ -99,6 +139,13 @@ export default async function getPostTypeStaticProps(
99139
props.error = false
100140
}
101141

142+
// Display 404 error page if error encountered.
143+
if (props.error) {
144+
return {
145+
notFound: true
146+
}
147+
}
148+
102149
// Merge in query results as Apollo state.
103150
return addApolloState(apolloClient, {
104151
props,
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import queryError404Page from '../pages/queryError404Page'
2+
import processPostTypeQuery from './processPostTypeQuery'
3+
4+
// Define single page query based on page name.
5+
export const customPageQuery = {
6+
404: {
7+
query: queryError404Page,
8+
title: '404 Not Found',
9+
description: ''
10+
}
11+
}
12+
13+
/**
14+
* Retrieve single page set via Additional Settings.
15+
*
16+
* @author WebDevStudios
17+
* @param {string} page Custom page name in settings.
18+
* @return {object} Object containing Apollo client instance and post data or error object.
19+
*/
20+
export default async function getSettingsCustomPage(page) {
21+
// Retrieve page query.
22+
const query = customPageQuery?.[page]?.query ?? null
23+
24+
const data = await processPostTypeQuery('page', page, query)
25+
26+
// Add custom SEO if missing.
27+
if (!data?.post?.seo) {
28+
data.post = {
29+
...data?.post,
30+
seo: {
31+
title: `${customPageQuery[page]?.title ?? ''} - ${
32+
data.defaultSeo?.openGraph?.siteName ?? ''
33+
}`,
34+
description: customPageQuery[page]?.description ?? '',
35+
canonical: `${data.defaultSeo?.openGraph?.url ?? ''}/${page}`
36+
}
37+
}
38+
}
39+
40+
return data
41+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import {initializeWpApollo, createWpApolloClient} from '../connector'
2+
import formatBlockData from '@/functions/formatBlockData'
3+
import formatDefaultSeoData from '@/functions/formatDefaultSeoData'
4+
import getMenus from '../menus/getMenus'
5+
6+
/**
7+
* Retrieve single post.
8+
*
9+
* @author WebDevStudios
10+
* @param {string} postType WP post type.
11+
* @param {number | string} id Post identifier.
12+
* @param {object} query Post retrieval query.
13+
* @param {object} variables Query variables.
14+
* @param {string} preview Whether query is for a regular post view (null), a preview check (basic), or full post preview (full).
15+
* @return {object} Object containing Apollo client instance and post data or error object.
16+
*/
17+
export default async function processPostTypeQuery(
18+
postType,
19+
id,
20+
query,
21+
variables = {},
22+
preview = null
23+
) {
24+
// Get/create Apollo instance.
25+
const apolloClient = preview
26+
? createWpApolloClient(true)
27+
: initializeWpApollo()
28+
29+
// Set up return object.
30+
const response = {
31+
apolloClient,
32+
error: false,
33+
errorMessage: null
34+
}
35+
36+
// If no query is set for given post type, return error message.
37+
if (!query) {
38+
return {
39+
apolloClient,
40+
error: true,
41+
errorMessage: `Post type \`${postType}\` is not supported.`
42+
}
43+
}
44+
45+
// Execute query.
46+
response.post = await apolloClient
47+
.query({query, variables})
48+
.then((res) => {
49+
const {homepageSettings, siteSeo, menus, ...postData} = res.data
50+
51+
// Retrieve menus.
52+
response.menus = getMenus(menus)
53+
54+
// Retrieve default SEO data.
55+
response.defaultSeo = formatDefaultSeoData({homepageSettings, siteSeo})
56+
57+
// Retrieve post data.
58+
const post =
59+
postData?.[postType] ?? // Dynamic posts.
60+
postData?.additionalSettings?.additionalSettings?.[postType] // Settings custom page.
61+
62+
// Set error props if data not found.
63+
if (!post) {
64+
response.error = true
65+
response.errorMessage = `An error occurred while trying to retrieve data for ${postType} "${id}."`
66+
67+
return null
68+
}
69+
70+
return post
71+
})
72+
.then(async (post) => {
73+
// Add slug/ID to post.
74+
const newPost = {
75+
...post,
76+
slug: id
77+
}
78+
79+
if ('basic' === preview || !post || !post?.blocksJSON) {
80+
return post
81+
}
82+
83+
// Handle blocks.
84+
newPost.blocks = await formatBlockData(
85+
JSON.parse(newPost.blocksJSON) ?? []
86+
)
87+
88+
delete newPost.blocksJSON
89+
90+
return newPost
91+
})
92+
.catch((error) => {
93+
response.error = true
94+
response.errorMessage = error.message
95+
96+
return null
97+
})
98+
99+
return response
100+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import {gql} from '@apollo/client'
2+
import {singlePageFragment} from './queryPageById'
3+
import defaultPageData from '../_partials/defaultPageData'
4+
5+
// Query: retrieve 404 error page.
6+
const queryError404Page = gql`
7+
query GET_ERROR_404_PAGE($imageSize: MediaItemSizeEnum = LARGE) {
8+
${defaultPageData}
9+
additionalSettings {
10+
additionalSettings {
11+
page: error404Page {
12+
... on Page {
13+
...SinglePageFields
14+
}
15+
}
16+
}
17+
}
18+
}
19+
${singlePageFragment}
20+
`
21+
22+
export default queryError404Page

0 commit comments

Comments
 (0)