Skip to main content

Hooks - Crud

List Query with Infinite Scroll

function UserList() {
const { items: users, query } = userQueryManager.useList({
filters: { status: 'active' },
limit: 20,
staleTime: 5 * 60 * 1000
})

const {
data,
error,
isLoading,
isFetchingNextPage,
fetchNextPage,
hasNextPage
} = query

if (isLoading) return <div>Loading users...</div>
if (error) return <div>Error: {error.message}</div>

return (
<div>
{users.map(user => (
<UserCard key={user.id} user={user} />
))}

{hasNextPage && (
<button
onClick={() => fetchNextPage()}
disabled={isFetchingNextPage}
>
{isFetchingNextPage ? 'Loading more...' : 'Load More'}
</button>
)}
</div>
)
}

Retrieve Single Item

function UserProfile({ userId }: { userId: string }) {
const { item: user, query } = userQueryManager.useRetrieve(userId, {
enabled: !!userId,
staleTime: 10 * 60 * 1000
})

if (query.isLoading) return <div>Loading user...</div>
if (query.error) return <div>Error: {query.error.message}</div>
if (!user) return <div>User not found</div>

return (
<div>
<h1>{user.name}</h1>
<p>{user.email}</p>
<p>Status: {user.status}</p>
</div>
)
}

Create with Optimistic Updates

function CreateUserForm() {
const createMutation = userQueryManager.useCreate({
optimistic: true,
appendTo: 'start',
listFilters: { status: 'active' },
onSuccess: (user) => {
toast.success(`User ${user.name} created successfully!`)
},
onError: (error) => {
toast.error(`Failed to create user: ${error.message}`)
}
})

const handleSubmit = (formData: Partial<User>) => {
createMutation.mutate({
name: formData.name,
email: formData.email,
status: 'active'
})
}

return (
<form onSubmit={(e) => {
e.preventDefault()
const formData = new FormData(e.target as HTMLFormElement)
handleSubmit({
name: formData.get('name') as string,
email: formData.get('email') as string
})
}}>
<input name="name" placeholder="Name" required />
<input name="email" type="email" placeholder="Email" required />
<button
type="submit"
disabled={createMutation.isPending}
>
{createMutation.isPending ? 'Creating...' : 'Create User'}
</button>
</form>
)
}

Update with Optimistic Updates

function UserEditForm({ user }: { user: User }) {
const updateMutation = userQueryManager.useUpdate({
optimistic: true,
onSuccess: (updatedUser) => {
toast.success(`User ${updatedUser.name} updated successfully!`)
},
onError: (error) => {
toast.error(`Failed to update user: ${error.message}`)
}
})

const handleUpdate = (updates: Partial<User>) => {
updateMutation.mutate({
id: user.id,
...updates
})
}

return (
<div>
<button onClick={() => handleUpdate({ status: 'inactive' })}>
Deactivate User
</button>
<button onClick={() => handleUpdate({ name: 'New Name' })}>
Update Name
</button>
</div>
)
}

Delete with Optimistic Updates

function UserActions({ user }: { user: User }) {
const deleteMutation = userQueryManager.useDelete({
optimistic: true,
onSuccess: () => {
toast.success('User deleted successfully!')
},
onError: (error) => {
toast.error(`Failed to delete user: ${error.message}`)
}
})

const handleDelete = () => {
if (confirm('Are you sure you want to delete this user?')) {
deleteMutation.mutate(user.id)
}
}

return (
<button
onClick={handleDelete}
disabled={deleteMutation.isPending}
>
{deleteMutation.isPending ? 'Deleting...' : 'Delete User'}
</button>
)
}