-
{chInfo?.name || getShortName(selectedChannel)}
-
{chInfo?.about || ''}
+
+ {chInfo.picture &&

}
+
+
{chInfo?.name || getShortName(selectedChannel)}
+ {chInfo?.about || ''}
+
+
}
{!chInfo &&
diff --git a/src/components/app-body/nostr-chat/index.js b/src/components/app-body/nostr-chat/index.js
index fd24e69..dae8c29 100644
--- a/src/components/app-body/nostr-chat/index.js
+++ b/src/components/app-body/nostr-chat/index.js
@@ -19,6 +19,7 @@ function NostrChat (props) {
const [loadedMessages, setLoadedMessages] = useState(false)
const [profiles, setProfiles] = useState({})
const [channelsData, setChannelsData] = useState({})
+ const [channelsLoaded, setChannelsLoaded] = useState(false)
const [channels] = useState(config.chatsId)
const [selectedChannel, setSelectedChannel] = useState(config.chatsId[0])
@@ -50,10 +51,14 @@ function NostrChat (props) {
return
}
- // Fetch profile.
- let profile = await appData.nostrQueries.getProfile(pubKey)
- if (!profile) profile = { name: pubKey }
+ console.log(`Trying to get ${pubKey} profile.`)
+ const defaultProfile = { name: pubKey } // default profile
+ profilesRef.current[pubKey] = defaultProfile // update ref , to prevent fetch this profile again.
+ // Fetch profile
+ const nostrProfile = await appData.nostrQueries.getProfile(pubKey)
+
+ const profile = nostrProfile || defaultProfile
// Update profiles state
setProfiles(currentProfiles => {
const newProfiles = { ...currentProfiles }
@@ -68,7 +73,8 @@ function NostrChat (props) {
// Handle nostr pool
useEffect(() => {
- if (!selectedChannel) return
+ // fetch messages when channel selected and channel metadata are loaded
+ if (!selectedChannel || !channelsLoaded) return
const relays = nostrQueries.relays
if (relays.length === 0) {
@@ -96,7 +102,7 @@ function NostrChat (props) {
console.log('Close existing pool')
pool.close()
}
- }, [onMsgRead, selectedChannel, nostrQueries])
+ }, [onMsgRead, selectedChannel, nostrQueries, channelsLoaded])
// Load channels data
useEffect(() => {
@@ -120,6 +126,7 @@ function NostrChat (props) {
newChs[ch] = channelData
return newChs
})
+ setChannelsLoaded(true)
}
}
diff --git a/src/components/app-body/nostr-chat/message-item.js b/src/components/app-body/nostr-chat/message-item.js
index cc40b73..3a37793 100644
--- a/src/components/app-body/nostr-chat/message-item.js
+++ b/src/components/app-body/nostr-chat/message-item.js
@@ -3,17 +3,16 @@
*/
// Global npm libraries
-import React, { useEffect, useRef, useState } from 'react'
+import React, { useEffect, useState } from 'react'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faUser } from '@fortawesome/free-solid-svg-icons'
+import { Spinner } from 'react-bootstrap'
import NostrFormat from '../../app-body/nostr/nostr-format'
function MessageItem (props) {
const { message, profiles } = props
const [profile, setProfile] = useState(null)
- const msgRef = useRef(null)
-
// Format timestamp
const formatTime = (timestamp) => {
return new Date(timestamp).toLocaleTimeString([], {
@@ -29,17 +28,8 @@ function MessageItem (props) {
}
}, [profiles, message, profile])
- useEffect(() => {
- if (msgRef.current && message.latest) {
- msgRef.current.scrollIntoView({
- behavior: 'smooth',
- block: 'end'
- })
- }
- }, [message])
-
return (
-
+
{/* Message Content */}
- {!profile &&
{message.pubkey}}
+ {!profile &&
{message.pubkey}}
{profile && profile.name &&
{profile.name}}
{formatTime(message.created_at * 1000)}
diff --git a/src/components/app-body/nostr-chat/message-list.js b/src/components/app-body/nostr-chat/message-list.js
index 6a6beda..469624f 100644
--- a/src/components/app-body/nostr-chat/message-list.js
+++ b/src/components/app-body/nostr-chat/message-list.js
@@ -3,7 +3,7 @@
*/
// Global npm libraries
-import React, { useEffect, useState, useCallback } from 'react'
+import React, { useEffect, useState, useCallback, useRef } from 'react'
// Local libraries
import MessageItem from './message-item'
@@ -13,12 +13,11 @@ import { Spinner } from 'react-bootstrap'
function MessageList (props) {
const { messages, loadedMessages } = props
const [groupedMessages, setGroupedMessages] = useState([])
-
+ const msgContainerRef = useRef()
// Group messages by date
const groupMessagesByDate = useCallback((messages) => {
const grouped = {}
messages.forEach((message, i) => {
- if (i === messages.length - 1) message.latest = true
const date = new Date(message.created_at * 1000).toDateString()
if (!grouped[date]) {
grouped[date] = []
@@ -33,6 +32,18 @@ function MessageList (props) {
const grouped = groupMessagesByDate(messages)
setGroupedMessages(grouped)
+
+ // Scroll to end of the message container.
+ // Wait few seconds before load render.
+ setTimeout(() => {
+ if (msgContainerRef.current) {
+ msgContainerRef.current.scrollTo({
+ top: msgContainerRef.current.scrollHeight - msgContainerRef.current.clientHeight,
+ behavior: 'smooth'
+ })
+ msgContainerRef.current = null // scroll one time
+ }
+ }, 1000)
}, [messages, groupMessagesByDate])
return (
@@ -66,7 +77,7 @@ function MessageList (props) {
)}
{loadedMessages && messages && messages.length > 0 && (
-
+
{Object.entries(groupedMessages).map(([date, dateMessages]) => (
diff --git a/src/services/nostr-queries.js b/src/services/nostr-queries.js
index 7fc3508..e1f1af4 100644
--- a/src/services/nostr-queries.js
+++ b/src/services/nostr-queries.js
@@ -54,6 +54,7 @@ export default class NostrQueries {
relay.close()
})
pool.on('error', (relay) => {
+ console.log(`Error fetching ${pubHex} profile. relay connection error :${relay.url} `)
relay.close()
resolve(false)
})