// utils/ExternalSignerUtils.ts import { Platform } from 'react-native'; /** * Utility functions for interacting with external Nostr signers (Android only) * Implements NIP-55 for Android: https://github.com/nostr-protocol/nips/blob/master/55.md */ class ExternalSignerUtils { /** * Check if an external signer is installed (Amber) * * Note: This needs to be implemented in native code since it requires * access to Android's PackageManager to query for activities that can * handle the nostrsigner: scheme. This is a placeholder for the TypeScript * interface. * * @returns {Promise<boolean>} True if an external signer is available */ static isExternalSignerInstalled(): Promise<boolean> { // This would need to be implemented with native modules // For now, we'll return false if not on Android if (Platform.OS !== 'android') { return Promise.resolve(false); } // TODO: Add actual implementation that calls native code: // In native Android code: // val intent = Intent().apply { // action = Intent.ACTION_VIEW // data = Uri.parse("nostrsigner:") // } // val infos = context.packageManager.queryIntentActivities(intent, 0) // return infos.size > 0 // Placeholder implementation - this should be replaced with actual native code check return Promise.resolve(false); } /** * Format permissions for external signer requests * * @param {Array<{type: string, kind?: number}>} permissions The permissions to request * @returns {string} JSON string of permissions */ static formatPermissions(permissions: Array<{type: string, kind?: number}>): string { return JSON.stringify(permissions); } /** * Create intent parameters for getting public key from external signer * * @param {Array<{type: string, kind?: number}>} permissions Default permissions to request * @returns {Object} Parameters for the intent */ static createGetPublicKeyParams(permissions: Array<{type: string, kind?: number}> = []): any { return { type: 'get_public_key', permissions: this.formatPermissions(permissions) }; } /** * Create intent parameters for signing an event * * @param {Object} event The event to sign * @param {string} currentUserPubkey The current user's public key * @returns {Object} Parameters for the intent */ static createSignEventParams(event: any, currentUserPubkey: string): any { return { type: 'sign_event', id: event.id || `event-${Date.now()}`, current_user: currentUserPubkey }; } /** * Check if we're running on Android * * @returns {boolean} True if running on Android */ static isAndroid(): boolean { return Platform.OS === 'android'; } } export default ExternalSignerUtils;