diff --git a/src/components/nostr/ChatComponent.vue b/src/components/nostr/ChatComponent.vue
index 8d95a01..b27ede6 100644
--- a/src/components/nostr/ChatComponent.vue
+++ b/src/components/nostr/ChatComponent.vue
@@ -12,6 +12,10 @@
Disconnected
+
+
+ {{ getTotalUnreadCount() }} unread
+
+
+
+
+ {{ getUnreadCount(peer.pubkey) > 99 ? '99+' : getUnreadCount(peer.pubkey) }}
+
+
@@ -95,32 +105,38 @@
-
-
-
-
- {{ selectedPeer ? getPeerInitials(selectedPeer) : 'U' }}
-
-
-
{{ selectedPeer?.username || 'Unknown User' }}
-
- {{ selectedPeer ? formatPubkey(selectedPeer.pubkey) : '' }}
-
-
+
+
+
+
+ {{ selectedPeer ? getPeerInitials(selectedPeer) : 'U' }}
+
+
+
{{ selectedPeer?.username || 'Unknown User' }}
+
+ {{ selectedPeer ? formatPubkey(selectedPeer.pubkey) : '' }}
+
-
- Connected
-
-
- Disconnected
-
+
+
+
+ Connected
+
+
+ Disconnected
+
+
+
+ {{ getUnreadCount(selectedPeer.pubkey) }} unread
+
+
@@ -181,6 +197,10 @@
Disconnected
+
+
+ {{ getTotalUnreadCount() }} unread
+
+
+
+
+ {{ getUnreadCount(peer.pubkey) > 99 ? '99+' : getUnreadCount(peer.pubkey) }}
+
+
@@ -420,11 +446,16 @@ const goBackToPeers = () => {
const {
isConnected,
messages,
- sendMessage: sendNostrMessage,
+ isLoggedIn,
connect,
disconnect,
subscribeToPeer,
- onMessageAdded
+ sendMessage: sendNostrMessage,
+ onMessageAdded,
+ markMessagesAsRead,
+ getUnreadCount,
+ getAllUnreadCounts,
+ getTotalUnreadCount
} = useNostrChat()
// Computed
@@ -491,6 +522,9 @@ const selectPeer = async (peer: Peer) => {
selectedPeer.value = peer
messageInput.value = ''
+ // Mark messages as read for this peer
+ markMessagesAsRead(peer.pubkey)
+
// On mobile, show chat view
if (isMobile.value) {
showChat.value = true
diff --git a/src/composables/useNostrChat.ts b/src/composables/useNostrChat.ts
index 57239d1..de795cb 100644
--- a/src/composables/useNostrChat.ts
+++ b/src/composables/useNostrChat.ts
@@ -20,14 +20,32 @@ export interface NostrRelayConfig {
write?: boolean
}
-// Get relays from config - requires VITE_NOSTR_RELAYS to be set
-const getRelays = (): NostrRelayConfig[] => {
- const configuredRelays = config.nostr.relays
- if (!configuredRelays || configuredRelays.length === 0) {
- throw new Error('VITE_NOSTR_RELAYS environment variable must be configured for chat functionality')
+// Add notification system for unread messages
+interface UnreadMessageData {
+ lastReadTimestamp: number
+ unreadCount: number
+}
+
+const UNREAD_MESSAGES_KEY = 'nostr-chat-unread-messages'
+
+// Get unread message data for a peer
+const getUnreadData = (peerPubkey: string): UnreadMessageData => {
+ try {
+ const stored = localStorage.getItem(`${UNREAD_MESSAGES_KEY}-${peerPubkey}`)
+ return stored ? JSON.parse(stored) : { lastReadTimestamp: 0, unreadCount: 0 }
+ } catch (error) {
+ console.warn('Failed to load unread data for peer:', peerPubkey, error)
+ return { lastReadTimestamp: 0, unreadCount: 0 }
+ }
+}
+
+// Save unread message data for a peer
+const saveUnreadData = (peerPubkey: string, data: UnreadMessageData): void => {
+ try {
+ localStorage.setItem(`${UNREAD_MESSAGES_KEY}-${peerPubkey}`, JSON.stringify(data))
+ } catch (error) {
+ console.warn('Failed to save unread data for peer:', peerPubkey, error)
}
-
- return configuredRelays.map((url: string) => ({ url, read: true, write: true }))
}
export function useNostrChat() {
@@ -36,15 +54,112 @@ export function useNostrChat() {
const isConnected = ref(false)
const messages = ref