重构组件样式系统为玻璃态设计风格并优化交互动效
Some checks failed
CI / Check / macos-latest (push) Has been cancelled
CI / Check / ubuntu-latest (push) Has been cancelled
CI / Check / windows-latest (push) Has been cancelled
CI / Test / macos-latest (push) Has been cancelled
CI / Test / ubuntu-latest (push) Has been cancelled
CI / Test / windows-latest (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Security Audit (push) Has been cancelled
CI / Secrets Scan (push) Has been cancelled
CI / Install Script Smoke Test (push) Has been cancelled

This commit is contained in:
iven
2026-03-01 18:24:02 +08:00
parent 810e32077e
commit 20093a6644
5 changed files with 2953 additions and 3706 deletions

View File

@@ -360,14 +360,25 @@ impl PresenceManager {
.clone();
// Check if user is already in another session
if let Some(existing_user) = self.users.get(&connection_id) {
if existing_user.session_id != session_id {
// Leave the previous session first
self.leave_session(connection_id)?;
} else {
// Already in this session
return Ok(existing_user.clone());
// Note: We need to clone the data and drop the reference before calling leave_session
// to avoid a deadlock with DashMap
let should_leave = {
let user_ref = self.users.get(&connection_id);
match user_ref {
Some(u) => {
if u.session_id == session_id {
// Already in this session - return the user
return Ok(u.clone());
}
true // Need to leave the old session
}
None => false
}
};
// user_ref is now dropped, we can safely call leave_session
if should_leave {
self.leave_session(connection_id)?;
}
// Check max participants
@@ -535,11 +546,11 @@ impl PresenceManager {
for mut entry in self.users.iter_mut() {
let user = entry.value_mut();
let elapsed = now.signed_duration_since(user.last_activity);
let elapsed_secs = elapsed.num_seconds() as u64;
let elapsed_ms = elapsed.num_milliseconds() as u128;
let new_status = if elapsed_secs > self.config.away_timeout.as_secs() {
let new_status = if elapsed_ms > self.config.away_timeout.as_millis() {
PresenceStatus::Away
} else if elapsed_secs > self.config.idle_timeout.as_secs() {
} else if elapsed_ms > self.config.idle_timeout.as_millis() {
PresenceStatus::Idle
} else {
PresenceStatus::Active
@@ -566,8 +577,9 @@ impl PresenceManager {
for entry in self.users.iter() {
let user = entry.value();
let elapsed = now.signed_duration_since(user.last_activity);
let elapsed_ms = elapsed.num_milliseconds() as u64;
if elapsed.num_seconds() as u64 > self.config.cleanup_timeout.as_secs() {
if u128::from(elapsed_ms) > self.config.cleanup_timeout.as_millis() {
removed.push(user.connection_id);
}
}