Cliente de API
O Cliente de API do Igniter fornece uma maneira perfeita de interagir com sua API backend a partir de suas aplicações frontend. Ele oferece segurança total de tipos, tratamento automático de erros e integração com hooks populares do React para busca de dados e mutações.
Configurando o Cliente de API
O primeiro passo é criar seu cliente de API conectando-o ao seu roteador Igniter:
// src/igniter.client.ts
import { createIgniterClient, useIgniterQueryClient } from '@igniter-js/core/client';
import { AppRouter } from './igniter.router';
/**
* Client for Igniter
*
* This client is used to fetch data on the client-side
* It uses the createIgniterClient function to create a client instance
*/
export const api = createIgniterClient(AppRouter);
/**
* Query client for Igniter
*
* This client provides access to the Igniter query functions
* and handles data fetching with respect to the application router.
* It will enable the necessary hooks for query management.
*/
export const useQueryClient = useIgniterQueryClient<typeof AppRouter>;
Integrando com React
Para usar o cliente de API em sua aplicação React, envolva seu aplicativo com o provedor Igniter:
// app/providers.tsx
import { IgniterProvider } from '@igniter-js/core/client'
export function Providers({ children }: { children: React.ReactNode }) {
return (
<IgniterProvider>
{children}
</IgniterProvider>
)
}
Fazendo Chamadas de API
Usando Queries (Requisições GET)
O hook useQuery fornece uma maneira poderosa de buscar dados com cache automático e revalidação:
import { api } from '@/igniter.client'
function UsersList() {
const { data: users, loading, error, refetch } = api.users.list.useQuery({
// Optional configuration
initialData: [], // Initial data while loading
staleTime: 1000 * 60, // Data stays fresh for 1 minute
refetchInterval: 1000 * 30, // Refetch every 30 seconds
refetchOnWindowFocus: true, // Refetch when window regains focus
refetchOnMount: true, // Refetch when component mounts
refetchOnReconnect: true, // Refetch when reconnecting
onLoading: (isLoading) => console.log('Loading:', isLoading),
onRequest: (response) => console.log('Data received:', response)
})
if (loading) return <div>Loading...</div>
if (error) return <div>Error: {error.message}</div>
return (
<div>
<button onClick={() => refetch()}>Refresh</button>
{users.map(user => (
<div key={user.id}>{user.name}</div>
))}
</div>
)
}
Usando Mutations (Requisições POST, PUT, DELETE)
O hook useMutation lida com modificações de dados com estados de carregamento e tratamento de erros:
function CreateUserForm() {
const { mutate, loading, error } = api.users.create.useMutation({
// Optional configuration
defaultValues: { name: '', email: '' },
onLoading: (isLoading) => console.log('Loading:', isLoading),
onRequest: (response) => console.log('Created user:', response)
})
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
try {
await mutate({
body: {
name: 'John Doe',
email: '[email protected]'
}
})
// Handle success
} catch (error) {
// Handle error
}
}
return (
<form onSubmit={handleSubmit}>
{/* Form fields */}
<button type="submit" disabled={loading}>
{loading ? 'Creating...' : 'Create User'}
</button>
{error && <div>Error: {error.message}</div>}
</form>
)
}
Gerenciando Cache
Você pode invalidar queries manualmente ou automaticamente após mutações:
function AdminPanel() {
const queryClient = useQueryClient()
// Invalidate specific queries
const invalidateUsers = () => {
queryClient.invalidate('users.list')
}
// Invalidate multiple queries
const invalidateAll = () => {
queryClient.invalidate([
'users.list',
'users.get'
])
}
return (
<button onClick={invalidateUsers}>
Refresh Users
</button>
)
}
Segurança de Tipos
O Cliente de API do Igniter fornece inferência completa de tipos para sua API:
// All these types are automatically inferred
import { InferOutput, InferInput } from '@igniter-js/core/client'
type User = InferOutput<typeof api.users.get>
type CreateUserInput = InferInput<typeof api.users.create>
// TypeScript will show errors for invalid inputs
api.users.create.useMutation({
onRequest: (data) => {
data.id // ✅ Typed as string
data.invalid // ❌ TypeScript error
}
})
Uso no Lado do Servidor
Integração com o App Router do Next.js
Você pode usar chamadas diretas ao servidor com Componentes de Servidor React:
// app/users/page.tsx
import { api } from '@/igniter.client'
export default async function UsersPage() {
const users = await api.users.list.call()
return (
<div>
{users.map(user => (
<div key={user.id}>{user.name}</div>
))}
</div>
)
}
Ações do Servidor
// app/users/actions.ts
'use server'
import { api } from '@/igniter.client'
export async function createUser(formData: FormData) {
const name = formData.get('name') as string
const email = formData.get('email') as string
return api.users.create.call({
body: { name, email }
})
}
// app/users/create-form.tsx
export function CreateUserForm() {
return (
<form action={createUser}>
<input name="name" />
<input name="email" type="email" />
<button type="submit">Create User</button>
</form>
)
}
Tratamento de Erros
O cliente de API fornece recursos robustos de tratamento de erros:
function UserProfile() {
const { data, error, retry } = api.users.get.useQuery({
onError: (error) => {
console.error('Failed to fetch user:', error)
},
retry: 3, // Retry failed requests
retryDelay: 1000, // Wait 1 second between retries
})
if (error) {
return (
<div>
Error loading profile
<button onClick={retry}>Try Again</button>
</div>
)
}
return <div>{/* User profile content */}</div>
}
Testes
O cliente de API pode ser usado em testes para verificar a funcionalidade da sua API:
import { api } from '@/igniter.client'
describe('User API', () => {
it('should create a user', async () => {
const result = await api.users.create.call({
body: {
name: 'Test User',
email: '[email protected]'
}
})
expect(result.status).toBe(201)
expect(result.data).toHaveProperty('id')
})
})
Ao usar o Cliente de API do Igniter, você obtém uma maneira totalmente segura em termos de tipos para interagir com sua API backend, com suporte integrado para cache, tratamento de erros e integração com React.
Quer desenvolver um SaaS em um final de semana?
Um único comando no terminal e pronto, você já tem seu projeto criado, com site, blog, central de ajuda, autenticação, onboarding, dashboard, emails... Para resumir, é assim que eu crio os meus SaaS em um Final de Semana.
Conheça minha estratégia