import { useEffect, useState } from "react" import { renderToStaticMarkup } from "react-dom/server" import services from "@/data/services.json" import Code from "./Code" import { Homepage, HomepageEmail, HomepageEmailOrProconnect, HomepageProconnect, } from "@gouvfr-lasuite/integration" import * as prettier from "prettier/standalone" import prettierHtml from "prettier/plugins/html" const defaultFormData = { serviceId: "", serviceName: "Service", tagline: "**Service**, un outil sécurisé pour les agents de l'État", entity: "Gouvernement", homepageType: "proconnect", } const homepageTypes = { proconnect: { label: "ProConnect uniquement", importCode: "HomepageProconnect", componentCode: ``, Component: , }, "email-or-proconnect": { label: "E-mail + ProConnect", importCode: "HomepageEmailOrProconnect", componentCode: ``, Component: ( ), }, email: { label: "E-mail uniquement", importCode: "HomepageEmail", componentCode: ``, Component: , }, custom: { label: "Autre", importCode: null, componentCode: `~~replace~~`, Component: null, }, } export default function HomepageGenerator() { const [codeData, setCodeData] = useState(defaultFormData) const [htmlMarkup, setHtmlMarkup] = useState("") useEffect(() => { getHTMLMarkup(codeData).then((html) => { setHtmlMarkup(html) }) }, [codeData]) return ( { const formData = new FormData(e.currentTarget) setCodeData({ ...Object.fromEntries(formData), serviceId: formData.get("serviceId") && formData.get("serviceId") !== "other" ? formData.get("serviceId") : undefined, }) }} > Service { const serviceId = e.currentTarget.value const service = services.find((service) => service.id === serviceId) ;(document.querySelector("#tagline") as HTMLInputElement).value = ( service || defaultFormData ).tagline ;(document.querySelector("#entity") as HTMLInputElement).value = ( service || defaultFormData ).entity ;(document.querySelector("#serviceName") as HTMLInputElement).value = service ? service.name : defaultFormData.serviceName ;(document.querySelector("#homepageType") as HTMLInputElement).value = ( service || defaultFormData ).homepageType }} > Choisir votre service pour pré-remplir les champs {services.map((service) => ( {service.name} ))} Autre… Nom du service Phrase d'accroche Mettre le texte entre ** pour l'écrire en gras, usage de <br>{" "} possible Type de connexion Choisir… {Object.keys(homepageTypes).map((key) => ( {homepageTypes[key].label} ))} {!!codeData && ( <> Code React correspondant {getReactMarkup(codeData)} Code HTML correspondant {htmlMarkup} > )} ) } const getReactMarkup = (codeData: any) => { return `import { Homepage${ codeData.homepageType && homepageTypes[codeData.homepageType].importCode ? `, ${homepageTypes[codeData.homepageType].importCode}` : "" } } from "@gouvfr-lasuite/integration" export default function MyHomepage() { return ( ${codeData.homepageType ? homepageTypes[codeData.homepageType].componentCode : ""} ) }` } const getHTMLMarkup = (codeData: any) => { const Component = ( {codeData.homepageType ? homepageTypes[codeData.homepageType].Component : ""} ) const markup = renderToStaticMarkup(Component) return prettier.format(markup, { parser: "html", plugins: [prettierHtml], printWidth: 100, tabWidth: 4, bracketSameLine: false, htmlWhitespaceSensitivity: "ignore", }) }
<br>
{getReactMarkup(codeData)}
{htmlMarkup}