Fix #330 - Multiple file browser windows are opened. #331
|
@ -13,6 +13,7 @@ class AppState extends ChangeNotifier {
|
|||
int _hoveredIndex = -1;
|
||||
int? _selectedIndex;
|
||||
bool _unreadMessagesBelow = false;
|
||||
bool _disableFilePicker = false;
|
||||
|
||||
void SetCwtchInit() {
|
||||
cwtchInit = true;
|
||||
|
@ -47,6 +48,12 @@ class AppState extends ChangeNotifier {
|
|||
notifyListeners();
|
||||
}
|
||||
|
||||
bool get disableFilePicker => _disableFilePicker;
|
||||
set disableFilePicker(bool newVal) {
|
||||
this._disableFilePicker = newVal;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
// Never use this for message lookup - can be a non-indexed value
|
||||
// e.g. -1
|
||||
int get hoveredIndex => _hoveredIndex;
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'package:crypto/crypto.dart';
|
||||
import 'package:cwtch/config.dart';
|
||||
import 'package:cwtch/cwtch_icons_icons.dart';
|
||||
import 'package:cwtch/models/appstate.dart';
|
||||
import 'package:cwtch/models/chatmessage.dart';
|
||||
|
@ -23,7 +22,6 @@ import 'package:flutter/services.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
|
||||
import 'package:path/path.dart' show basename;
|
||||
|
||||
import '../main.dart';
|
||||
import '../settings.dart';
|
||||
|
@ -89,11 +87,13 @@ class _MessageViewState extends State<MessageView> {
|
|||
if (showFileSharing) {
|
||||
appBarButtons.add(IconButton(
|
||||
splashRadius: Material.defaultSplashRadius / 2,
|
||||
icon: Icon(Icons.attach_file, size: 24),
|
||||
icon: Icon(Icons.attach_file, size: 24, color: Provider.of<Settings>(context).theme.mainTextColor),
|
||||
tooltip: AppLocalizations.of(context)!.tooltipSendFile,
|
||||
onPressed: () {
|
||||
_showFilePicker(context);
|
||||
},
|
||||
onPressed: Provider.of<AppState>(context).disableFilePicker
|
||||
|
||||
? null
|
||||
: () {
|
||||
_showFilePicker(context);
|
||||
},
|
||||
));
|
||||
}
|
||||
appBarButtons.add(IconButton(
|
||||
|
@ -392,9 +392,19 @@ class _MessageViewState extends State<MessageView> {
|
|||
|
||||
void _showFilePicker(BuildContext ctx) async {
|
||||
imagePreview = null;
|
||||
FilePickerResult? result = await FilePicker.platform.pickFiles();
|
||||
if (result != null) {
|
||||
File file = File(result.files.first.path);
|
||||
|
||||
// only allow one file picker at a time
|
||||
// note: ideally we would destroy file picker when leaving a conversation
|
||||
// but we don't currently have that option.
|
||||
// we need to store AppState in a variable because ctx might be destroyed
|
||||
// while awaiting for pickFiles.
|
||||
var appstate = Provider.of<AppState>(ctx, listen: false);
|
||||
appstate.disableFilePicker = true;
|
||||
// currently lockParentWindow only works on Windows...
|
||||
FilePickerResult? result = await FilePicker.platform.pickFiles(lockParentWindow: true);
|
||||
appstate.disableFilePicker = false;
|
||||
if (result != null && result.files.first.path != null) {
|
||||
File file = File(result.files.first.path!);
|
||||
// We have a maximum number of bytes we can represent in terms of
|
||||
// a manifest (see : https://git.openprivacy.ca/cwtch.im/cwtch/src/branch/master/protocol/files/manifest.go#L25)
|
||||
if (file.lengthSync() <= 10737418240) {
|
||||
|
|
|
@ -112,14 +112,14 @@ packages:
|
|||
name: file_picker
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.0.1"
|
||||
version: "4.3.2"
|
||||
file_picker_desktop:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: file_picker_desktop
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
version: "1.1.1"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
|
|
|
@ -41,7 +41,7 @@ dependencies:
|
|||
flutter_test:
|
||||
sdk: flutter
|
||||
scrollable_positioned_list: ^0.2.0-nullsafety.0
|
||||
file_picker: ^4.0.1
|
||||
file_picker: ^4.3.2
|
||||
file_picker_desktop: ^1.1.0
|
||||
url_launcher: ^6.0.12
|
||||
|
||||
|
|
Loading…
Reference in New Issue
this is an unfun usage patern that might get missed on reuse. any way we can bundle it in a build widget that handles this and can be reused easily in 1 line?
The correct solution here is to fix file picker API properly modal.
Currently that behaviour is only supported on windows.