Loja / Gestão Operacional — Visão Geral
Última atualização: 16 de julho de 2026
O que é este fluxo
A tab "Loja" do app não é uma vitrine de produtos, é a tela de perfil do vendedor. app/(tabs)/loja.tsx apenas renderiza StoreProfileScreen, cujo próprio cabeçalho exibe o título "Perfil". A partir dela, um menu dá acesso a um conjunto de sub-telas operacionais como controle de inventário, gestão de aprovações, atualizações de dados, notificações, sugestões de feedback, repositório de vendas salvas e gerenciamento da tela inicial. Cada uma dessas sub-telas é documentada em seu próprio arquivo neste fluxo.
Arquivos-chave
| Arquivo | Responsabilidade |
|---|---|
app/(tabs)/loja.tsx | Rota da tab, só delega para StoreProfileScreen |
features/store/store-profile.tsx | Tela de perfil e menu de navegação |
features/store/store-profile.controller.ts | Estado, dados do usuário, foto de perfil, flags de menu, modo dev |
storage/organization/organization.storage.ts | Contexto de organização selecionada (já documentado em Sincronização Offline) |
services/profile-image/profile-image.service.instance.ts | Upload/remoção da foto de perfil |
O que é real e o que é hardcoded no perfil
| Dado exibido | Origem | Real ou hardcoded |
|---|---|---|
| Nome e email | useUser() | Real, parte do fluxo de autenticação |
| Cargo "Vendedor" | const PROFILE_ROLE = "Vendedor"; | Hardcoded pra todo usuário, sem distinção de papel |
| Foto de perfil | fetchProfileImageDataUri / profileImageService | Real, upload e remoção de fato chamam a API |
| Organização atual e lista de organizações | storage/organization/organization.storage.ts (MMKV) | Real |
| "Saldo Flex" e "Provisão de Acréscimo" | SUMMARY_FLEX = "R$ 0,00" e `SUMMARY_PROVISION = "R$ 0,00 | 00/00/0000"` |
| Versão do app | lida de package.json | Real, valor de build |
Trocar de organização pelo perfil segue o mesmo caminho já documentado no fluxo de sincronização: grava a nova organização selecionada no storage, chama reset() e depois startSyncAll(organizationId) do useSync(), disparando uma resincronização completa.
O menu é inteiramente controlado por flags de configuração
Cada item do menu só aparece se a flag correspondente, lida via useSettings(), estiver ativa. Não existe nenhuma tela nova aqui, é a mesma lógica de feature flag já usada em outros fluxos do app:
| Item do menu | Rota | Flag | Padrão |
|---|---|---|---|
| Sugestões | /loja/sugestoes | cfg-ativarsugestoes | Desligado |
| Atualizações | /loja/atualizacoes | cfg-ativaratualizacoes | Ligado |
| Gerenciar Tela Inicial | /loja/gerenciar-tela-inicial | cfg-ativargerenciamentodetelainicial | Ligado |
| Controle de Inventário | /loja/controle-inventario | cfg-ativarcontroledeinventario | Desligado |
| Central de Notificações | /loja/notificacoes | cfg-ativarcentraldenotificacoes | Desligado |
| Gestão de Aprovações (atalho no topo do card) | /loja/gestao-aprovacoes | cfg-ativargestaodeaprovacoes | Desligado |
| Troca de organização | abre bottom sheet | cfg-ativartrocadeorganizacao | Ligado |
| Modo Dev | oculto até desbloquear | cfg-ativarmododev | Desligado |
Dois itens aparecem comentados diretamente no array menuItems de store-profile.controller.ts, sem chegar a ser renderizados: "Configurações do Perfil" (troca de senha) e "Contactar Central" (WhatsApp, controlado por cfg-ativarcontactarcentral, que por sua vez está com valor padrão ligado apesar da UI estar desativada). São indícios de funcionalidades planejadas e depois pausadas, não código morto para remover sem verificar antes com o time.
O modo dev e uma nota de segurança
Tocar dez vezes seguidas no item "Versão" abre um bottom sheet pedindo uma senha. Se o valor digitado bater com uma constante fixa no código, o modo dev é ativado e um painel avançado é liberado para editar qualquer parâmetro persistido em settings.service.ts:
// store-profile.controller.ts
const handleSubmitDevPassword = useCallback(
(password: string) => {
if (password.trim() !== "191543") {
setDevModePasswordError("Senha inválida. Verifique o código de acesso.");
return;
}
settings.update("cfg-ativarmododev", "S");
// ...
},
[settings, toast],
);
Essa senha fica em texto puro dentro do bundle JavaScript do app, então qualquer pessoa capaz de fazer engenharia reversa do APK/IPA consegue extraí-la e habilitar o modo dev em qualquer instalação. Vale registrar isso como ponto de atenção de segurança, já que o painel liberado por ela permite editar parâmetros de configuração do app diretamente no dispositivo.
Armadilhas conhecidas
A maior parte das sub-telas acessíveis por este menu é protótipo de UI sem integração real, conforme detalhado em cada documento específico: controle de inventário, gestão de aprovações, notificações, sugestões e repositório são 100% mock. Atualizações e gerenciar tela inicial, ao contrário, são funcionais de ponta a ponta. Antes de assumir que uma ação nesta área realmente persiste ou envia algo, confira o documento da sub-tela específica.