-
Notifications
You must be signed in to change notification settings - Fork 0
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
Embedded Portal Flow #19
Changes from 8 commits
923edd3
789bc02
2c95b15
11c2079
b298739
f774aa7
0c7646f
129aa83
cafa147
a47c960
a6509de
523d620
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,86 @@ | ||||||||||||||||||||||||||||
"use client"; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
import { useState } from "react"; | ||||||||||||||||||||||||||||
import { ISpace, initializeFlatfile } from "@flatfile/react"; | ||||||||||||||||||||||||||||
import { Button } from "@/components/ui/button"; | ||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||
ArrowsPointingInIcon, | ||||||||||||||||||||||||||||
ArrowsPointingOutIcon, | ||||||||||||||||||||||||||||
} from "@heroicons/react/24/outline"; | ||||||||||||||||||||||||||||
import HeaderContent from "@/app/(authenticated)/project-onboarding/header-content"; | ||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||
EMBEDDED_PORTAL_ITEM, | ||||||||||||||||||||||||||||
EMBEDDED_PORTAL_INITIAL_STEPS, | ||||||||||||||||||||||||||||
} from "@/lib/workflow-constants"; | ||||||||||||||||||||||||||||
import { Step } from "@/components/shared/step-list"; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
export default function EmbeddedPortal({ | ||||||||||||||||||||||||||||
flatfileSpaceId, | ||||||||||||||||||||||||||||
flatfileSpaceAccessToken, | ||||||||||||||||||||||||||||
}: { | ||||||||||||||||||||||||||||
flatfileSpaceId: string; | ||||||||||||||||||||||||||||
flatfileSpaceAccessToken: string; | ||||||||||||||||||||||||||||
}) { | ||||||||||||||||||||||||||||
const [showSpace, setShowSpace] = useState(false); | ||||||||||||||||||||||||||||
const steps: Step[] = [ | ||||||||||||||||||||||||||||
{ ...EMBEDDED_PORTAL_INITIAL_STEPS[0], status: "complete" }, | ||||||||||||||||||||||||||||
{ ...EMBEDDED_PORTAL_INITIAL_STEPS[1], status: "current" }, | ||||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const spaceProps: ISpace = { | ||||||||||||||||||||||||||||
space: { | ||||||||||||||||||||||||||||
id: flatfileSpaceId, | ||||||||||||||||||||||||||||
accessToken: flatfileSpaceAccessToken, | ||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||
namespace: process.env.NEXT_PUBLIC_FLATFILE_NAMESPACE as string, | ||||||||||||||||||||||||||||
environmentId: process.env.NEXT_PUBLIC_FLATFILE_ENVIRONMENT_ID as string, | ||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||
const { Space, OpenEmbed } = initializeFlatfile({ | ||||||||||||||||||||||||||||
...spaceProps, | ||||||||||||||||||||||||||||
closeSpace: { | ||||||||||||||||||||||||||||
operation: "contacts:submit", | ||||||||||||||||||||||||||||
onClose: () => setShowSpace(false), | ||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const onOpenSpace = async () => { | ||||||||||||||||||||||||||||
setShowSpace(!showSpace); | ||||||||||||||||||||||||||||
OpenEmbed(); | ||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||
Comment on lines
+46
to
+49
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. Consider adding error handling for the const onOpenSpace = async () => {
try {
setShowSpace(!showSpace);
OpenEmbed();
} catch (error) {
console.error("Error opening Flatfile space:", error);
// Handle error appropriately
}
}; Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||
<div className="space-y-6"> | ||||||||||||||||||||||||||||
<HeaderContent item={EMBEDDED_PORTAL_ITEM} steps={steps} /> | ||||||||||||||||||||||||||||
<div className="text-white"> | ||||||||||||||||||||||||||||
<p className="text-2xl mb-8 md:max-w-lg"> | ||||||||||||||||||||||||||||
Your embedded Flatfile space is configured and ready for import. 🎉 | ||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||
<div className="flex flex-col md:flex-row justify-between lg:justify-start lg:space-x-12 space-y-12 md:space-y-0"> | ||||||||||||||||||||||||||||
<div className="md:max-w-md"> | ||||||||||||||||||||||||||||
<p className="font-semibold mb-4">Launch Flatfile</p> | ||||||||||||||||||||||||||||
<p>Launch Flatfile via the “Import" button below.</p> | ||||||||||||||||||||||||||||
<p> | ||||||||||||||||||||||||||||
Use the Sidebar in the embedded application to guide you through | ||||||||||||||||||||||||||||
the import process! | ||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||
<div className="mt-8"> | ||||||||||||||||||||||||||||
<div className="content"> | ||||||||||||||||||||||||||||
<div> | ||||||||||||||||||||||||||||
<Button className="contrast" onClick={onOpenSpace}> | ||||||||||||||||||||||||||||
{showSpace ? "Close Portal" : "Import Data"} | ||||||||||||||||||||||||||||
{showSpace ? ( | ||||||||||||||||||||||||||||
<ArrowsPointingInIcon className="w-4 h-4 ml-2" /> | ||||||||||||||||||||||||||||
) : ( | ||||||||||||||||||||||||||||
<ArrowsPointingOutIcon className="w-4 h-4 ml-2" /> | ||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||
</Button> | ||||||||||||||||||||||||||||
{showSpace && <Space />} | ||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,13 +1,26 @@ | ||||||||||||||||||||||||||||||||||||||||||||||
import { WorkflowType } from "@/lib/workflow-type"; | ||||||||||||||||||||||||||||||||||||||||||||||
import CreateSpaceForm from "@/components/shared/create-space-form"; | ||||||||||||||||||||||||||||||||||||||||||||||
import { SpaceService } from "@/lib/services/space"; | ||||||||||||||||||||||||||||||||||||||||||||||
import invariant from "ts-invariant"; | ||||||||||||||||||||||||||||||||||||||||||||||
import { getServerSession } from "@/lib/get-server-session"; | ||||||||||||||||||||||||||||||||||||||||||||||
import { redirect } from "next/navigation"; | ||||||||||||||||||||||||||||||||||||||||||||||
import SetupSpace from "@/components/shared/setup-space"; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
const STORAGE_KEY = `${process.env.NEXT_PUBLIC_APP_ID}-embedded-portal-downloaded`; | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
export default async function Page() { | ||||||||||||||||||||||||||||||||||||||||||||||
const session = await getServerSession(); | ||||||||||||||||||||||||||||||||||||||||||||||
invariant(session?.user, "User must be logged in"); | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
const space = await SpaceService.getSpaceForWorkflow({ | ||||||||||||||||||||||||||||||||||||||||||||||
userId: session.user.id, | ||||||||||||||||||||||||||||||||||||||||||||||
workflowType: WorkflowType.Embed, | ||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+16
to
+19
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. Add error handling for the asynchronous operation to improve robustness and user experience in case of errors. const space = await SpaceService.getSpaceForWorkflow({
userId: session.user.id,
workflowType: WorkflowType.Embed,
}).catch(error => {
console.error("Failed to fetch space data:", error);
// Redirect to an error page or show an error message
redirect("/error");
}); Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
if (space) { | ||||||||||||||||||||||||||||||||||||||||||||||
redirect(`/embedded-portal/${space.id}`); | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+16
to
+23
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. Consider wrapping the space fetching and redirection logic in a try-catch block to handle potential errors more gracefully. + try {
const space = await SpaceService.getSpaceForWorkflow({
userId: session.user.id,
workflowType: WorkflowType.Embed,
});
if (space) {
redirect(`/embedded-portal/${space.id}`);
}
+ } catch (error) {
+ console.error("Error fetching space or redirecting:", error);
+ // Redirect to an error page or show an error message
+ redirect("/error");
+ } Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
export default function Page() { | ||||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||||
<div> | ||||||||||||||||||||||||||||||||||||||||||||||
<CreateSpaceForm | ||||||||||||||||||||||||||||||||||||||||||||||
workflowType={WorkflowType.Embed} | ||||||||||||||||||||||||||||||||||||||||||||||
spaceName={"Embedded Portal"} | ||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||||||||
<SetupSpace workflowType={WorkflowType.Embed} storageKey={STORAGE_KEY} /> | ||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||
} |
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.
Add error handling for asynchronous operations to prevent unhandled promise rejections and improve user experience in case of errors.
Committable suggestion