💄 Optimize (idk what i did)
This commit is contained in:
@ -1,5 +1,6 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
@ -499,9 +500,38 @@ class ChatMessageController extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
Timer? _readEventDebounce;
|
||||
int? _readEventAnchor;
|
||||
|
||||
void readEvent(int id) {
|
||||
if (_readEventAnchor != null) {
|
||||
_readEventAnchor = math.max(_readEventAnchor!, id);
|
||||
} else {
|
||||
_readEventAnchor = id;
|
||||
}
|
||||
if (_readEventDebounce?.isActive ?? false) {
|
||||
_readEventDebounce?.cancel();
|
||||
}
|
||||
|
||||
_readEventDebounce = Timer(const Duration(milliseconds: 500), () {
|
||||
_ws.conn?.sink.add(jsonEncode(
|
||||
WebSocketPackage(
|
||||
method: 'events.read',
|
||||
endpoint: 'im',
|
||||
payload: {
|
||||
'channel_member_id': profile!.id,
|
||||
'event_id': _readEventAnchor,
|
||||
},
|
||||
).toJson(),
|
||||
));
|
||||
log('[Messaging] Send read event request: $_readEventAnchor');
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_wsSubscription?.cancel();
|
||||
_readEventDebounce?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ class NotificationProvider extends ChangeNotifier {
|
||||
showingCount++;
|
||||
showingTrayCount++;
|
||||
notifications.add(notification);
|
||||
Future.delayed(const Duration(seconds: 3), () {
|
||||
Future.delayed(const Duration(seconds: 5), () {
|
||||
if (showingCount >= 0) showingCount--;
|
||||
notifyListeners();
|
||||
});
|
||||
|
@ -39,7 +39,8 @@ class ChatRoomScreen extends StatefulWidget {
|
||||
final String alias;
|
||||
final ChatRoomScreenExtra? extra;
|
||||
|
||||
const ChatRoomScreen({super.key, required this.scope, required this.alias, this.extra});
|
||||
const ChatRoomScreen(
|
||||
{super.key, required this.scope, required this.alias, this.extra});
|
||||
|
||||
@override
|
||||
State<ChatRoomScreen> createState() => _ChatRoomScreenState();
|
||||
@ -192,10 +193,12 @@ class _ChatRoomScreenState extends State<ChatRoomScreen> {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
log('[ChatInput] Setting initial text and attachments...');
|
||||
if (widget.extra!.initialText != null) {
|
||||
_inputGlobalKey.currentState?.setInitialText(widget.extra!.initialText!);
|
||||
_inputGlobalKey.currentState
|
||||
?.setInitialText(widget.extra!.initialText!);
|
||||
}
|
||||
if (widget.extra!.initialAttachments != null) {
|
||||
_inputGlobalKey.currentState?.setInitialAttachments(widget.extra!.initialAttachments!);
|
||||
_inputGlobalKey.currentState
|
||||
?.setInitialAttachments(widget.extra!.initialAttachments!);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -241,12 +244,15 @@ class _ChatRoomScreenState extends State<ChatRoomScreen> {
|
||||
appBar: AppBar(
|
||||
title: Text(
|
||||
_channel?.type == 1
|
||||
? ud.getAccountFromCache(_otherMember?.accountId)?.nick ?? _channel!.name
|
||||
? ud.getAccountFromCache(_otherMember?.accountId)?.nick ??
|
||||
_channel!.name
|
||||
: _channel?.name ?? 'loading'.tr(),
|
||||
),
|
||||
actions: [
|
||||
IconButton(
|
||||
icon: _ongoingCall == null ? const Icon(Symbols.call) : const Icon(Symbols.call_end),
|
||||
icon: _ongoingCall == null
|
||||
? const Icon(Symbols.call)
|
||||
: const Icon(Symbols.call_end),
|
||||
onPressed: _isCalling
|
||||
? null
|
||||
: _ongoingCall == null
|
||||
@ -296,9 +302,9 @@ class _ChatRoomScreenState extends State<ChatRoomScreen> {
|
||||
)
|
||||
],
|
||||
),
|
||||
)
|
||||
.height(_ongoingCall != null ? 54 : 0, animate: true)
|
||||
.animate(const Duration(milliseconds: 300), Curves.fastLinearToSlowEaseIn),
|
||||
).height(_ongoingCall != null ? 54 : 0, animate: true).animate(
|
||||
const Duration(milliseconds: 300),
|
||||
Curves.fastLinearToSlowEaseIn),
|
||||
if (_messageController.isPending)
|
||||
Expanded(
|
||||
child: const CircularProgressIndicator().center(),
|
||||
@ -316,6 +322,7 @@ class _ChatRoomScreenState extends State<ChatRoomScreen> {
|
||||
},
|
||||
itemBuilder: (context, idx) {
|
||||
final message = _messageController.messages[idx];
|
||||
_messageController.readEvent(message.id);
|
||||
|
||||
bool canMerge = false, canMergePrevious = false;
|
||||
if (idx > 0) {
|
||||
@ -337,7 +344,8 @@ class _ChatRoomScreenState extends State<ChatRoomScreen> {
|
||||
data: message,
|
||||
isMerged: canMerge,
|
||||
hasMerged: canMergePrevious,
|
||||
isPending: _messageController.unconfirmedMessages.contains(message.uuid),
|
||||
isPending: _messageController.unconfirmedMessages
|
||||
.contains(message.uuid),
|
||||
onReply: (value) {
|
||||
_inputGlobalKey.currentState?.setReply(value);
|
||||
},
|
||||
|
@ -17,6 +17,7 @@ import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
import 'package:surface/providers/config.dart';
|
||||
import 'package:surface/providers/database.dart';
|
||||
import 'package:surface/providers/notification.dart';
|
||||
import 'package:surface/providers/sn_network.dart';
|
||||
import 'package:surface/providers/theme.dart';
|
||||
import 'package:surface/theme.dart';
|
||||
@ -562,6 +563,18 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Symbols.notifications),
|
||||
title: Text('settingsEnablePushNotifications').tr(),
|
||||
subtitle:
|
||||
Text('settingsEnablePushNotificationsDescription').tr(),
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 24),
|
||||
trailing: const Icon(Symbols.chevron_right),
|
||||
onTap: () {
|
||||
final nty = context.read<NotificationProvider>();
|
||||
nty.registerPushNotifications();
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
title: Text('settingsMiscAbout').tr(),
|
||||
subtitle: Text('settingsMiscAboutDescription').tr(),
|
||||
|
@ -1,5 +1,4 @@
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
|
||||
part 'account.freezed.dart';
|
||||
part 'account.g.dart';
|
||||
|
@ -20,7 +20,6 @@ SnAccount _$SnAccountFromJson(Map<String, dynamic> json) {
|
||||
|
||||
/// @nodoc
|
||||
mixin _$SnAccount {
|
||||
@HiveField(0)
|
||||
int get id => throw _privateConstructorUsedError;
|
||||
DateTime get createdAt => throw _privateConstructorUsedError;
|
||||
DateTime get updatedAt => throw _privateConstructorUsedError;
|
||||
@ -403,7 +402,6 @@ class _$SnAccountImpl extends _SnAccount {
|
||||
_$$SnAccountImplFromJson(json);
|
||||
|
||||
@override
|
||||
@HiveField(0)
|
||||
final int id;
|
||||
@override
|
||||
final DateTime createdAt;
|
||||
@ -582,7 +580,6 @@ abstract class _SnAccount extends SnAccount {
|
||||
_$SnAccountImpl.fromJson;
|
||||
|
||||
@override
|
||||
@HiveField(0)
|
||||
int get id;
|
||||
@override
|
||||
DateTime get createdAt;
|
||||
|
@ -1,5 +1,4 @@
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:livekit_client/livekit_client.dart';
|
||||
import 'package:surface/types/account.dart';
|
||||
import 'package:surface/types/attachment.dart';
|
||||
@ -12,7 +11,6 @@ part 'chat.g.dart';
|
||||
class SnChannel with _$SnChannel {
|
||||
const SnChannel._();
|
||||
|
||||
@HiveType(typeId: 2)
|
||||
const factory SnChannel({
|
||||
required int id,
|
||||
required DateTime createdAt,
|
||||
@ -42,7 +40,6 @@ class SnChannel with _$SnChannel {
|
||||
class SnChannelMember with _$SnChannelMember {
|
||||
const SnChannelMember._();
|
||||
|
||||
@HiveType(typeId: 3)
|
||||
const factory SnChannelMember({
|
||||
required int id,
|
||||
required DateTime createdAt,
|
||||
@ -67,7 +64,6 @@ class SnChannelMember with _$SnChannelMember {
|
||||
class SnChatMessage with _$SnChatMessage {
|
||||
const SnChatMessage._();
|
||||
|
||||
@HiveType(typeId: 4)
|
||||
const factory SnChatMessage({
|
||||
required int id,
|
||||
required DateTime createdAt,
|
||||
|
@ -20,34 +20,20 @@ SnChannel _$SnChannelFromJson(Map<String, dynamic> json) {
|
||||
|
||||
/// @nodoc
|
||||
mixin _$SnChannel {
|
||||
@HiveField(0)
|
||||
int get id => throw _privateConstructorUsedError;
|
||||
@HiveField(1)
|
||||
DateTime get createdAt => throw _privateConstructorUsedError;
|
||||
@HiveField(2)
|
||||
DateTime get updatedAt => throw _privateConstructorUsedError;
|
||||
@HiveField(3)
|
||||
dynamic get deletedAt => throw _privateConstructorUsedError;
|
||||
@HiveField(4)
|
||||
String get alias => throw _privateConstructorUsedError;
|
||||
@HiveField(5)
|
||||
String get name => throw _privateConstructorUsedError;
|
||||
@HiveField(6)
|
||||
String get description => throw _privateConstructorUsedError;
|
||||
@HiveField(7)
|
||||
List<SnChannelMember>? get members => throw _privateConstructorUsedError;
|
||||
List<SnChatMessage>? get messages => throw _privateConstructorUsedError;
|
||||
@HiveField(8)
|
||||
int get type => throw _privateConstructorUsedError;
|
||||
@HiveField(9)
|
||||
int get accountId => throw _privateConstructorUsedError;
|
||||
@HiveField(10)
|
||||
SnRealm? get realm => throw _privateConstructorUsedError;
|
||||
@HiveField(11)
|
||||
int? get realmId => throw _privateConstructorUsedError;
|
||||
@HiveField(12)
|
||||
bool get isPublic => throw _privateConstructorUsedError;
|
||||
@HiveField(13)
|
||||
bool get isCommunity => throw _privateConstructorUsedError;
|
||||
|
||||
/// Serializes this SnChannel to a JSON map.
|
||||
@ -320,7 +306,6 @@ class __$$SnChannelImplCopyWithImpl<$Res>
|
||||
|
||||
/// @nodoc
|
||||
@JsonSerializable()
|
||||
@HiveType(typeId: 2)
|
||||
class _$SnChannelImpl extends _SnChannel {
|
||||
const _$SnChannelImpl(
|
||||
{required this.id,
|
||||
@ -346,29 +331,21 @@ class _$SnChannelImpl extends _SnChannel {
|
||||
_$$SnChannelImplFromJson(json);
|
||||
|
||||
@override
|
||||
@HiveField(0)
|
||||
final int id;
|
||||
@override
|
||||
@HiveField(1)
|
||||
final DateTime createdAt;
|
||||
@override
|
||||
@HiveField(2)
|
||||
final DateTime updatedAt;
|
||||
@override
|
||||
@HiveField(3)
|
||||
final dynamic deletedAt;
|
||||
@override
|
||||
@HiveField(4)
|
||||
final String alias;
|
||||
@override
|
||||
@HiveField(5)
|
||||
final String name;
|
||||
@override
|
||||
@HiveField(6)
|
||||
final String description;
|
||||
final List<SnChannelMember>? _members;
|
||||
@override
|
||||
@HiveField(7)
|
||||
List<SnChannelMember>? get members {
|
||||
final value = _members;
|
||||
if (value == null) return null;
|
||||
@ -388,22 +365,16 @@ class _$SnChannelImpl extends _SnChannel {
|
||||
}
|
||||
|
||||
@override
|
||||
@HiveField(8)
|
||||
final int type;
|
||||
@override
|
||||
@HiveField(9)
|
||||
final int accountId;
|
||||
@override
|
||||
@HiveField(10)
|
||||
final SnRealm? realm;
|
||||
@override
|
||||
@HiveField(11)
|
||||
final int? realmId;
|
||||
@override
|
||||
@HiveField(12)
|
||||
final bool isPublic;
|
||||
@override
|
||||
@HiveField(13)
|
||||
final bool isCommunity;
|
||||
|
||||
@override
|
||||
@ -498,48 +469,34 @@ abstract class _SnChannel extends SnChannel {
|
||||
_$SnChannelImpl.fromJson;
|
||||
|
||||
@override
|
||||
@HiveField(0)
|
||||
int get id;
|
||||
@override
|
||||
@HiveField(1)
|
||||
DateTime get createdAt;
|
||||
@override
|
||||
@HiveField(2)
|
||||
DateTime get updatedAt;
|
||||
@override
|
||||
@HiveField(3)
|
||||
dynamic get deletedAt;
|
||||
@override
|
||||
@HiveField(4)
|
||||
String get alias;
|
||||
@override
|
||||
@HiveField(5)
|
||||
String get name;
|
||||
@override
|
||||
@HiveField(6)
|
||||
String get description;
|
||||
@override
|
||||
@HiveField(7)
|
||||
List<SnChannelMember>? get members;
|
||||
@override
|
||||
List<SnChatMessage>? get messages;
|
||||
@override
|
||||
@HiveField(8)
|
||||
int get type;
|
||||
@override
|
||||
@HiveField(9)
|
||||
int get accountId;
|
||||
@override
|
||||
@HiveField(10)
|
||||
SnRealm? get realm;
|
||||
@override
|
||||
@HiveField(11)
|
||||
int? get realmId;
|
||||
@override
|
||||
@HiveField(12)
|
||||
bool get isPublic;
|
||||
@override
|
||||
@HiveField(13)
|
||||
bool get isCommunity;
|
||||
|
||||
/// Create a copy of SnChannel
|
||||
@ -556,26 +513,16 @@ SnChannelMember _$SnChannelMemberFromJson(Map<String, dynamic> json) {
|
||||
|
||||
/// @nodoc
|
||||
mixin _$SnChannelMember {
|
||||
@HiveField(0)
|
||||
int get id => throw _privateConstructorUsedError;
|
||||
@HiveField(1)
|
||||
DateTime get createdAt => throw _privateConstructorUsedError;
|
||||
@HiveField(2)
|
||||
DateTime get updatedAt => throw _privateConstructorUsedError;
|
||||
@HiveField(3)
|
||||
DateTime? get deletedAt => throw _privateConstructorUsedError;
|
||||
@HiveField(4)
|
||||
int get channelId => throw _privateConstructorUsedError;
|
||||
@HiveField(5)
|
||||
int get accountId => throw _privateConstructorUsedError;
|
||||
@HiveField(6)
|
||||
String? get nick => throw _privateConstructorUsedError;
|
||||
@HiveField(7)
|
||||
SnChannel? get channel => throw _privateConstructorUsedError;
|
||||
@HiveField(8)
|
||||
SnAccount? get account => throw _privateConstructorUsedError;
|
||||
int get notify => throw _privateConstructorUsedError;
|
||||
@HiveField(9)
|
||||
int get powerLevel => throw _privateConstructorUsedError;
|
||||
dynamic get calls => throw _privateConstructorUsedError;
|
||||
dynamic get events => throw _privateConstructorUsedError;
|
||||
@ -844,7 +791,6 @@ class __$$SnChannelMemberImplCopyWithImpl<$Res>
|
||||
|
||||
/// @nodoc
|
||||
@JsonSerializable()
|
||||
@HiveType(typeId: 3)
|
||||
class _$SnChannelMemberImpl extends _SnChannelMember {
|
||||
const _$SnChannelMemberImpl(
|
||||
{required this.id,
|
||||
@ -866,37 +812,27 @@ class _$SnChannelMemberImpl extends _SnChannelMember {
|
||||
_$$SnChannelMemberImplFromJson(json);
|
||||
|
||||
@override
|
||||
@HiveField(0)
|
||||
final int id;
|
||||
@override
|
||||
@HiveField(1)
|
||||
final DateTime createdAt;
|
||||
@override
|
||||
@HiveField(2)
|
||||
final DateTime updatedAt;
|
||||
@override
|
||||
@HiveField(3)
|
||||
final DateTime? deletedAt;
|
||||
@override
|
||||
@HiveField(4)
|
||||
final int channelId;
|
||||
@override
|
||||
@HiveField(5)
|
||||
final int accountId;
|
||||
@override
|
||||
@HiveField(6)
|
||||
final String? nick;
|
||||
@override
|
||||
@HiveField(7)
|
||||
final SnChannel? channel;
|
||||
@override
|
||||
@HiveField(8)
|
||||
final SnAccount? account;
|
||||
@override
|
||||
@JsonKey()
|
||||
final int notify;
|
||||
@override
|
||||
@HiveField(9)
|
||||
final int powerLevel;
|
||||
@override
|
||||
final dynamic calls;
|
||||
@ -990,36 +926,26 @@ abstract class _SnChannelMember extends SnChannelMember {
|
||||
_$SnChannelMemberImpl.fromJson;
|
||||
|
||||
@override
|
||||
@HiveField(0)
|
||||
int get id;
|
||||
@override
|
||||
@HiveField(1)
|
||||
DateTime get createdAt;
|
||||
@override
|
||||
@HiveField(2)
|
||||
DateTime get updatedAt;
|
||||
@override
|
||||
@HiveField(3)
|
||||
DateTime? get deletedAt;
|
||||
@override
|
||||
@HiveField(4)
|
||||
int get channelId;
|
||||
@override
|
||||
@HiveField(5)
|
||||
int get accountId;
|
||||
@override
|
||||
@HiveField(6)
|
||||
String? get nick;
|
||||
@override
|
||||
@HiveField(7)
|
||||
SnChannel? get channel;
|
||||
@override
|
||||
@HiveField(8)
|
||||
SnAccount? get account;
|
||||
@override
|
||||
int get notify;
|
||||
@override
|
||||
@HiveField(9)
|
||||
int get powerLevel;
|
||||
@override
|
||||
dynamic get calls;
|
||||
@ -1040,31 +966,18 @@ SnChatMessage _$SnChatMessageFromJson(Map<String, dynamic> json) {
|
||||
|
||||
/// @nodoc
|
||||
mixin _$SnChatMessage {
|
||||
@HiveField(0)
|
||||
int get id => throw _privateConstructorUsedError;
|
||||
@HiveField(1)
|
||||
DateTime get createdAt => throw _privateConstructorUsedError;
|
||||
@HiveField(2)
|
||||
DateTime get updatedAt => throw _privateConstructorUsedError;
|
||||
@HiveField(3)
|
||||
DateTime? get deletedAt => throw _privateConstructorUsedError;
|
||||
@HiveField(4)
|
||||
String get uuid => throw _privateConstructorUsedError;
|
||||
@HiveField(5)
|
||||
Map<String, dynamic> get body => throw _privateConstructorUsedError;
|
||||
@HiveField(6)
|
||||
String get type => throw _privateConstructorUsedError;
|
||||
@HiveField(7)
|
||||
SnChannel get channel => throw _privateConstructorUsedError;
|
||||
@HiveField(8)
|
||||
SnChannelMember get sender => throw _privateConstructorUsedError;
|
||||
@HiveField(9)
|
||||
int get channelId => throw _privateConstructorUsedError;
|
||||
@HiveField(10)
|
||||
int get senderId => throw _privateConstructorUsedError;
|
||||
@HiveField(11)
|
||||
int? get quoteEventId => throw _privateConstructorUsedError;
|
||||
@HiveField(12)
|
||||
int? get relatedEventId => throw _privateConstructorUsedError;
|
||||
SnChatMessagePreload? get preload => throw _privateConstructorUsedError;
|
||||
|
||||
@ -1353,7 +1266,6 @@ class __$$SnChatMessageImplCopyWithImpl<$Res>
|
||||
|
||||
/// @nodoc
|
||||
@JsonSerializable()
|
||||
@HiveType(typeId: 4)
|
||||
class _$SnChatMessageImpl extends _SnChatMessage {
|
||||
const _$SnChatMessageImpl(
|
||||
{required this.id,
|
||||
@ -1377,24 +1289,18 @@ class _$SnChatMessageImpl extends _SnChatMessage {
|
||||
_$$SnChatMessageImplFromJson(json);
|
||||
|
||||
@override
|
||||
@HiveField(0)
|
||||
final int id;
|
||||
@override
|
||||
@HiveField(1)
|
||||
final DateTime createdAt;
|
||||
@override
|
||||
@HiveField(2)
|
||||
final DateTime updatedAt;
|
||||
@override
|
||||
@HiveField(3)
|
||||
final DateTime? deletedAt;
|
||||
@override
|
||||
@HiveField(4)
|
||||
final String uuid;
|
||||
final Map<String, dynamic> _body;
|
||||
@override
|
||||
@JsonKey()
|
||||
@HiveField(5)
|
||||
Map<String, dynamic> get body {
|
||||
if (_body is EqualUnmodifiableMapView) return _body;
|
||||
// ignore: implicit_dynamic_type
|
||||
@ -1402,25 +1308,18 @@ class _$SnChatMessageImpl extends _SnChatMessage {
|
||||
}
|
||||
|
||||
@override
|
||||
@HiveField(6)
|
||||
final String type;
|
||||
@override
|
||||
@HiveField(7)
|
||||
final SnChannel channel;
|
||||
@override
|
||||
@HiveField(8)
|
||||
final SnChannelMember sender;
|
||||
@override
|
||||
@HiveField(9)
|
||||
final int channelId;
|
||||
@override
|
||||
@HiveField(10)
|
||||
final int senderId;
|
||||
@override
|
||||
@HiveField(11)
|
||||
final int? quoteEventId;
|
||||
@override
|
||||
@HiveField(12)
|
||||
final int? relatedEventId;
|
||||
@override
|
||||
final SnChatMessagePreload? preload;
|
||||
@ -1515,43 +1414,30 @@ abstract class _SnChatMessage extends SnChatMessage {
|
||||
_$SnChatMessageImpl.fromJson;
|
||||
|
||||
@override
|
||||
@HiveField(0)
|
||||
int get id;
|
||||
@override
|
||||
@HiveField(1)
|
||||
DateTime get createdAt;
|
||||
@override
|
||||
@HiveField(2)
|
||||
DateTime get updatedAt;
|
||||
@override
|
||||
@HiveField(3)
|
||||
DateTime? get deletedAt;
|
||||
@override
|
||||
@HiveField(4)
|
||||
String get uuid;
|
||||
@override
|
||||
@HiveField(5)
|
||||
Map<String, dynamic> get body;
|
||||
@override
|
||||
@HiveField(6)
|
||||
String get type;
|
||||
@override
|
||||
@HiveField(7)
|
||||
SnChannel get channel;
|
||||
@override
|
||||
@HiveField(8)
|
||||
SnChannelMember get sender;
|
||||
@override
|
||||
@HiveField(9)
|
||||
int get channelId;
|
||||
@override
|
||||
@HiveField(10)
|
||||
int get senderId;
|
||||
@override
|
||||
@HiveField(11)
|
||||
int? get quoteEventId;
|
||||
@override
|
||||
@HiveField(12)
|
||||
int? get relatedEventId;
|
||||
@override
|
||||
SnChatMessagePreload? get preload;
|
||||
|
@ -2,214 +2,6 @@
|
||||
|
||||
part of 'chat.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// TypeAdapterGenerator
|
||||
// **************************************************************************
|
||||
|
||||
class SnChannelImplAdapter extends TypeAdapter<_$SnChannelImpl> {
|
||||
@override
|
||||
final int typeId = 2;
|
||||
|
||||
@override
|
||||
_$SnChannelImpl read(BinaryReader reader) {
|
||||
final numOfFields = reader.readByte();
|
||||
final fields = <int, dynamic>{
|
||||
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
||||
};
|
||||
return _$SnChannelImpl(
|
||||
id: fields[0] as int,
|
||||
createdAt: fields[1] as DateTime,
|
||||
updatedAt: fields[2] as DateTime,
|
||||
deletedAt: fields[3] as dynamic,
|
||||
alias: fields[4] as String,
|
||||
name: fields[5] as String,
|
||||
description: fields[6] as String,
|
||||
members: (fields[7] as List?)?.cast<SnChannelMember>(),
|
||||
type: fields[8] as int,
|
||||
accountId: fields[9] as int,
|
||||
realm: fields[10] as SnRealm?,
|
||||
realmId: fields[11] as int?,
|
||||
isPublic: fields[12] as bool,
|
||||
isCommunity: fields[13] as bool,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void write(BinaryWriter writer, _$SnChannelImpl obj) {
|
||||
writer
|
||||
..writeByte(14)
|
||||
..writeByte(0)
|
||||
..write(obj.id)
|
||||
..writeByte(1)
|
||||
..write(obj.createdAt)
|
||||
..writeByte(2)
|
||||
..write(obj.updatedAt)
|
||||
..writeByte(3)
|
||||
..write(obj.deletedAt)
|
||||
..writeByte(4)
|
||||
..write(obj.alias)
|
||||
..writeByte(5)
|
||||
..write(obj.name)
|
||||
..writeByte(6)
|
||||
..write(obj.description)
|
||||
..writeByte(8)
|
||||
..write(obj.type)
|
||||
..writeByte(9)
|
||||
..write(obj.accountId)
|
||||
..writeByte(10)
|
||||
..write(obj.realm)
|
||||
..writeByte(11)
|
||||
..write(obj.realmId)
|
||||
..writeByte(12)
|
||||
..write(obj.isPublic)
|
||||
..writeByte(13)
|
||||
..write(obj.isCommunity)
|
||||
..writeByte(7)
|
||||
..write(obj.members);
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => typeId.hashCode;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
identical(this, other) ||
|
||||
other is SnChannelImplAdapter &&
|
||||
runtimeType == other.runtimeType &&
|
||||
typeId == other.typeId;
|
||||
}
|
||||
|
||||
class SnChannelMemberImplAdapter extends TypeAdapter<_$SnChannelMemberImpl> {
|
||||
@override
|
||||
final int typeId = 3;
|
||||
|
||||
@override
|
||||
_$SnChannelMemberImpl read(BinaryReader reader) {
|
||||
final numOfFields = reader.readByte();
|
||||
final fields = <int, dynamic>{
|
||||
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
||||
};
|
||||
return _$SnChannelMemberImpl(
|
||||
id: fields[0] as int,
|
||||
createdAt: fields[1] as DateTime,
|
||||
updatedAt: fields[2] as DateTime,
|
||||
deletedAt: fields[3] as DateTime?,
|
||||
channelId: fields[4] as int,
|
||||
accountId: fields[5] as int,
|
||||
nick: fields[6] as String?,
|
||||
channel: fields[7] as SnChannel?,
|
||||
account: fields[8] as SnAccount?,
|
||||
powerLevel: fields[9] as int,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void write(BinaryWriter writer, _$SnChannelMemberImpl obj) {
|
||||
writer
|
||||
..writeByte(10)
|
||||
..writeByte(0)
|
||||
..write(obj.id)
|
||||
..writeByte(1)
|
||||
..write(obj.createdAt)
|
||||
..writeByte(2)
|
||||
..write(obj.updatedAt)
|
||||
..writeByte(3)
|
||||
..write(obj.deletedAt)
|
||||
..writeByte(4)
|
||||
..write(obj.channelId)
|
||||
..writeByte(5)
|
||||
..write(obj.accountId)
|
||||
..writeByte(6)
|
||||
..write(obj.nick)
|
||||
..writeByte(7)
|
||||
..write(obj.channel)
|
||||
..writeByte(8)
|
||||
..write(obj.account)
|
||||
..writeByte(9)
|
||||
..write(obj.powerLevel);
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => typeId.hashCode;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
identical(this, other) ||
|
||||
other is SnChannelMemberImplAdapter &&
|
||||
runtimeType == other.runtimeType &&
|
||||
typeId == other.typeId;
|
||||
}
|
||||
|
||||
class SnChatMessageImplAdapter extends TypeAdapter<_$SnChatMessageImpl> {
|
||||
@override
|
||||
final int typeId = 4;
|
||||
|
||||
@override
|
||||
_$SnChatMessageImpl read(BinaryReader reader) {
|
||||
final numOfFields = reader.readByte();
|
||||
final fields = <int, dynamic>{
|
||||
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
||||
};
|
||||
return _$SnChatMessageImpl(
|
||||
id: fields[0] as int,
|
||||
createdAt: fields[1] as DateTime,
|
||||
updatedAt: fields[2] as DateTime,
|
||||
deletedAt: fields[3] as DateTime?,
|
||||
uuid: fields[4] as String,
|
||||
body: (fields[5] as Map).cast<String, dynamic>(),
|
||||
type: fields[6] as String,
|
||||
channel: fields[7] as SnChannel,
|
||||
sender: fields[8] as SnChannelMember,
|
||||
channelId: fields[9] as int,
|
||||
senderId: fields[10] as int,
|
||||
quoteEventId: fields[11] as int?,
|
||||
relatedEventId: fields[12] as int?,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void write(BinaryWriter writer, _$SnChatMessageImpl obj) {
|
||||
writer
|
||||
..writeByte(13)
|
||||
..writeByte(0)
|
||||
..write(obj.id)
|
||||
..writeByte(1)
|
||||
..write(obj.createdAt)
|
||||
..writeByte(2)
|
||||
..write(obj.updatedAt)
|
||||
..writeByte(3)
|
||||
..write(obj.deletedAt)
|
||||
..writeByte(4)
|
||||
..write(obj.uuid)
|
||||
..writeByte(6)
|
||||
..write(obj.type)
|
||||
..writeByte(7)
|
||||
..write(obj.channel)
|
||||
..writeByte(8)
|
||||
..write(obj.sender)
|
||||
..writeByte(9)
|
||||
..write(obj.channelId)
|
||||
..writeByte(10)
|
||||
..write(obj.senderId)
|
||||
..writeByte(11)
|
||||
..write(obj.quoteEventId)
|
||||
..writeByte(12)
|
||||
..write(obj.relatedEventId)
|
||||
..writeByte(5)
|
||||
..write(obj.body);
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => typeId.hashCode;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
identical(this, other) ||
|
||||
other is SnChatMessageImplAdapter &&
|
||||
runtimeType == other.runtimeType &&
|
||||
typeId == other.typeId;
|
||||
}
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
@ -1,5 +1,4 @@
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:surface/types/account.dart';
|
||||
|
||||
part 'realm.freezed.dart';
|
||||
@ -27,7 +26,6 @@ class SnRealmMember with _$SnRealmMember {
|
||||
class SnRealm with _$SnRealm {
|
||||
const SnRealm._();
|
||||
|
||||
@HiveType(typeId: 1)
|
||||
const factory SnRealm({
|
||||
required int id,
|
||||
required DateTime createdAt,
|
||||
|
@ -367,32 +367,19 @@ SnRealm _$SnRealmFromJson(Map<String, dynamic> json) {
|
||||
|
||||
/// @nodoc
|
||||
mixin _$SnRealm {
|
||||
@HiveField(0)
|
||||
int get id => throw _privateConstructorUsedError;
|
||||
@HiveField(1)
|
||||
DateTime get createdAt => throw _privateConstructorUsedError;
|
||||
@HiveField(2)
|
||||
DateTime get updatedAt => throw _privateConstructorUsedError;
|
||||
@HiveField(3)
|
||||
DateTime? get deletedAt => throw _privateConstructorUsedError;
|
||||
@HiveField(4)
|
||||
String get alias => throw _privateConstructorUsedError;
|
||||
@HiveField(5)
|
||||
String get name => throw _privateConstructorUsedError;
|
||||
@HiveField(6)
|
||||
String get description => throw _privateConstructorUsedError;
|
||||
List<SnRealmMember>? get members => throw _privateConstructorUsedError;
|
||||
@HiveField(7)
|
||||
String? get avatar => throw _privateConstructorUsedError;
|
||||
@HiveField(8)
|
||||
String? get banner => throw _privateConstructorUsedError;
|
||||
@HiveField(9)
|
||||
Map<String, dynamic>? get accessPolicy => throw _privateConstructorUsedError;
|
||||
@HiveField(10)
|
||||
int get accountId => throw _privateConstructorUsedError;
|
||||
@HiveField(11)
|
||||
bool get isPublic => throw _privateConstructorUsedError;
|
||||
@HiveField(12)
|
||||
bool get isCommunity => throw _privateConstructorUsedError;
|
||||
int get popularity => throw _privateConstructorUsedError;
|
||||
|
||||
@ -645,7 +632,6 @@ class __$$SnRealmImplCopyWithImpl<$Res>
|
||||
|
||||
/// @nodoc
|
||||
@JsonSerializable()
|
||||
@HiveType(typeId: 1)
|
||||
class _$SnRealmImpl extends _SnRealm {
|
||||
const _$SnRealmImpl(
|
||||
{required this.id,
|
||||
@ -671,25 +657,18 @@ class _$SnRealmImpl extends _SnRealm {
|
||||
_$$SnRealmImplFromJson(json);
|
||||
|
||||
@override
|
||||
@HiveField(0)
|
||||
final int id;
|
||||
@override
|
||||
@HiveField(1)
|
||||
final DateTime createdAt;
|
||||
@override
|
||||
@HiveField(2)
|
||||
final DateTime updatedAt;
|
||||
@override
|
||||
@HiveField(3)
|
||||
final DateTime? deletedAt;
|
||||
@override
|
||||
@HiveField(4)
|
||||
final String alias;
|
||||
@override
|
||||
@HiveField(5)
|
||||
final String name;
|
||||
@override
|
||||
@HiveField(6)
|
||||
final String description;
|
||||
final List<SnRealmMember>? _members;
|
||||
@override
|
||||
@ -702,14 +681,11 @@ class _$SnRealmImpl extends _SnRealm {
|
||||
}
|
||||
|
||||
@override
|
||||
@HiveField(7)
|
||||
final String? avatar;
|
||||
@override
|
||||
@HiveField(8)
|
||||
final String? banner;
|
||||
final Map<String, dynamic>? _accessPolicy;
|
||||
@override
|
||||
@HiveField(9)
|
||||
Map<String, dynamic>? get accessPolicy {
|
||||
final value = _accessPolicy;
|
||||
if (value == null) return null;
|
||||
@ -719,13 +695,10 @@ class _$SnRealmImpl extends _SnRealm {
|
||||
}
|
||||
|
||||
@override
|
||||
@HiveField(10)
|
||||
final int accountId;
|
||||
@override
|
||||
@HiveField(11)
|
||||
final bool isPublic;
|
||||
@override
|
||||
@HiveField(12)
|
||||
final bool isCommunity;
|
||||
@override
|
||||
@JsonKey()
|
||||
@ -825,45 +798,32 @@ abstract class _SnRealm extends SnRealm {
|
||||
factory _SnRealm.fromJson(Map<String, dynamic> json) = _$SnRealmImpl.fromJson;
|
||||
|
||||
@override
|
||||
@HiveField(0)
|
||||
int get id;
|
||||
@override
|
||||
@HiveField(1)
|
||||
DateTime get createdAt;
|
||||
@override
|
||||
@HiveField(2)
|
||||
DateTime get updatedAt;
|
||||
@override
|
||||
@HiveField(3)
|
||||
DateTime? get deletedAt;
|
||||
@override
|
||||
@HiveField(4)
|
||||
String get alias;
|
||||
@override
|
||||
@HiveField(5)
|
||||
String get name;
|
||||
@override
|
||||
@HiveField(6)
|
||||
String get description;
|
||||
@override
|
||||
List<SnRealmMember>? get members;
|
||||
@override
|
||||
@HiveField(7)
|
||||
String? get avatar;
|
||||
@override
|
||||
@HiveField(8)
|
||||
String? get banner;
|
||||
@override
|
||||
@HiveField(9)
|
||||
Map<String, dynamic>? get accessPolicy;
|
||||
@override
|
||||
@HiveField(10)
|
||||
int get accountId;
|
||||
@override
|
||||
@HiveField(11)
|
||||
bool get isPublic;
|
||||
@override
|
||||
@HiveField(12)
|
||||
bool get isCommunity;
|
||||
@override
|
||||
int get popularity;
|
||||
|
@ -2,80 +2,6 @@
|
||||
|
||||
part of 'realm.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// TypeAdapterGenerator
|
||||
// **************************************************************************
|
||||
|
||||
class SnRealmImplAdapter extends TypeAdapter<_$SnRealmImpl> {
|
||||
@override
|
||||
final int typeId = 1;
|
||||
|
||||
@override
|
||||
_$SnRealmImpl read(BinaryReader reader) {
|
||||
final numOfFields = reader.readByte();
|
||||
final fields = <int, dynamic>{
|
||||
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
||||
};
|
||||
return _$SnRealmImpl(
|
||||
id: fields[0] as int,
|
||||
createdAt: fields[1] as DateTime,
|
||||
updatedAt: fields[2] as DateTime,
|
||||
deletedAt: fields[3] as DateTime?,
|
||||
alias: fields[4] as String,
|
||||
name: fields[5] as String,
|
||||
description: fields[6] as String,
|
||||
avatar: fields[7] as String?,
|
||||
banner: fields[8] as String?,
|
||||
accessPolicy: (fields[9] as Map?)?.cast<String, dynamic>(),
|
||||
accountId: fields[10] as int,
|
||||
isPublic: fields[11] as bool,
|
||||
isCommunity: fields[12] as bool,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void write(BinaryWriter writer, _$SnRealmImpl obj) {
|
||||
writer
|
||||
..writeByte(13)
|
||||
..writeByte(0)
|
||||
..write(obj.id)
|
||||
..writeByte(1)
|
||||
..write(obj.createdAt)
|
||||
..writeByte(2)
|
||||
..write(obj.updatedAt)
|
||||
..writeByte(3)
|
||||
..write(obj.deletedAt)
|
||||
..writeByte(4)
|
||||
..write(obj.alias)
|
||||
..writeByte(5)
|
||||
..write(obj.name)
|
||||
..writeByte(6)
|
||||
..write(obj.description)
|
||||
..writeByte(7)
|
||||
..write(obj.avatar)
|
||||
..writeByte(8)
|
||||
..write(obj.banner)
|
||||
..writeByte(10)
|
||||
..write(obj.accountId)
|
||||
..writeByte(11)
|
||||
..write(obj.isPublic)
|
||||
..writeByte(12)
|
||||
..write(obj.isCommunity)
|
||||
..writeByte(9)
|
||||
..write(obj.accessPolicy);
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => typeId.hashCode;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
identical(this, other) ||
|
||||
other is SnRealmImplAdapter &&
|
||||
runtimeType == other.runtimeType &&
|
||||
typeId == other.typeId;
|
||||
}
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
@ -23,7 +23,8 @@ class NotifyIndicator extends StatefulWidget {
|
||||
State<NotifyIndicator> createState() => _NotifyIndicatorState();
|
||||
}
|
||||
|
||||
class _NotifyIndicatorState extends State<NotifyIndicator> with SingleTickerProviderStateMixin {
|
||||
class _NotifyIndicatorState extends State<NotifyIndicator>
|
||||
with SingleTickerProviderStateMixin {
|
||||
late final AnimationController _animationController = AnimationController(
|
||||
vsync: this,
|
||||
duration: const Duration(milliseconds: 300),
|
||||
@ -101,7 +102,8 @@ class _NotifyIndicatorState extends State<NotifyIndicator> with SingleTickerProv
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
width: double.infinity,
|
||||
constraints: BoxConstraints(
|
||||
maxWidth: isMobile ? MediaQuery.of(context).size.width - 16 : 360,
|
||||
maxWidth:
|
||||
isMobile ? MediaQuery.of(context).size.width - 16 : 360,
|
||||
),
|
||||
child: Material(
|
||||
elevation: 2,
|
||||
@ -118,7 +120,8 @@ class _NotifyIndicatorState extends State<NotifyIndicator> with SingleTickerProv
|
||||
),
|
||||
)
|
||||
else
|
||||
Icon(kNotificationTopicIcons[current?.topic] ?? Symbols.notifications),
|
||||
Icon(kNotificationTopicIcons[current?.topic] ??
|
||||
Symbols.notifications),
|
||||
const Gap(16),
|
||||
Expanded(
|
||||
child: Column(
|
||||
@ -126,14 +129,20 @@ class _NotifyIndicatorState extends State<NotifyIndicator> with SingleTickerProv
|
||||
children: [
|
||||
Text(
|
||||
current?.title ?? 'Notification',
|
||||
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodyMedium!
|
||||
.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
if (current?.subtitle?.isNotEmpty ?? false)
|
||||
Text(
|
||||
current!.subtitle!,
|
||||
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodyMedium!
|
||||
.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
@ -148,18 +157,25 @@ class _NotifyIndicatorState extends State<NotifyIndicator> with SingleTickerProv
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Text(DateFormat('HH:mm').format(current?.createdAt.toLocal() ?? DateTime.now()))
|
||||
.fontSize(12)
|
||||
.padding(right: 2),
|
||||
Text(
|
||||
DateFormat('HH:mm').format(
|
||||
(current?.createdAt ?? DateTime.now())
|
||||
.millisecondsSinceEpoch >
|
||||
0
|
||||
? (current?.createdAt ?? DateTime.now())
|
||||
: DateTime.now()),
|
||||
).fontSize(12).padding(right: 2),
|
||||
const Gap(6),
|
||||
if (current?.metadata['image'] != null)
|
||||
SizedBox(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: ClipRRect(
|
||||
borderRadius: const BorderRadius.all(Radius.circular(8)),
|
||||
borderRadius: const BorderRadius.all(
|
||||
Radius.circular(8)),
|
||||
child: AutoResizeUniversalImage(
|
||||
sn.getAttachmentUrl(current?.metadata['image']),
|
||||
sn.getAttachmentUrl(
|
||||
current?.metadata['image']),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
|
Reference in New Issue
Block a user