Fase 3 (isla reutilizable): servicios de personaje de pago; aplica a rename

Componente genérico CharacterPurchaseForm (selector de personaje + botón con precio)
+ entry character_purchase, configurable por data-* en la plantilla. Al enviar, la
vista devuelve {session_id, stripe_public_key} y se redirige al Checkout de Stripe
(helper stripe.ts que carga Stripe.js). Reutilizable por rename/customize/race/
faction/level/gold/transfer... cambiando solo los data-* y la lista de personajes
(json_script). Primer uso: rename_character.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-12 21:33:14 +00:00
parent b1107c0a54
commit 2258df4b09
5 changed files with 193 additions and 22 deletions
@@ -0,0 +1,24 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { CharacterPurchaseForm } from '../components/CharacterPurchaseForm'
// Entry genérico para todos los servicios de personaje de pago. La plantilla
// configura el formulario con data-* y una lista de personajes en json_script.
const el = document.getElementById('character-purchase-app')
if (el) {
const dataEl = document.getElementById('character-purchase-data')
const characters: string[] = dataEl ? JSON.parse(dataEl.textContent || '[]') : []
createRoot(el).render(
<StrictMode>
<CharacterPurchaseForm
url={el.dataset.url || ''}
csrfToken={el.dataset.csrf || ''}
characters={characters}
price={el.dataset.price || ''}
label={el.dataset.label || 'Comprar'}
field={el.dataset.field || 'character'}
buttonClass={el.dataset.buttonClass || 'rename-button'}
/>
</StrictMode>,
)
}