Path: blob/main/components/dashboard/src/onboarding/OnboardingStep.tsx
2500 views
/**1* Copyright (c) 2023 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { FC, FormEvent, useCallback } from "react";7import Alert from "../components/Alert";8import { Button, ButtonProps } from "@podkit/buttons/Button";9import { Heading2, Subheading } from "../components/typography/headings";10import { LoadingButton } from "@podkit/buttons/LoadingButton";1112type Props = {13title: string;14subtitle?: string;15isValid: boolean;16isSaving?: boolean;17error?: string;18onSubmit(): void;19submitButtonText?: string;20submitButtonType?: ButtonProps["variant"];21onCancel?(): void;22cancelButtonText?: string;23cancelButtonType?: ButtonProps["variant"];24};25export const OnboardingStep: FC<Props> = ({26title,27subtitle,28isValid,29isSaving = false,30error,31children,32onSubmit,33submitButtonText,34submitButtonType,35onCancel,36cancelButtonText,37cancelButtonType,38}) => {39const handleSubmit = useCallback(40async (e: FormEvent<HTMLFormElement>) => {41e.preventDefault();42if (isSaving || !isValid) {43return;44}4546onSubmit();47},48[isSaving, isValid, onSubmit],49);5051return (52<div className="flex flex-col items-center justify-center max-w-full">53{/* Intentionally adjusting the size of the heading here */}54<Heading2 className="text-4xl">{title}</Heading2>55{subtitle && <Subheading>{subtitle}</Subheading>}5657<form className="mt-8 mb-14 max-w-lg" onSubmit={handleSubmit}>58{/* Form contents provided as children */}59{children}6061{error && <Alert type="error">{error}</Alert>}6263<div className={"mt-4" + (onCancel ? " flex space-x-2" : "")}>64{onCancel && (65<Button66type="button"67variant={cancelButtonType || "secondary"}68disabled={isSaving}69onClick={onCancel}70>71{cancelButtonText || "Cancel"}72</Button>73)}74<LoadingButton75type="submit"76variant={submitButtonType || "default"}77disabled={!isValid || isSaving}78className="w-full"79loading={isSaving}80>81{submitButtonText || "Continue"}82</LoadingButton>83</div>84</form>85</div>86);87};888990