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" 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) 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 .filter(({ enabled }) => !!enabled) .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 {getHTMLMarkup(codeData)} > )} ) } 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) if (typeof window === "undefined") { return markup } const div = document.createElement("div") div.innerHTML = markup return reIndent(div, 0).innerHTML.trim() } // https://stackoverflow.com/a/26361620/257559 const reIndent = (node: Element, level: number) => { const indentBefore = new Array(level++ + 1).join(" ") const indentAfter = new Array(level - 1).join(" ") let textNode: Text for (let i = 0; i < node.children.length; i++) { textNode = document.createTextNode("\n" + indentBefore) node.insertBefore(textNode, node.children[i]) reIndent(node.children[i], level) if (node.lastElementChild == node.children[i]) { textNode = document.createTextNode("\n" + indentAfter) node.appendChild(textNode) } } return node }
<br>
{getReactMarkup(codeData)}
{getHTMLMarkup(codeData)}