API Reference
API Reference
Complete reference for all better-admin APIs, including providers, hooks, and utilities.
Authentication Provider
createAuthProvider
Creates an authentication provider that integrates better-auth with better-admin.
function createAuthProvider(
options: AuthProviderOptions
): AuthProviderParameters:
options.authClient(required) - The better-auth client instanceoptions.onError(optional) - Error handler function(error: Error) => void
Returns: AuthProvider
Example:
import { createAuthProvider } from "better-admin";
import { authClient } from "./auth-client";
const authProvider = createAuthProvider({
authClient,
onError: (error) => {
console.error("Auth error:", error);
},
});AuthProvider Interface
interface AuthProvider {
login: (params: { email: string; password: string }) => Promise<void>;
logout: () => Promise<void>;
checkAuth: () => Promise<void>;
checkError: (error: any) => Promise<void>;
getIdentity: () => Promise<User | null>;
getPermissions?: () => Promise<any>;
}Methods:
login- Authenticate a user with email and passwordlogout- Sign out the current usercheckAuth- Verify if the user is authenticatedcheckError- Handle API errors (401, 403)getIdentity- Get the current user's identitygetPermissions- Get the current user's permissions
useBetterAuth
React hook to access authentication state.
function useBetterAuth(authClient: any): {
user: User | null;
isLoading: boolean;
error: Error | null;
signIn: Function;
signOut: Function;
signUp: Function;
}Parameters:
authClient(required) - The better-auth client instance
Returns:
user- Current authenticated user or nullisLoading- Loading stateerror- Error object if anysignIn- Function to sign insignOut- Function to sign outsignUp- Function to sign up
Example:
import { useBetterAuth } from "better-admin";
import { authClient } from "./auth-client";
function MyComponent() {
const { user, isLoading, signOut } = useBetterAuth(authClient);
if (isLoading) return <div>Loading...</div>;
return (
<div>
<p>Welcome {user?.name}</p>
<button onClick={() => signOut()}>Sign Out</button>
</div>
);
}Data Provider
createQueryProvider
Creates a data provider that integrates better-query with better-admin.
function createQueryProvider(
options: DataProviderOptions
): DataProviderParameters:
options.queryClient(required) - The better-query instanceoptions.onError(optional) - Error handler function(error: Error) => void
Returns: DataProvider
Example:
import { createQueryProvider } from "better-admin";
import { query } from "./query";
const dataProvider = createQueryProvider({
queryClient: query,
onError: (error) => {
console.error("Data error:", error);
},
});DataProvider Interface
interface DataProvider {
getList: <T>(resource: string, params: ListParams) => Promise<ListResult<T>>;
getOne: <T>(resource: string, params: GetOneParams) => Promise<T>;
getMany: <T>(resource: string, params: GetManyParams) => Promise<T[]>;
create: <T>(resource: string, params: CreateParams<T>) => Promise<T>;
update: <T>(resource: string, params: UpdateParams<T>) => Promise<T>;
delete: <T>(resource: string, params: DeleteParams) => Promise<T>;
deleteMany: (resource: string, params: DeleteManyParams) => Promise<void>;
}Methods:
getList- Get a paginated list of resourcesgetOne- Get a single resource by IDgetMany- Get multiple resources by IDscreate- Create a new resourceupdate- Update an existing resourcedelete- Delete a resourcedeleteMany- Delete multiple resources
ListParams
interface ListParams {
pagination?: {
page: number;
perPage: number;
};
sort?: {
field: string;
order: "ASC" | "DESC";
};
filter?: Record<string, any>;
}useQuery
React hook to use better-query operations.
function useQuery(resource: string, queryClient: any): {
list: (params?: any) => UseQueryResult;
get: (params: any) => UseQueryResult;
create: () => UseMutationResult;
update: () => UseMutationResult;
remove: () => UseMutationResult;
count: (params?: any) => UseQueryResult;
}Parameters:
resource(required) - The resource name (e.g., "user", "post")queryClient(required) - The better-query instance
Returns:
list- Query hook for listing resourcesget- Query hook for getting a single resourcecreate- Mutation hook for creating resourcesupdate- Mutation hook for updating resourcesremove- Mutation hook for deleting resourcescount- Query hook for counting resources
Example:
import { useQuery } from "better-admin";
import { query } from "./query";
function UsersList() {
const { list, remove } = useQuery("user", query);
const { data, isLoading } = list.useQuery();
const handleDelete = async (id: string) => {
await remove.mutateAsync({ where: { id } });
};
return (
<div>
{data?.map(user => (
<div key={user.id}>
{user.name}
<button onClick={() => handleDelete(user.id)}>Delete</button>
</div>
))}
</div>
);
}Type Definitions
User
interface User {
id: string;
email?: string;
name?: string;
image?: string;
[key: string]: any;
}ListResult
interface ListResult<T = any> {
data: T[];
total: number;
}CreateParams
interface CreateParams<T = any> {
data: T;
}UpdateParams
interface UpdateParams<T = any> {
id: string | number;
data: T;
previousData?: T;
}DeleteParams
interface DeleteParams {
id: string | number;
previousData?: any;
}Error Handling
All providers support error handling through the onError callback:
const provider = createAuthProvider({
authClient,
onError: (error) => {
// Custom error handling
console.error(error);
toast.error(error.message);
analytics.track("error", { message: error.message });
},
});TypeScript Support
All APIs are fully typed with TypeScript. When using with TypeScript, you get:
- Full type inference from schemas
- Autocomplete for all methods
- Type-safe parameters and return values
- Compile-time error checking
Example:
interface UserSchema {
id: string;
name: string;
email: string;
role: "admin" | "user";
}
const { list } = useQuery("user", query);
const { data } = list.useQuery();
// data is inferred as UserSchema[]Best Practices
- Single Provider Instance: Create provider instances once and reuse them
- Error Handling: Always provide
onErrorhandlers - Type Safety: Use TypeScript for full type inference
- Resource Names: Use consistent resource naming across your app
- Permissions: Define permissions at the resource level in better-query
Migration from react-admin
Better Admin providers are designed to be compatible with react-admin patterns:
// react-admin
import { AuthProvider } from "ra-core";
import simpleRestProvider from "ra-data-simple-rest";
// better-admin
import { createAuthProvider, createQueryProvider } from "better-admin";See the Migration Guide for complete migration instructions.
Next Steps
- Quick Start - Get started quickly
- Auth Provider Guide - Detailed authentication guide
- Data Provider Guide - Detailed data operations guide