Helper library for Strapi plugins development providing React components, hooks, utilities, and TypeScript types for building plugin interfaces
—
The @strapi/helper-plugin package provides 15 React hooks that encapsulate common plugin functionality including API communication, state management, permissions checking, and user interactions. These hooks follow React best practices and provide consistent interfaces for plugin development.
Hooks for making HTTP requests and handling API communication with authentication and error handling.
// HTTP client hook with abort signal support
interface FetchClientReturn {
get: <TData = any>(url: string, config?: any) => Promise<TData>;
post: <TData = any, TResponse = any>(url: string, data?: any, config?: any) => Promise<TResponse>;
put: <TData = any>(url: string, data?: any, config?: any) => Promise<TData>;
del: <TData = any>(url: string, config?: any) => Promise<TData>;
}
function useFetchClient(): FetchClientReturn;
// API error handler hook
interface APIErrorHandlerReturn {
(error: any): void;
}
function useAPIErrorHandler(formatMessage?: (descriptor: any) => string): APIErrorHandlerReturn;Usage Examples:
// HTTP client with automatic abort on unmount
const { get, post, put, del } = useFetchClient();
const fetchArticles = async () => {
const response = await get('/api/articles');
return response;
};
// API error handling
const handleAPIError = useAPIErrorHandler();
const saveArticle = async (data) => {
try {
await post('/api/articles', data);
} catch (error) {
handleAPIError(error);
}
};Hooks for managing role-based access control and checking user permissions.
// Role-based access control hook
interface Permission {
action: string;
subject: string;
conditions?: any[];
}
interface AllowedActions {
[key: string]: boolean;
}
interface RBACReturn {
allowedActions: AllowedActions;
isLoading: boolean;
setIsLoading: () => void;
}
function useRBAC(
permissionsToCheck?: Record<string, Permission[]>,
passedPermissions?: Permission[]
): RBACReturn;Usage Examples:
// Check permissions for multiple actions
const { allowedActions, isLoading } = useRBAC({
create: [{ action: 'create', subject: 'plugin::my-plugin.entity' }],
read: [{ action: 'read', subject: 'plugin::my-plugin.entity' }],
update: [{ action: 'update', subject: 'plugin::my-plugin.entity' }],
delete: [{ action: 'delete', subject: 'plugin::my-plugin.entity' }]
});
// Use the permissions
if (allowedActions.canCreate) {
// Show create button
}Hooks for managing component state, selections, and persistent data.
// Selection state management hook
interface SelectionActions<TValues> {
selectOne: (selection: TValues) => void;
selectAll: (nextSelections: TValues[]) => void;
selectOnly: (nextSelection: TValues) => void;
selectMultiple: (nextSelections: TValues[]) => void;
deselectMultiple: (nextSelections: TValues[]) => void;
setSelections: (selections: TValues[]) => void;
}
function useSelectionState<TValues extends object>(
keys: Array<keyof TValues>,
initialValue: TValues[]
): readonly [TValues[], SelectionActions<TValues>];
// Persistent state hook with localStorage
function usePersistentState<T>(
key: string,
initialValue: T
): readonly [T, (value: T | ((prev: T) => T)) => void];
// Callback ref hook
function useCallbackRef<T extends HTMLElement>(
callback: (element: T | null) => void
): React.RefCallback<T>;Usage Examples:
// Multiple selection management
const [selections, { selectOne, selectAll, deselectMultiple }] = useSelectionState(
['id'],
[]
);
// Persistent state across sessions
const [preferences, setPreferences] = usePersistentState('plugin-preferences', {
theme: 'light',
language: 'en'
});
// Callback ref for element access
const elementRef = useCallbackRef<HTMLDivElement>((element) => {
if (element) {
element.focus();
}
});Hooks for managing URL state and query parameters with browser history integration.
// Query parameter management hook
interface QueryResult<TQuery> {
query: TQuery;
rawQuery: string;
}
function useQueryParams<TQuery extends object>(
initialParams?: TQuery
): readonly [
QueryResult<TQuery>,
(nextParams: TQuery, method?: 'push' | 'remove') => void
];
// Simple query hook for URL parameters
function useQuery(): URLSearchParams;Usage Examples:
// Manage complex query parameters
const [{ query }, setQuery] = useQueryParams({
page: 1,
pageSize: 20,
sort: 'name:asc'
});
// Update URL parameters
const handlePageChange = (page: number) => {
setQuery({ ...query, page });
};
// Remove parameters
const clearFilters = () => {
setQuery({ filters: undefined }, 'remove');
};
// Simple query access
const searchParams = useQuery();
const searchTerm = searchParams.get('search');Hooks for filtering, collating, and processing data.
// Data filtering hook
interface FilterReturn<TData> {
filteredData: TData[];
filters: Record<string, any>;
setFilters: (filters: Record<string, any>) => void;
resetFilters: () => void;
}
function useFilter<TData>(
data: TData[],
initialFilters?: Record<string, any>
): FilterReturn<TData>;
// Internationalized string collation hook
interface CollatorOptions extends Intl.CollatorOptions {
locale?: string;
}
function useCollator(
locale?: string,
options?: CollatorOptions
): Intl.Collator;Usage Examples:
// Filter data with multiple criteria
const { filteredData, filters, setFilters } = useFilter(articles, {
status: 'published'
});
const handleStatusFilter = (status: string) => {
setFilters({ ...filters, status });
};
// Internationalized string comparison
const collator = useCollator('en', {
numeric: true,
sensitivity: 'base'
});
const sortedItems = items.sort((a, b) =>
collator.compare(a.name, b.name)
);Hooks for managing UI interactions, focus, and user interface behaviors.
// Input field focus management hook
function useFocusInputField(shouldFocus?: boolean): React.RefObject<HTMLInputElement>;
// Focus management on navigation hook
function useFocusWhenNavigate(): React.RefObject<HTMLElement>;
// Scroll locking hook for modals/overlays
function useLockScroll(shouldLock?: boolean): void;
// Clipboard operations hook
interface ClipboardReturn {
copy: (value: string | number) => Promise<boolean>;
}
function useClipboard(): ClipboardReturn;Usage Examples:
// Auto-focus input field
const inputRef = useFocusInputField(isModalOpen);
<input ref={inputRef} />
// Focus on navigation
const mainRef = useFocusWhenNavigate();
<main ref={mainRef}>
{/* Content */}
</main>
// Lock scroll when modal is open
useLockScroll(isModalOpen);
// Clipboard functionality
const { copy } = useClipboard();
const handleCopy = async () => {
const success = await copy(textToCopy);
if (success) {
showNotification('Copied to clipboard');
}
};Install with Tessl CLI
npx tessl i tessl/npm-strapi--helper-plugin