useSDK Hook

The useSDK hook provides access to the SDK context, including initialization state, organization information, and API methods.

Import

import { useSDK, useSDKReady } from '@mims/sdk-react';

useSDK

Returns the full SDK context value with all properties and methods.

Basic Usagetsx
function MyComponent() {
  const sdk = useSDK();

  if (sdk.isValidating) {
    return <div>Initializing SDK...</div>;
  }

  if (sdk.validationError) {
    return <div>Error: {sdk.validationError}</div>;
  }

  return (
    <div>
      <p>Organization: {sdk.organizationName}</p>
      <p>Scopes: {sdk.scopes.join(', ')}</p>
    </div>
  );
}

Return Value

PropTypeDefaultDescription
isInitializedbooleanWhether the SDK has successfully validated the API key and is ready to use.
isValidatingbooleanWhether the SDK is currently validating the API key. True during initial load.
validationErrorstring | nullError message if API key validation failed, null otherwise.
organizationIdstring | nullThe organization ID associated with the validated API key.
organizationNamestring | nullThe organization name associated with the validated API key.
scopesstring[]Array of permission scopes granted to the API key.
configSDKConfigThe current SDK configuration object.
apiRequest<T>(endpoint: string, options?: RequestInit) => Promise<T>Method to make authenticated API requests to the MIMS backend.

Provider Required

useSDK must be used within a MIMSProvider. Using it outside will throw an error:"useSDK must be used within a MIMSProvider"

useSDKReady

A convenience hook that returns a simple boolean indicating if the SDK is ready to use.

useSDKReadytsx
function MyComponent() {
  const isReady = useSDKReady();

  if (!isReady) {
    return <LoadingSpinner />;
  }

  return <DocumentViewer />;
}

// Equivalent to:
function useSDKReady(): boolean {
  const { isInitialized, isValidating } = useSDK();
  return isInitialized && !isValidating;
}

Making API Requests

The apiRequest method allows you to make authenticated requests to the MIMS API. It automatically includes the API key and handles timeouts.

API Requeststsx
function DocumentLoader({ documentId }: { documentId: string }) {
  const { apiRequest, isInitialized } = useSDK();
  const [document, setDocument] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    if (!isInitialized) return;

    async function loadDocument() {
      try {
        const data = await apiRequest<DocumentResponse>(
          `/sdk/documents/${documentId}`
        );
        setDocument(data);
      } catch (error) {
        console.error('Failed to load document:', error);
      } finally {
        setLoading(false);
      }
    }

    loadDocument();
  }, [documentId, apiRequest, isInitialized]);

  if (loading) return <div>Loading...</div>;
  return <div>{document?.filename}</div>;
}

POST Request Example

POST Requesttsx
async function submitDocument(payload: DocumentSubmissionPayload) {
  const { apiRequest } = useSDK();

  const result = await apiRequest<SubmissionResponse>('/sdk/documents/submit', {
    method: 'POST',
    body: JSON.stringify(payload),
  });

  return result;
}

Checking Scopes

Use the scopes array to check if the current API key has specific permissions:

Scope Checkingtsx
function SubmitButton() {
  const { scopes } = useSDK();
  
  const canSubmit = scopes.includes('documents:submit');
  const canRead = scopes.includes('documents:read');

  if (!canSubmit) {
    return (
      <Tooltip content="Your API key doesn't have submit permissions">
        <button disabled>Submit Document</button>
      </Tooltip>
    );
  }

  return <button onClick={handleSubmit}>Submit Document</button>;
}

Configuration Access

Access the current SDK configuration through the config property:

Config Accesstsx
function DebugPanel() {
  const { config } = useSDK();

  if (!config.debug) return null;

  return (
    <div className="debug-panel">
      <p>API Base URL: {config.apiBaseUrl}</p>
      <p>Timeout: {config.timeout}ms</p>
      <p>Custom Headers: {Object.keys(config.customHeaders || {}).length}</p>
    </div>
  );
}

TypeScript Interface

types.tstypescript
interface SDKContextValue {
  /** Whether the SDK is initialized */
  isInitialized: boolean;
  /** Whether the SDK is validating the API key */
  isValidating: boolean;
  /** Validation error if any */
  validationError: string | null;
  /** Organization ID from validated API key */
  organizationId: string | null;
  /** Organization name */
  organizationName: string | null;
  /** API scopes */
  scopes: string[];
  /** SDK configuration */
  config: SDKConfig;
  /** Make an authenticated request to the API */
  apiRequest: <T>(endpoint: string, options?: RequestInit) => Promise<T>;
}

interface SDKConfig {
  apiBaseUrl: string;
  apiKey: string;
  debug?: boolean;
  customHeaders?: Record<string, string>;
  timeout?: number;
}

Error Handling

Error Handlingtsx
function SDKErrorBoundary({ children }: { children: React.ReactNode }) {
  const { validationError, isValidating } = useSDK();

  if (isValidating) {
    return <FullPageLoader message="Initializing SDK..." />;
  }

  if (validationError) {
    return (
      <ErrorDisplay
        title="SDK Initialization Failed"
        message={validationError}
        actions={[
          { label: 'Retry', onClick: () => window.location.reload() },
          { label: 'Contact Support', href: '/support' },
        ]}
      />
    );
  }

  return <>{children}</>;
}