⬆️ Support some new server stuff

This commit is contained in:
LittleSheep 2024-05-10 23:17:01 +08:00
parent c1d3bac0c8
commit 40aa16e971
41 changed files with 105 additions and 69 deletions

View File

@ -1,3 +1,5 @@
import 'dart:convert';
import 'package:solian/models/account.dart'; import 'package:solian/models/account.dart';
import 'package:solian/models/channel.dart'; import 'package:solian/models/channel.dart';
import 'package:solian/models/post.dart'; import 'package:solian/models/post.dart';
@ -7,9 +9,9 @@ class Message {
DateTime createdAt; DateTime createdAt;
DateTime updatedAt; DateTime updatedAt;
DateTime? deletedAt; DateTime? deletedAt;
String content; String rawContent;
Map<String, dynamic>? metadata; Map<String, dynamic>? metadata;
int type; String type;
List<Attachment>? attachments; List<Attachment>? attachments;
Channel? channel; Channel? channel;
Sender sender; Sender sender;
@ -20,12 +22,16 @@ class Message {
bool isSending = false; bool isSending = false;
Map<String, dynamic> get decodedContent {
return jsonDecode(utf8.fuse(base64).decode(rawContent));
}
Message({ Message({
required this.id, required this.id,
required this.createdAt, required this.createdAt,
required this.updatedAt, required this.updatedAt,
this.deletedAt, this.deletedAt,
required this.content, required this.rawContent,
required this.metadata, required this.metadata,
required this.type, required this.type,
this.attachments, this.attachments,
@ -42,18 +48,14 @@ class Message {
createdAt: DateTime.parse(json['created_at']), createdAt: DateTime.parse(json['created_at']),
updatedAt: DateTime.parse(json['updated_at']), updatedAt: DateTime.parse(json['updated_at']),
deletedAt: json['deleted_at'], deletedAt: json['deleted_at'],
content: json['content'], rawContent: json['content'],
metadata: json['metadata'], metadata: json['metadata'],
type: json['type'], type: json['type'],
attachments: List<Attachment>.from( attachments: List<Attachment>.from(json['attachments']?.map((x) => Attachment.fromJson(x)) ?? List.empty()),
json['attachments']?.map((x) => Attachment.fromJson(x)) ??
List.empty()),
channel: Channel.fromJson(json['channel']), channel: Channel.fromJson(json['channel']),
sender: Sender.fromJson(json['sender']), sender: Sender.fromJson(json['sender']),
replyId: json['reply_id'], replyId: json['reply_id'],
replyTo: json['reply_to'] != null replyTo: json['reply_to'] != null ? Message.fromJson(json['reply_to']) : null,
? Message.fromJson(json['reply_to'])
: null,
channelId: json['channel_id'], channelId: json['channel_id'],
senderId: json['sender_id'], senderId: json['sender_id'],
); );
@ -63,11 +65,10 @@ class Message {
'created_at': createdAt.toIso8601String(), 'created_at': createdAt.toIso8601String(),
'updated_at': updatedAt.toIso8601String(), 'updated_at': updatedAt.toIso8601String(),
'deleted_at': deletedAt, 'deleted_at': deletedAt,
'content': content, 'content': rawContent,
'metadata': metadata, 'metadata': metadata,
'type': type, 'type': type,
'attachments': List<dynamic>.from( 'attachments': List<dynamic>.from(attachments?.map((x) => x.toJson()) ?? List.empty()),
attachments?.map((x) => x.toJson()) ?? List.empty()),
'channel': channel?.toJson(), 'channel': channel?.toJson(),
'sender': sender.toJson(), 'sender': sender.toJson(),
'reply_id': replyId, 'reply_id': replyId,

View File

@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:oauth2/oauth2.dart' as oauth2; import 'package:oauth2/oauth2.dart' as oauth2;
import 'package:solian/utils/http.dart'; import 'package:solian/utils/http.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
class AuthProvider extends ChangeNotifier { class AuthProvider extends ChangeNotifier {
AuthProvider() { AuthProvider() {

View File

@ -13,7 +13,7 @@ import 'package:solian/models/message.dart';
import 'package:solian/models/packet.dart'; import 'package:solian/models/packet.dart';
import 'package:solian/models/pagination.dart'; import 'package:solian/models/pagination.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/chat/call/exts.dart'; import 'package:solian/widgets/chat/call/exts.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
import 'package:wakelock_plus/wakelock_plus.dart'; import 'package:wakelock_plus/wakelock_plus.dart';
@ -41,6 +41,7 @@ class ChatProvider extends ChangeNotifier {
var uri = Uri( var uri = Uri(
scheme: ori.scheme.replaceFirst('http', 'ws'), scheme: ori.scheme.replaceFirst('http', 'ws'),
host: ori.host, host: ori.host,
port: ori.port,
path: ori.path, path: ori.path,
queryParameters: {'tk': Uri.encodeComponent(auth.client!.currentToken!)}, queryParameters: {'tk': Uri.encodeComponent(auth.client!.currentToken!)},
); );

View File

@ -3,7 +3,7 @@ import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:solian/models/friendship.dart'; import 'package:solian/models/friendship.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
class FriendProvider extends ChangeNotifier { class FriendProvider extends ChangeNotifier {
List<Friendship> friends = List.empty(); List<Friendship> friends = List.empty();

View File

@ -6,7 +6,7 @@ import 'package:livekit_client/livekit_client.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:solian/models/pagination.dart'; import 'package:solian/models/pagination.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/models/notification.dart' as model; import 'package:solian/models/notification.dart' as model;
import 'package:web_socket_channel/web_socket_channel.dart'; import 'package:web_socket_channel/web_socket_channel.dart';
import 'dart:math' as math; import 'dart:math' as math;
@ -74,10 +74,11 @@ class NotifyProvider extends ChangeNotifier {
await auth.client!.refreshToken(auth.client!.currentRefreshToken!); await auth.client!.refreshToken(auth.client!.currentRefreshToken!);
var ori = getRequestUri('passport', '/api/notifications/listen'); var ori = getRequestUri('passport', '/api/ws');
var uri = Uri( var uri = Uri(
scheme: ori.scheme.replaceFirst('http', 'ws'), scheme: ori.scheme.replaceFirst('http', 'ws'),
host: ori.host, host: ori.host,
port: ori.port,
path: ori.path, path: ori.path,
queryParameters: { queryParameters: {
'tk': Uri.encodeComponent(auth.client!.currentToken!) 'tk': Uri.encodeComponent(auth.client!.currentToken!)

View File

@ -3,7 +3,7 @@ import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:solian/models/realm.dart'; import 'package:solian/models/realm.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
class RealmProvider with ChangeNotifier { class RealmProvider with ChangeNotifier {
List<Realm> realms = List.empty(); List<Realm> realms = List.empty();

View File

@ -5,7 +5,7 @@ import 'package:flutter_animate/flutter_animate.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:solian/models/friendship.dart'; import 'package:solian/models/friendship.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/account/account_avatar.dart'; import 'package:solian/widgets/account/account_avatar.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
import 'package:solian/widgets/scaffold.dart'; import 'package:solian/widgets/scaffold.dart';

View File

@ -8,7 +8,7 @@ import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/account/account_avatar.dart'; import 'package:solian/widgets/account/account_avatar.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
import 'package:solian/widgets/scaffold.dart'; import 'package:solian/widgets/scaffold.dart';

View File

@ -3,7 +3,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
import 'package:solian/widgets/scaffold.dart'; import 'package:solian/widgets/scaffold.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';

View File

@ -3,7 +3,7 @@ import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
import 'package:solian/widgets/scaffold.dart'; import 'package:solian/widgets/scaffold.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;

View File

@ -7,7 +7,7 @@ import 'package:provider/provider.dart';
import 'package:solian/models/channel.dart'; import 'package:solian/models/channel.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
import 'package:solian/widgets/scaffold.dart'; import 'package:solian/widgets/scaffold.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';

View File

@ -6,7 +6,7 @@ import 'package:provider/provider.dart';
import 'package:solian/models/account.dart'; import 'package:solian/models/account.dart';
import 'package:solian/models/channel.dart'; import 'package:solian/models/channel.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/account/account_avatar.dart'; import 'package:solian/widgets/account/account_avatar.dart';
import 'package:solian/widgets/account/friend_picker.dart'; import 'package:solian/widgets/account/friend_picker.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';

View File

@ -8,7 +8,7 @@ import 'package:solian/models/message.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/providers/chat.dart'; import 'package:solian/providers/chat.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/utils/theme.dart'; import 'package:solian/utils/theme.dart';
import 'package:solian/widgets/chat/channel_action.dart'; import 'package:solian/widgets/chat/channel_action.dart';
import 'package:solian/widgets/chat/message.dart'; import 'package:solian/widgets/chat/message.dart';

View File

@ -6,7 +6,7 @@ import 'package:solian/models/channel.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/providers/chat.dart'; import 'package:solian/providers/chat.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/utils/theme.dart'; import 'package:solian/utils/theme.dart';
import 'package:solian/widgets/chat/chat_new.dart'; import 'package:solian/widgets/chat/chat_new.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';

View File

@ -7,7 +7,7 @@ import 'package:solian/models/post.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/providers/realm.dart'; import 'package:solian/providers/realm.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;

View File

@ -5,7 +5,7 @@ import 'package:flutter_animate/flutter_animate.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/providers/notify.dart'; import 'package:solian/providers/notify.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/scaffold.dart'; import 'package:solian/widgets/scaffold.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';

View File

@ -7,7 +7,7 @@ import 'package:provider/provider.dart';
import 'package:solian/models/post.dart'; import 'package:solian/models/post.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:solian/widgets/account/account_avatar.dart'; import 'package:solian/widgets/account/account_avatar.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';

View File

@ -7,7 +7,7 @@ import 'package:provider/provider.dart';
import 'package:solian/models/post.dart'; import 'package:solian/models/post.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:solian/widgets/account/account_avatar.dart'; import 'package:solian/widgets/account/account_avatar.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
@ -55,7 +55,6 @@ class _MomentEditorScreenState extends State<MomentEditorScreen> {
final uri = widget.editing == null final uri = widget.editing == null
? getRequestUri('interactive', '/api/p/moments') ? getRequestUri('interactive', '/api/p/moments')
: getRequestUri('interactive', '/api/p/moments/${widget.editing!.id}'); : getRequestUri('interactive', '/api/p/moments/${widget.editing!.id}');
print(uri);
final req = Request(widget.editing == null ? 'POST' : 'PUT', uri); final req = Request(widget.editing == null ? 'POST' : 'PUT', uri);
req.headers['Content-Type'] = 'application/json'; req.headers['Content-Type'] = 'application/json';

View File

@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import 'package:solian/models/post.dart'; import 'package:solian/models/post.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
import 'package:solian/widgets/scaffold.dart'; import 'package:solian/widgets/scaffold.dart';
import 'package:solian/widgets/posts/comment_list.dart'; import 'package:solian/widgets/posts/comment_list.dart';

View File

@ -7,7 +7,7 @@ import 'package:provider/provider.dart';
import 'package:solian/models/realm.dart'; import 'package:solian/models/realm.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/utils/theme.dart'; import 'package:solian/utils/theme.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
import 'package:solian/widgets/scaffold.dart'; import 'package:solian/widgets/scaffold.dart';

View File

@ -6,7 +6,7 @@ import 'package:provider/provider.dart';
import 'package:solian/models/account.dart'; import 'package:solian/models/account.dart';
import 'package:solian/models/realm.dart'; import 'package:solian/models/realm.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/utils/theme.dart'; import 'package:solian/utils/theme.dart';
import 'package:solian/widgets/account/account_avatar.dart'; import 'package:solian/widgets/account/account_avatar.dart';
import 'package:solian/widgets/account/friend_picker.dart'; import 'package:solian/widgets/account/friend_picker.dart';

View File

@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:solian/models/account.dart'; import 'package:solian/models/account.dart';
import 'package:solian/models/personal_page.dart'; import 'package:solian/models/personal_page.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/utils/theme.dart'; import 'package:solian/utils/theme.dart';
import 'package:solian/widgets/account/account_avatar.dart'; import 'package:solian/widgets/account/account_avatar.dart';
import 'package:solian/widgets/account/personal_page_content.dart'; import 'package:solian/widgets/account/personal_page_content.dart';

View File

@ -1,7 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
class HttpClient extends http.BaseClient { class HttpClient extends http.BaseClient {
final bool isUnauthorizedRetry; final bool isUnauthorizedRetry;

View File

@ -1,7 +1,7 @@
const serviceUrls = { const serviceUrls = {
'passport': 'https://id.solsynth.dev', 'passport': 'https://id.solsynth.dev',
'interactive': 'https://co.solsynth.dev', 'interactive': 'https://co.solsynth.dev',
'messaging': 'https://im.solsynth.dev' 'messaging': 'http://192.168.50.83:8447' // 'https://im.solsynth.dev'
}; };
Uri getRequestUri(String service, String path) { Uri getRequestUri(String service, String path) {

View File

@ -1,7 +1,7 @@
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:solian/utils/platform.dart'; import 'package:solian/utils/platform.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
class AccountAvatar extends StatelessWidget { class AccountAvatar extends StatelessWidget {
final String source; final String source;

View File

@ -7,7 +7,7 @@ import 'package:solian/models/channel.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/providers/chat.dart'; import 'package:solian/providers/chat.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
class ChannelCallAction extends StatefulWidget { class ChannelCallAction extends StatefulWidget {

View File

@ -5,7 +5,7 @@ import 'package:provider/provider.dart';
import 'package:solian/models/channel.dart'; import 'package:solian/models/channel.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
class ChannelDeletion extends StatefulWidget { class ChannelDeletion extends StatefulWidget {

View File

@ -10,19 +10,23 @@ class ChatMessageContent extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Markdown( if (item.type == 'm.text') {
data: item.content, return Markdown(
shrinkWrap: true, data: item.decodedContent['value'],
selectable: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), selectable: true,
padding: const EdgeInsets.all(0), physics: const NeverScrollableScrollPhysics(),
onTapLink: (text, href, title) async { padding: const EdgeInsets.all(0),
if (href == null) return; onTapLink: (text, href, title) async {
await launchUrlString( if (href == null) return;
href, await launchUrlString(
mode: LaunchMode.externalApplication, href,
); mode: LaunchMode.externalApplication,
}, );
); },
);
}
return Container();
} }
} }

View File

@ -5,7 +5,7 @@ import 'package:provider/provider.dart';
import 'package:solian/models/message.dart'; import 'package:solian/models/message.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
class ChatMessageDeletionDialog extends StatefulWidget { class ChatMessageDeletionDialog extends StatefulWidget {

View File

@ -9,7 +9,7 @@ import 'package:provider/provider.dart';
import 'package:solian/models/message.dart'; import 'package:solian/models/message.dart';
import 'package:solian/models/post.dart'; import 'package:solian/models/post.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
import 'package:solian/widgets/posts/attachment_editor.dart'; import 'package:solian/widgets/posts/attachment_editor.dart';
import 'package:badges/badges.dart' as badge; import 'package:badges/badges.dart' as badge;
@ -55,6 +55,10 @@ class _ChatMessageEditorState extends State<ChatMessageEditor> {
); );
} }
Map<String, dynamic> buildContentBody(String content, {String algorithm = 'plain'}) {
return {'value': content, 'algorithm': algorithm};
}
Future<void> sendMessage(BuildContext context) async { Future<void> sendMessage(BuildContext context) async {
_focusNode.requestFocus(); _focusNode.requestFocus();
@ -68,7 +72,8 @@ class _ChatMessageEditorState extends State<ChatMessageEditor> {
final req = Request(widget.editing == null ? 'POST' : 'PUT', uri); final req = Request(widget.editing == null ? 'POST' : 'PUT', uri);
req.headers['Content-Type'] = 'application/json'; req.headers['Content-Type'] = 'application/json';
req.body = jsonEncode(<String, dynamic>{ req.body = jsonEncode(<String, dynamic>{
'content': _textController.value.text, 'type': 'm.text',
'content': buildContentBody(_textController.value.text),
'attachments': _attachments, 'attachments': _attachments,
'reply_to': widget.replying?.id, 'reply_to': widget.replying?.id,
}); });
@ -106,7 +111,10 @@ class _ChatMessageEditorState extends State<ChatMessageEditor> {
setState(() { setState(() {
_prevEditingId = widget.editing!.id; _prevEditingId = widget.editing!.id;
_attachments = widget.editing!.attachments ?? List.empty(growable: true); _attachments = widget.editing!.attachments ?? List.empty(growable: true);
_textController.text = widget.editing!.content;
if (widget.editing!.type == 'm.text') {
_textController.text = widget.editing!.decodedContent['value'];
}
}); });
} }
} }

View File

@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:solian/models/packet.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/providers/notify.dart'; import 'package:solian/providers/notify.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
@ -35,9 +36,13 @@ class _NotificationNotifierState extends State<NotificationNotifier> {
nty.connect(auth).then((snapshot) { nty.connect(auth).then((snapshot) {
snapshot!.stream.listen( snapshot!.stream.listen(
(event) { (event) {
final result = model.Notification.fromJson(jsonDecode(event)); final result = NetworkPackage.fromJson(jsonDecode(event));
nty.onRemoteMessage(result); switch (result.method) {
nty.notifyMessage(result.subject, result.content); case 'notifications.new':
final result = model.Notification.fromJson(jsonDecode(event));
nty.onRemoteMessage(result);
nty.notifyMessage(result.subject, result.content);
}
}, },
onError: (_, __) => connect(), onError: (_, __) => connect(),
onDone: () => connect(), onDone: () => connect(),

View File

@ -11,7 +11,7 @@ import 'package:provider/provider.dart';
import 'package:solian/models/post.dart'; import 'package:solian/models/post.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/file.dart'; import 'package:solian/utils/file.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';

View File

@ -9,7 +9,7 @@ import 'package:http/http.dart' as http;
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/router.dart'; import 'package:solian/router.dart';
import 'package:solian/screens/posts/comment_editor.dart'; import 'package:solian/screens/posts/comment_editor.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/posts/post.dart'; import 'package:solian/widgets/posts/post.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';

View File

@ -4,7 +4,7 @@ import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:solian/models/post.dart'; import 'package:solian/models/post.dart';
import 'package:markdown/markdown.dart' as markdown; import 'package:markdown/markdown.dart' as markdown;
import 'package:solian/utils/platform.dart'; import 'package:solian/utils/platform.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';
class ArticleContent extends StatelessWidget { class ArticleContent extends StatelessWidget {

View File

@ -4,7 +4,7 @@ import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart'; import 'package:media_kit_video/media_kit_video.dart';
import 'package:solian/models/post.dart'; import 'package:solian/models/post.dart';
import 'package:solian/utils/platform.dart'; import 'package:solian/utils/platform.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:flutter_carousel_widget/flutter_carousel_widget.dart'; import 'package:flutter_carousel_widget/flutter_carousel_widget.dart';
import 'package:solian/widgets/posts/attachment_screen.dart'; import 'package:solian/widgets/posts/attachment_screen.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';

View File

@ -5,7 +5,7 @@ import 'package:provider/provider.dart';
import 'package:solian/models/post.dart'; import 'package:solian/models/post.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
class ItemDeletionDialog extends StatefulWidget { class ItemDeletionDialog extends StatefulWidget {

View File

@ -5,7 +5,7 @@ import 'package:flutter_animate/flutter_animate.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:solian/models/reaction.dart'; import 'package:solian/models/reaction.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';

View File

@ -5,7 +5,7 @@ import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:solian/models/realm.dart'; import 'package:solian/models/realm.dart';
import 'package:solian/providers/auth.dart'; import 'package:solian/providers/auth.dart';
import 'package:solian/utils/service_url.dart'; import 'package:solian/utils/services_url.dart';
import 'package:solian/widgets/exts.dart'; import 'package:solian/widgets/exts.dart';
class RealmDeletion extends StatefulWidget { class RealmDeletion extends StatefulWidget {

View File

@ -17,6 +17,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.5.0" version: "2.5.0"
asn1lib:
dependency: transitive
description:
name: asn1lib
sha256: c9c85fedbe2188b95133cbe960e16f5f448860f7133330e272edbbca5893ddc6
url: "https://pub.dev"
source: hosted
version: "1.5.2"
async: async:
dependency: transitive dependency: transitive
description: description:
@ -217,6 +225,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.3" version: "2.0.3"
encrypt:
dependency: "direct main"
description:
name: encrypt
sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2"
url: "https://pub.dev"
source: hosted
version: "5.0.3"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:

View File

@ -72,6 +72,7 @@ dependencies:
cached_network_image: ^3.3.1 cached_network_image: ^3.3.1
desktop_drop: ^0.4.4 desktop_drop: ^0.4.4
easy_debounce: ^2.0.3 easy_debounce: ^2.0.3
encrypt: ^5.0.3
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

BIN
web/favicon.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 480 B

After

Width:  |  Height:  |  Size: 70 KiB