feat: Implement room login state management and enhance SAR message handling

This commit is contained in:
Janez T
2025-10-14 22:55:38 +02:00
parent fd54392d3c
commit 846cc9dce4
16 changed files with 2652 additions and 208 deletions

View File

@@ -0,0 +1,111 @@
import 'dart:typed_data';
/// Represents the login state for a room
class RoomLoginState {
final Uint8List publicKeyPrefix;
final bool isLoggedIn;
final bool isAdmin;
final int permissions;
final int? tag;
final DateTime? loginTime;
final bool hasPassword; // Whether we have a saved password
const RoomLoginState({
required this.publicKeyPrefix,
this.isLoggedIn = false,
this.isAdmin = false,
this.permissions = 0,
this.tag,
this.loginTime,
this.hasPassword = false,
});
/// Create a logged-in state
factory RoomLoginState.loggedIn({
required Uint8List publicKeyPrefix,
required int permissions,
required bool isAdmin,
required int tag,
required bool hasPassword,
}) {
return RoomLoginState(
publicKeyPrefix: publicKeyPrefix,
isLoggedIn: true,
isAdmin: isAdmin,
permissions: permissions,
tag: tag,
loginTime: DateTime.now(),
hasPassword: hasPassword,
);
}
/// Create a logged-out state
factory RoomLoginState.loggedOut({
required Uint8List publicKeyPrefix,
bool hasPassword = false,
}) {
return RoomLoginState(
publicKeyPrefix: publicKeyPrefix,
isLoggedIn: false,
hasPassword: hasPassword,
);
}
/// Copy with modified fields
RoomLoginState copyWith({
Uint8List? publicKeyPrefix,
bool? isLoggedIn,
bool? isAdmin,
int? permissions,
int? tag,
DateTime? loginTime,
bool? hasPassword,
}) {
return RoomLoginState(
publicKeyPrefix: publicKeyPrefix ?? this.publicKeyPrefix,
isLoggedIn: isLoggedIn ?? this.isLoggedIn,
isAdmin: isAdmin ?? this.isAdmin,
permissions: permissions ?? this.permissions,
tag: tag ?? this.tag,
loginTime: loginTime ?? this.loginTime,
hasPassword: hasPassword ?? this.hasPassword,
);
}
/// Get formatted public key prefix (e.g., "15:59:89:54:b4:d4")
String get publicKeyPrefixHex {
return publicKeyPrefix
.map((b) => b.toRadixString(16).padLeft(2, '0'))
.join(':');
}
/// Get login duration if logged in
Duration? get loginDuration {
if (!isLoggedIn || loginTime == null) return null;
return DateTime.now().difference(loginTime!);
}
/// Get formatted login duration (e.g., "2h 15m ago")
String? get loginDurationFormatted {
final duration = loginDuration;
if (duration == null) return null;
if (duration.inMinutes < 1) {
return 'just now';
} else if (duration.inMinutes < 60) {
return '${duration.inMinutes}m ago';
} else if (duration.inHours < 24) {
final hours = duration.inHours;
final minutes = duration.inMinutes % 60;
return minutes > 0 ? '${hours}h ${minutes}m ago' : '${hours}h ago';
} else {
final days = duration.inDays;
return '${days}d ago';
}
}
@override
String toString() {
return 'RoomLoginState(prefix: $publicKeyPrefixHex, loggedIn: $isLoggedIn, admin: $isAdmin, hasPassword: $hasPassword)';
}
}