UNPKG

@idto/digilocker-sdk

Version:

Official JavaScript SDK for integrating DigiLocker authentication with IDTO platform. Provides secure Aadhaar verification with real-time event tracking and reference key delivery.

540 lines (422 loc) 13.9 kB
# @idto/digilocker-sdk Official JavaScript SDK for integrating DigiLocker authentication with IDTO platform. Provides secure Aadhaar verification with real-time event tracking and reference key delivery. ## Features - 🔐 **Secure DigiLocker Integration** - Government-approved Aadhaar verification - 📱 **Responsive Design** - Optimized for mobile and desktop - 🌐 **Multi-language Support** - English & Hindi - 🔊 **Audio Controls** - User-friendly audio management - 📡 **Real-time Events** - Track user state and progress - 🎯 **User State Tracking** - Monitor authentication flow - 🔑 **Reference Key Delivery** - Get verification results instantly -**Lightweight** - Minimal bundle size with maximum functionality - 📝 **Full TypeScript Support** - Complete type definitions and IntelliSense ## Installation ```bash npm install @idto/digilocker-sdk # or yarn add @idto/digilocker-sdk # or pnpm add @idto/digilocker-sdk ``` ## Domain Whitelisting **Important**: Before using the SDK, please contact the organization to whitelist your domain. This is required for the DigiLocker integration to work properly. **Required Setup**: - **Domain Whitelisting**: Contact support to whitelist your domain - **User ID**: Obtain your unique user identifier from the organization - **Authentication Token**: Get your secure authentication token Contact: support@idto.ai ## Quick Start ```tsx import { DigilockerIdtoSdk } from '@idto/digilocker-sdk'; function App() { return ( <DigilockerIdtoSdk userId="user123" token="your-auth-token" isShowDrawerInMobile={false} /> ); } ``` ## Loading CSS Styles **✅ CSS is automatically included!** When you import the `DigilockerIdtoSdk` component, all necessary styles are automatically loaded. No additional CSS imports are required. ```tsx import { DigilockerIdtoSdk } from '@idto/digilocker-sdk'; function App() { return ( <DigilockerIdtoSdk userId="user123" token="your-auth-token" isShowDrawerInMobile={false} /> ); } ``` **Note**: The CSS is embedded directly into the JavaScript bundle, so you don't need to worry about loading external stylesheets. ## Event-Driven Architecture The SDK emits real-time events to keep your application informed about the user's DigiLocker authentication status. ### Event Types | Event | Description | Data Payload | |-------|-------------|--------------| | `SESSION_INITIATED` | DigiLocker session started | `{ user_id, redirect_url }` | | `REFERENCE_RECEIVED` | **Reference key received** | `{ user_id, reference_key, expires_at }` | | `SESSION_COMPLETED` | Authentication completed | `{ user_id }` | | `ERROR_OCCURRED` | Error during process | `{ user_id, error, error_code }` | | `SESSION_EXPIRED` | Session expired | `{ user_id, reference_key }` | | `LANGUAGE_CHANGED` | Language preference changed | `{ language, language_code }` | | `AUDIO_TOGGLED` | Audio state changed | `{ is_muted }` | ### Using Event Callbacks ```tsx import { DigilockerIdtoSdk } from '@idto/digilocker-sdk'; function App() { const handleReferenceReceived = (data) => { console.log('✅ Reference Key:', data.reference_key); console.log('⏰ Expires at:', data.expires_at); // Store reference key in your database saveReferenceKey(data.user_id, data.reference_key); }; const handleSessionCompleted = (data) => { console.log('🎉 Session completed for user:', data.user_id); // Redirect user or update UI }; const handleError = (data) => { console.error('❌ Error occurred:', data.error); // Show error message to user }; return ( <DigilockerIdtoSdk userId="user123" token="your-auth-token" onReferenceReceived={handleReferenceReceived} onSessionCompleted={handleSessionCompleted} onError={handleError} /> ); } ``` ### Global Event Emitter For advanced event handling across components: ```tsx import { globalEventEmitter } from '@idto/digilocker-sdk'; // Listen to all events globalEventEmitter.on('REFERENCE_RECEIVED', (event) => { console.log('Event:', event.type); console.log('Data:', event.data); console.log('Timestamp:', event.timestamp); }); // Listen to specific events globalEventEmitter.on('SESSION_INITIATED', (event) => { console.log('Session initiated for user:', event.data.user_id); }); // Remove listener const handleError = (event) => console.log('Error:', event.data.error); globalEventEmitter.on('ERROR_OCCURRED', handleError); // Later remove the listener globalEventEmitter.off('ERROR_OCCURRED', handleError); // Remove all listeners globalEventEmitter.removeAllListeners(); ``` ### React Hooks Use the provided React hooks for component-level event handling: ```tsx import { useEventListener } from '@idto/digilocker-sdk'; function MyComponent() { useEventListener('REFERENCE_RECEIVED', (event) => { console.log('Reference received:', event.data.reference_key); }); useEventListener('ERROR_OCCURRED', (event) => { console.error('Error:', event.data.error); }); return <div>Listening to events...</div>; } ``` ## Complete Integration Example ```tsx import React, { useState } from 'react'; import { DigilockerIdtoSdk } from '@idto/digilocker-sdk'; function App() { const [referenceKey, setReferenceKey] = useState(''); const [sessionStatus, setSessionStatus] = useState('idle'); const handleReferenceReceived = (data) => { setReferenceKey(data.reference_key); setSessionStatus('completed'); // Send to your backend fetch('/api/store-reference', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userId: data.user_id, referenceKey: data.reference_key, expiresAt: data.expires_at }) }); }; const handleSessionInitiated = (data) => { setSessionStatus('initiated'); console.log('Redirecting to:', data.redirect_url); }; const handleError = (data) => { setSessionStatus('error'); console.error('DigiLocker error:', data.error); }; return ( <div> <h1>DigiLocker Integration</h1> {sessionStatus === 'completed' && ( <div> <h2>✅ Verification Complete!</h2> <p>Reference Key: {referenceKey}</p> </div> )} {sessionStatus === 'error' && ( <div> <h2>❌ Error Occurred</h2> <p>Please try again</p> </div> )} <DigilockerIdtoSdk userId="user123" token="your-auth-token" onReferenceReceived={handleReferenceReceived} onSessionInitiated={handleSessionInitiated} onError={handleError} onSessionCompleted={() => setSessionStatus('completed')} /> </div> ); } export default App; ``` ## API Reference ### Props | Prop | Type | Required | Default | Description | |------|------|----------|---------|-------------| | `userId` | string | ✅ | - | Unique identifier for the user | | `token` | string | ✅ | - | Authentication token | | `isShowDrawerInMobile` | boolean | ❌ | false | Show drawer on mobile devices | ### Event Callback Props | Prop | Type | Description | |------|------|-------------| | `onEvent` | function | General event handler for all events | | `onSessionInitiated` | function | Called when session is initiated | | `onReferenceReceived` | function | Called when reference key is received | | `onSessionCompleted` | function | Called when session is completed | | `onError` | function | Called when an error occurs | | `onSessionExpired` | function | Called when session expires | | `onLanguageChanged` | function | Called when language is changed | | `onAudioToggled` | function | Called when audio is toggled | ### Event Data Structure ```typescript interface DigilockerEvent { type: DigilockerEventType; timestamp: number; data?: any; } ``` ## Styling & Customization The SDK includes comprehensive CSS classes that you can customize to match your application's design: ### Layout & Containers ```css /* Main containers */ .idto_digilocker_app_container .idto_digilocker_main_container .idto_digilocker_init_container .idto_digilocker_init_container_full_height /* Responsive height classes */ .idto_digilocker_mobile_min_height .idto_digilocker_desktop_min_height /* Overview containers */ .idto_digilocker_overview_container .idto_digilocker_overview_container_mobile .idto_digilocker_overview_container_desktop ``` ### Header & Navigation ```css /* Header components */ .idto_digilocker_header .idto_digilocker_header_mobile .idto_digilocker_header_desktop .idto_digilocker_header_logo_container .idto_digilocker_header_logo_container_mobile .idto_digilocker_header_logo_container_desktop /* DigiLocker init header */ .idto_digilocker_init_header .idto_digilocker_init_logo_container ``` ### Controls & Interactive Elements ```css /* Language controls */ .idto_digilocker_init_language_dropdown .idto_digilocker_init_language_trigger .idto_digilocker_init_language_dropdown_menu .idto_digilocker_init_language_option .idto_digilocker_init_language_text .idto_digilocker_init_language_arrow /* Audio controls */ .idto_digilocker_init_audio_control .idto_digilocker_init_audio_text /* Buttons */ .idto_digilocker_button .idto_digilocker_button_primary .idto_digilocker_button_secondary .idto_digilocker_button_success .idto_digilocker_button_error .idto_digilocker_button_text .idto_digilocker_button_loader .idto_digilocker_init_button .idto_digilocker_mobile_button .idto_digilocker_desktop_button ``` ### Content Sections ```css /* Main content areas */ .idto_digilocker_init_content .idto_digilocker_init_main_content .idto_digilocker_init_info_section .idto_digilocker_init_visual_section .idto_digilocker_init_footer /* Text sections */ .idto_digilocker_init_text_section .idto_digilocker_init_title .idto_digilocker_init_description .idto_digilocker_init_security_text /* Mobile & Desktop content */ .idto_digilocker_mobile_content .idto_digilocker_mobile_title .idto_digilocker_mobile_description .idto_digilocker_mobile_disclaimer .idto_digilocker_desktop_content .idto_digilocker_desktop_title .idto_digilocker_desktop_subtitle .idto_digilocker_desktop_description .idto_digilocker_desktop_disclaimer ``` ### Success & Loading States ```css /* Success state */ .idto_digilocker_success_container .idto_digilocker_success_content .idto_digilocker_success_gif .idto_digilocker_countdown_text /* Loading states */ .idto_digilocker_loader .idto_digilocker_loader_spinner /* Error states */ .idto_digilocker_init_error_text ``` ### Modal & Overlay Components ```css /* Modal variants */ .idto_digilocker_modal_overlay .idto_digilocker_modal_content .idto_digilocker_modal_small .idto_digilocker_modal_medium .idto_digilocker_modal_large .idto_digilocker_modal_custom /* Bottom sheet */ .idto_digilocker_bottom_sheet_overlay .idto_digilocker_bottom_sheet_content .idto_digilocker_bottom_sheet_default .idto_digilocker_bottom_sheet_custom .idto_digilocker_bottom_sheet_drag_handle .idto_digilocker_bottom_sheet_drag_indicator ``` ### Branding & Visual Elements ```css /* Branding */ .idto_digilocker_init_branding .idto_digilocker_init_branding_text .idto_digilocker_init_branding_logo /* Icons & images */ .idto_digilocker_init_icon_container .idto_digilocker_init_image_container .idto_digilocker_init_security_badge .idto_digilocker_desktop_logo ``` ### Customization Examples ```css /* Custom button styling */ .idto_digilocker_button { background-color: #your-brand-color; border-radius: 8px; font-weight: 600; } /* Custom header styling */ .idto_digilocker_init_header { background: linear-gradient(90deg, #your-color-1, #your-color-2); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } /* Custom modal styling */ .idto_digilocker_modal_content { border-radius: 16px; box-shadow: 0 25px 50px rgba(0, 0, 0, 0.25); } ``` ## Error Handling Comprehensive error handling with specific error codes: ```tsx const handleError = (data) => { switch (data.error_code) { case 'SESSION_INITIATION_FAILED': // Handle session initiation failure showToast('Failed to start verification. Please try again.'); break; case 'REFERENCE_FETCH_FAILED': // Handle reference fetch failure showToast('Verification failed. Please restart the process.'); break; default: // Handle generic errors showToast('An unexpected error occurred. Please try again.'); break; } }; ``` ## Browser Support - ✅ Chrome 80+ - ✅ Firefox 75+ - ✅ Safari 13+ - ✅ Edge 80+ ## Requirements - React >= 16.8.0 - React DOM >= 16.8.0 - Node.js >= 14.0.0 ## TypeScript Support This package includes complete TypeScript declarations. No additional `@types` packages are required. ```typescript import { DigilockerIdtoSdk, DigilockerEvent } from '@idto/digilocker-sdk'; // Full IntelliSense support const handleEvent = (event: DigilockerEvent) => { console.log(event.type, event.data); }; ``` ## Development ### Build the Package ```bash npm run build:lib # or pnpm run build:lib # or yarn build:lib ``` This creates the distribution files in the `dist/` folder, including: - **ESM Bundle**: `index.esm.js` - For modern bundlers - **CommonJS Bundle**: `index.cjs.js` - For Node.js compatibility - **TypeScript Declarations**: `*.d.ts` files - For full type support - **Source Maps**: `*.map` files - For debugging ### Type Checking ```bash npm run type-check ``` ### Linting ```bash npm run lint ``` ## License MIT License - see [LICENSE](LICENSE) file for details. ## Support - 📧 Email: support@idto.ai - 📖 Documentation: [https://docs.idto.ai](https://docs.idto.ai) - 🐛 Issues: [GitHub Issues](https://github.com/idto-ai/digilocker-sdk/issues) --- Built with ❤️ by [IDTO](https://idto.ai)