Fase 2 (isla): formulario de registro en React/TSX

register_view ya devolvía JSON en POST, así que sin cambio de backend:
RegisterForm.tsx replica register.js (password/conf con mostrar-ocultar, email/conf,
reclutador opcional, checkbox de términos que habilita el botón) y hace fetch
form-urlencoded + CSRF a {% url 'register' %}. El mensaje de éxito llega como HTML
(dangerouslySetInnerHTML); los de error como texto en rojo.

- partials/register.html: el <form> + register.js se sustituyen por #register-app
  (data-csrf/data-register-url) + {% vite_asset %}. Info-box y rama "ya conectado"
  siguen en Django.
- Nueva entry 'register' en vite.config.ts.

Verificado: check OK, la página monta la isla, POST con datos inválidos devuelve
el JSON de validación correcto.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-12 20:45:00 +00:00
parent 0909567e0d
commit 8156befe4f
4 changed files with 229 additions and 42 deletions
+7 -42
View File
@@ -54,48 +54,13 @@
<div class="box-content">
<div class="body-box-content centered">
<form action="" method="POST" id="nw-create-form" accept-charset="utf-8">
{% csrf_token %}
<table class="middle-center-table">
<script src="{{ URL_PRINCIPAL }}/static/nw-themes/nw-ryu/nw-js-handlers/register.js"></script>
<tbody><tr>
<td><input type="password" maxlength="16" name="password" id="password" placeholder="Contraseña">
<span class="far fa-eye toggle-password"></span></td>
</tr>
<tr>
<td><input type="password" maxlength="16" name="conf-password" id="conf-password" placeholder="Confirmar contraseña">
<span class="far fa-eye toggle-password-conf"></span></td>
</tr>
<tr>
<td><input type="email" name="email" id="email" placeholder="Correo electrónico de Gmail"></td>
</tr>
<tr>
<td><input type="email" name="conf-email" id="conf-email" placeholder="Confirmar correo electrónico"></td>
</tr>
<tr>
<td><hr></td>
</tr>
<tr>
<td>Opcional: Sólo si eres reclutado por un amigo</td>
</tr>
<tr>
<td><input type="text" maxlength="12" name="recruiter" id="recruiter" placeholder="Reclutante"></td>
</tr>
<tr>
</tr>
<tr>
<td>
<input type="checkbox" onclick="click_checkbox()" id="accept-terms-cookies" class="terms-check" name="accept-terms-cookies">
<label for="vehicle1"> Acepto las <a href="https://foro.novawow.com/forum/novawow/normas-de-la-comunidad/16502-normas-del-juego" target="_blank" rel="noopener noreferrer">Normas</a>, <a href="terms-and-conditions" target="_blank">Términos y Condiciones</a> y la <a href="privacy-policy" target="_blank">Política de Privacidad</a></label>
</td>
</tr>
<tr>
<td><button type="submit" name="create" class="create-button" data-id="CrearCuenta" id="create-account-btn" disabled="true">Crear cuenta</button></td>
</tr>
</tbody></table>
</form>
<hr>
<div class="alert-message" id="create-response"></div>
{% load django_vite %}
<!-- Isla React (Vite): formulario de creación de cuenta. POST a
{% url 'register' %} (que ya devuelve JSON) con CSRF. -->
<div id="register-app"
data-csrf="{{ csrf_token }}"
data-register-url="{% url 'register' %}"></div>
{% vite_asset 'src/entries/register.tsx' %}
<br>
</div>
</div>