Skip to content

Padrão de Actions

As Actions são responsáveis por centralizar a lógica de execução técnica, comunicação externa e obtenção de dados (API, LocalStorage, Cookies, etc) em arquivos independentes e reutilizáveis.

Estrutura do Arquivo

  • Local: src/actions/
  • Sufixo: .action.ts
  • Nomenclatura: kebab-case (ex: get-profile.action.ts, get-local-token.action.ts)
  • Camada: Application (Agnóstica a funcionalidades específicas)

Exemplo de Implementação

Chamada de API

typescript
import { api } from "@/services/api";
import { User } from "@/types/user";

/**
 * Registra um novo usuário no sistema.
 */
export const registerUserAction = async (userData: Partial<User>): Promise<User> => {
    try {
        const response = await api.post<User>("/auth/register", userData);
        return response.data;
    } catch (error) {
        throw error;
    }
};

Ação de Recurso Local

typescript
/**
 * Obtém o token de sessão armazenado em cookie.
 */
export const getSessionTokenAction = (): string | null => {
    return CookieManager.get("session-token") ?? null;
};

Diretrizes de Uso

  1. Escopo Amplo: Lembre-se que uma Action não é apenas para APIs. Use-a para qualquer tarefa técnica que obtenha ou manipule dados fora da lógica de negócio pura (ex: ler cookies, storage, acessar instâncias de SDKs globais).
  2. Responsabilidade Única: Cada arquivo de ação deve focar em uma única operação ou um grupo muito pequeno de operações relacionadas.
  3. Independência de UI: Uma action nunca deve acessar componentes de UI, hooks de navegação ou estado local diretamente. Ela recebe parâmetros e retorna promessas. Isso inclui a proibição de exibir Toasts ou Alertas em caso de erro.
  4. Tipagem: Sempre defina os tipos de entrada e saída para garantir a segurança do TypeScript.
  5. Integração:
    • TanStack Query: As actions devem ser usadas como a queryFn ou mutationFn dentro dos hooks do TanStack Query.
    • Redux Saga: As actions devem ser chamadas via efeito call (ex: yield call(registerUserAction, payload)) para execução de lógica assíncrona dentro dos sagas.
  6. Propagação de Erros: Sempre use throw error no catch para que a camada superior (Hook do Query ou Saga) possa capturar e tratar a falha adequadamente.

Lista de Exemplos Sugeridos

  • get-list-user.action.ts
  • get-profile.action.ts
  • register-user.action.ts
  • logout.action.ts
  • update-profile.action.ts
  • delete-feed.action.ts