Camada de Funcionalidade (Feature Layer)
A Camada de Funcionalidade encapsula a lógica de negócio e o gerenciamento de dados de um domínio específico.
Exemplo Prático: TanStack Query e Sincronização de Estado
Imagine um cenário onde precisamos gerenciar uma lista de usuários que é compartilhada entre três componentes diferentes que não se conhecem.
1. O Data Hook (Coração da Feature)
Usamos o TanStack Query para garantir que todos os componentes usem a mesma instância de dados através de uma chave única (['users']).
typescript
// src/features/users/hooks/use-users-data.ts
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { getUsersAction, updateUserStatusAction } from '../../../actions/user-actions';
export function useUsersData() {
const queryClient = useQueryClient();
// Busca a lista única de usuários
const query = useQuery({
queryKey: ['users'],
queryFn: getUsersAction,
staleTime: 1000 * 60 * 5, // 5 minutos
});
// Mutação para atualizar status (Ativo/Inativo)
const mutation = useMutation({
mutationFn: updateUserStatusAction,
onSuccess: () => {
// O segredo: invalida a query e propaga a atualização para todos os ouvintes
queryClient.invalidateQueries({ queryKey: ['users'] });
},
});
return {
users: query.data ?? [],
isLoading: query.isLoading,
updateStatus: mutation.mutate,
};
}2. Componentes Consumidores (Desacoplados)
Embora os componentes abaixo estejam na Camada de Tela, a regra de filtragem e obtenção é provida pela Camada de Funcionalidade.
Componente A: Pacientes Ativos
typescript
// Parte de uma Screen ou Organismo
const ActiveUsersList = () => {
const { users } = useUsersData();
const activeUsers = users.filter(u => u.status === 'active');
return <List data={activeUsers} />;
};Componente B: Usuários Inativos
typescript
const InactiveUsersList = () => {
const { users } = useUsersData();
const inactiveUsers = users.filter(u => u.status === 'inactive');
return <List data={inactiveUsers} />;
};Componente C: Painel de Controle (Ações)
typescript
const UserControlPanel = ({ userId }) => {
const { updateStatus } = useUsersData();
return (
<Button onPress={() => updateStatus({ id: userId, status: 'active' })}>
Ativar Usuário
</Button>
);
};Por que isso é Camada de Funcionalidade?
- Compartilhamento Silencioso: Os componentes não precisam de props para se comunicar. Eles se sincronizam através da camada de dados.
- Propagação Automática: Quando o
Componente Cexecuta a ação, a lista emAeBé atualizada automaticamente pelo TanStack Query. - Regra de Domínio: A lógica de que um usuário tem um status "active" ou "inactive" é uma regra de negócio (Feature).