Compare commits
No commits in common. "9910fc7a92b7acc0ab1177848b36989a76c969d5" and "8ec33ccbf468139c3d859e5b71c81df865eb60c8" have entirely different histories.
9910fc7a92
...
8ec33ccbf4
@ -20,6 +20,7 @@ import 'package:solian/widgets/app_bar_leading.dart';
|
|||||||
import 'package:solian/widgets/app_bar_title.dart';
|
import 'package:solian/widgets/app_bar_title.dart';
|
||||||
import 'package:solian/widgets/channel/channel_call_indicator.dart';
|
import 'package:solian/widgets/channel/channel_call_indicator.dart';
|
||||||
import 'package:solian/widgets/chat/call/chat_call_action.dart';
|
import 'package:solian/widgets/chat/call/chat_call_action.dart';
|
||||||
|
import 'package:solian/widgets/chat/chat_event.dart';
|
||||||
import 'package:solian/widgets/chat/chat_event_list.dart';
|
import 'package:solian/widgets/chat/chat_event_list.dart';
|
||||||
import 'package:solian/widgets/chat/chat_message_input.dart';
|
import 'package:solian/widgets/chat/chat_message_input.dart';
|
||||||
import 'package:solian/widgets/current_state_action.dart';
|
import 'package:solian/widgets/current_state_action.dart';
|
||||||
@ -38,10 +39,7 @@ class ChannelChatScreen extends StatefulWidget {
|
|||||||
State<ChannelChatScreen> createState() => _ChannelChatScreenState();
|
State<ChannelChatScreen> createState() => _ChannelChatScreenState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ChannelChatScreenState extends State<ChannelChatScreen>
|
class _ChannelChatScreenState extends State<ChannelChatScreen> {
|
||||||
with WidgetsBindingObserver {
|
|
||||||
DateTime? _isOutOfSyncSince;
|
|
||||||
|
|
||||||
bool _isBusy = false;
|
bool _isBusy = false;
|
||||||
int? _accountId;
|
int? _accountId;
|
||||||
|
|
||||||
@ -125,38 +123,20 @@ class _ChannelChatScreenState extends State<ChannelChatScreen>
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void _keepUpdateWithServer() {
|
|
||||||
_getOngoingCall();
|
|
||||||
_chatController.getEvents(_channel!, widget.realm);
|
|
||||||
setState(() => _isOutOfSyncSince = null);
|
|
||||||
}
|
|
||||||
|
|
||||||
Event? _messageToReplying;
|
Event? _messageToReplying;
|
||||||
Event? _messageToEditing;
|
Event? _messageToEditing;
|
||||||
|
|
||||||
@override
|
Widget buildHistoryBody(Event item, {bool isMerged = false}) {
|
||||||
void didChangeAppLifecycleState(AppLifecycleState state) {
|
return ChatEvent(
|
||||||
switch (state) {
|
key: Key('m${item.uuid}'),
|
||||||
case AppLifecycleState.resumed:
|
item: item,
|
||||||
if (_isOutOfSyncSince == null) break;
|
isMerged: isMerged,
|
||||||
if (DateTime.now().difference(_isOutOfSyncSince!).inSeconds < 60) break;
|
chatController: _chatController,
|
||||||
_keepUpdateWithServer();
|
);
|
||||||
break;
|
|
||||||
case AppLifecycleState.paused:
|
|
||||||
if (mounted) {
|
|
||||||
setState(() => _isOutOfSyncSince = DateTime.now());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
|
||||||
WidgetsBinding.instance.addObserver(this);
|
|
||||||
|
|
||||||
_accountId = Get.find<AuthProvider>().userProfile.value!['id'];
|
_accountId = Get.find<AuthProvider>().userProfile.value!['id'];
|
||||||
|
|
||||||
_chatController = ChatEventController();
|
_chatController = ChatEventController();
|
||||||
@ -167,10 +147,21 @@ class _ChannelChatScreenState extends State<ChannelChatScreen>
|
|||||||
_chatController.getEvents(_channel!, widget.realm);
|
_chatController.getEvents(_channel!, widget.realm);
|
||||||
_listenMessages();
|
_listenMessages();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
if (_isBusy || _channel == null) {
|
||||||
|
return Material(
|
||||||
|
color: Theme.of(context).colorScheme.surface,
|
||||||
|
child: const Center(
|
||||||
|
child: CircularProgressIndicator(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
String title = _channel?.name ?? 'loading'.tr;
|
String title = _channel?.name ?? 'loading'.tr;
|
||||||
String? placeholder;
|
String? placeholder;
|
||||||
|
|
||||||
@ -194,8 +185,7 @@ class _ChannelChatScreenState extends State<ChannelChatScreen>
|
|||||||
actions: [
|
actions: [
|
||||||
const BackgroundStateWidget(),
|
const BackgroundStateWidget(),
|
||||||
Builder(builder: (context) {
|
Builder(builder: (context) {
|
||||||
if (_isBusy || _channel == null) return const SizedBox();
|
if (_isBusy) return const SizedBox();
|
||||||
|
|
||||||
return ChatCallButton(
|
return ChatCallButton(
|
||||||
realm: _channel!.realm,
|
realm: _channel!.realm,
|
||||||
channel: _channel!,
|
channel: _channel!,
|
||||||
@ -205,8 +195,6 @@ class _ChannelChatScreenState extends State<ChannelChatScreen>
|
|||||||
IconButton(
|
IconButton(
|
||||||
icon: const Icon(Icons.more_vert),
|
icon: const Icon(Icons.more_vert),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
if (_channel == null) return;
|
|
||||||
|
|
||||||
AppRouter.instance
|
AppRouter.instance
|
||||||
.pushNamed(
|
.pushNamed(
|
||||||
'channelDetail',
|
'channelDetail',
|
||||||
@ -231,14 +219,7 @@ class _ChannelChatScreenState extends State<ChannelChatScreen>
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
body: Builder(builder: (context) {
|
body: Column(
|
||||||
if (_isBusy || _channel == null) {
|
|
||||||
return const Center(
|
|
||||||
child: CircularProgressIndicator(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Column(
|
|
||||||
children: [
|
children: [
|
||||||
if (_ongoingCall != null)
|
if (_ongoingCall != null)
|
||||||
ChannelCallIndicator(
|
ChannelCallIndicator(
|
||||||
@ -258,18 +239,6 @@ class _ChannelChatScreenState extends State<ChannelChatScreen>
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (_isOutOfSyncSince != null)
|
|
||||||
ListTile(
|
|
||||||
tileColor: Theme.of(context).colorScheme.surfaceContainerLow,
|
|
||||||
leading: const Icon(Icons.history_toggle_off),
|
|
||||||
title: Text('messageOutOfSync'.tr),
|
|
||||||
subtitle: Text('messageOutOfSyncCaption'.tr),
|
|
||||||
onTap: _isBusy
|
|
||||||
? null
|
|
||||||
: () {
|
|
||||||
_keepUpdateWithServer();
|
|
||||||
},
|
|
||||||
),
|
|
||||||
Obx(() {
|
Obx(() {
|
||||||
if (_chatController.isLoading.isTrue) {
|
if (_chatController.isLoading.isTrue) {
|
||||||
return const LinearProgressIndicator().animate().slideY();
|
return const LinearProgressIndicator().animate().slideY();
|
||||||
@ -303,15 +272,13 @@ class _ChannelChatScreenState extends State<ChannelChatScreen>
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
),
|
||||||
}),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_subscription?.cancel();
|
_subscription?.cancel();
|
||||||
WidgetsBinding.instance.removeObserver(this);
|
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -370,7 +370,4 @@ const i18nEnglish = {
|
|||||||
'callStatusDisconnected': 'Disconnected',
|
'callStatusDisconnected': 'Disconnected',
|
||||||
'callStatusConnecting': 'Connecting',
|
'callStatusConnecting': 'Connecting',
|
||||||
'callStatusReconnected': 'Reconnecting',
|
'callStatusReconnected': 'Reconnecting',
|
||||||
'messageOutOfSync': 'May Out of Sync with Server',
|
|
||||||
'messageOutOfSyncCaption':
|
|
||||||
'Since the App has entered the background, there may be a time difference between the message list and the server. Click to Refresh.',
|
|
||||||
};
|
};
|
||||||
|
@ -337,6 +337,4 @@ const i18nSimplifiedChinese = {
|
|||||||
'callStatusDisconnected': '已断开',
|
'callStatusDisconnected': '已断开',
|
||||||
'callStatusConnecting': '连接中',
|
'callStatusConnecting': '连接中',
|
||||||
'callStatusReconnected': '重连中',
|
'callStatusReconnected': '重连中',
|
||||||
'messageOutOfSync': '消息可能与服务器脱节',
|
|
||||||
'messageOutOfSyncCaption': '由于 App 进入后台,消息列表可能与服务器存在时差,点击刷新。',
|
|
||||||
};
|
};
|
||||||
|
@ -159,9 +159,8 @@ class _ControlsWidgetState extends State<ControlsWidget> {
|
|||||||
}
|
}
|
||||||
var track = await LocalVideoTrack.createScreenShareTrack(
|
var track = await LocalVideoTrack.createScreenShareTrack(
|
||||||
ScreenShareCaptureOptions(
|
ScreenShareCaptureOptions(
|
||||||
captureScreenAudio: true,
|
|
||||||
sourceId: source.id,
|
sourceId: source.id,
|
||||||
maxFrameRate: 30.0,
|
maxFrameRate: 15.0,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
await _participant.publishVideoTrack(track);
|
await _participant.publishVideoTrack(track);
|
||||||
@ -175,7 +174,6 @@ class _ControlsWidgetState extends State<ControlsWidget> {
|
|||||||
var track = await LocalVideoTrack.createScreenShareTrack(
|
var track = await LocalVideoTrack.createScreenShareTrack(
|
||||||
const ScreenShareCaptureOptions(
|
const ScreenShareCaptureOptions(
|
||||||
useiOSBroadcastExtension: true,
|
useiOSBroadcastExtension: true,
|
||||||
captureScreenAudio: true,
|
|
||||||
maxFrameRate: 30.0,
|
maxFrameRate: 30.0,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -4,17 +4,17 @@ import 'package:get/utils.dart';
|
|||||||
abstract class AppNavigation {
|
abstract class AppNavigation {
|
||||||
static List<AppNavigationDestination> destinations = [
|
static List<AppNavigationDestination> destinations = [
|
||||||
AppNavigationDestination(
|
AppNavigationDestination(
|
||||||
icon: Icons.home,
|
icon: const Icon(Icons.home),
|
||||||
label: 'home'.tr,
|
label: 'home'.tr,
|
||||||
page: 'home',
|
page: 'home',
|
||||||
),
|
),
|
||||||
AppNavigationDestination(
|
AppNavigationDestination(
|
||||||
icon: Icons.workspaces,
|
icon: const Icon(Icons.workspaces),
|
||||||
label: 'realms'.tr,
|
label: 'realms'.tr,
|
||||||
page: 'realms',
|
page: 'realms',
|
||||||
),
|
),
|
||||||
AppNavigationDestination(
|
AppNavigationDestination(
|
||||||
icon: Icons.forum,
|
icon: const Icon(Icons.forum),
|
||||||
label: 'channelTypeDirect'.tr,
|
label: 'channelTypeDirect'.tr,
|
||||||
page: 'chat',
|
page: 'chat',
|
||||||
),
|
),
|
||||||
@ -25,7 +25,7 @@ abstract class AppNavigation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class AppNavigationDestination {
|
class AppNavigationDestination {
|
||||||
final IconData icon;
|
final Widget icon;
|
||||||
final String label;
|
final String label;
|
||||||
final String page;
|
final String page;
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ class _AppNavigationDrawerState extends State<AppNavigationDrawer> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return ListTile(
|
return ListTile(
|
||||||
contentPadding: const EdgeInsets.only(left: 20, right: 20),
|
contentPadding: const EdgeInsets.symmetric(horizontal: 24),
|
||||||
title: Text(
|
title: Text(
|
||||||
auth.userProfile.value!['nick'],
|
auth.userProfile.value!['nick'],
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
@ -154,7 +154,7 @@ class _AppNavigationDrawerState extends State<AppNavigationDrawer> {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}).paddingSymmetric(vertical: 8),
|
}).paddingOnly(top: 8),
|
||||||
const Divider(thickness: 0.3, height: 1),
|
const Divider(thickness: 0.3, height: 1),
|
||||||
Column(
|
Column(
|
||||||
children: AppNavigation.destinations
|
children: AppNavigation.destinations
|
||||||
@ -163,7 +163,7 @@ class _AppNavigationDrawerState extends State<AppNavigationDrawer> {
|
|||||||
contentPadding: const EdgeInsets.symmetric(
|
contentPadding: const EdgeInsets.symmetric(
|
||||||
horizontal: 20,
|
horizontal: 20,
|
||||||
),
|
),
|
||||||
leading: Icon(e.icon, size: 20).paddingAll(2),
|
leading: e.icon,
|
||||||
title: Text(e.label),
|
title: Text(e.label),
|
||||||
enabled: true,
|
enabled: true,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user