Skip to content

Commit 1a1a6b4

Browse files
authored
fix(collection-pages): misc fixes (#815)
* fix: collection * fix: prevent double renders * fix: duplicate permalink shows error on title * chore: add story add story for page details
1 parent b090f6b commit 1a1a6b4

File tree

4 files changed

+83
-42
lines changed

4 files changed

+83
-42
lines changed

apps/studio/src/features/editing-experience/components/CreateCollectionPageModal/CreateCollectionPageWizardContext.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,26 @@ const useCreateCollectionPageWizardContext = ({
101101
void router.push(`/sites/${siteId}/${nextType}/${pageId}`)
102102
},
103103
onError: (error) => {
104-
if (error.data?.code === "CONFLICT") {
104+
if (
105+
error.data?.code === "CONFLICT" &&
106+
values.type === "CollectionPage"
107+
) {
105108
formMethods.setError(
106109
"permalink",
107110
{ message: error.message },
108111
{ shouldFocus: true },
109112
)
113+
return
114+
} else if (
115+
error.data?.code === "CONFLICT" &&
116+
values.type === "CollectionLink"
117+
) {
118+
formMethods.setError(
119+
"title",
120+
{ message: error.message },
121+
{ shouldFocus: true },
122+
)
123+
return
110124
} else {
111125
console.error(error)
112126
}
Lines changed: 50 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { useMemo } from "react"
2-
import { Box, Flex, Stack } from "@chakra-ui/react"
1+
import { Suspense, useMemo } from "react"
2+
import { Box, Flex, Skeleton, Stack } from "@chakra-ui/react"
33
import { useIsMobile } from "@opengovsg/design-system-react"
44
import { ResourceType } from "~prisma/generated/generatedEnums"
55
import { format } from "date-fns"
@@ -13,32 +13,7 @@ import { useCreateCollectionPageWizard } from "./CreateCollectionPageWizardConte
1313

1414
export const PreviewLayout = (): JSX.Element => {
1515
const isMobile = useIsMobile()
16-
const {
17-
pagePreviewJson,
18-
currentType,
19-
siteId,
20-
formMethods: { watch },
21-
} = useCreateCollectionPageWizard()
22-
23-
const themeCssVars = useSiteThemeCssVars({ siteId })
24-
const currentPermalink = watch("permalink", "/")
25-
const title = watch("title")
26-
27-
const previewOverrides = useMemo(() => {
28-
switch (currentType) {
29-
case ResourceType.CollectionLink: {
30-
return {
31-
page: {
32-
title: "Newsroom",
33-
date: format(new Date(), "dd MMM yyyy"),
34-
},
35-
}
36-
}
37-
case ResourceType.CollectionPage: {
38-
return {}
39-
}
40-
}
41-
}, [currentType])
16+
const { currentType } = useCreateCollectionPageWizard()
4217

4318
return (
4419
<Stack
@@ -64,22 +39,56 @@ export const PreviewLayout = (): JSX.Element => {
6439
{`You're previewing a collection ${currentType === ResourceType.CollectionLink ? "link" : "page"}`}
6540
</Flex>
6641
<Box bg="white" overflow="auto" height="100%">
67-
<PreviewIframe
68-
preventPointerEvents
69-
keyForRerender={currentType}
70-
style={themeCssVars}
71-
>
72-
<PreviewWithoutSitemap
73-
overrides={previewOverrides}
74-
siteId={siteId}
75-
siteMap={generatePreviewSitemap(collectionSitemap, title)}
76-
permalink={currentPermalink}
77-
{...pagePreviewJson}
78-
/>
79-
</PreviewIframe>
42+
<Suspense fallback={<Skeleton height="100%" />}>
43+
<SuspendableLayoutPreview />
44+
</Suspense>
8045
</Box>
8146
</Box>
8247
)}
8348
</Stack>
8449
)
8550
}
51+
52+
const SuspendableLayoutPreview = () => {
53+
const {
54+
pagePreviewJson,
55+
currentType,
56+
siteId,
57+
formMethods: { watch },
58+
} = useCreateCollectionPageWizard()
59+
const themeCssVars = useSiteThemeCssVars({ siteId })
60+
const currentPermalink = watch("permalink", "/")
61+
const title = watch("title")
62+
63+
const previewOverrides = useMemo(() => {
64+
switch (currentType) {
65+
case ResourceType.CollectionLink: {
66+
return {
67+
page: {
68+
title: "Newsroom",
69+
date: format(new Date(), "dd MMM yyyy"),
70+
},
71+
}
72+
}
73+
case ResourceType.CollectionPage: {
74+
return {}
75+
}
76+
}
77+
}, [currentType])
78+
79+
return (
80+
<PreviewIframe
81+
preventPointerEvents
82+
keyForRerender={currentType}
83+
style={themeCssVars}
84+
>
85+
<PreviewWithoutSitemap
86+
overrides={previewOverrides}
87+
siteId={siteId}
88+
siteMap={generatePreviewSitemap(collectionSitemap, title)}
89+
permalink={currentPermalink}
90+
{...pagePreviewJson}
91+
/>
92+
</PreviewIframe>
93+
)
94+
}

apps/studio/src/server/modules/collection/collection.router.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ export const collectionRouter = router({
9191
siteId: input.siteId,
9292
action: "create",
9393
userId: ctx.user.id,
94+
resourceId: !!input.collectionId ? String(input.collectionId) : null,
9495
})
9596

9697
let newPage: UnwrapTagged<PrismaJson.BlobJsonContent>

apps/studio/src/stories/Flows/CreateCollectionItemFlow.stories.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,20 @@ export const SelectLayout: Story = {
6464
})
6565
},
6666
}
67+
68+
export const EnterPageDetails: Story = {
69+
play: async (context) => {
70+
const { canvasElement } = context
71+
const screen = within(canvasElement.ownerDocument.body)
72+
await SelectLayout.play?.(context)
73+
74+
await userEvent.click(
75+
screen.getByRole("button", { name: /next: page details/i }),
76+
)
77+
78+
await userEvent.type(
79+
screen.getByLabelText(/page title/i),
80+
"My_new page WITH w@eird characters!",
81+
)
82+
},
83+
}

0 commit comments

Comments
 (0)