CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-strapi--helper-plugin

Helper library for Strapi plugins development providing React components, hooks, utilities, and TypeScript types for building plugin interfaces

Pending
Overview
Eval results
Files

hooks.mddocs/

Hooks

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.

API & HTTP Client Hooks

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);
  }
};

Permission & RBAC Hooks

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
}

State Management Hooks

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();
  }
});

URL & Query Parameter Hooks

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');

Data Filtering & Processing

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)
);

UI Interaction Hooks

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');
  }
};

Implementation Notes

useFetchClient

  • Automatically handles request cancellation on component unmount
  • Returns a configured axios instance with authentication headers
  • Supports all HTTP methods with TypeScript generics for response types

useRBAC

  • Checks permissions against the user's current roles and permissions
  • Supports conditional permissions that require API validation
  • Returns loading state during permission checks
  • Automatically prefixes action names with "can" in the returned object

useSelectionState

  • Generic hook that works with any object type
  • Uses provided keys to determine item equality
  • Supports single, multiple, and bulk selection operations
  • Immutable state updates for optimal React performance

useQueryParams

  • Integrates with React Router for browser history management
  • Supports typed query parameters with TypeScript generics
  • Handles parameter encoding/decoding automatically
  • Supports both adding and removing parameters

Performance Considerations

  • All hooks use React.useMemo and React.useCallback for optimization
  • useRBAC uses React Query for permission caching
  • usePersistentState debounces localStorage writes
  • useCollator caches collator instances for performance

Error Handling

  • useFetchClient automatically cancels requests on unmount
  • useAPIErrorHandler provides consistent error message formatting
  • useClipboard gracefully handles clipboard API failures
  • All hooks include proper cleanup in useEffect return functions

Install with Tessl CLI

npx tessl i tessl/npm-strapi--helper-plugin

docs

content-manager.md

features.md

hooks.md

index.md

types.md

ui-components.md

utilities.md

tile.json