DS-6096 integation form flow#34
Merged
Merged
Conversation
Collaborator
|
Mati, revisaría Fuera de eso, lo veo bien. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR: conectar el form email-first del hero con el endpoint de estado de registro
TL;DR
Se conecta el form de dos pasos del hero (ya está en el DOM con
data-registration-flow="email-first") contra el endpoint de estado de registro que se shipeó en #32. El paso 1 recibe el email y le pregunta al endpoint si el usuario ya está registrado para el evento actual. Si lo está → redirect a la experiencia registrada. Si no (o el endpoint falla) → revela el paso 2 (nombre / WhatsApp / política / promociones) y submitea a través del pipeline de registro existente. No hay pantallas intermedias, no hay barra de progreso — redirect directo en ambos estados terminales.ECOMMERCENO va a ser tratado como registrado en una landing deDIGITALTRENDS. El evento lo resuelve server-sidecheckRegistrationStatus.phpvíagetCurrentEvent(); el cliente solo manda{email}. Esto es a propósito — el cliente no puede consultar por un evento distinto al de la landing donde está parado.data-registration-flow="email-first". Todos los paths legacy (modal de extra data, los CTAs.alreadyRegisterForm, sponsors quick-submit,alreadyAccountForm) quedan byte por byte intactos.services/register.phpes la fuente de verdad y deduplica server-side. Que el check esté caído un rato no puede dejar a los usuarios afuera del registro.Cambios por archivo
src/1.0.0/js/heroRegistrationFlow.js— módulo nuevoExport único:
initHeroRegistrationFlow(form). Internamente:stepOneEl,stepTwoEl,stepOneButton,stepTwoButtonal momento del init. El botón del paso 2 NO se busca conform.querySelector("button")al momento del handler (ese selector devuelve el botón del paso 1 oculto — ver más abajo el gotcha del loading).handleEmailStep: valida el email, postea acheckRegistrationStatus, redirige sitrue, revela paso 2 sifalseonull(fail-open).handleSubmitStep: rutea el submit del paso 2 alsubmitFormFetchexistente, redirige cuandofetchResp.ok. El único call site decustomErrorestá en el catch — las ramas internas hacenthrowpara no reportar errores dos veces.setButtonLoading(button, isLoading): helper local que toggleabutton--loadingYbutton.disabledsobre la referencia cacheada. Ambos handlers también hacen early-return cuandobutton.disabled === true(defensa contra double-tap de iOS y otros casos de doble-fire en mobile).submitque llamapreventDefault()— defense in depth contra un Enter en el input de email. Los botones sontype="button", así que en la práctica no debería dispararse, pero el listener es barato y elimina ambigüedad.goToStepTwo: togglea[hidden], mirroreaform.dataset.step = "2", mueve el foco al input de nombre. Honraprefers-reduced-motion— cuando está activado, el swap es sincrónico (sin animación, sin setTimeout). Si no, corre un cross-fade de 280ms (ver CSS abajo).dplrid+eventsen localStorage vía el helper existentesetEventInLocalStorageANTES de redirigir. Eso mantiene paridad de storage con el path post-submit, así la landing registrada lee las mismas keys sin importar cómo llegó el usuario.src/1.0.0/js/common/submitForm.jscheckRegistrationStatus(email)que devuelvePromise<boolean | null>. POST{"email": "..."}only (sin campo de evento) a/services/checkRegistrationStatus.php. Devuelvetruesi registrado,falsesi no,nullante fallo de transporte / HTTP no-OK / JSON inválido. Loguea errores de red conconsole.warn.redirectToRegisteredPage()mudado acá desdecommonForm.js(el caso especial del slug de sponsors se preservó textual). Esto evita el ciclo de imports que se formaría si no entrecommonForm.jsyheroRegistrationFlow.js.submitFormFetchdocumentando su contrato tri-state (undefinedsi falla validación cliente,nullsi falla red, objeto en éxito). El contrato ya existía; el JSDoc solo lo explicita para que un futuro caller no destructure unnull/undefinedy crashee./services/checkRegistrationStatus.php), no relativo — protege contra landings en sub-rutas (ej./sponsors).src/1.0.0/js/common/formsValidators.jsvalidateEmailStep(form): componevalidateEmptyFieldyvalidateEmailFieldsobre elinput[name="email"]del form. Devuelve un boolean plano. El rendering de errores reusa el path existente (setErrorField) a través de esos dos helpers — no se introduce ningún helper de error nuevo.src/1.0.0/js/commonForm.jsredirectToRegisteredPagelocal se eliminó; ahora se importa desde./common/submitForm.js.initHeroRegistrationFlowdesde./heroRegistrationFlow.js.if (form) { ... }ahora despacha: siform.dataset.registrationFlow === "email-first"→initHeroRegistrationFlow(form); si no → el wiring legacy (listener desubmitFormHandler+swichFormListener) corre intacto.modalForm,extraData,alreadyRegisterButtons,alreadyAccountForm) quedan sin tocar.src/1.0.0/css/components/form.csseasesobreopacityytransform, con untranslateYchico de ±8px para dar pista direccional (el paso 1 sale hacia arriba, el paso 2 entra desde abajo)..is-leavingy.is-enteringson clases de estado scopeadas bajo.emms__form--two-step .emms__form__step. Sin modifier BEM porque son estados transitorios de UI, no una variante del componente.prefers-reduced-motion: reduceclampeatransition-durationa 1ms y saca eltranslateY. Defense in depth arriba del guard de JS.Resumen del flujo
Related to: Ticket