一些更新

This commit is contained in:
cc
2026-03-15 20:28:46 +08:00
parent 5494490ff8
commit ef97202867
3 changed files with 44 additions and 38 deletions

View File

@@ -3045,13 +3045,15 @@
} }
.member-flag { .member-flag {
width: 18px;
height: 18px; height: 18px;
padding: 0 6px;
border-radius: 9999px; border-radius: 9999px;
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
font-size: 11px;
white-space: nowrap;
&.owner { &.owner {
color: #f59e0b; color: #f59e0b;
@@ -4702,10 +4704,9 @@
// 全局消息搜索结果面板 // 全局消息搜索结果面板
.global-msg-search-results { .global-msg-search-results {
max-height: 320px; flex: 1;
overflow-y: auto; overflow-y: auto;
background: var(--bg-primary); background: var(--bg-primary);
border-top: 1px solid var(--border-color);
.global-msg-searching, .global-msg-searching,
.global-msg-empty { .global-msg-empty {

View File

@@ -2691,6 +2691,7 @@ function ChatPage(props: ChatPageProps) {
setGlobalMsgResults([]) setGlobalMsgResults([])
} finally { } finally {
if (gen === globalMsgSearchGenRef.current) setGlobalMsgSearching(false) if (gen === globalMsgSearchGenRef.current) setGlobalMsgSearching(false)
setGlobalMsgSearching(false)
} }
}, 500) }, 500)
}, []) }, [])
@@ -2702,6 +2703,7 @@ function ChatPage(props: ChatPageProps) {
setGlobalMsgQuery('') setGlobalMsgQuery('')
setGlobalMsgResults([]) setGlobalMsgResults([])
setGlobalMsgSearching(false) setGlobalMsgSearching(false)
if (globalMsgSearchTimerRef.current) clearTimeout(globalMsgSearchTimerRef.current)
}, []) }, [])
// 滚动加载更多 + 显示/隐藏回到底部按钮(优化:节流,避免频繁执行) // 滚动加载更多 + 显示/隐藏回到底部按钮(优化:节流,避免频繁执行)
@@ -4003,44 +4005,11 @@ function ChatPage(props: ChatPageProps) {
<X size={12} /> <X size={12} />
</button> </button>
)} )}
{globalMsgSearching && <Loader2 size={12} className="spin" style={{ flexShrink: 0 }} />}
</div> </div>
<button className="icon-btn refresh-btn" onClick={handleRefresh} disabled={isLoadingSessions || isRefreshingSessions}> <button className="icon-btn refresh-btn" onClick={handleRefresh} disabled={isLoadingSessions || isRefreshingSessions}>
<RefreshCw size={16} className={(isLoadingSessions || isRefreshingSessions) ? 'spin' : ''} /> <RefreshCw size={16} className={(isLoadingSessions || isRefreshingSessions) ? 'spin' : ''} />
</button> </button>
</div> </div>
{/* 全局消息搜索结果面板 */}
{showGlobalMsgSearch && (
<div className="global-msg-search-results">
{globalMsgSearching && (
<div className="global-msg-searching"><Loader2 size={14} className="spin" /> ...</div>
)}
{!globalMsgSearching && globalMsgQuery && globalMsgResults.length === 0 && (
<div className="global-msg-empty"></div>
)}
{globalMsgResults.map((msg, i) => {
const sid = msg._session_id || msg.username || ''
const sessionObj = sessions.find(s => s.username === sid)
const sessionName = sessionObj?.displayName || sid || '未知会话'
const content = (msg.content || msg.strContent || msg.message_content || '').slice(0, 60)
const ts = msg.createTime || msg.create_time
const timeStr = ts ? new Date(ts * 1000).toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) : ''
return (
<div key={i} className="global-msg-result-item" onClick={() => {
if (sessionObj) {
handleSelectSession(sessionObj)
handleCloseGlobalMsgSearch()
setSearchKeyword('')
}
}}>
<div className="global-msg-result-session">{sessionName}</div>
<div className="global-msg-result-content">{content}</div>
<div className="global-msg-result-time">{timeStr}</div>
</div>
)
})}
</div>
)}
</div> </div>
{/* 折叠群 header */} {/* 折叠群 header */}
<div className="session-header-panel folded-header"> <div className="session-header-panel folded-header">
@@ -4079,6 +4048,39 @@ function ChatPage(props: ChatPageProps) {
</div> </div>
) : ( ) : (
<div className={`session-list-viewport ${foldedView ? 'folded' : ''}`}> <div className={`session-list-viewport ${foldedView ? 'folded' : ''}`}>
{/* 全局消息搜索结果 */}
{showGlobalMsgSearch ? (
<div className="global-msg-search-results">
{globalMsgSearching && (
<div className="global-msg-searching"><Loader2 size={14} className="spin" /> ...</div>
)}
{!globalMsgSearching && globalMsgQuery && globalMsgResults.length === 0 && (
<div className="global-msg-empty"></div>
)}
{!globalMsgSearching && globalMsgResults.map((msg, i) => {
const sid = msg._session_id || msg.username || ''
const sessionObj = sessions.find(s => s.username === sid)
const sessionName = sessionObj?.displayName || sid || '未知会话'
const content = (msg.content || msg.strContent || msg.message_content || '').slice(0, 60)
const ts = msg.createTime || msg.create_time
const timeStr = ts ? new Date(ts * 1000).toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) : ''
return (
<div key={i} className="global-msg-result-item" onClick={() => {
if (sessionObj) {
handleSelectSession(sessionObj)
handleCloseGlobalMsgSearch()
setSearchKeyword('')
}
}}>
<div className="global-msg-result-session">{sessionName}</div>
<div className="global-msg-result-content">{content}</div>
<div className="global-msg-result-time">{timeStr}</div>
</div>
)
})}
</div>
) : (
<>
{/* 普通会话列表 */} {/* 普通会话列表 */}
<div className="session-list-panel main-panel"> <div className="session-list-panel main-panel">
{Array.isArray(filteredSessions) && filteredSessions.length > 0 ? ( {Array.isArray(filteredSessions) && filteredSessions.length > 0 ? (
@@ -4136,6 +4138,8 @@ function ChatPage(props: ChatPageProps) {
</div> </div>
)} )}
</div> </div>
</>
)}
</div> </div>
)} )}
@@ -4515,12 +4519,12 @@ function ChatPage(props: ChatPageProps) {
<div className="group-member-badges"> <div className="group-member-badges">
{member.isOwner && ( {member.isOwner && (
<span className="member-flag owner" title="群主"> <span className="member-flag owner" title="群主">
<Crown size={12} />
</span> </span>
)} )}
{member.isFriend && ( {member.isFriend && (
<span className="member-flag friend" title="好友"> <span className="member-flag friend" title="好友">
<UserCheck size={12} />
</span> </span>
)} )}
</div> </div>

View File

@@ -221,6 +221,7 @@ export interface ElectronAPI {
}> }>
getMyAvatarUrl: () => Promise<{ success: boolean; avatarUrl?: string; error?: string }> getMyAvatarUrl: () => Promise<{ success: boolean; avatarUrl?: string; error?: string }>
downloadEmoji: (cdnUrl: string, md5?: string) => Promise<{ success: boolean; localPath?: string; error?: string }> downloadEmoji: (cdnUrl: string, md5?: string) => Promise<{ success: boolean; localPath?: string; error?: string }>
searchMessages: (keyword: string, sessionId?: string, limit?: number, offset?: number, beginTimestamp?: number, endTimestamp?: number) => Promise<{ success: boolean; messages?: Message[]; error?: string }>
close: () => Promise<boolean> close: () => Promise<boolean>
getSessionDetail: (sessionId: string) => Promise<{ getSessionDetail: (sessionId: string) => Promise<{
success: boolean success: boolean