Added support for the upload status snackbar in the event screen
This commit is contained in:
parent
aa1d9b9edf
commit
34e7756e80
4 changed files with 56 additions and 15 deletions
|
|
@ -2,7 +2,7 @@ import 'dart:async';
|
|||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../utils.dart' show getImageThumbnailPath;
|
||||
import '../utils.dart' show getImageThumbnailPath, showUploadStatusSnackBar;
|
||||
import '../blocs/event_bloc.dart';
|
||||
import '../screens/gallery_screen.dart';
|
||||
import '../models/task_model.dart';
|
||||
|
|
@ -189,9 +189,16 @@ class _EventScreenState extends State<EventScreen>
|
|||
);
|
||||
}
|
||||
|
||||
// TODO: use a block provider instead of passing callbacks
|
||||
Future<void> onAddPicturePressed() async {
|
||||
await Navigator.of(context).pushNamed('newImage/${bloc.eventName}');
|
||||
print('popped the pictures');
|
||||
if (bloc.snackBarStatus.value == false) {
|
||||
showUploadStatusSnackBar(
|
||||
_scaffoldContext,
|
||||
bloc.uploadStatus,
|
||||
bloc.updateSnackBarStatus,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void dispose() {
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ class _NewImageScreenState extends State<NewImageScreen> {
|
|||
|
||||
/// Saves the image to the storage bucket.
|
||||
void onSubmit() async {
|
||||
await bloc.submit();
|
||||
bloc.submit();
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,12 +28,8 @@ class UploadStatusService {
|
|||
///
|
||||
/// The task gets automatically removed when done.
|
||||
void addNewUpload(StorageUploadTask task) async {
|
||||
final initialSnap = task.lastSnapshot;
|
||||
// Initialize the map entry with the initial values.
|
||||
_tasksData[task] = [
|
||||
initialSnap.bytesTransferred,
|
||||
initialSnap.totalByteCount,
|
||||
];
|
||||
// Initialize the map entry with initial values.
|
||||
_tasksData[task] = [0, 0];
|
||||
task.events.listen(
|
||||
(StorageTaskEvent event) {
|
||||
// Update the map with the current values.
|
||||
|
|
@ -47,6 +43,7 @@ class UploadStatusService {
|
|||
);
|
||||
await task.onComplete;
|
||||
_tasksData.remove(task);
|
||||
_sendUpdate();
|
||||
}
|
||||
|
||||
/// Updates the _status subject with the most current data.
|
||||
|
|
@ -60,10 +57,10 @@ class UploadStatusService {
|
|||
},
|
||||
);
|
||||
if (bytestTransferred != 0) {
|
||||
percentage = totalBytes / bytestTransferred;
|
||||
percentage = bytestTransferred / totalBytes;
|
||||
}
|
||||
_status.sink.add(UploadStatus(
|
||||
percentage: percentage,
|
||||
percentage: (percentage * 100).toStringAsFixed(2),
|
||||
numberOfFiles: _tasksData.length,
|
||||
));
|
||||
}
|
||||
|
|
@ -77,7 +74,7 @@ class UploadStatusService {
|
|||
/// The status of an upload.
|
||||
class UploadStatus {
|
||||
/// Percentage of the upload.
|
||||
final double percentage;
|
||||
final String percentage;
|
||||
|
||||
/// Number of files being uploaded.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -71,9 +71,46 @@ String getImageThumbnailPath(String path) {
|
|||
return tokens.join('/');
|
||||
}
|
||||
|
||||
/// Shows an upload status snack bar.
|
||||
///
|
||||
/// Takes the data from the [uploadStatus] stream and shows in the snack bar.
|
||||
/// Calls [onSuccessfullyClosed] with [false] when all files are done being
|
||||
/// uploaded.
|
||||
void showUploadStatusSnackBar(
|
||||
BuildContext context,
|
||||
BuildContext scaffoldContext,
|
||||
Observable<UploadStatus> uploadStatus,
|
||||
ValueObservable<bool> snackBarStatus,
|
||||
) {}
|
||||
Function(bool) onSuccessfullyClosed,
|
||||
) {
|
||||
assert(scaffoldContext != null);
|
||||
assert(uploadStatus != null);
|
||||
assert(onSuccessfullyClosed != null);
|
||||
final scaffoldState = Scaffold.of(scaffoldContext);
|
||||
scaffoldState.showSnackBar(SnackBar(
|
||||
/// The snack bar shouldn't close until the files are done uploading
|
||||
/// hence the long duration. It gets closed programatically.
|
||||
duration: Duration(hours: 1),
|
||||
content: StreamBuilder(
|
||||
stream: uploadStatus,
|
||||
builder: (BuildContext context, AsyncSnapshot<UploadStatus> snap) {
|
||||
if (!snap.hasData) {
|
||||
return Text('');
|
||||
}
|
||||
print('Number of files: ${snap.data.numberOfFiles}');
|
||||
if (snap.data.numberOfFiles == 0) {
|
||||
onSuccessfullyClosed(false);
|
||||
scaffoldState.hideCurrentSnackBar();
|
||||
return Text('');
|
||||
}
|
||||
return Row(
|
||||
children: <Widget>[
|
||||
Spacer(),
|
||||
Text('${snap.data.numberOfFiles} pending files'),
|
||||
Spacer(flex: 5),
|
||||
Text(snap.data.percentage + '%'),
|
||||
Spacer(),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue