Avisos e Comunicação
Última atualização: 15 de julho de 2026
Visão Geral
Esta é a parte da home mais equilibrada entre real e mock. Cortes de pedido e pesquisas pendentes são inteiramente mockados. Mural de comunicação e novidades da versão são reais, buscados da API. O painel de últimas mudanças de sincronização também é real, alimentado pelo mesmo mecanismo de sincronização já documentado em Sincronização Offline. E a avaliação de satisfação é só uma sequência de telas locais, sem envio para lugar nenhum.
Arquivos-chave
| Arquivo | Estado | Responsabilidade |
|---|---|---|
features/home/subscreens/order-cut-offs/home-order-cut-offs.controller.ts | Mock | Alertas de corte de pedido |
features/home/subscreens/pending-surveys/pending-survey-selection.controller.ts | Mock | Seleção de pesquisa pendente |
features/home/components/page/home-communication-section/home-communication-section-controller.ts | Real | Carrossel do mural de comunicação |
features/home/subscreens/news/home-news.controller.ts | Real | Histórico de versões/novidades |
features/home/hooks/use-sync-changes.ts | Real | Painel de últimas mudanças de sincronização |
features/home/home-controller.tsx | Local apenas | Fluxo de avaliação de satisfação |
Cortes de pedido: mock, incluindo as ações
A tela de cortes de pedido lista prazos e permite "finalizar" ou "lançar" uma venda, mas tudo isso opera sobre um array de registros de teste, e as ações só mudam estado local, sem chamar nenhum serviço:
// home-order-cut-offs.controller.ts
import { ORDER_CUT_OFFS_MOCK, type OrderCutOffRecord } from "./home-order-cut-offs.mock";
export function useHomeOrderCutOffsController() {
const [finalizedRecordIds, setFinalizedRecordIds] = React.useState<string[]>(() =>
ORDER_CUT_OFFS_MOCK.filter((record) => record.saleStatus === "finalized").map((record) => record.id),
);
// ...
return {
records: ORDER_CUT_OFFS_MOCK,
// ...
};
}
Marcar um pedido como finalizado nessa tela só adiciona o id numa lista local de finalizados, sem persistir nada, sem sincronizar com o fluxo de venda real documentado em Nova Venda.
Pesquisas pendentes: mesma situação
// pending-survey-selection.controller.ts
import { PENDING_SURVEYS_MOCK } from "./pending-surveys.mock";
// ...
surveys: PENDING_SURVEYS_MOCK,
Não existe integração com um serviço de pesquisas real, a lista de pesquisas "pendentes" é sempre a mesma.
Mural de comunicação: real
O carrossel do mural busca publicações de fato do backend, via React Query:
// home-communication-section-controller.ts
const activePublicationsQuery = useAppQuery<Publication[]>({
queryKey: ["home-communication", "active-publications"],
queryFn: () =>
publicationService.fetchPublicationsRemote({ page: 0, size: HOME_COMMUNICATION_PAGE_SIZE }),
enabled: Boolean(authContexts?.token),
staleTime: 0,
refetchOnMount: false,
});
Novidades da versão: real
O histórico de novidades busca versões reais do serviço correspondente, também via React Query:
// home-news.controller.ts
const { data: versions = [] } = useAppQuery<Version[]>({
queryKey: ["versions", "home-news"],
queryFn: () => versionService.fetchRemote({ page: 0, size: 100 }),
});
O painel de últimas mudanças de sincronização é real, com um detalhe
Esse painel mostra produtos que entraram em promoção, tiveram preço alterado ou entrada de estoque na última sincronização. O hook que alimenta ele lê dados genuínos, persistidos durante a sincronização já documentada em Sincronização Completa vs Incremental:
// use-sync-changes.ts
import { getChanges } from "@/storage/sync-changes/sync-changes.storage";
import { getAllLastUpdatedAt } from "@/storage/sync/sync.storage";
export function useSyncChanges() {
const [items, setItems] = useState<LastSyncChangeItem[]>(() => getChanges());
const [periodLabel, setPeriodLabel] = useState<string>(getMostRecentSyncLabel);
useEffect(() => subscribeStorageKey("sync-changes:items", () => setItems(getChanges())), []);
useEffect(() => subscribeStorageKey("sync:lastUpdatedAt", () => setPeriodLabel(getMostRecentSyncLabel())), []);
return { items, periodLabel };
}
O detalhe é que o arquivo que fornece o tipo desses itens (home-last-sync-changes.mock.ts, um nome de arquivo de mock) também exporta um array de exemplo inteiro, LAST_SYNC_CHANGE_ITEMS, construído a partir de produtos de teste. Esse array não é importado em lugar nenhum além do próprio arquivo onde é definido, é código morto que sobrou de antes da integração real existir. O que de fato é usado desse arquivo pela home é só o tipo LastSyncChangeItem e uma constante de rótulo, LAST_SYNC_PERIOD_LABEL, usada como texto de reserva apenas enquanto nenhuma sincronização real ainda aconteceu:
// home-controller.tsx
const { items: lastSyncChangeItems, periodLabel: dynamicPeriodLabel } = useSyncChanges();
const lastSyncPeriodLabel = dynamicPeriodLabel || LAST_SYNC_PERIOD_LABEL;
Avaliação de satisfação: sem envio
O fluxo de avaliar a satisfação com o app (escolher um "mood", escrever um motivo, ver uma tela de sucesso) é real na navegação entre telas, mas termina sem chamar nenhum serviço:
// home-controller.tsx
const handleSubmitFeedbackReason = useCallback(() => {
setIsSatisfactionModalOpen(false);
setIsFeedbackSuccessModalOpen(true);
}, []);
A "submissão" é só a troca de qual modal está visível. Não existe, hoje, nenhuma chamada de API enviando essa avaliação para algum lugar.
Armadilhas conhecidas
Ao decidir se um pedaço da home está pronto para um teste ponta a ponta, confira se ele consulta um serviço de verdade (mural, novidades, mudanças de sincronização) ou se opera só sobre um array de mock local (cortes de pedido, pesquisas pendentes, avaliação de satisfação). O nome de um arquivo terminando em .mock.ts não significa que tudo que ele exporta seja mock ativo, home-last-sync-changes.mock.ts é o exemplo mais direto disso: mistura um tipo e uma constante de fallback realmente usados com um array de exemplo morto.