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, }) }} >
{!!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", }) }