Skip to content

Feature/ba 2670 fe setup routing for wagtail and base app pages #284

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
'use client'

import { FC } from 'react'

import { ComponentWithQueryRef, withRelay } from '@baseapp-frontend/graphql'

import { notFound } from 'next/navigation'
import { usePreloadedQuery } from 'react-relay'

import { PageWagtailTokenQuery } from '../../../__generated__/PageWagtailTokenQuery.graphql'
import PageQueryNode, {
PageWagtailURLPathQuery,
} from '../../../__generated__/PageWagtailURLPathQuery.graphql'
import {
getPageWagtailByTokenQuery,
getPageWagtailByURLPathQuery,
} from '../../graphql/queries/Page'
import WagtailPagesProvider from '../../providers/WagtailPagesProvider'
import { WagtailPageProps } from './types'

const PreloadedWagtailPagesProvider: FC<
ComponentWithQueryRef<PageWagtailURLPathQuery | PageWagtailTokenQuery> & WagtailPageProps
> = ({ children, queryRef, defaultSettings }) => {
const isTokenQuery = 'token' in queryRef.variables && 'contentType' in queryRef.variables

const currentPage = usePreloadedQuery(
isTokenQuery ? getPageWagtailByTokenQuery : getPageWagtailByURLPathQuery,
queryRef,
)

if (!currentPage?.page) {
notFound()
}
return (
<WagtailPagesProvider
currentPage={currentPage.page}
defaultSettings={{
...(defaultSettings ?? {}),
}}
>
{children}
</WagtailPagesProvider>
)
}

export default withRelay<
typeof PageQueryNode,
PageWagtailURLPathQuery | PageWagtailTokenQuery,
WagtailPageProps
>(PreloadedWagtailPagesProvider)
24 changes: 22 additions & 2 deletions packages/wagtail/modules/pages/createWagtailPage/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,13 @@ import PageQueryByPathNode, {
} from '../../../__generated__/PageWagtailURLPathQuery.graphql'
import { PageTypes } from '../../components'
import WagtailPagesProvider from '../../providers/WagtailPagesProvider'
import { PageParams, PageSearchParams, WagtailPageProps } from './types'
import PreloadedWagtailPagesProvider from './PreloadedWagtailPagesProvider'
import {
CreateWagtailPageProviderParams,
PageParams,
PageSearchParams,
WagtailPageProps,
} from './types'

type PageQueryOptions =
| {
Expand Down Expand Up @@ -73,8 +79,22 @@ export const generateWagtailPageComponents = (
) => ({
preloadedPageQueryRef,
WagtailPagesProvider: ({ children, defaultSettings }: WagtailPageProps) => (
<WagtailPagesProvider
<PreloadedWagtailPagesProvider
preloadedQuery={preloadedPageQueryRef}
defaultSettings={defaultSettings}
>
{children}
</PreloadedWagtailPagesProvider>
),
WagtailPageTypes: PageTypes,
})

export const createWagtailPageProviderFromFragment = ({
pageFragment,
}: CreateWagtailPageProviderParams) => ({
WagtailPagesProvider: ({ children, defaultSettings }: WagtailPageProps) => (
<WagtailPagesProvider
currentPage={pageFragment}
defaultSettings={{
...(defaultSettings ?? {}),
}}
Expand Down
5 changes: 5 additions & 0 deletions packages/wagtail/modules/pages/createWagtailPage/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { PropsWithChildren } from 'react'

import type { PageWagtailFieldsFragment$key } from '../../../__generated__/PageWagtailFieldsFragment.graphql'
import type { WagtailPagesContextState } from '../../providers/WagtailPagesProvider/types'

export interface PageParams {
Expand All @@ -15,6 +16,10 @@ export interface PageSearchParams {
}
}

export interface CreateWagtailPageProviderParams {
pageFragment: PageWagtailFieldsFragment$key
}

export interface WagtailPageProps extends PropsWithChildren {
defaultSettings?: ProviderDefaultSettingsType
}
Expand Down
1 change: 1 addition & 0 deletions packages/wagtail/modules/pages/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export { default as createWagtailPage } from './createWagtailPage'
export { createWagtailPagePreview } from './createWagtailPage'
export { createWagtailPageProviderFromFragment } from './createWagtailPage'
export type * from './createWagtailPage/types'
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,22 @@

import { FC, useMemo, useState } from 'react'

import { ComponentWithQueryRef, withRelay } from '@baseapp-frontend/graphql'

import { useFragment, usePreloadedQuery } from 'react-relay'
import { useFragment } from 'react-relay'

import { PageWagtailFieldsFragment$data } from '../../../__generated__/PageWagtailFieldsFragment.graphql'
import { PageWagtailTokenQuery } from '../../../__generated__/PageWagtailTokenQuery.graphql'
import PageQueryNode, {
PageWagtailURLPathQuery,
} from '../../../__generated__/PageWagtailURLPathQuery.graphql'
import {
PageWagtailFieldsFragment,
getPageWagtailByTokenQuery,
getPageWagtailByURLPathQuery,
} from '../../graphql/queries/Page'
import { PageWagtailFieldsFragment } from '../../graphql/queries/Page'
import { PROVIDER_INITIAL_STATE } from './constants'
import { WagtailPagesContext } from './context'
import { WagtailPagesContextState, WagtailPagesProviderProps } from './types'

const WagtailPagesProvider: FC<
ComponentWithQueryRef<PageWagtailURLPathQuery | PageWagtailTokenQuery> & WagtailPagesProviderProps
> = ({ children, queryRef, defaultSettings }) => {
const isTokenQuery = 'token' in queryRef.variables && 'contentType' in queryRef.variables

const currentPage = usePreloadedQuery(
isTokenQuery ? getPageWagtailByTokenQuery : getPageWagtailByURLPathQuery,
queryRef,
)

if (!currentPage?.page) {
throw new Error('Current page not found in provider')
}
const WagtailPagesProvider: FC<WagtailPagesProviderProps> = ({
children,
currentPage,
defaultSettings,
}) => {
const currentPageFragment = useFragment(
PageWagtailFieldsFragment,
currentPage.page,
currentPage,
) as PageWagtailFieldsFragment$data

const [state, setState] = useState<WagtailPagesContextState>({
Expand Down Expand Up @@ -73,8 +55,4 @@ const WagtailPagesProvider: FC<
)
}

export default withRelay<
typeof PageQueryNode,
PageWagtailURLPathQuery | PageWagtailTokenQuery,
WagtailPagesProviderProps
>(WagtailPagesProvider)
export default WagtailPagesProvider
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import React from 'react'

import type { PageWagtailFieldsFragment$data } from '../../../__generated__/PageWagtailFieldsFragment.graphql'
import type {
PageWagtailFieldsFragment$data,
PageWagtailFieldsFragment$key,
} from '../../../__generated__/PageWagtailFieldsFragment.graphql'
import type { AvailableBlocksType } from '../../components/Blocks/types'
import type { AvailablePageTypesType } from '../../components/PageTypes/types'

export type WagtailPagesProviderProps = {
children: React.ReactNode
currentPage: PageWagtailFieldsFragment$key
defaultSettings: Partial<Omit<WagtailPagesContextState, 'currentPage'>>
}

Expand Down
Loading
Loading