-
Notifications
You must be signed in to change notification settings - Fork 2
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
feat: Add Preview/Draft Layout Wrapper for Testing Links #4090
base: main
Are you sure you want to change the base?
Changes from all commits
87f349f
77966e0
84b9fe2
297b3fb
166348d
59beaa6
3c8c9d1
4dc7520
1395eb6
18357ad
c69cf29
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
import Link from "@mui/material/Link"; | ||
import Typography from "@mui/material/Typography"; | ||
import { clearLocalFlow } from "lib/local"; | ||
import { useStore } from "pages/FlowEditor/lib/store"; | ||
import React from "react"; | ||
import { useNavigation } from "react-navi"; | ||
|
||
const NavigateToPublishedButton: React.FC = () => { | ||
const { navigate } = useNavigation(); | ||
const id = useStore().id; | ||
|
||
const handleClick = () => { | ||
clearLocalFlow(id); | ||
navigate("published?analytics=false"); | ||
window.location.reload(); | ||
}; | ||
|
||
return ( | ||
<Link onClick={handleClick} component="button"> | ||
<Typography variant="body1" textAlign="left"> | ||
Go to the published version of this service | ||
</Typography> | ||
</Link> | ||
); | ||
}; | ||
|
||
export default NavigateToPublishedButton; |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,77 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import Box from "@mui/material/Box"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import { styled } from "@mui/material/styles"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import Typography from "@mui/material/Typography"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import { ComponentType as TYPES } from "@opensystemslab/planx-core/types"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import { useStore } from "pages/FlowEditor/lib/store"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import React from "react"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import { ApplicationPath } from "types"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
import { contentFlowSpacing } from "./Card"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import NavigateToPublishedButton from "./NavigateToPublishedButton"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import SaveResumeButton from "./SaveResumeButton"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
type OrNavigationType = "save-resume" | "navigate-to-published"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
export const InnerContainer = styled(Box)(({ theme }) => ({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"& p": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
...contentFlowSpacing(theme), | ||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
})); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const BUTTON_COMPONENTS = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"save-resume": SaveResumeButton, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"navigate-to-published": NavigateToPublishedButton, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} as const; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const TEST_ENVIRONMENTS = new Set(["preview", "draft"]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const OrNavigationButton = ({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
handleSubmit, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
}: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
handleSubmit: ((data?: any) => void) | undefined; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
}) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
const [path, breadcrumbs, flow] = useStore((state) => [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
state.path, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
state.breadcrumbs, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
state.flow, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const endOfUrl = window.location.pathname.split("/").slice(-1)[0]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const isTestEnvironment: boolean = TEST_ENVIRONMENTS.has(endOfUrl); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit: Redundant type? P.S. love to see a |
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const defineNavigationType = (): OrNavigationType | undefined => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
// Check if we have a Send node in our breadcrumbs | ||||||||||||||||||||||||||||||||||||||||||||||||||||
// This is a better/more immediate proxy for "submitted" in the frontend because actual send events that populate lowcal_sessions.submitted_at are queued via Hasura | ||||||||||||||||||||||||||||||||||||||||||||||||||||
const hasSent = Object.keys(breadcrumbs).some( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
(breadcrumbNodeId: string) => flow[breadcrumbNodeId]?.type === TYPES.Send, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const showSaveResumeButton = | ||||||||||||||||||||||||||||||||||||||||||||||||||||
path === ApplicationPath.SaveAndReturn && handleSubmit && !hasSent; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if (showSaveResumeButton && !isTestEnvironment) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return "save-resume"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!showSaveResumeButton && isTestEnvironment) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return "navigate-to-published"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const orNavigationType = defineNavigationType(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const ButtonComponent = | ||||||||||||||||||||||||||||||||||||||||||||||||||||
orNavigationType && BUTTON_COMPONENTS[orNavigationType]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
ButtonComponent && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
<InnerContainer> | ||||||||||||||||||||||||||||||||||||||||||||||||||||
<Typography variant="body1">or</Typography> | ||||||||||||||||||||||||||||||||||||||||||||||||||||
<ButtonComponent /> | ||||||||||||||||||||||||||||||||||||||||||||||||||||
</InnerContainer> | ||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+62
to
+74
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
An early return here feels more idiomatic imho. This is a bit more clear and explicit - if the condition it not met, don't show this component. It also helps us with type narrowing - we no longer need to check for the |
||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
export default OrNavigationButton; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
import Box from "@mui/material/Box"; | ||
import Card from "@planx/components/shared/Preview/Card"; | ||
import { CardHeader } from "@planx/components/shared/Preview/CardHeader/CardHeader"; | ||
import React, { PropsWithChildren, useState } from "react"; | ||
|
||
export const TestWarningPage = ({ children }: PropsWithChildren) => { | ||
const [hasAcknowledgedWarning, setHasAcknowledgedWarning] = useState(false); | ||
return ( | ||
<> | ||
{hasAcknowledgedWarning ? ( | ||
children | ||
) : ( | ||
<Box width="100%"> | ||
<Card handleSubmit={() => setHasAcknowledgedWarning(true)}> | ||
<CardHeader | ||
title="This is a test environment" | ||
description="This version of the service is unpublished and for testing only. Do not use it to submit real applications" | ||
></CardHeader> | ||
</Card> | ||
</Box> | ||
)} | ||
</> | ||
); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should actually come back and type
handleSubmit
properly, but for now let's work to not introduce any newany
s to the codebase.