MDK Logo

UI hooks

Hooks for application state, permissions, and UI patterns

@mdk/foundation

Hooks for managing application state, user permissions, notifications, and common UI patterns.

Prerequisites

Import

import {
  useNotification,
  useHasPerms,
  useCheckPerm,
  useHeaderControls,
  useLocalStorage,
  usePagination,
  useIsFeatureEditingEnabled,
} from '@mdk/foundation'

useNotification

@mdk/foundation

Show toast notifications with Redux integration. Supports success, error, info, and warning variants.

import { useNotification } from '@mdk/foundation'

Returns

MethodTypeDescription
notifySuccessfunctionShow success toast
notifyErrorfunctionShow error toast
notifyInfofunctionShow info toast
notifyWarningfunctionShow warning toast

Method signature

notifySuccess(message: string, description?: string, options?: NotificationOptions)

Options

OptionTypeDefaultDescription
durationnumber3000Duration in milliseconds (0 = no autoclose)
positionToastPosition'top-left'Toast position on screen
dontClosebooleanfalsePrevent autoclose

Example

function SaveButton() {
  const { notifySuccess, notifyError } = useNotification()

  const handleSave = async () => {
    try {
      await saveData()
      notifySuccess('Saved', 'Your changes have been saved.')
    } catch (error) {
      notifyError('Error', 'Failed to save changes.', { dontClose: true })
    }
  }

  return <Button onClick={handleSave}>Save</Button>
}

useHasPerms

@mdk/foundation

Check user permissions with a flexible API. Returns a function that accepts various permission formats.

import { useHasPerms } from '@mdk/foundation'

Returns

TypeDescription
(req: PermissionRequest) => booleanFunction to check permissions

PermissionRequest formats

FormatExampleDescription
String'users:read'Check single permission
Array['users:write', 'users:read']Check first permission in array
Object{ perm: 'users:write' }Check permission property
Object{ write: true }Check write capability
Object{ cap: 'admin' }Check capability

Example

function UserActions() {
  const hasPerms = useHasPerms()

  return (
    <div>
      {hasPerms('users:read') && <UserList />}
      {hasPerms({ write: true }) && <CreateButton />}
      {hasPerms({ cap: 'admin' }) && <AdminPanel />}
    </div>
  )
}

useCheckPerm

@mdk/foundation

Check a specific permission. Simpler API than useHasPerms for single permission checks.

import { useCheckPerm } from '@mdk/foundation'

Parameters

ParameterTypeDescription
permstringPermission string to check (e.g., 'users:read')
writebooleanWhether write access is required
capstringCapability to check (e.g., 'admin')

Returns

TypeDescription
booleantrue if user has the permission

Example

function UserManagement() {
  const canRead = useCheckPerm({ perm: 'users:read' })
  const canWrite = useCheckPerm({ write: true })
  const isAdmin = useCheckPerm({ cap: 'admin' })

  return (
    <div>
      {canRead && <UserList />}
      {canWrite && <CreateButton />}
      {isAdmin && <AdminPanel />}
    </div>
  )
}

useHeaderControls

@mdk/foundation

Manage header visibility preferences with localStorage persistence and notifications.

import { useHeaderControls } from '@mdk/foundation'

Returns

PropertyTypeDescription
preferencesHeaderPreferencesCurrent visibility state for each header item
isLoadingbooleanLoading state
errorError | nullError state
handleTogglefunctionToggle a header item visibility
handleResetfunctionReset to default preferences

Example

function HeaderSettings() {
  const { preferences, handleToggle, handleReset } = useHeaderControls()

  return (
    <div>
      {Object.entries(preferences).map(([key, visible]) => (
        <Toggle
          key={key}
          label={key}
          checked={visible}
          onChange={(value) => handleToggle(key, value)}
        />
      ))}
      <Button onClick={handleReset}>Reset to Default</Button>
    </div>
  )
}

useLocalStorage

@mdk/foundation

Type-safe localStorage access with cross-tab synchronization.

import { useLocalStorage } from '@mdk/foundation'

Parameters

ParameterTypeDescription
keystringRequired: localStorage key
defaultValueTRequired: Fallback value when key is missing

Returns

IndexTypeDescription
[0]TCurrent stored value
[1]functionSet value (accepts value or updater function)
[2]functionRemove value from storage

Example

function ThemeToggle() {
  const [theme, setTheme, removeTheme] = useLocalStorage('theme', 'dark')

  return (
    <div>
      <p>Current theme: {theme}</p>
      <Button onClick={() => setTheme('light')}>Light</Button>
      <Button onClick={() => setTheme('dark')}>Dark</Button>
      <Button onClick={() => setTheme((prev) => prev === 'dark' ? 'light' : 'dark')}>
        Toggle
      </Button>
      <Button onClick={removeTheme}>Reset</Button>
    </div>
  )
}

usePagination

@mdk/foundation

Manage pagination state with API query arguments (limit/offset pattern).

import { usePagination } from '@mdk/foundation'

Options

OptionTypeDefaultDescription
currentnumber1Initial page number
pageSizenumber20Items per page
totalnumberInitial total count
showSizeChangerbooleantrueShow page size selector

Returns

PropertyTypeDescription
paginationobjectCurrent pagination state
queryArgs{ limit, offset }Query arguments for API calls
setPaginationfunctionUpdate pagination state
handleChangefunctionHandle page/size change
resetfunctionReset to initial state
setTotalfunctionUpdate total count
hideNextPagefunctionHide next page when data exhausted

Example

function MinerList() {
  const { pagination, queryArgs, handleChange } = usePagination({
    current: 1,
    pageSize: 20,
  })

  const { data } = useQuery(['miners', queryArgs], () =>
    api.getMiners(queryArgs.limit, queryArgs.offset)
  )

  return (
    <div>
      <Table data={data} />
      <Pagination {...pagination} onChange={handleChange} />
    </div>
  )
}

useIsFeatureEditingEnabled

@mdk/foundation

Check if the current user has permission to edit feature flags.

import { useIsFeatureEditingEnabled } from '@mdk/foundation'

Returns

TypeDescription
booleantrue if user has the 'features' capability

Example

function FeaturePanel() {
  const canEditFeatures = useIsFeatureEditingEnabled()

  if (!canEditFeatures) {
    return <p>You don't have permission to edit features.</p>
  }

  return <FeatureFlagsSettings {...props} />
}

On this page