Feature: Class Registration
Introdução ao documento
Este documento descreve a feature final exposta em /{slug}/inscricao/turma, que instrui o participante a concluir a inscrição no WhatsApp e permite reenvio controlado da mensagem.
Evidências:
../../app/[slug]/inscricao/turma/page.tsx#L8-L13../../src/features/components/ClassRegistration/ClassRegistration.component.tsx#L5-L8../../src/features/components/ClassRegistration/components/ClassCTA/ClassCTA.component.tsx#L10-L109
Versionamento
Atualizar este documento quando mudarem:
- os limites de reenvio;
- a lógica de countdown;
- a exibição de suporte;
- o contrato de
/v1/flow/resend.
Evidências:
../../src/features/components/ClassRegistration/components/ClassCTA/ClassCTA.component.tsx#L11-L49../../src/features/api/resendTemplate/resendTemplate.api.ts#L6-L24../../pages/api/v1/flow/resend.ts#L21-L44
Referencial teórico
O mapeamento desta feature foi derivado da página protegida turma, do ClassCTA, do endpoint interno de reenvio e do suporte carregado via globalThis.
Evidências:
../../app/[slug]/inscricao/turma/page.tsx#L8-L13../../src/common/components/AuthProtected/AuthProtected.component.tsx#L14-L20../../src/features/components/ClassRegistration/components/ClassCTA/ClassCTA.component.tsx#L28-L31../../src/features/api/resendTemplate/resendTemplate.api.ts#L6-L24
Visão geral
- A rota protegida renderiza
ClassRegistration, que delega a experiência paraClassCTA(turma/page.tsx#L8-L13, ClassRegistration.component.tsx#L5-L8). - A UI orienta o participante a finalizar o cadastro no WhatsApp, inicia um countdown e libera reenvio progressivo da mensagem (ClassCTA.component.tsx#L72-L106).
Atores
- Participante autenticado (turma/page.tsx#L8-L13).
- App Next.js / guard client-side (turma/page.tsx#L9-L11).
- Backend interno de reenvio
/v1/flow/resend(resendTemplate.api.ts#L6-L24, pages/api/v1/flow/resend.ts#L21-L41). - Canal de suporte via
supportUrlinjetado no layout (ClassCTA.component.tsx#L28-L31, ../../app/layout.tsx#L33-L58).
Pré-condições
AuthProtectedprecisa permitir a página (turma/page.tsx#L9-L11).- A página depende de sessão válida para que
/v1/flow/resendconsiga lerid,course_slug,phoneenameno backend (pages/api/v1/flow/resend.ts#L11-L25). - O suporte depende de
globalThis.supportUrlconfigurado no layout (ClassCTA.component.tsx#L28-L31, ../../app/layout.tsx#L48-L58).
Fluxo principal
- A página protegida monta
ClassCTA(turma/page.tsx#L8-L13). - O componente inicia
count = 60eisCounting = true(ClassCTA.component.tsx#L11-L14). - A cada segundo, o contador é decrementado até zero (ClassCTA.component.tsx#L16-L26).
- Quando o countdown termina, o participante pode clicar em
Reenviar mensagem(ClassCTA.component.tsx#L88-L94). - O clique chama
/v1/flow/resende reinicia o contador conforme o total de envios realizados (ClassCTA.component.tsx#L33-L43).
Fluxos alternativos
- Em erro de reenvio, a feature mostra snackbar de erro e reinicia a espera em 30 segundos (ClassCTA.component.tsx#L44-L49, ClassCTA.component.tsx#L62-L69).
- Após dois reenvios, a feature passa a exibir o botão
Solicitar suporte(ClassCTA.component.tsx#L96-L105). - Após quatro reenvios, o botão de reenvio fica desabilitado (ClassCTA.component.tsx#L88-L94).
Regras de negócio
- O primeiro countdown começa em 60 segundos (ClassCTA.component.tsx#L11-L12).
- A cada sucesso de reenvio, o próximo countdown passa a ser
60 * totalSends(ClassCTA.component.tsx#L37-L41). - Em erro, o cooldown é reduzido para 30 segundos antes de uma nova tentativa (ClassCTA.component.tsx#L44-L49).
- O botão de reenvio fica indisponível enquanto o contador está rodando ou quando
totalSends >= 4(ClassCTA.component.tsx#L88-L94). - O suporte só aparece a partir do segundo reenvio concluído (
totalSends >= 2) (ClassCTA.component.tsx#L96-L105).
Estados possíveis
isCounting = true/false(ClassCTA.component.tsx#L11-L13, ClassCTA.component.tsx#L19-L23).count > 0/count = 0(ClassCTA.component.tsx#L19-L23).totalSends < 2,>= 2,>= 4(ClassCTA.component.tsx#L37-L42, ClassCTA.component.tsx#L88-L105).
Endpoints envolvidos
OpenAPIpath/v1/flow/resend(pages/api/v1/flow/resend.ts#L21-L41).
Dados impactados
- A feature depende de
SessionUsereCourseCustomizationpara compor o reenvio do template final (pages/api/v1/flow/resend.ts#L22-L35).
Pendências
- Não há confirmação visual do payload retornado por
/v1/flow/resend; a UX só mostra snackbars. - O estado inicial já bloqueia reenvio por 60 segundos, mas o documento de produto correspondente não está versionado no repositório.
Evidências: