Integration Hooks Guide — Multi-App & Backend Connectivity
Tier C — Historical. This document is a point-in-time snapshot preserved for reference. For current architecture, see CANONICAL_PLATFORM_ARCHITECTURE.md.
Overview
The @integratewise/domain-shells package now includes 7 comprehensive integration hooks that connect:
- Multi-app Portfolio: Cross-domain navigation between Revops, SalesOps, Admin, Personal, etc.
- Backend Services: Spine (SSOT), Memory (conversations), Governance (approvals), Connected Apps
- Real-time Sync: Automatic data synchronization with retry logic
- RBAC Integration: Permission-based rendering and navigation
- Signal Detection: Intelligence overlay powered by platform signals
All hooks are fully typed with TypeScript and follow React best practices.
Hook Reference
1. useDomainNavigation()
Cross-app navigation bridge for 12-app portfolio.
function App() {
const { allDomains, accessibleDomains, navigateToDomain } = useDomainNavigation();
return (
<div>
{accessibleDomains.map(domain => (
<button
key={domain.id}
onClick={() => navigateToDomain(domain.id)}
>
{domain.name}
</button>
))}
</div>
);
}
Returns:
allDomains: DomainApp[]— All 12 workbenches (unfiltered)accessibleDomains: DomainApp[]— RBAC-filtered domainsnavigateToDomain(domainId: string)— Navigate to domain
Domains Included:
- Account Success (
/workspace) - RevOps (
/revops) - SalesOps (
/salesops) - Personal (
/personal) - Admin (
/admin- requiresadminpermission)
2. useBackendSync(config?)
Real-time backend data synchronization with retry logic.
function Dashboard() {
const { syncing, lastSync, performSync } = useBackendSync({
interval: 30000, // Sync every 30 seconds
retryAttempts: 3,
onSync: (data) => {
console.log('Synced data:', data);
},
onError: (error) => {
console.error('Sync failed:', error);
},
});
return (
<div>
{syncing && <p>Syncing...</p>}
{lastSync && <p>Last synced: {lastSync.toLocaleTimeString()}</p>}
<button onClick={performSync}>Sync Now</button>
</div>
);
}
Config:
interval?: number— Milliseconds between syncs (default: 30000)retryAttempts?: number— Number of retry attempts (default: 3)onSync?: (data) => void— Callback on successful synconError?: (error) => void— Callback on sync failure
Returns:
syncing: boolean— Is currently syncinglastSync: Date | null— Last successful sync timeperformSync()— Trigger manual sync
3. useSpineData(entityType)
Fetch and cache Spine SSOT entity data with TTL.
function AccountsList() {
const { data: accounts, loading, error, refetch } = useSpineData('account');
if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return (
<div>
{accounts.map(account => (
<div key={account.id}>{account.name}</div>
))}
<button onClick={refetch}>Refresh</button>
</div>
);
}
Cache:
- 5-minute TTL per entity type
- Automatic cache invalidation
- Manual refetch available
Returns:
data: SpineEntity[]— Array of entities from Spineloading: boolean— Is loadingerror: Error | null— Error if fetch failedrefetch()— Manual refresh
4. useSignalDetection()
Intelligence signal detection and classification.
function IntelligencePanel() {
const {
signals,
loading,
getSignalsByType,
getHighSeveritySignals,
} = useSignalDetection();
const risks = getSignalsByType('risk');
const criticalSignals = getHighSeveritySignals();
return (
<div>
<h3>Critical Signals ({criticalSignals.length})</h3>
{criticalSignals.map(signal => (
<div
key={signal.id}
className={`severity-${signal.severity}`}
>
{signal.title}
</div>
))}
<h3>Risks ({risks.length})</h3>
{risks.map(risk => (
<div key={risk.id}>{risk.description}</div>
))}
</div>
);
}
Signal Types:
risk— High-risk signals requiring attentionopportunity— Growth opportunitiesinsight— Data insightsaction— Recommended actions
Severity Levels:
critical— Immediate action requiredhigh— Should address soonmedium— Worth monitoringlow— Informationalinfo— Background info
Returns:
signals: Signal[]— All detected signalsloading: boolean— Is loadingfilteredSignals: Signal[]— Filtered resultsfilterSignals(filters)— Filter signalsgetSignalsByType(type)— Get signals by typegetHighSeveritySignals()— Get critical + high
5. useMemoryIntegration()
Conversational memory persistence and retrieval.
function ChatInterface() {
const { messages, loading, addMessage, reload } = useMemoryIntegration();
const handleSendMessage = (content: string) => {
addMessage({
role: 'user',
content,
});
// Chat logic here...
};
return (
<div>
{messages.map(msg => (
<div key={msg.id} className={`message-${msg.role}`}>
{msg.content}
</div>
))}
<input
onKeyDown={(e) => {
if (e.key === 'Enter') {
handleSendMessage(e.currentTarget.value);
}
}}
/>
</div>
);
}
Returns:
messages: ConversationMessage[]— All messages in current sessionloading: boolean— Is loading conversation historyaddMessage(message)— Add message to memoryreload()— Reload conversation history
6. useGovernanceIntegration()
Governance approvals and workflows.
function ApprovalCenter() {
const { workflows, loading, pendingApprovals, reload } = useGovernanceIntegration();
return (
<div>
<h3>Pending Approvals ({pendingApprovals.length})</h3>
{pendingApprovals.map(workflow => (
<div key={workflow.id}>
<p>{workflow.type}</p>
<p>Requested by: {workflow.requester}</p>
<p>Approvers: {workflow.approvers.join(', ')}</p>
<button>Review</button>
</div>
))}
<button onClick={reload}>Refresh Approvals</button>
</div>
);
}
Workflow Statuses:
pending— Awaiting approvalapproved— Approvedrejected— Rejectedcancelled— Cancelled
Returns:
workflows: ApprovalWorkflow[]— All workflowsloading: boolean— Is loadingpendingApprovals()— Only pending workflowsreload()— Refresh workflows
7. useConnectedAppsSync()
External app data synchronization (ChatGPT, HubSpot, Slack, etc.).
function ConnectedAppsPanel() {
const { apps, syncing, triggerSync } = useConnectedAppsSync();
return (
<div>
<h3>Connected Apps</h3>
{apps.map(app => (
<div key={app.id}>
<span>{app.name}</span>
<span className={`status-${app.status}`}>
{app.status}
</span>
<button
onClick={() => triggerSync(app.id)}
disabled={syncing}
>
{syncing ? 'Syncing...' : 'Sync'}
</button>
</div>
))}
<button
onClick={() => triggerSync()}
disabled={syncing}
>
Sync All
</button>
</div>
);
}
App Statuses:
connected— Connected and synceddisconnected— Not connectedsyncing— Currently syncingerror— Sync error
Returns:
apps: ConnectedApp[]— All connected appssyncing: boolean— Is syncingtriggerSync(appId?)— Sync specific or all apps
Usage Patterns
Pattern 1: Multi-Domain App Switcher
function DomainSwitcher() {
const { accessibleDomains, navigateToDomain } = useDomainNavigation();
return (
<nav>
{accessibleDomains.map(domain => (
<button
key={domain.id}
onClick={() => navigateToDomain(domain.id)}
>
{domain.icon} {domain.name}
</button>
))}
</nav>
);
}
Pattern 2: Real-time Dashboard
function RealTimeDashboard() {
// Auto-sync every 30 seconds with error handling
useBackendSync({
interval: 30000,
onSync: (data) => console.log('Dashboard updated'),
onError: (error) => console.error('Sync failed, will retry'),
});
const accounts = useSpineData('account');
const signals = useSignalDetection();
return (
<div>
<Stats accounts={accounts.data} />
<Signals signals={signals.getHighSeveritySignals()} />
</div>
);
}
Pattern 3: Intelligence Overlay
function IntelligenceOverlay() {
const signals = useSignalDetection();
return (
<aside>
<h3>Intelligence ({signals.signals.length})</h3>
<section>
<h4>Risks</h4>
{signals.getSignalsByType('risk').map(risk => (
<Alert key={risk.id} signal={risk} />
))}
</section>
<section>
<h4>Opportunities</h4>
{signals.getSignalsByType('opportunity').map(opp => (
<Opportunity key={opp.id} signal={opp} />
))}
</section>
</aside>
);
}
Pattern 4: Integrated Workbench
function AccountSuccessWorkbench() {
const { user } = usePlatform();
const { accessibleDomains } = useDomainNavigation();
const { syncing } = useBackendSync({ interval: 30000 });
const accounts = useSpineData('account');
const signals = useSignalDetection();
return (
<div>
<Sidebar domains={accessibleDomains} />
<Header user={user} syncing={syncing} />
<Dashboard
accounts={accounts.data}
signals={signals.signals}
/>
<IntelligencePanel signals={signals.signals} />
</div>
);
}
Type Definitions
All hooks are fully typed:
// Signals
type SignalType = 'risk' | 'opportunity' | 'insight' | 'action';
type SignalSeverity = 'critical' | 'high' | 'medium' | 'low' | 'info';
interface Signal {
id: string;
type: SignalType;
severity: SignalSeverity;
title: string;
description: string;
source: string;
confidence: number; // 0-100
timestamp: Date;
metadata?: Record<string, any>;
}
// Spine Entities
interface SpineEntity {
id: string;
type: string;
name: string;
[key: string]: any;
}
// Domain Apps
interface DomainApp {
id: string;
name: string;
path: string;
icon: React.ReactNode;
requiresPermission?: string;
}
// Workflows
interface ApprovalWorkflow {
id: string;
type: string;
status: 'pending' | 'approved' | 'rejected' | 'cancelled';
requester: string;
approvers: string[];
createdAt: Date;
expiresAt?: Date;
}
// Connected Apps
interface ConnectedApp {
id: string;
name: string;
status: 'connected' | 'disconnected' | 'syncing' | 'error';
lastSync?: Date;
nextSync?: Date;
}
Performance Considerations
- Spine Data Caching: 5-minute TTL prevents excessive API calls
- Backend Sync Retry: Automatic retry with exponential backoff
- Memory Integration: Lazy-loads conversation history
- Signal Detection: Filters signals client-side to minimize API calls
- Connected Apps: Batches sync operations
Integrating with Your Backend
All hooks use the useGateway() SDK to call your backend. Wire them by:
- Ensure Gateway SDK is installed:
npm install @integratewise/gateway-sdk - Configure backend endpoints in
/api/gateway/*routes - Test with real data using the hooks in your workbench
Example backend integration:
// /api/gateway/entity/route.ts
export async function GET(req: Request) {
const { orgId, entityType } = req.nextUrl.searchParams;
// Fetch from Spine SSOT
const data = await spine.getEntities(orgId, entityType);
return Response.json(data);
}
Summary
These 7 hooks provide enterprise-grade integration:
✅ Multi-app portfolio navigation
✅ Real-time backend synchronization
✅ Spine SSOT data caching
✅ Intelligence signal detection
✅ Conversational memory persistence
✅ Governance workflow management
✅ External app synchronization
Use them to build seamless, production-ready workbenches across all 12+ frontend apps.