fbmobile/lib/ui/views/upload_view.dart

186 lines
9.6 KiB
Dart
Raw Normal View History

2021-02-02 17:17:48 +00:00
import 'package:clipboard/clipboard.dart';
2021-02-02 14:33:23 +00:00
import 'package:flutter/material.dart';
import 'package:flutter_translate/flutter_translate.dart';
2021-02-02 17:17:48 +00:00
import 'package:provider/provider.dart';
2021-02-02 14:33:23 +00:00
import '../../core/enums/viewstate.dart';
2021-02-02 17:17:48 +00:00
import '../../core/models/session.dart';
2021-02-02 14:33:23 +00:00
import '../../core/viewmodels/upload_model.dart';
import '../shared/app_colors.dart';
import '../widgets/centered_error_row.dart';
import '../widgets/my_appbar.dart';
import 'base_view.dart';
class UploadView extends StatelessWidget {
static const routeName = '/upload';
2023-01-04 20:17:54 +00:00
const UploadView({super.key});
2021-02-02 14:33:23 +00:00
@override
Widget build(BuildContext context) {
return BaseView<UploadModel>(
onModelReady: (model) => model.init(),
builder: (context, model, child) =>
Scaffold(appBar: MyAppBar(title: Text(translate('titles.upload'))), body: _render(model, context)));
}
2021-02-02 17:17:48 +00:00
bool _isUploadButtonEnabled(UploadModel model) {
2023-01-04 20:17:54 +00:00
return model.pasteTextTouched || (model.paths != null && model.paths!.isNotEmpty);
}
2021-02-02 17:17:48 +00:00
Widget _render(UploadModel model, BuildContext context) {
var url = Provider.of<Session>(context).url;
2021-02-02 14:33:23 +00:00
2023-01-04 20:17:54 +00:00
return model.state == ViewState.busy
? Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
2023-01-04 20:17:54 +00:00
const CircularProgressIndicator(),
(model.stateMessage != null && model.stateMessage!.isNotEmpty ? Text(model.stateMessage!) : Container())
]))
: ListView(children: <Widget>[
Padding(
padding: const EdgeInsets.only(left: 25.0, right: 25.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: TextFormField(
minLines: 1,
maxLines: 7,
decoration: InputDecoration(
2023-01-04 20:17:54 +00:00
prefixIcon: const Icon(
Icons.text_snippet,
),
suffixIcon: IconButton(
onPressed: () => model.pasteTextController.clear(),
2023-01-04 20:17:54 +00:00
icon: const Icon(Icons.clear),
),
hintText: translate('upload.text_to_be_pasted'),
2023-01-04 20:17:54 +00:00
contentPadding: const EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
border: OutlineInputBorder(borderRadius: BorderRadius.circular(32.0)),
2021-02-02 14:33:23 +00:00
),
controller: model.pasteTextController)),
Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.end,
children: [Text(translate('upload.and_or'))])),
Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
ElevatedButton.icon(
2023-01-04 20:17:54 +00:00
icon: const Icon(Icons.file_copy_sharp, color: blueColor),
onPressed: () => model.openFileExplorer(),
label: Text(
translate('upload.open_file_explorer'),
)),
ElevatedButton.icon(
2023-01-04 20:17:54 +00:00
icon: const Icon(Icons.cancel, color: orangeColor),
onPressed: model.paths != null && model.paths!.isNotEmpty
? () => model.clearCachedFiles()
: null,
label: Text(
translate('upload.clear_temporary_files'),
)),
2021-02-02 14:33:23 +00:00
],
)),
Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Checkbox(
value: model.createMulti,
onChanged: (v) => model.toggleCreateMulti(),
),
Text(translate('upload.multipaste')),
])),
Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
ElevatedButton.icon(
onPressed: !_isUploadButtonEnabled(model)
? null
: () async {
Map<String, bool>? items = await model.upload();
String? clipboardContent = model.generatePasteLinks(items, url);
if (clipboardContent != null && clipboardContent.isNotEmpty) {
FlutterClipboard.copy(clipboardContent).then((value) {
final snackBar = SnackBar(
action: SnackBarAction(
label: translate('upload.dismiss'),
textColor: blueColor,
onPressed: () {
ScaffoldMessenger.of(context).hideCurrentSnackBar();
},
),
content: Text(translate('upload.uploaded')),
2023-01-04 20:17:54 +00:00
duration: const Duration(seconds: 10),
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
});
}
},
2023-01-04 20:17:54 +00:00
icon: const Icon(Icons.upload_rounded, color: greenColor),
label: Text(
translate('upload.upload'),
)),
])),
model.errorMessage != null && model.errorMessage!.isNotEmpty
? (Padding(
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
child: CenteredErrorRow(model.errorMessage)))
: Container(),
Builder(
builder: (BuildContext context) => model.loadingPath
2023-01-04 20:17:54 +00:00
? const Padding(
padding: EdgeInsets.only(bottom: 10.0),
child: CircularProgressIndicator(),
)
: model.paths != null
? Container(
padding: const EdgeInsets.only(bottom: 30.0),
height: MediaQuery.of(context).size.height * 0.50,
child: ListView.separated(
itemCount: model.paths != null && model.paths!.isNotEmpty ? model.paths!.length : 1,
itemBuilder: (BuildContext context, int index) {
final bool isMultiPath = model.paths != null && model.paths!.isNotEmpty;
final String name = (isMultiPath
? model.paths!.map((e) => e.name).toList()[index]
: model.fileName ?? '...');
2023-01-04 20:17:54 +00:00
final path = model.paths!.isNotEmpty
? model.paths!.map((e) => e.path).toList()[index].toString()
: '';
return Card(
child: ListTile(
title: Text(
name,
),
subtitle: Text(path),
));
},
separatorBuilder: (BuildContext context, int index) => const Divider(),
),
)
: Container(),
),
],
))
]);
2021-02-02 14:33:23 +00:00
}
}