Pular para o conteúdo principal

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

ArquivoEstadoResponsabilidade
features/home/subscreens/order-cut-offs/home-order-cut-offs.controller.tsMockAlertas de corte de pedido
features/home/subscreens/pending-surveys/pending-survey-selection.controller.tsMockSeleção de pesquisa pendente
features/home/components/page/home-communication-section/home-communication-section-controller.tsRealCarrossel do mural de comunicação
features/home/subscreens/news/home-news.controller.tsRealHistórico de versões/novidades
features/home/hooks/use-sync-changes.tsRealPainel de últimas mudanças de sincronização
features/home/home-controller.tsxLocal apenasFluxo 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.