import { ucFirst } from "@maykin-ui/client-common"; import React, { useContext } from "react"; import { Body, Card, Column, Container, Form, FormProps, Grid, Hr, Logo, } from "../../components"; import { ConfigContext } from "../../contexts"; import { SerializedFormData, gettextFirst } from "../../lib"; import { BaseTemplate, BaseTemplateProps } from "../base"; import { TRANSLATIONS } from "./translations"; export type LoginTemplateProps< T extends SerializedFormData = SerializedFormData, > = BaseTemplateProps & { fields?: FormProps["fields"]; /** Form props. */ formProps: FormProps; /** The login form label. */ labelLogin?: FormProps["labelSubmit"]; /** Logo (JSX) slot. */ slotLogo?: React.ReactNode; labelOidcLogin?: string; urlOidcLogin?: string; }; /** * Login Template * * Uses a `Form` to render form fields within `CardBaseTemplate`, styled to * resemble a login page. * * @typeParam T - The shape of the serialized form data. */ export const LoginTemplate = < T extends SerializedFormData = SerializedFormData, >({ columnProps, formProps, labelLogin, labelOidcLogin, urlOidcLogin, slotLogo, ...props }: LoginTemplateProps) => { const { logo: CustomLogo } = useContext(ConfigContext); const _labelLogin = gettextFirst(labelLogin, TRANSLATIONS.LABEL_LOGIN); const _labelOidcLogin = gettextFirst( labelOidcLogin, TRANSLATIONS.LABEL_OIDC_LOGIN, ); const secondaryActions = []; if (urlOidcLogin) secondaryActions.push({ href: urlOidcLogin, variant: "secondary", children: _labelOidcLogin, disabled: false, }); return ( {slotLogo || CustomLogo || }
justify="stretch" labelSubmit={ucFirst(_labelLogin)} secondaryActions={secondaryActions} showRequiredExplanation={false} {...formProps} />
); };