Custom Actions, Filters and Optimistic Operations
Custom Actions
You can define domain-specific actions:
const usersManager = new QueryManager<User>({
// ... basic configurations
actions: {
// Action to activate user
async activate(manager, userId: number) {
await api.post(`/users/${userId}/activate/`)
// Update item in cache
await manager.refreshItem(userId)
// Can update other related managers
notificationsManager.refresh()
},
// Action to send email
async sendEmail(manager, userId: number, message: string) {
await api.post(`/users/${userId}/send-email/`, { message })
return 'Email sent successfully'
},
},
})
// Using actions
function UserCard({ user }: { user: User }) {
const { activate, sendEmail } = usersManager.actions
const handleActivate = () => {
activate(user.id)
}
const handleSendEmail = async () => {
const result = await sendEmail(user.id, 'Hello!')
alert(result)
}
return (
<div>
<h3>{user.name}</h3>
<button onClick={handleActivate}>Activate</button>
<button onClick={handleSendEmail}>Send Email</button>
</div>
)
}
Filters and Metadata
// Using filters
const { items } = usersManager.useList({
filter: {
status: 'active',
role: 'admin',
search: 'john',
},
})
// Custom metadata
const usersManager = new QueryManager<User, FilterArgs, UserMeta>({
// ... configurations
initialMeta: {
totalActiveUsers: 0,
lastSync: new Date(),
},
})
// Updating metadata
usersManager.setOptions({
meta: {
totalActiveUsers: 150,
},
})
Optimistic Operations
Optimistic operations show changes in the UI before server confirmation:
// Global configuration in manager
const usersManager = new QueryManager<User>({
// ... other configurations
creation: {
optimistic: true,
appendTo: 'start', // Add to beginning of list
},
update: {
optimistic: true,
},
deletion: {
optimistic: true,
},
})
// Or per individual operation
const { create } = usersManager.useCreate({
optimistic: true,
appendTo: 'end', // Overrides global configuration
})