### Direct Messaging on Nostr This project includes a complete direct messaging system supporting both NIP-04 (legacy) and NIP-17 (modern, more private) encrypted messages with real-time subscriptions, optimistic updates, and a persistent cache-first local storage. **The DM system is not enabled by default** - follow the setup instructions below to add messaging functionality to your application. ## Setup Instructions ### 1. Add DMProvider to Your App First, add the `DMProvider` to your app's provider tree in `src/App.tsx`: ```tsx // Add these imports at the top of src/App.tsx import { DMProvider, type DMConfig } from '@/components/DMProvider'; import { PROTOCOL_MODE } from '@/lib/dmConstants'; // Add this configuration before your App component const dmConfig: DMConfig = { // Enable or disable DMs entirely enabled: true, // Set to true to enable messaging functionality // Choose one protocol mode: // PROTOCOL_MODE.NIP04_ONLY - Force NIP-04 (legacy) only // PROTOCOL_MODE.NIP17_ONLY - Force NIP-17 (private) only // PROTOCOL_MODE.NIP04_OR_NIP17 - Allow users to choose between NIP-04 and NIP-17 (defaults to NIP-17) protocolMode: PROTOCOL_MODE.NIP17_ONLY, // Recommended for new apps }; // Then wrap your app components with DMProvider: export function App() { return ( ); } ``` ### 2. Configure DM Settings The `DMConfig` object supports the following options: - `enabled` (boolean, default: `false`) - Enable/disable entire DM system. When false, no messages are loaded, stored, or processed. - `protocolMode` (ProtocolMode, default: `PROTOCOL_MODE.NIP17_ONLY`) - Which protocols to support: - `PROTOCOL_MODE.NIP04_ONLY` - Legacy encryption only - `PROTOCOL_MODE.NIP17_ONLY` - Modern private messages (recommended) - `PROTOCOL_MODE.NIP04_OR_NIP17` - Support both protocols (for backwards compatibility) **Note**: The DM system uses domain-based IndexedDB naming (`nostr-dm-store-${hostname}`) to prevent conflicts between multiple apps on the same domain. ## Quick Start ### 1. Send Messages ```tsx import { useDMContext } from '@/hooks/useDMContext'; import { MESSAGE_PROTOCOL } from '@/lib/dmConstants'; function ComposeMessage({ recipientPubkey }: { recipientPubkey: string }) { const { sendMessage } = useDMContext(); const [content, setContent] = useState(''); const handleSend = async () => { await sendMessage({ recipientPubkey, content, protocol: MESSAGE_PROTOCOL.NIP17, // Uses NIP-44 encryption + gift wrapping }); setContent(''); }; return (
{ e.preventDefault(); handleSend(); }}>