Merge pull request #5606 from sahilyeole/master

Few mobile chat window improvements
This commit is contained in:
RustDesk 2023-09-05 22:21:12 +08:00 committed by GitHub
commit 0a603d022f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 80 additions and 26 deletions

View File

@ -48,6 +48,7 @@ class DraggableChatWindow extends StatelessWidget {
position: position,
width: width,
height: height,
chatModel: chatModel,
builder: (context, onPanUpdate) {
final child =
Scaffold(
@ -242,6 +243,7 @@ class Draggable extends StatefulWidget {
this.position = Offset.zero,
required this.width,
required this.height,
this.chatModel,
required this.builder})
: super(key: key);
@ -250,6 +252,7 @@ class Draggable extends StatefulWidget {
final Offset position;
final double width;
final double height;
final ChatModel? chatModel;
final Widget Function(BuildContext, GestureDragUpdateCallback) builder;
@override
@ -258,6 +261,7 @@ class Draggable extends StatefulWidget {
class _DraggableState extends State<Draggable> {
late Offset _position;
late ChatModel? _chatModel;
bool _keyboardVisible = false;
double _saveHeight = 0;
double _lastBottomHeight = 0;
@ -266,6 +270,7 @@ class _DraggableState extends State<Draggable> {
void initState() {
super.initState();
_position = widget.position;
_chatModel = widget.chatModel;
}
void onPanUpdate(DragUpdateDetails d) {
@ -292,6 +297,7 @@ class _DraggableState extends State<Draggable> {
setState(() {
_position = Offset(x, y);
});
_chatModel?.setChatWindowPosition(_position);
}
checkScreenSize() {}
@ -351,14 +357,14 @@ class IOSDraggable extends StatefulWidget {
const IOSDraggable({
Key? key,
this.position = Offset.zero,
required this.chatModel,
this.chatModel,
required this.width,
required this.height,
required this.builder})
: super(key: key);
final Offset position;
final ChatModel chatModel;
final ChatModel? chatModel;
final double width;
final double height;
final Widget Function(BuildContext) builder;
@ -368,22 +374,58 @@ class IOSDraggable extends StatefulWidget {
}
class _IOSDraggableState extends State<IOSDraggable> {
late Offset _position;
late ChatModel _chatModel;
late double _width;
late double _height;
late Offset _position;
late ChatModel? _chatModel;
late double _width;
late double _height;
bool _keyboardVisible = false;
double _saveHeight = 0;
double _lastBottomHeight = 0;
@override
void initState() {
super.initState();
_position = widget.position;
_chatModel = widget.chatModel;
_width = widget.width;
_height = widget.height;
}
@override
void initState() {
super.initState();
_position = widget.position;
_chatModel = widget.chatModel;
_width = widget.width;
_height = widget.height;
}
checkKeyboard() {
final bottomHeight = MediaQuery.of(context).viewInsets.bottom;
final currentVisible = bottomHeight != 0;
// save
if (!_keyboardVisible && currentVisible) {
_saveHeight = _position.dy;
}
// reset
if (_lastBottomHeight > 0 && bottomHeight == 0) {
setState(() {
_position = Offset(_position.dx, _saveHeight);
});
}
// onKeyboardVisible
if (_keyboardVisible && currentVisible) {
final sumHeight = bottomHeight + _height;
final contextHeight = MediaQuery.of(context).size.height;
if (sumHeight + _position.dy > contextHeight) {
final y = contextHeight - sumHeight;
setState(() {
_position = Offset(_position.dx, y);
});
}
}
_keyboardVisible = currentVisible;
_lastBottomHeight = bottomHeight;
}
@override
Widget build(BuildContext context) {
checkKeyboard();
return Stack(
children: [
Positioned(
@ -394,13 +436,15 @@ void initState() {
setState(() {
_position += details.delta;
});
_chatModel?.setChatWindowPosition(_position);
},
child: Material(
child:
Container(
width: _width,
height: _height,
child: widget.builder(context),
decoration: BoxDecoration(border: Border.all(color: MyTheme.border)),
child: widget.builder(context),
),
),
),

View File

@ -72,6 +72,13 @@ class ChatModel with ChangeNotifier {
RxInt mobileUnreadSum = 0.obs;
MessageKey? latestReceivedKey;
Offset chatWindowPosition = Offset(20, 80);
void setChatWindowPosition(Offset position) {
chatWindowPosition = position;
notifyListeners();
}
@override
void dispose() {
textController.dispose();
@ -210,7 +217,7 @@ class ChatModel with ChangeNotifier {
}
},
child: DraggableChatWindow(
position: chatInitPos ?? Offset(20, 80),
position: chatInitPos ?? chatWindowPosition,
width: 250,
height: 350,
chatModel: this));

View File

@ -300,11 +300,12 @@ packages:
dash_chat_2:
dependency: "direct main"
description:
name: dash_chat_2
sha256: e9e08b2a030d340d60f7adbeb977d3d6481db1f172b51440bfa02488b92fa19c
url: "https://pub.dev"
source: hosted
version: "0.0.17"
path: "."
ref: HEAD
resolved-ref: bd6b5b41254e57c5bcece202ebfb234de63e6487
url: "https://github.com/rustdesk-org/Dash-Chat-2"
source: git
version: "0.0.18"
debounce_throttle:
dependency: "direct main"
description:
@ -1398,10 +1399,10 @@ packages:
dependency: transitive
description:
name: video_player
sha256: "59f7f31c919c59cbedd37c617317045f5f650dc0eeb568b0b0de9a36472bdb28"
sha256: d3910a8cefc0de8a432a4411dcf85030e885d8fef3ddea291f162253a05dbf01
url: "https://pub.dev"
source: hosted
version: "2.5.1"
version: "2.7.1"
video_player_android:
dependency: transitive
description:
@ -1422,10 +1423,10 @@ packages:
dependency: transitive
description:
name: video_player_platform_interface
sha256: "42bb75de5e9b79e1f20f1d95f688fac0f95beac4d89c6eb2cd421724d4432dae"
sha256: be72301bf2c0150ab35a8c34d66e5a99de525f6de1e8d27c0672b836fe48f73a
url: "https://pub.dev"
source: hosted
version: "6.0.1"
version: "6.2.1"
video_player_web:
dependency: transitive
description:

View File

@ -39,7 +39,9 @@ dependencies:
package_info_plus: ^3.1.2
url_launcher: ^6.0.9
toggle_switch: ^2.1.0
dash_chat_2: ^0.0.17
dash_chat_2:
git:
url: https://github.com/rustdesk-org/Dash-Chat-2
draggable_float_widget: ^0.0.2
settings_ui: ^2.0.2
flutter_breadcrumb: ^1.0.1