✨ WebSocket connection indicator
This commit is contained in:
parent
e4e562918c
commit
f266968644
@ -103,5 +103,8 @@
|
|||||||
},
|
},
|
||||||
"reactionPositive": "Postive",
|
"reactionPositive": "Postive",
|
||||||
"reactionNegative": "Negative",
|
"reactionNegative": "Negative",
|
||||||
"reactionNeutral": "Neutral"
|
"reactionNeutral": "Neutral",
|
||||||
|
"connectionConnected": "Connected",
|
||||||
|
"connectionDisconnected": "Disconnected",
|
||||||
|
"connectionReconnecting": "Reconnecting"
|
||||||
}
|
}
|
||||||
|
@ -41,11 +41,14 @@ class WebSocketService {
|
|||||||
WebSocketChannel? _channel;
|
WebSocketChannel? _channel;
|
||||||
final StreamController<WebSocketPacket> _streamController =
|
final StreamController<WebSocketPacket> _streamController =
|
||||||
StreamController<WebSocketPacket>.broadcast();
|
StreamController<WebSocketPacket>.broadcast();
|
||||||
|
final StreamController<WebSocketState> _statusStreamController =
|
||||||
|
StreamController<WebSocketState>.broadcast();
|
||||||
String? _lastUrl;
|
String? _lastUrl;
|
||||||
String? _lastAtk;
|
String? _lastAtk;
|
||||||
Timer? _reconnectTimer;
|
Timer? _reconnectTimer;
|
||||||
|
|
||||||
Stream<WebSocketPacket> get dataStream => _streamController.stream;
|
Stream<WebSocketPacket> get dataStream => _streamController.stream;
|
||||||
|
Stream<WebSocketState> get statusStream => _statusStreamController.stream;
|
||||||
|
|
||||||
Future<void> connect(String url, String atk) async {
|
Future<void> connect(String url, String atk) async {
|
||||||
_lastUrl = url;
|
_lastUrl = url;
|
||||||
@ -57,6 +60,7 @@ class WebSocketService {
|
|||||||
headers: {'Authorization': 'Bearer $atk'},
|
headers: {'Authorization': 'Bearer $atk'},
|
||||||
);
|
);
|
||||||
await _channel!.ready;
|
await _channel!.ready;
|
||||||
|
_statusStreamController.sink.add(WebSocketState.connected());
|
||||||
_channel!.stream.listen(
|
_channel!.stream.listen(
|
||||||
(data) {
|
(data) {
|
||||||
final dataStr =
|
final dataStr =
|
||||||
@ -68,10 +72,14 @@ class WebSocketService {
|
|||||||
onDone: () {
|
onDone: () {
|
||||||
log('[WebSocket] Connection closed, attempting to reconnect...');
|
log('[WebSocket] Connection closed, attempting to reconnect...');
|
||||||
_scheduleReconnect();
|
_scheduleReconnect();
|
||||||
|
_statusStreamController.sink.add(WebSocketState.disconnected());
|
||||||
},
|
},
|
||||||
onError: (error) {
|
onError: (error) {
|
||||||
log('[WebSocket] Error occurred: $error, attempting to reconnect...');
|
log('[WebSocket] Error occurred: $error, attempting to reconnect...');
|
||||||
_scheduleReconnect();
|
_scheduleReconnect();
|
||||||
|
_statusStreamController.sink.add(
|
||||||
|
WebSocketState.error(error.toString()),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@ -84,6 +92,7 @@ class WebSocketService {
|
|||||||
_reconnectTimer?.cancel();
|
_reconnectTimer?.cancel();
|
||||||
_reconnectTimer = Timer(const Duration(milliseconds: 500), () {
|
_reconnectTimer = Timer(const Duration(milliseconds: 500), () {
|
||||||
if (_lastUrl != null && _lastAtk != null) {
|
if (_lastUrl != null && _lastAtk != null) {
|
||||||
|
_statusStreamController.sink.add(WebSocketState.connecting());
|
||||||
connect(_lastUrl!, _lastAtk!);
|
connect(_lastUrl!, _lastAtk!);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -110,6 +119,7 @@ final websocketStateProvider =
|
|||||||
|
|
||||||
class WebSocketStateNotifier extends StateNotifier<WebSocketState> {
|
class WebSocketStateNotifier extends StateNotifier<WebSocketState> {
|
||||||
final Ref ref;
|
final Ref ref;
|
||||||
|
Timer? _reconnectTimer;
|
||||||
|
|
||||||
WebSocketStateNotifier(this.ref) : super(const WebSocketState.disconnected());
|
WebSocketStateNotifier(this.ref) : super(const WebSocketState.disconnected());
|
||||||
|
|
||||||
@ -132,11 +142,22 @@ class WebSocketStateNotifier extends StateNotifier<WebSocketState> {
|
|||||||
}
|
}
|
||||||
await service.connect('$baseUrl/ws'.replaceFirst('http', 'ws'), atk);
|
await service.connect('$baseUrl/ws'.replaceFirst('http', 'ws'), atk);
|
||||||
state = const WebSocketState.connected();
|
state = const WebSocketState.connected();
|
||||||
|
service.statusStream.listen((event) {
|
||||||
|
state = event;
|
||||||
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
state = WebSocketState.error('Failed to connect: $err');
|
state = WebSocketState.error('Failed to connect: $err');
|
||||||
|
_scheduleReconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _scheduleReconnect() {
|
||||||
|
_reconnectTimer?.cancel();
|
||||||
|
_reconnectTimer = Timer(const Duration(milliseconds: 500), () {
|
||||||
|
connect();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void sendMessage(String message) {
|
void sendMessage(String message) {
|
||||||
final service = ref.read(websocketProvider);
|
final service = ref.read(websocketProvider);
|
||||||
service.sendMessage(message);
|
service.sendMessage(message);
|
||||||
@ -145,6 +166,7 @@ class WebSocketStateNotifier extends StateNotifier<WebSocketState> {
|
|||||||
void close() {
|
void close() {
|
||||||
final service = ref.read(websocketProvider);
|
final service = ref.read(websocketProvider);
|
||||||
service.close();
|
service.close();
|
||||||
|
_reconnectTimer?.cancel();
|
||||||
state = const WebSocketState.disconnected();
|
state = const WebSocketState.disconnected();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,48 +9,91 @@
|
|||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
|
|
||||||
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
||||||
import 'package:auto_route/auto_route.dart' as _i16;
|
import 'package:auto_route/auto_route.dart' as _i17;
|
||||||
import 'package:flutter/material.dart' as _i17;
|
import 'package:flutter/material.dart' as _i18;
|
||||||
import 'package:island/models/post.dart' as _i18;
|
import 'package:island/models/post.dart' as _i19;
|
||||||
import 'package:island/screens/account.dart' as _i1;
|
import 'package:island/screens/account.dart' as _i2;
|
||||||
import 'package:island/screens/account/me.dart' as _i10;
|
import 'package:island/screens/account/me.dart' as _i11;
|
||||||
import 'package:island/screens/account/me/publishers.dart' as _i6;
|
import 'package:island/screens/account/me/publishers.dart' as _i7;
|
||||||
import 'package:island/screens/account/me/update.dart' as _i15;
|
import 'package:island/screens/account/me/update.dart' as _i16;
|
||||||
import 'package:island/screens/auth/create_account.dart' as _i5;
|
import 'package:island/screens/account/profile.dart' as _i1;
|
||||||
import 'package:island/screens/auth/login.dart' as _i9;
|
import 'package:island/screens/auth/create_account.dart' as _i6;
|
||||||
import 'package:island/screens/auth/tabs.dart' as _i14;
|
import 'package:island/screens/auth/login.dart' as _i10;
|
||||||
import 'package:island/screens/chat/chat.dart' as _i3;
|
import 'package:island/screens/auth/tabs.dart' as _i15;
|
||||||
import 'package:island/screens/chat/room.dart' as _i4;
|
import 'package:island/screens/chat/chat.dart' as _i4;
|
||||||
import 'package:island/screens/chat/room_detail.dart' as _i2;
|
import 'package:island/screens/chat/room.dart' as _i5;
|
||||||
import 'package:island/screens/explore.dart' as _i8;
|
import 'package:island/screens/chat/room_detail.dart' as _i3;
|
||||||
import 'package:island/screens/posts/compose.dart' as _i11;
|
import 'package:island/screens/explore.dart' as _i9;
|
||||||
import 'package:island/screens/posts/detail.dart' as _i12;
|
import 'package:island/screens/posts/compose.dart' as _i12;
|
||||||
import 'package:island/screens/realm/detail.dart' as _i13;
|
import 'package:island/screens/posts/detail.dart' as _i13;
|
||||||
import 'package:island/screens/realm/realms.dart' as _i7;
|
import 'package:island/screens/realm/detail.dart' as _i14;
|
||||||
|
import 'package:island/screens/realm/realms.dart' as _i8;
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i1.AccountScreen]
|
/// [_i1.AccountProfileScreen]
|
||||||
class AccountRoute extends _i16.PageRouteInfo<void> {
|
class AccountProfileRoute extends _i17.PageRouteInfo<AccountProfileRouteArgs> {
|
||||||
const AccountRoute({List<_i16.PageRouteInfo>? children})
|
AccountProfileRoute({
|
||||||
|
_i18.Key? key,
|
||||||
|
required String name,
|
||||||
|
List<_i17.PageRouteInfo>? children,
|
||||||
|
}) : super(
|
||||||
|
AccountProfileRoute.name,
|
||||||
|
args: AccountProfileRouteArgs(key: key, name: name),
|
||||||
|
rawPathParams: {'name': name},
|
||||||
|
initialChildren: children,
|
||||||
|
);
|
||||||
|
|
||||||
|
static const String name = 'AccountProfileRoute';
|
||||||
|
|
||||||
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
|
name,
|
||||||
|
builder: (data) {
|
||||||
|
final pathParams = data.inheritedPathParams;
|
||||||
|
final args = data.argsAs<AccountProfileRouteArgs>(
|
||||||
|
orElse:
|
||||||
|
() => AccountProfileRouteArgs(name: pathParams.getString('name')),
|
||||||
|
);
|
||||||
|
return _i1.AccountProfileScreen(key: args.key, name: args.name);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
class AccountProfileRouteArgs {
|
||||||
|
const AccountProfileRouteArgs({this.key, required this.name});
|
||||||
|
|
||||||
|
final _i18.Key? key;
|
||||||
|
|
||||||
|
final String name;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'AccountProfileRouteArgs{key: $key, name: $name}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// generated route for
|
||||||
|
/// [_i2.AccountScreen]
|
||||||
|
class AccountRoute extends _i17.PageRouteInfo<void> {
|
||||||
|
const AccountRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(AccountRoute.name, initialChildren: children);
|
: super(AccountRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'AccountRoute';
|
static const String name = 'AccountRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i1.AccountScreen();
|
return const _i2.AccountScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i2.ChatDetailScreen]
|
/// [_i3.ChatDetailScreen]
|
||||||
class ChatDetailRoute extends _i16.PageRouteInfo<ChatDetailRouteArgs> {
|
class ChatDetailRoute extends _i17.PageRouteInfo<ChatDetailRouteArgs> {
|
||||||
ChatDetailRoute({
|
ChatDetailRoute({
|
||||||
_i17.Key? key,
|
_i18.Key? key,
|
||||||
required int id,
|
required int id,
|
||||||
List<_i16.PageRouteInfo>? children,
|
List<_i17.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
ChatDetailRoute.name,
|
ChatDetailRoute.name,
|
||||||
args: ChatDetailRouteArgs(key: key, id: id),
|
args: ChatDetailRouteArgs(key: key, id: id),
|
||||||
@ -60,14 +103,14 @@ class ChatDetailRoute extends _i16.PageRouteInfo<ChatDetailRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'ChatDetailRoute';
|
static const String name = 'ChatDetailRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final pathParams = data.inheritedPathParams;
|
final pathParams = data.inheritedPathParams;
|
||||||
final args = data.argsAs<ChatDetailRouteArgs>(
|
final args = data.argsAs<ChatDetailRouteArgs>(
|
||||||
orElse: () => ChatDetailRouteArgs(id: pathParams.getInt('id')),
|
orElse: () => ChatDetailRouteArgs(id: pathParams.getInt('id')),
|
||||||
);
|
);
|
||||||
return _i2.ChatDetailScreen(key: args.key, id: args.id);
|
return _i3.ChatDetailScreen(key: args.key, id: args.id);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -75,7 +118,7 @@ class ChatDetailRoute extends _i16.PageRouteInfo<ChatDetailRouteArgs> {
|
|||||||
class ChatDetailRouteArgs {
|
class ChatDetailRouteArgs {
|
||||||
const ChatDetailRouteArgs({this.key, required this.id});
|
const ChatDetailRouteArgs({this.key, required this.id});
|
||||||
|
|
||||||
final _i17.Key? key;
|
final _i18.Key? key;
|
||||||
|
|
||||||
final int id;
|
final int id;
|
||||||
|
|
||||||
@ -86,28 +129,28 @@ class ChatDetailRouteArgs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i3.ChatListScreen]
|
/// [_i4.ChatListScreen]
|
||||||
class ChatListRoute extends _i16.PageRouteInfo<void> {
|
class ChatListRoute extends _i17.PageRouteInfo<void> {
|
||||||
const ChatListRoute({List<_i16.PageRouteInfo>? children})
|
const ChatListRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(ChatListRoute.name, initialChildren: children);
|
: super(ChatListRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'ChatListRoute';
|
static const String name = 'ChatListRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i3.ChatListScreen();
|
return const _i4.ChatListScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i4.ChatRoomScreen]
|
/// [_i5.ChatRoomScreen]
|
||||||
class ChatRoomRoute extends _i16.PageRouteInfo<ChatRoomRouteArgs> {
|
class ChatRoomRoute extends _i17.PageRouteInfo<ChatRoomRouteArgs> {
|
||||||
ChatRoomRoute({
|
ChatRoomRoute({
|
||||||
_i17.Key? key,
|
_i18.Key? key,
|
||||||
required int id,
|
required int id,
|
||||||
List<_i16.PageRouteInfo>? children,
|
List<_i17.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
ChatRoomRoute.name,
|
ChatRoomRoute.name,
|
||||||
args: ChatRoomRouteArgs(key: key, id: id),
|
args: ChatRoomRouteArgs(key: key, id: id),
|
||||||
@ -117,14 +160,14 @@ class ChatRoomRoute extends _i16.PageRouteInfo<ChatRoomRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'ChatRoomRoute';
|
static const String name = 'ChatRoomRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final pathParams = data.inheritedPathParams;
|
final pathParams = data.inheritedPathParams;
|
||||||
final args = data.argsAs<ChatRoomRouteArgs>(
|
final args = data.argsAs<ChatRoomRouteArgs>(
|
||||||
orElse: () => ChatRoomRouteArgs(id: pathParams.getInt('id')),
|
orElse: () => ChatRoomRouteArgs(id: pathParams.getInt('id')),
|
||||||
);
|
);
|
||||||
return _i4.ChatRoomScreen(key: args.key, id: args.id);
|
return _i5.ChatRoomScreen(key: args.key, id: args.id);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -132,7 +175,7 @@ class ChatRoomRoute extends _i16.PageRouteInfo<ChatRoomRouteArgs> {
|
|||||||
class ChatRoomRouteArgs {
|
class ChatRoomRouteArgs {
|
||||||
const ChatRoomRouteArgs({this.key, required this.id});
|
const ChatRoomRouteArgs({this.key, required this.id});
|
||||||
|
|
||||||
final _i17.Key? key;
|
final _i18.Key? key;
|
||||||
|
|
||||||
final int id;
|
final int id;
|
||||||
|
|
||||||
@ -143,25 +186,25 @@ class ChatRoomRouteArgs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i5.CreateAccountScreen]
|
/// [_i6.CreateAccountScreen]
|
||||||
class CreateAccountRoute extends _i16.PageRouteInfo<void> {
|
class CreateAccountRoute extends _i17.PageRouteInfo<void> {
|
||||||
const CreateAccountRoute({List<_i16.PageRouteInfo>? children})
|
const CreateAccountRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(CreateAccountRoute.name, initialChildren: children);
|
: super(CreateAccountRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'CreateAccountRoute';
|
static const String name = 'CreateAccountRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i5.CreateAccountScreen();
|
return const _i6.CreateAccountScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i3.EditChatScreen]
|
/// [_i4.EditChatScreen]
|
||||||
class EditChatRoute extends _i16.PageRouteInfo<EditChatRouteArgs> {
|
class EditChatRoute extends _i17.PageRouteInfo<EditChatRouteArgs> {
|
||||||
EditChatRoute({_i17.Key? key, int? id, List<_i16.PageRouteInfo>? children})
|
EditChatRoute({_i18.Key? key, int? id, List<_i17.PageRouteInfo>? children})
|
||||||
: super(
|
: super(
|
||||||
EditChatRoute.name,
|
EditChatRoute.name,
|
||||||
args: EditChatRouteArgs(key: key, id: id),
|
args: EditChatRouteArgs(key: key, id: id),
|
||||||
@ -171,14 +214,14 @@ class EditChatRoute extends _i16.PageRouteInfo<EditChatRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'EditChatRoute';
|
static const String name = 'EditChatRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final pathParams = data.inheritedPathParams;
|
final pathParams = data.inheritedPathParams;
|
||||||
final args = data.argsAs<EditChatRouteArgs>(
|
final args = data.argsAs<EditChatRouteArgs>(
|
||||||
orElse: () => EditChatRouteArgs(id: pathParams.optInt('id')),
|
orElse: () => EditChatRouteArgs(id: pathParams.optInt('id')),
|
||||||
);
|
);
|
||||||
return _i3.EditChatScreen(key: args.key, id: args.id);
|
return _i4.EditChatScreen(key: args.key, id: args.id);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -186,7 +229,7 @@ class EditChatRoute extends _i16.PageRouteInfo<EditChatRouteArgs> {
|
|||||||
class EditChatRouteArgs {
|
class EditChatRouteArgs {
|
||||||
const EditChatRouteArgs({this.key, this.id});
|
const EditChatRouteArgs({this.key, this.id});
|
||||||
|
|
||||||
final _i17.Key? key;
|
final _i18.Key? key;
|
||||||
|
|
||||||
final int? id;
|
final int? id;
|
||||||
|
|
||||||
@ -197,12 +240,12 @@ class EditChatRouteArgs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i6.EditPublisherScreen]
|
/// [_i7.EditPublisherScreen]
|
||||||
class EditPublisherRoute extends _i16.PageRouteInfo<EditPublisherRouteArgs> {
|
class EditPublisherRoute extends _i17.PageRouteInfo<EditPublisherRouteArgs> {
|
||||||
EditPublisherRoute({
|
EditPublisherRoute({
|
||||||
_i17.Key? key,
|
_i18.Key? key,
|
||||||
String? name,
|
String? name,
|
||||||
List<_i16.PageRouteInfo>? children,
|
List<_i17.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
EditPublisherRoute.name,
|
EditPublisherRoute.name,
|
||||||
args: EditPublisherRouteArgs(key: key, name: name),
|
args: EditPublisherRouteArgs(key: key, name: name),
|
||||||
@ -212,14 +255,14 @@ class EditPublisherRoute extends _i16.PageRouteInfo<EditPublisherRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'EditPublisherRoute';
|
static const String name = 'EditPublisherRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final pathParams = data.inheritedPathParams;
|
final pathParams = data.inheritedPathParams;
|
||||||
final args = data.argsAs<EditPublisherRouteArgs>(
|
final args = data.argsAs<EditPublisherRouteArgs>(
|
||||||
orElse: () => EditPublisherRouteArgs(name: pathParams.optString('id')),
|
orElse: () => EditPublisherRouteArgs(name: pathParams.optString('id')),
|
||||||
);
|
);
|
||||||
return _i6.EditPublisherScreen(key: args.key, name: args.name);
|
return _i7.EditPublisherScreen(key: args.key, name: args.name);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -227,7 +270,7 @@ class EditPublisherRoute extends _i16.PageRouteInfo<EditPublisherRouteArgs> {
|
|||||||
class EditPublisherRouteArgs {
|
class EditPublisherRouteArgs {
|
||||||
const EditPublisherRouteArgs({this.key, this.name});
|
const EditPublisherRouteArgs({this.key, this.name});
|
||||||
|
|
||||||
final _i17.Key? key;
|
final _i18.Key? key;
|
||||||
|
|
||||||
final String? name;
|
final String? name;
|
||||||
|
|
||||||
@ -238,12 +281,12 @@ class EditPublisherRouteArgs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i7.EditRealmScreen]
|
/// [_i8.EditRealmScreen]
|
||||||
class EditRealmRoute extends _i16.PageRouteInfo<EditRealmRouteArgs> {
|
class EditRealmRoute extends _i17.PageRouteInfo<EditRealmRouteArgs> {
|
||||||
EditRealmRoute({
|
EditRealmRoute({
|
||||||
_i17.Key? key,
|
_i18.Key? key,
|
||||||
String? slug,
|
String? slug,
|
||||||
List<_i16.PageRouteInfo>? children,
|
List<_i17.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
EditRealmRoute.name,
|
EditRealmRoute.name,
|
||||||
args: EditRealmRouteArgs(key: key, slug: slug),
|
args: EditRealmRouteArgs(key: key, slug: slug),
|
||||||
@ -253,14 +296,14 @@ class EditRealmRoute extends _i16.PageRouteInfo<EditRealmRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'EditRealmRoute';
|
static const String name = 'EditRealmRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final pathParams = data.inheritedPathParams;
|
final pathParams = data.inheritedPathParams;
|
||||||
final args = data.argsAs<EditRealmRouteArgs>(
|
final args = data.argsAs<EditRealmRouteArgs>(
|
||||||
orElse: () => EditRealmRouteArgs(slug: pathParams.optString('slug')),
|
orElse: () => EditRealmRouteArgs(slug: pathParams.optString('slug')),
|
||||||
);
|
);
|
||||||
return _i7.EditRealmScreen(key: args.key, slug: args.slug);
|
return _i8.EditRealmScreen(key: args.key, slug: args.slug);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -268,7 +311,7 @@ class EditRealmRoute extends _i16.PageRouteInfo<EditRealmRouteArgs> {
|
|||||||
class EditRealmRouteArgs {
|
class EditRealmRouteArgs {
|
||||||
const EditRealmRouteArgs({this.key, this.slug});
|
const EditRealmRouteArgs({this.key, this.slug});
|
||||||
|
|
||||||
final _i17.Key? key;
|
final _i18.Key? key;
|
||||||
|
|
||||||
final String? slug;
|
final String? slug;
|
||||||
|
|
||||||
@ -279,124 +322,124 @@ class EditRealmRouteArgs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i8.ExploreScreen]
|
/// [_i9.ExploreScreen]
|
||||||
class ExploreRoute extends _i16.PageRouteInfo<void> {
|
class ExploreRoute extends _i17.PageRouteInfo<void> {
|
||||||
const ExploreRoute({List<_i16.PageRouteInfo>? children})
|
const ExploreRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(ExploreRoute.name, initialChildren: children);
|
: super(ExploreRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'ExploreRoute';
|
static const String name = 'ExploreRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i8.ExploreScreen();
|
return const _i9.ExploreScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i9.LoginScreen]
|
/// [_i10.LoginScreen]
|
||||||
class LoginRoute extends _i16.PageRouteInfo<void> {
|
class LoginRoute extends _i17.PageRouteInfo<void> {
|
||||||
const LoginRoute({List<_i16.PageRouteInfo>? children})
|
const LoginRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(LoginRoute.name, initialChildren: children);
|
: super(LoginRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'LoginRoute';
|
static const String name = 'LoginRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i9.LoginScreen();
|
return const _i10.LoginScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i6.ManagedPublisherScreen]
|
/// [_i7.ManagedPublisherScreen]
|
||||||
class ManagedPublisherRoute extends _i16.PageRouteInfo<void> {
|
class ManagedPublisherRoute extends _i17.PageRouteInfo<void> {
|
||||||
const ManagedPublisherRoute({List<_i16.PageRouteInfo>? children})
|
const ManagedPublisherRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(ManagedPublisherRoute.name, initialChildren: children);
|
: super(ManagedPublisherRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'ManagedPublisherRoute';
|
static const String name = 'ManagedPublisherRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i6.ManagedPublisherScreen();
|
return const _i7.ManagedPublisherScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i10.MyselfProfileScreen]
|
/// [_i11.MyselfProfileScreen]
|
||||||
class MyselfProfileRoute extends _i16.PageRouteInfo<void> {
|
class MyselfProfileRoute extends _i17.PageRouteInfo<void> {
|
||||||
const MyselfProfileRoute({List<_i16.PageRouteInfo>? children})
|
const MyselfProfileRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(MyselfProfileRoute.name, initialChildren: children);
|
: super(MyselfProfileRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'MyselfProfileRoute';
|
static const String name = 'MyselfProfileRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i10.MyselfProfileScreen();
|
return const _i11.MyselfProfileScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i3.NewChatScreen]
|
/// [_i4.NewChatScreen]
|
||||||
class NewChatRoute extends _i16.PageRouteInfo<void> {
|
class NewChatRoute extends _i17.PageRouteInfo<void> {
|
||||||
const NewChatRoute({List<_i16.PageRouteInfo>? children})
|
const NewChatRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(NewChatRoute.name, initialChildren: children);
|
: super(NewChatRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'NewChatRoute';
|
static const String name = 'NewChatRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i3.NewChatScreen();
|
return const _i4.NewChatScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i6.NewPublisherScreen]
|
/// [_i7.NewPublisherScreen]
|
||||||
class NewPublisherRoute extends _i16.PageRouteInfo<void> {
|
class NewPublisherRoute extends _i17.PageRouteInfo<void> {
|
||||||
const NewPublisherRoute({List<_i16.PageRouteInfo>? children})
|
const NewPublisherRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(NewPublisherRoute.name, initialChildren: children);
|
: super(NewPublisherRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'NewPublisherRoute';
|
static const String name = 'NewPublisherRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i6.NewPublisherScreen();
|
return const _i7.NewPublisherScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i7.NewRealmScreen]
|
/// [_i8.NewRealmScreen]
|
||||||
class NewRealmRoute extends _i16.PageRouteInfo<void> {
|
class NewRealmRoute extends _i17.PageRouteInfo<void> {
|
||||||
const NewRealmRoute({List<_i16.PageRouteInfo>? children})
|
const NewRealmRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(NewRealmRoute.name, initialChildren: children);
|
: super(NewRealmRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'NewRealmRoute';
|
static const String name = 'NewRealmRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i7.NewRealmScreen();
|
return const _i8.NewRealmScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i11.PostComposeScreen]
|
/// [_i12.PostComposeScreen]
|
||||||
class PostComposeRoute extends _i16.PageRouteInfo<PostComposeRouteArgs> {
|
class PostComposeRoute extends _i17.PageRouteInfo<PostComposeRouteArgs> {
|
||||||
PostComposeRoute({
|
PostComposeRoute({
|
||||||
_i17.Key? key,
|
_i18.Key? key,
|
||||||
_i18.SnPost? originalPost,
|
_i19.SnPost? originalPost,
|
||||||
List<_i16.PageRouteInfo>? children,
|
List<_i17.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
PostComposeRoute.name,
|
PostComposeRoute.name,
|
||||||
args: PostComposeRouteArgs(key: key, originalPost: originalPost),
|
args: PostComposeRouteArgs(key: key, originalPost: originalPost),
|
||||||
@ -405,13 +448,13 @@ class PostComposeRoute extends _i16.PageRouteInfo<PostComposeRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'PostComposeRoute';
|
static const String name = 'PostComposeRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final args = data.argsAs<PostComposeRouteArgs>(
|
final args = data.argsAs<PostComposeRouteArgs>(
|
||||||
orElse: () => const PostComposeRouteArgs(),
|
orElse: () => const PostComposeRouteArgs(),
|
||||||
);
|
);
|
||||||
return _i11.PostComposeScreen(
|
return _i12.PostComposeScreen(
|
||||||
key: args.key,
|
key: args.key,
|
||||||
originalPost: args.originalPost,
|
originalPost: args.originalPost,
|
||||||
);
|
);
|
||||||
@ -422,9 +465,9 @@ class PostComposeRoute extends _i16.PageRouteInfo<PostComposeRouteArgs> {
|
|||||||
class PostComposeRouteArgs {
|
class PostComposeRouteArgs {
|
||||||
const PostComposeRouteArgs({this.key, this.originalPost});
|
const PostComposeRouteArgs({this.key, this.originalPost});
|
||||||
|
|
||||||
final _i17.Key? key;
|
final _i18.Key? key;
|
||||||
|
|
||||||
final _i18.SnPost? originalPost;
|
final _i19.SnPost? originalPost;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
@ -433,12 +476,12 @@ class PostComposeRouteArgs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i12.PostDetailScreen]
|
/// [_i13.PostDetailScreen]
|
||||||
class PostDetailRoute extends _i16.PageRouteInfo<PostDetailRouteArgs> {
|
class PostDetailRoute extends _i17.PageRouteInfo<PostDetailRouteArgs> {
|
||||||
PostDetailRoute({
|
PostDetailRoute({
|
||||||
_i17.Key? key,
|
_i18.Key? key,
|
||||||
required int id,
|
required int id,
|
||||||
List<_i16.PageRouteInfo>? children,
|
List<_i17.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
PostDetailRoute.name,
|
PostDetailRoute.name,
|
||||||
args: PostDetailRouteArgs(key: key, id: id),
|
args: PostDetailRouteArgs(key: key, id: id),
|
||||||
@ -448,14 +491,14 @@ class PostDetailRoute extends _i16.PageRouteInfo<PostDetailRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'PostDetailRoute';
|
static const String name = 'PostDetailRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final pathParams = data.inheritedPathParams;
|
final pathParams = data.inheritedPathParams;
|
||||||
final args = data.argsAs<PostDetailRouteArgs>(
|
final args = data.argsAs<PostDetailRouteArgs>(
|
||||||
orElse: () => PostDetailRouteArgs(id: pathParams.getInt('id')),
|
orElse: () => PostDetailRouteArgs(id: pathParams.getInt('id')),
|
||||||
);
|
);
|
||||||
return _i12.PostDetailScreen(key: args.key, id: args.id);
|
return _i13.PostDetailScreen(key: args.key, id: args.id);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -463,7 +506,7 @@ class PostDetailRoute extends _i16.PageRouteInfo<PostDetailRouteArgs> {
|
|||||||
class PostDetailRouteArgs {
|
class PostDetailRouteArgs {
|
||||||
const PostDetailRouteArgs({this.key, required this.id});
|
const PostDetailRouteArgs({this.key, required this.id});
|
||||||
|
|
||||||
final _i17.Key? key;
|
final _i18.Key? key;
|
||||||
|
|
||||||
final int id;
|
final int id;
|
||||||
|
|
||||||
@ -474,12 +517,12 @@ class PostDetailRouteArgs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i11.PostEditScreen]
|
/// [_i12.PostEditScreen]
|
||||||
class PostEditRoute extends _i16.PageRouteInfo<PostEditRouteArgs> {
|
class PostEditRoute extends _i17.PageRouteInfo<PostEditRouteArgs> {
|
||||||
PostEditRoute({
|
PostEditRoute({
|
||||||
_i17.Key? key,
|
_i18.Key? key,
|
||||||
required int id,
|
required int id,
|
||||||
List<_i16.PageRouteInfo>? children,
|
List<_i17.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
PostEditRoute.name,
|
PostEditRoute.name,
|
||||||
args: PostEditRouteArgs(key: key, id: id),
|
args: PostEditRouteArgs(key: key, id: id),
|
||||||
@ -489,14 +532,14 @@ class PostEditRoute extends _i16.PageRouteInfo<PostEditRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'PostEditRoute';
|
static const String name = 'PostEditRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final pathParams = data.inheritedPathParams;
|
final pathParams = data.inheritedPathParams;
|
||||||
final args = data.argsAs<PostEditRouteArgs>(
|
final args = data.argsAs<PostEditRouteArgs>(
|
||||||
orElse: () => PostEditRouteArgs(id: pathParams.getInt('id')),
|
orElse: () => PostEditRouteArgs(id: pathParams.getInt('id')),
|
||||||
);
|
);
|
||||||
return _i11.PostEditScreen(key: args.key, id: args.id);
|
return _i12.PostEditScreen(key: args.key, id: args.id);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -504,7 +547,7 @@ class PostEditRoute extends _i16.PageRouteInfo<PostEditRouteArgs> {
|
|||||||
class PostEditRouteArgs {
|
class PostEditRouteArgs {
|
||||||
const PostEditRouteArgs({this.key, required this.id});
|
const PostEditRouteArgs({this.key, required this.id});
|
||||||
|
|
||||||
final _i17.Key? key;
|
final _i18.Key? key;
|
||||||
|
|
||||||
final int id;
|
final int id;
|
||||||
|
|
||||||
@ -515,12 +558,12 @@ class PostEditRouteArgs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i13.RealmDetailScreen]
|
/// [_i14.RealmDetailScreen]
|
||||||
class RealmDetailRoute extends _i16.PageRouteInfo<RealmDetailRouteArgs> {
|
class RealmDetailRoute extends _i17.PageRouteInfo<RealmDetailRouteArgs> {
|
||||||
RealmDetailRoute({
|
RealmDetailRoute({
|
||||||
_i17.Key? key,
|
_i18.Key? key,
|
||||||
required String slug,
|
required String slug,
|
||||||
List<_i16.PageRouteInfo>? children,
|
List<_i17.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
RealmDetailRoute.name,
|
RealmDetailRoute.name,
|
||||||
args: RealmDetailRouteArgs(key: key, slug: slug),
|
args: RealmDetailRouteArgs(key: key, slug: slug),
|
||||||
@ -530,14 +573,14 @@ class RealmDetailRoute extends _i16.PageRouteInfo<RealmDetailRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'RealmDetailRoute';
|
static const String name = 'RealmDetailRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final pathParams = data.inheritedPathParams;
|
final pathParams = data.inheritedPathParams;
|
||||||
final args = data.argsAs<RealmDetailRouteArgs>(
|
final args = data.argsAs<RealmDetailRouteArgs>(
|
||||||
orElse: () => RealmDetailRouteArgs(slug: pathParams.getString('slug')),
|
orElse: () => RealmDetailRouteArgs(slug: pathParams.getString('slug')),
|
||||||
);
|
);
|
||||||
return _i13.RealmDetailScreen(key: args.key, slug: args.slug);
|
return _i14.RealmDetailScreen(key: args.key, slug: args.slug);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -545,7 +588,7 @@ class RealmDetailRoute extends _i16.PageRouteInfo<RealmDetailRouteArgs> {
|
|||||||
class RealmDetailRouteArgs {
|
class RealmDetailRouteArgs {
|
||||||
const RealmDetailRouteArgs({this.key, required this.slug});
|
const RealmDetailRouteArgs({this.key, required this.slug});
|
||||||
|
|
||||||
final _i17.Key? key;
|
final _i18.Key? key;
|
||||||
|
|
||||||
final String slug;
|
final String slug;
|
||||||
|
|
||||||
@ -556,49 +599,49 @@ class RealmDetailRouteArgs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i7.RealmListScreen]
|
/// [_i8.RealmListScreen]
|
||||||
class RealmListRoute extends _i16.PageRouteInfo<void> {
|
class RealmListRoute extends _i17.PageRouteInfo<void> {
|
||||||
const RealmListRoute({List<_i16.PageRouteInfo>? children})
|
const RealmListRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(RealmListRoute.name, initialChildren: children);
|
: super(RealmListRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'RealmListRoute';
|
static const String name = 'RealmListRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i7.RealmListScreen();
|
return const _i8.RealmListScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i14.TabsScreen]
|
/// [_i15.TabsScreen]
|
||||||
class TabsRoute extends _i16.PageRouteInfo<void> {
|
class TabsRoute extends _i17.PageRouteInfo<void> {
|
||||||
const TabsRoute({List<_i16.PageRouteInfo>? children})
|
const TabsRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(TabsRoute.name, initialChildren: children);
|
: super(TabsRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'TabsRoute';
|
static const String name = 'TabsRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i14.TabsScreen();
|
return const _i15.TabsScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i15.UpdateProfileScreen]
|
/// [_i16.UpdateProfileScreen]
|
||||||
class UpdateProfileRoute extends _i16.PageRouteInfo<void> {
|
class UpdateProfileRoute extends _i17.PageRouteInfo<void> {
|
||||||
const UpdateProfileRoute({List<_i16.PageRouteInfo>? children})
|
const UpdateProfileRoute({List<_i17.PageRouteInfo>? children})
|
||||||
: super(UpdateProfileRoute.name, initialChildren: children);
|
: super(UpdateProfileRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'UpdateProfileRoute';
|
static const String name = 'UpdateProfileRoute';
|
||||||
|
|
||||||
static _i16.PageInfo page = _i16.PageInfo(
|
static _i17.PageInfo page = _i17.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i15.UpdateProfileScreen();
|
return const _i16.UpdateProfileScreen();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
93
lib/screens/account/profile.dart
Normal file
93
lib/screens/account/profile.dart
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
import 'package:auto_route/auto_route.dart';
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:island/models/user.dart';
|
||||||
|
import 'package:island/pods/network.dart';
|
||||||
|
import 'package:island/widgets/app_scaffold.dart';
|
||||||
|
import 'package:island/widgets/content/cloud_files.dart';
|
||||||
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
|
|
||||||
|
part 'profile.g.dart';
|
||||||
|
|
||||||
|
@riverpod
|
||||||
|
Future<SnAccount> account(Ref ref, String uname) async {
|
||||||
|
final apiClient = ref.watch(apiClientProvider);
|
||||||
|
final resp = await apiClient.get("/accounts/$uname");
|
||||||
|
return SnAccount.fromJson(resp.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RoutePage()
|
||||||
|
class AccountProfileScreen extends HookConsumerWidget {
|
||||||
|
final String name;
|
||||||
|
const AccountProfileScreen({
|
||||||
|
super.key,
|
||||||
|
@PathParam("name") required this.name,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
final accountAsync = ref.watch(accountProvider(name));
|
||||||
|
return accountAsync.when(
|
||||||
|
data:
|
||||||
|
(data) => AppScaffold(
|
||||||
|
body: CustomScrollView(
|
||||||
|
slivers: [
|
||||||
|
SliverAppBar(
|
||||||
|
expandedHeight: 180,
|
||||||
|
pinned: true,
|
||||||
|
flexibleSpace: FlexibleSpaceBar(
|
||||||
|
background:
|
||||||
|
data.profile.backgroundId != null
|
||||||
|
? CloudImageWidget(
|
||||||
|
fileId: data.profile.backgroundId!,
|
||||||
|
)
|
||||||
|
: Container(
|
||||||
|
color:
|
||||||
|
Theme.of(context).appBarTheme.backgroundColor,
|
||||||
|
),
|
||||||
|
title: Text(
|
||||||
|
data.name,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Theme.of(context).appBarTheme.foregroundColor,
|
||||||
|
shadows: [
|
||||||
|
Shadow(
|
||||||
|
color: Colors.black54,
|
||||||
|
blurRadius: 5.0,
|
||||||
|
offset: Offset(1.0, 1.0),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SliverToBoxAdapter(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
data.profile.bio ?? '',
|
||||||
|
style: const TextStyle(fontSize: 16),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
error:
|
||||||
|
(error, stackTrace) => AppScaffold(
|
||||||
|
appBar: AppBar(leading: const PageBackButton()),
|
||||||
|
body: Center(child: Text(error.toString())),
|
||||||
|
),
|
||||||
|
loading:
|
||||||
|
() => AppScaffold(
|
||||||
|
appBar: AppBar(leading: const PageBackButton()),
|
||||||
|
body: Center(child: CircularProgressIndicator()),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
149
lib/screens/account/profile.g.dart
Normal file
149
lib/screens/account/profile.g.dart
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'profile.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// RiverpodGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
String _$accountHash() => r'39003ef3250181b9290e0562329c7801d4841941';
|
||||||
|
|
||||||
|
/// Copied from Dart SDK
|
||||||
|
class _SystemHash {
|
||||||
|
_SystemHash._();
|
||||||
|
|
||||||
|
static int combine(int hash, int value) {
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = 0x1fffffff & (hash + value);
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
|
||||||
|
return hash ^ (hash >> 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int finish(int hash) {
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
hash = hash ^ (hash >> 11);
|
||||||
|
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// See also [account].
|
||||||
|
@ProviderFor(account)
|
||||||
|
const accountProvider = AccountFamily();
|
||||||
|
|
||||||
|
/// See also [account].
|
||||||
|
class AccountFamily extends Family<AsyncValue<SnAccount>> {
|
||||||
|
/// See also [account].
|
||||||
|
const AccountFamily();
|
||||||
|
|
||||||
|
/// See also [account].
|
||||||
|
AccountProvider call(String uname) {
|
||||||
|
return AccountProvider(uname);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
AccountProvider getProviderOverride(covariant AccountProvider provider) {
|
||||||
|
return call(provider.uname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||||
|
|
||||||
|
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||||
|
_allTransitiveDependencies;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String? get name => r'accountProvider';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// See also [account].
|
||||||
|
class AccountProvider extends AutoDisposeFutureProvider<SnAccount> {
|
||||||
|
/// See also [account].
|
||||||
|
AccountProvider(String uname)
|
||||||
|
: this._internal(
|
||||||
|
(ref) => account(ref as AccountRef, uname),
|
||||||
|
from: accountProvider,
|
||||||
|
name: r'accountProvider',
|
||||||
|
debugGetCreateSourceHash:
|
||||||
|
const bool.fromEnvironment('dart.vm.product')
|
||||||
|
? null
|
||||||
|
: _$accountHash,
|
||||||
|
dependencies: AccountFamily._dependencies,
|
||||||
|
allTransitiveDependencies: AccountFamily._allTransitiveDependencies,
|
||||||
|
uname: uname,
|
||||||
|
);
|
||||||
|
|
||||||
|
AccountProvider._internal(
|
||||||
|
super._createNotifier, {
|
||||||
|
required super.name,
|
||||||
|
required super.dependencies,
|
||||||
|
required super.allTransitiveDependencies,
|
||||||
|
required super.debugGetCreateSourceHash,
|
||||||
|
required super.from,
|
||||||
|
required this.uname,
|
||||||
|
}) : super.internal();
|
||||||
|
|
||||||
|
final String uname;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Override overrideWith(
|
||||||
|
FutureOr<SnAccount> Function(AccountRef provider) create,
|
||||||
|
) {
|
||||||
|
return ProviderOverride(
|
||||||
|
origin: this,
|
||||||
|
override: AccountProvider._internal(
|
||||||
|
(ref) => create(ref as AccountRef),
|
||||||
|
from: from,
|
||||||
|
name: null,
|
||||||
|
dependencies: null,
|
||||||
|
allTransitiveDependencies: null,
|
||||||
|
debugGetCreateSourceHash: null,
|
||||||
|
uname: uname,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
AutoDisposeFutureProviderElement<SnAccount> createElement() {
|
||||||
|
return _AccountProviderElement(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return other is AccountProvider && other.uname == uname;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
|
hash = _SystemHash.combine(hash, uname.hashCode);
|
||||||
|
|
||||||
|
return _SystemHash.finish(hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
|
// ignore: unused_element
|
||||||
|
mixin AccountRef on AutoDisposeFutureProviderRef<SnAccount> {
|
||||||
|
/// The parameter `uname` of this provider.
|
||||||
|
String get uname;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AccountProviderElement
|
||||||
|
extends AutoDisposeFutureProviderElement<SnAccount>
|
||||||
|
with AccountRef {
|
||||||
|
_AccountProviderElement(super.provider);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get uname => (origin as AccountProvider).uname;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
@ -10,7 +10,6 @@ import 'package:island/route.gr.dart';
|
|||||||
import 'package:island/widgets/alert.dart';
|
import 'package:island/widgets/alert.dart';
|
||||||
import 'package:island/widgets/app_scaffold.dart';
|
import 'package:island/widgets/app_scaffold.dart';
|
||||||
import 'package:material_symbols_icons/symbols.dart';
|
import 'package:material_symbols_icons/symbols.dart';
|
||||||
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@ import 'package:island/widgets/alert.dart';
|
|||||||
import 'package:island/widgets/app_scaffold.dart';
|
import 'package:island/widgets/app_scaffold.dart';
|
||||||
import 'package:island/widgets/content/cloud_files.dart';
|
import 'package:island/widgets/content/cloud_files.dart';
|
||||||
import 'package:material_symbols_icons/symbols.dart';
|
import 'package:material_symbols_icons/symbols.dart';
|
||||||
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
|
|
||||||
|
@ -15,7 +15,6 @@ import 'package:island/widgets/alert.dart';
|
|||||||
import 'package:island/widgets/app_scaffold.dart';
|
import 'package:island/widgets/app_scaffold.dart';
|
||||||
import 'package:island/widgets/content/cloud_files.dart';
|
import 'package:island/widgets/content/cloud_files.dart';
|
||||||
import 'package:material_symbols_icons/symbols.dart';
|
import 'package:material_symbols_icons/symbols.dart';
|
||||||
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
|
|
||||||
part 'room_detail.freezed.dart';
|
part 'room_detail.freezed.dart';
|
||||||
@ -42,7 +41,7 @@ class ChatDetailScreen extends HookConsumerWidget {
|
|||||||
offset: Offset(1.0, 1.0),
|
offset: Offset(1.0, 1.0),
|
||||||
);
|
);
|
||||||
|
|
||||||
return Scaffold(
|
return AppScaffold(
|
||||||
body: roomState.when(
|
body: roomState.when(
|
||||||
loading: () => const Center(child: CircularProgressIndicator()),
|
loading: () => const Center(child: CircularProgressIndicator()),
|
||||||
error: (error, _) => Center(child: Text('Error: $error')),
|
error: (error, _) => Center(child: Text('Error: $error')),
|
||||||
|
@ -85,27 +85,34 @@ class _PostListController extends StateNotifier<List<SnPost>> {
|
|||||||
if (isLoading || hasReachedMax) return;
|
if (isLoading || hasReachedMax) return;
|
||||||
isLoading = true;
|
isLoading = true;
|
||||||
|
|
||||||
final response = await _dio.get(
|
try {
|
||||||
'/posts',
|
final response = await _dio.get(
|
||||||
queryParameters: {'offset': offset, 'take': take},
|
'/posts',
|
||||||
);
|
queryParameters: {'offset': offset, 'take': take},
|
||||||
|
);
|
||||||
|
|
||||||
final List<SnPost> fetched =
|
final List<SnPost> fetched =
|
||||||
(response.data as List)
|
(response.data as List)
|
||||||
.map((e) => SnPost.fromJson(e as Map<String, dynamic>))
|
.map((e) => SnPost.fromJson(e as Map<String, dynamic>))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
final headerTotal = int.tryParse(response.headers['x-total']?.first ?? '');
|
final headerTotal = int.tryParse(response.headers['x-total']?.first ?? '');
|
||||||
if (headerTotal != null) total = headerTotal;
|
if (headerTotal != null) total = headerTotal;
|
||||||
|
|
||||||
state = [...state, ...fetched];
|
if (!mounted) return; // Check if the notifier is still mounted
|
||||||
offset += fetched.length;
|
|
||||||
if (state.length >= total) hasReachedMax = true;
|
|
||||||
|
|
||||||
isLoading = false;
|
state = [...state, ...fetched];
|
||||||
|
offset += fetched.length;
|
||||||
|
if (state.length >= total) hasReachedMax = true;
|
||||||
|
} finally {
|
||||||
|
if (mounted) {
|
||||||
|
isLoading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateOne(int index, SnPost post) {
|
void updateOne(int index, SnPost post) {
|
||||||
|
if (!mounted) return; // Check if the notifier is still mounted
|
||||||
final updatedPosts = [...state];
|
final updatedPosts = [...state];
|
||||||
updatedPosts[index] = post;
|
updatedPosts[index] = post;
|
||||||
state = updatedPosts;
|
state = updatedPosts;
|
||||||
|
@ -23,7 +23,6 @@ import 'package:island/widgets/content/cloud_files.dart';
|
|||||||
import 'package:island/widgets/post/publishers_modal.dart';
|
import 'package:island/widgets/post/publishers_modal.dart';
|
||||||
import 'package:markdown_editor_plus/widgets/markdown_auto_preview.dart';
|
import 'package:markdown_editor_plus/widgets/markdown_auto_preview.dart';
|
||||||
import 'package:material_symbols_icons/symbols.dart';
|
import 'package:material_symbols_icons/symbols.dart';
|
||||||
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
|
@ -14,7 +14,6 @@ import 'package:island/widgets/alert.dart';
|
|||||||
import 'package:island/widgets/app_scaffold.dart';
|
import 'package:island/widgets/app_scaffold.dart';
|
||||||
import 'package:island/widgets/content/cloud_files.dart';
|
import 'package:island/widgets/content/cloud_files.dart';
|
||||||
import 'package:material_symbols_icons/symbols.dart';
|
import 'package:material_symbols_icons/symbols.dart';
|
||||||
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
|
|
||||||
|
@ -2,23 +2,24 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:bitsdojo_window/bitsdojo_window.dart';
|
import 'package:bitsdojo_window/bitsdojo_window.dart';
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:island/pods/websocket.dart';
|
||||||
import 'package:island/route.dart';
|
import 'package:island/route.dart';
|
||||||
import 'package:material_symbols_icons/material_symbols_icons.dart';
|
import 'package:material_symbols_icons/material_symbols_icons.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:responsive_framework/responsive_framework.dart';
|
import 'package:responsive_framework/responsive_framework.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
|
|
||||||
class WindowScaffold extends StatelessWidget {
|
class WindowScaffold extends HookConsumerWidget {
|
||||||
final Widget child;
|
final Widget child;
|
||||||
final AppRouter router;
|
final AppRouter router;
|
||||||
const WindowScaffold({super.key, required this.child, required this.router});
|
const WindowScaffold({super.key, required this.child, required this.router});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
if (!kIsWeb &&
|
if (!kIsWeb &&
|
||||||
(Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
|
(Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
|
||||||
final devicePixelRatio = MediaQuery.of(context).devicePixelRatio;
|
final devicePixelRatio = MediaQuery.of(context).devicePixelRatio;
|
||||||
@ -31,56 +32,65 @@ class WindowScaffold extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return Material(
|
return Material(
|
||||||
child: Column(
|
child: Stack(
|
||||||
|
fit: StackFit.expand,
|
||||||
children: [
|
children: [
|
||||||
WindowTitleBarBox(
|
Column(
|
||||||
child: Container(
|
children: [
|
||||||
decoration: BoxDecoration(
|
WindowTitleBarBox(
|
||||||
border: Border(
|
child: Container(
|
||||||
bottom: BorderSide(
|
decoration: BoxDecoration(
|
||||||
color: Theme.of(context).dividerColor,
|
border: Border(
|
||||||
width: 1 / devicePixelRatio,
|
bottom: BorderSide(
|
||||||
|
color: Theme.of(context).dividerColor,
|
||||||
|
width: 1 / devicePixelRatio,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: MoveWindow(
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
mainAxisAlignment:
|
||||||
|
Platform.isMacOS
|
||||||
|
? MainAxisAlignment.center
|
||||||
|
: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
'Solar Network',
|
||||||
|
textAlign:
|
||||||
|
Platform.isMacOS
|
||||||
|
? TextAlign.center
|
||||||
|
: TextAlign.start,
|
||||||
|
).padding(horizontal: 12, vertical: 5),
|
||||||
|
),
|
||||||
|
if (!Platform.isMacOS)
|
||||||
|
MinimizeWindowButton(colors: windowButtonColor),
|
||||||
|
if (!Platform.isMacOS)
|
||||||
|
MaximizeWindowButton(colors: windowButtonColor),
|
||||||
|
if (!Platform.isMacOS)
|
||||||
|
CloseWindowButton(
|
||||||
|
colors: windowButtonColor,
|
||||||
|
onPressed: () => appWindow.hide(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
child: MoveWindow(
|
Expanded(child: child),
|
||||||
child: Row(
|
],
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
|
||||||
mainAxisAlignment:
|
|
||||||
Platform.isMacOS
|
|
||||||
? MainAxisAlignment.center
|
|
||||||
: MainAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
'Solar Network',
|
|
||||||
textAlign:
|
|
||||||
Platform.isMacOS
|
|
||||||
? TextAlign.center
|
|
||||||
: TextAlign.start,
|
|
||||||
).padding(horizontal: 12, vertical: 5),
|
|
||||||
),
|
|
||||||
if (!Platform.isMacOS)
|
|
||||||
MinimizeWindowButton(colors: windowButtonColor),
|
|
||||||
if (!Platform.isMacOS)
|
|
||||||
MaximizeWindowButton(colors: windowButtonColor),
|
|
||||||
if (!Platform.isMacOS)
|
|
||||||
CloseWindowButton(
|
|
||||||
colors: windowButtonColor,
|
|
||||||
onPressed: () => appWindow.hide(),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
Expanded(child: child),
|
_WebSocketIndicator(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return child;
|
return Stack(
|
||||||
|
fit: StackFit.expand,
|
||||||
|
children: [child, _WebSocketIndicator()],
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,3 +252,50 @@ class AppBackground extends ConsumerWidget {
|
|||||||
return Material(color: Colors.transparent, child: child);
|
return Material(color: Colors.transparent, child: child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _WebSocketIndicator extends HookConsumerWidget {
|
||||||
|
const _WebSocketIndicator();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
final websocketState = ref.watch(websocketStateProvider);
|
||||||
|
final indicatorHeight = MediaQuery.of(context).padding.top + 60;
|
||||||
|
|
||||||
|
Color indicatorColor;
|
||||||
|
String indicatorText;
|
||||||
|
|
||||||
|
if (websocketState == WebSocketState.connected()) {
|
||||||
|
indicatorColor = Colors.green;
|
||||||
|
indicatorText = 'connectionConnected';
|
||||||
|
} else if (websocketState == WebSocketState.connecting()) {
|
||||||
|
indicatorColor = Colors.teal;
|
||||||
|
indicatorText = 'connectionReconnecting';
|
||||||
|
} else {
|
||||||
|
indicatorColor = Colors.orange;
|
||||||
|
indicatorText = 'connectionDisconnected';
|
||||||
|
}
|
||||||
|
|
||||||
|
return AnimatedPositioned(
|
||||||
|
duration: Duration(milliseconds: 1850),
|
||||||
|
top: websocketState == WebSocketState.connected() ? -indicatorHeight : 0,
|
||||||
|
curve: Curves.fastLinearToSlowEaseIn,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
height: indicatorHeight,
|
||||||
|
child: Material(
|
||||||
|
elevation: 4,
|
||||||
|
child: AnimatedContainer(
|
||||||
|
duration: Duration(milliseconds: 300),
|
||||||
|
color: indicatorColor,
|
||||||
|
child: Center(
|
||||||
|
child:
|
||||||
|
Text(
|
||||||
|
indicatorText,
|
||||||
|
style: TextStyle(color: Colors.white, fontSize: 16),
|
||||||
|
).tr(),
|
||||||
|
).padding(top: MediaQuery.of(context).padding.top),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -9,7 +9,6 @@ import 'package:island/widgets/alert.dart';
|
|||||||
import 'package:island/widgets/content/cloud_files.dart';
|
import 'package:island/widgets/content/cloud_files.dart';
|
||||||
import 'package:island/widgets/post/publishers_modal.dart';
|
import 'package:island/widgets/post/publishers_modal.dart';
|
||||||
import 'package:material_symbols_icons/symbols.dart';
|
import 'package:material_symbols_icons/symbols.dart';
|
||||||
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
|
||||||
import 'package:styled_widget/styled_widget.dart';
|
import 'package:styled_widget/styled_widget.dart';
|
||||||
|
|
||||||
class PostQuickReply extends HookConsumerWidget {
|
class PostQuickReply extends HookConsumerWidget {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user