Skip to main content

Fluxo de carga do perfil e das roles (carga normal)

Cenário: usuário já logado (ex.: perfis Visitante e Membro), abre o app e depois abre o diálogo de perfil.


1. Carga inicial (Home)

OrdemAçãoOndeHTTP / efeito
1initState()HomePage
2_loadMyProfile() iniciaHomePage
3setState(_isLoadingProfile = true)HomePageUI mostra "Consultando perfil..."
4await service.loadProfile()UserProfileService → ProfileRepository1 GET myProfileHttp (perfil do backend)
5Perfil em memória (profileNotifier), setState()HomePageUI mostra nome, avatar, etc.
6_preloadRoleCatalog() (sem await)HomePageDispara em background
7ensureFullCatalogLoaded()RoleCatalogService1 POST userGatewayHttp action USER_ROLES_AVAILABLE_LIST com fullCatalog: true (em background)
8setState(_isLoadingProfile = false)HomePageFim do loading do perfil

O preload do catálogo completo (7) não bloqueia a tela; quando termina, o cache "full" fica preenchido para uso no diálogo.


2. Usuário abre o diálogo de perfil

OrdemAçãoOndeHTTP / efeito
1Diálogo abre com widget.profileProfileDialogPerfil já vem da Home (em memória)
2_applyProfileState(widget.profile)ProfileDialogPreenche campos e estado local (síncrono)
3postFrameCallback disparaProfileDialog
4_loadChurchOptions() inicia (async)ProfileDialog
5_loadAvailableRoles() inicia (async)ProfileDialog

As duas cargas (igrejas e roles) rodam em paralelo.


3. _loadChurchOptions() (em paralelo com roles)

OrdemAçãoHTTP / efeito
1setState(_loadingChurchOptions = true)UI pode mostrar loading de igrejas
2await getSignupChurchOptions.execute()1 chamada (HTTP/use case) para lista de igrejas
3setState(_churchOptions = ...)Dropdown de igreja preenchido
4_loadAvailableRoles() chamado de novoVer fluxo de roles abaixo (pode ser segunda execução)
5setState(_loadingChurchOptions = false)

4. _loadAvailableRoles() (origem do atraso na aba “Perfil na EBD”)

OrdemAçãoHTTP / efeito
1setState(_loadingRoleCatalog = true)UI mostra "Carregando papéis habilitados..." na aba Perfil na EBD
2await ensureFullCatalogLoaded()0 ou 1 POST: 0 se o preload da Home já encheu o cache "full"; 1 se ainda não (action USER_ROLES_AVAILABLE_LIST, fullCatalog: true)
3await getAvailableRoleCatalog(unitId, requesterRole)1 POST USER_ROLES_AVAILABLE_LIST (lista eligível para unitId + requesterRole, ex.: Visitante/Membro)
4setState(_availableRoleCatalog = catalog, ...)Dropdown "Cargo desejado" e rótulos (incl. "Cargo atual") preenchidos
5setState(_loadingRoleCatalog = false)Fim do loading de roles

As duas chamadas (catálogo completo e lista eligível) rodam em paralelo (Future.wait), então o tempo de espera é o máximo dos dois, não a soma.

Observação: _loadAvailableRoles() pode ser chamada duas vezes (uma no postFrameCallback e outra ao terminar _loadChurchOptions()). A segunda execução reutiliza cache quando possível.


5. Onde está o atraso

  • Perfil: atraso só na Home até o primeiro loadProfile() terminar (um GET). O diálogo não faz nova carga de perfil; usa o que já está em memória.
  • Roles: o atraso visível é na aba “Perfil na EBD”:
    • Enquanto _loadingRoleCatalog == true aparece "Carregando papéis habilitados...".
    • Isso dura pelo menos: ensureFullCatalogLoaded() (se precisar de 1 POST) + getAvailableRoleCatalog() (1 POST), em série.
  • Para usuário Visitante ou Membro, o backend usa unitId e requesterRole (ex.: VISITOR ou MEMBER) para filtrar a lista eligível; o catálogo completo é usado para ter todos os rótulos (ex.: "Visitante", "Membro") em memória sem atraso depois que o cache está cheio.

6. Otimização aplicada

As duas cargas de roles no diálogo passam a rodar em paralelo:

  • ensureFullCatalogLoaded() e getAvailableRoleCatalog(unitId, requesterRole) são disparadas juntas (ex.: Future.wait ou equivalente).
  • A UI só sai de "Carregando papéis habilitados..." quando as duas tiverem terminado, mas o tempo de espera fica próximo do máximo dos dois tempos (em geral um único RTT de rede), em vez da soma dos dois.

Assim, o fluxo de carga do perfil continua o mesmo; o fluxo de roles no diálogo fica mais rápido e o atraso na tela diminui.