# IC Reactor - AI Friendly Guide IC Reactor is a modern, type-safe library for building Internet Computer applications. It provides seamless integration between JavaScript/TypeScript applications and IC canisters with full TypeScript support, intelligent caching (via TanStack Query), and React integration. ## Core Packages - `@ic-reactor/core`: Low-level API for managing actors, agents, and query caching. - `@ic-reactor/react`: High-level React hooks and context providers for easy integration. ## Key Concepts - **Reactor**: Manages a single canister's actor instance, handling method calls and query caching. (Replaces `CandidActor`) - **DisplayReactor**: A specialized `Reactor` that automatically transforms Candid types (BigInt, Principal) to JS-friendly types (string, number). (Replaces `DisplayCodecActor`) - **ClientManager**: Manages the IC Agent connection, handling authentication and identity provider integration. - **Auto Codecs**: Automatically transforms Candid types (BigInt, Principal) to JS-friendly types (string, number). - **Type Safety**: Provides end-to-end type safety from Candid definitions to React hooks. ## Common Code Patterns ### 1. Initialization (Core) ```typescript import { ClientManager, Reactor, DisplayReactor } from '@ic-reactor/core'; import { QueryClient } from '@tanstack/query-core'; import { idlFactory, type _SERVICE } from './declarations/my_canister'; const queryClient = new QueryClient(); const clientManager = new ClientManager({ queryClient }); // Standard Reactor (Raw Candid Types) const reactor = new Reactor<_SERVICE>({ clientManager, idlFactory, canisterId: 'rrkah-fqaaa-aaaaa-aaaaq-cai', }); // OR DisplayReactor (Auto Transformation) const displayReactor = new DisplayReactor<_SERVICE>({ clientManager, idlFactory, canisterId: 'rrkah-fqaaa-aaaaa-aaaaq-cai', }); ``` ### 2. React Integration (Standard Hooks) ```typescript import { createActorHooks } from '@ic-reactor/react'; const { useActorQuery, useActorMutation } = createActorHooks(reactor); // Query call (cached) function Profile() { const { data, isLoading } = useActorQuery({ functionName: 'getUserProfile', args: ['principal-id'], }); return
{isLoading ? 'Loading...' : data.name}
; } // Update call (mutation) function UpdateProfile() { const { mutate, isPending } = useActorMutation({ functionName: 'updateUserProfile', onSuccess: (data) => console.log('Updated!', data), onCanisterError: (error) => console.error('Logic Error:', error), }); return ; } ``` ### 3. Query Factories (Advanced / Route Loaders) For extracting queries outside of components or creating reusable query factories: ```typescript import { createQuery, createQueryFactory } from '@ic-reactor/react'; // Single Query Factory const profileQuery = createQuery(reactor, { functionName: 'getUserProfile', args: ['user-id'], }); // Usage: await profileQuery.fetch() OR profileQuery.useQuery() // Dynamic Query Factory const profileQueryFactory = createQueryFactory(reactor, { functionName: 'getUserProfile', }); // Usage: profileQueryFactory(['user-id']).useQuery() ``` ### 4. Infinite Queries ```typescript const { useActorInfiniteQuery } = createActorHooks(reactor); function ActivityLog() { const { data, fetchNextPage, hasNextPage } = useActorInfiniteQuery({ functionName: 'getActivities', args: [], paginationType: 'offset', // or 'cursor' // ... }); } ``` ## API Reference (Summary) ### @ic-reactor/core - `Reactor`: `callMethod`, `getQueryOptions`, `generateQueryKey`, `invalidateQueries`. - `DisplayReactor`: Extended `Reactor` with automatic type transformation. - `ClientManager`: `authenticate`, `login`, `logout`, `subscribeAuthState`. ### @ic-reactor/react #### Core Factories - `createActorHooks(reactor)`: Generates a typed hook suite for a canister: - `useActorQuery`: Standard query hook. - `useActorMutation`: Mutation hook. - `useActorInfiniteQuery`: Infinite query hook (pagination). - `useActorSuspenseQuery`: Suspense-enabled query hook. - `useActorSuspenseInfiniteQuery`: Suspense-enabled infinite query hook. #### Standalone Factories - `createQuery(reactor, config)`: Creates a reusable query object. - `createSuspenseQuery(reactor, config)`: Creates a reusable suspense query object. - `createInfiniteQuery(reactor, config)`: Creates a reusable infinite query object. - `createSuspenseInfiniteQuery(reactor, config)`: Creates a reusable suspense infinite query object. - `createMutation(reactor, config)`: Creates a reusable mutation object. - `createQueryFactory(reactor, config)`: Creates a dynamic query factory function. #### Authentication Hooks - `useAuth`: Login/logout and identity management. - `useAgentState`: Access agent initialization status and network details. - `useUserPrincipal`: Access the current user's Principal. - `createAuthHooks(clientManager)`: Creates a scoped set of authentication hooks (rarely needed, use top-level exports). ## Best Practices 1. Use `DisplayReactor` for simpler data handling with AI / UI layers. 2. Use `createActorHooks` to generate type-safe hooks for your specific canister. 3. Leverage TanStack Query options (staleTime, cacheTime) passed through `useActorQuery`. 4. Use `Suspense` versions (`useActorSuspenseQuery`) for a better loading experience.