4da36aa31d
Flutter Android client for FabledAssistant with: - Session-cookie auth via persistent cookie jar (Dio + cookie_jar) - OAuth/SSO login via in-app WebView (flutter_inappwebview) - Notes: list, detail (markdown render), create/edit - Tasks: list with status tabs, create/edit with priority - Chat: SSE streaming bubbles, conversation management - Quick Capture FAB for rapid note/task creation - Settings screen (change server URL, logout) - Android home screen widget → opens chat - Riverpod state management, go_router navigation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
40 lines
1.1 KiB
Dart
40 lines
1.1 KiB
Dart
enum MessageRole { user, assistant }
|
|
|
|
class Message {
|
|
final int? id;
|
|
final int conversationId;
|
|
final MessageRole role;
|
|
final String content;
|
|
final String status; // "complete" | "generating"
|
|
final DateTime? createdAt;
|
|
|
|
const Message({
|
|
this.id,
|
|
required this.conversationId,
|
|
required this.role,
|
|
required this.content,
|
|
this.status = 'complete',
|
|
this.createdAt,
|
|
});
|
|
|
|
factory Message.fromJson(Map<String, dynamic> json) => Message(
|
|
id: json['id'] as int?,
|
|
conversationId: json['conversation_id'] as int,
|
|
role: json['role'] == 'user' ? MessageRole.user : MessageRole.assistant,
|
|
content: json['content'] as String,
|
|
status: json['status'] as String? ?? 'complete',
|
|
createdAt: json['created_at'] != null
|
|
? DateTime.parse(json['created_at'] as String)
|
|
: null,
|
|
);
|
|
|
|
Message copyWith({String? content, String? status}) => Message(
|
|
id: id,
|
|
conversationId: conversationId,
|
|
role: role,
|
|
content: content ?? this.content,
|
|
status: status ?? this.status,
|
|
createdAt: createdAt,
|
|
);
|
|
}
|