mirror of
https://github.com/hicccc77/WeFlow.git
synced 2026-03-25 07:16:51 +00:00
一些更新
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
1
src/types/electron.d.ts
vendored
1
src/types/electron.d.ts
vendored
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user