ente/lib/ui/create_collection_page.dart

266 lines
8.1 KiB
Dart
Raw Normal View History

2020-10-28 12:03:28 +00:00
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:logging/logging.dart';
import 'package:page_transition/page_transition.dart';
import 'package:photos/core/configuration.dart';
2020-10-28 12:03:28 +00:00
import 'package:photos/db/files_db.dart';
import 'package:photos/models/collection.dart';
import 'package:photos/models/collection_items.dart';
2020-10-28 12:03:28 +00:00
import 'package:photos/models/file.dart';
import 'package:photos/models/selected_files.dart';
2020-10-28 12:03:28 +00:00
import 'package:photos/services/collections_service.dart';
import 'package:photos/ui/collection_page.dart';
import 'package:photos/ui/loading_widget.dart';
import 'package:photos/ui/thumbnail_widget.dart';
2020-10-28 12:03:28 +00:00
import 'package:photos/utils/dialog_util.dart';
import 'package:photos/utils/file_uploader.dart';
import 'package:photos/utils/toast_util.dart';
class CreateCollectionPage extends StatefulWidget {
final SelectedFiles selectedFiles;
const CreateCollectionPage(this.selectedFiles, {Key key}) : super(key: key);
2020-10-28 12:03:28 +00:00
@override
_CreateCollectionPageState createState() => _CreateCollectionPageState();
}
class _CreateCollectionPageState extends State<CreateCollectionPage> {
final _logger = Logger("CreateCollectionPage");
String _albumName;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
2021-02-05 19:54:46 +00:00
title: Text("add memories"),
2020-10-28 12:03:28 +00:00
),
body: _getBody(context),
);
}
Widget _getBody(BuildContext context) {
return Column(
2020-10-28 12:03:28 +00:00
children: [
Row(
children: [
Expanded(
child: Padding(
2021-02-05 19:46:55 +00:00
padding: const EdgeInsets.only(
top: 16, bottom: 12, left: 24, right: 24),
2021-02-05 19:54:46 +00:00
child: OutlineButton.icon(
2021-02-05 19:46:55 +00:00
padding: EdgeInsets.all(20),
2021-02-05 19:54:46 +00:00
icon: Icon(Icons.create_new_folder_outlined),
label: Text(
"to a new album",
style: Theme.of(context).textTheme.bodyText1,
),
onPressed: () {
_showNameAlbumDialog();
},
),
),
),
],
),
Padding(
2021-02-05 19:46:55 +00:00
padding: const EdgeInsets.fromLTRB(24, 12, 8, 16),
child: Align(
alignment: Alignment.centerLeft,
child: Text(
2021-02-05 19:54:46 +00:00
"to an existing album",
style: TextStyle(
fontWeight: FontWeight.bold,
color: Theme.of(context).primaryColorLight,
2020-10-28 12:03:28 +00:00
),
),
),
),
_getExistingCollectionsWidget(),
2020-10-28 12:03:28 +00:00
],
);
}
Widget _getExistingCollectionsWidget() {
return FutureBuilder<List<CollectionWithThumbnail>>(
future: _getCollectionsWithThumbnail(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text(snapshot.error.toString());
} else if (snapshot.hasData) {
return Flexible(
child: ListView.builder(
itemBuilder: (context, index) {
return _buildCollectionItem(snapshot.data[index]);
},
itemCount: snapshot.data.length,
shrinkWrap: true,
),
);
} else {
return loadWidget;
}
},
);
}
Widget _buildCollectionItem(CollectionWithThumbnail item) {
return Container(
2021-02-05 19:46:55 +00:00
padding: EdgeInsets.only(left: 24, bottom: 16),
child: GestureDetector(
child: Row(
children: <Widget>[
ClipRRect(
borderRadius: BorderRadius.circular(2.0),
child: Container(
child: ThumbnailWidget(item.thumbnail),
height: 64,
width: 64,
),
),
Padding(padding: EdgeInsets.all(8)),
Expanded(
child: Text(
item.collection.name,
style: TextStyle(
fontSize: 16,
),
),
),
],
),
onTap: () async {
if (await _addToCollection(item.collection.id)) {
2021-01-08 17:11:32 +00:00
showToast("added successfully to '" + item.collection.name);
Navigator.pop(context);
Navigator.push(
context,
PageTransition(
type: PageTransitionType.bottomToTop,
child: CollectionPage(
item.collection,
)));
}
},
),
);
}
Future<List<CollectionWithThumbnail>> _getCollectionsWithThumbnail() async {
final collectionsWithThumbnail = List<CollectionWithThumbnail>();
final collections = CollectionsService.instance.getCollections();
for (final c in collections) {
2020-10-31 16:11:43 +00:00
if (c.owner.id != Configuration.instance.getUserID()) {
continue;
}
var thumbnail = await FilesDB.instance.getLatestFileInCollection(c.id);
if (thumbnail == null) {
continue;
}
final lastUpdatedFile =
await FilesDB.instance.getLastModifiedFileInCollection(c.id);
collectionsWithThumbnail.add(CollectionWithThumbnail(
c,
thumbnail,
lastUpdatedFile,
));
}
collectionsWithThumbnail.sort((first, second) {
return second.lastUpdatedFile.updationTime
.compareTo(first.lastUpdatedFile.updationTime);
});
return collectionsWithThumbnail;
}
2020-10-28 12:03:28 +00:00
void _showNameAlbumDialog() async {
AlertDialog alert = AlertDialog(
2021-01-08 17:11:32 +00:00
title: Text("album title"),
2020-10-28 12:03:28 +00:00
content: TextFormField(
decoration: InputDecoration(
hintText: "Christmas 2020 / Dinner at Alice's",
2020-10-28 12:03:28 +00:00
contentPadding: EdgeInsets.all(8),
),
onChanged: (value) {
setState(() {
_albumName = value;
});
},
autofocus: true,
keyboardType: TextInputType.text,
textCapitalization: TextCapitalization.words,
2020-10-28 12:03:28 +00:00
),
actions: [
FlatButton(
2021-01-08 17:11:32 +00:00
child: Text("ok"),
2020-10-28 12:03:28 +00:00
onPressed: () async {
Navigator.pop(context);
2020-10-28 12:03:28 +00:00
final collection = await _createAlbum(_albumName);
if (collection != null) {
if (await _addToCollection(collection.id)) {
2021-01-08 17:11:32 +00:00
showToast("album '" + _albumName + "' created.");
Navigator.pop(context);
Navigator.push(
context,
PageTransition(
type: PageTransitionType.bottomToTop,
child: CollectionPage(
collection,
)));
}
2020-10-28 12:03:28 +00:00
}
},
),
],
);
showDialog(
context: context,
builder: (BuildContext context) {
return alert;
},
);
}
Future<bool> _addToCollection(int collectionID) async {
2021-01-08 17:02:41 +00:00
final dialog = createProgressDialog(context, "uploading files to album...");
2020-10-28 12:03:28 +00:00
await dialog.show();
try {
final files = List<File>();
for (final file in widget.selectedFiles.files) {
final currentFile = await FilesDB.instance.getFile(file.generatedID);
if (currentFile.uploadedFileID == null) {
final uploadedFile = (await FileUploader.instance
.forceUpload(currentFile, collectionID));
files.add(uploadedFile);
} else {
files.add(currentFile);
}
}
2020-10-28 12:03:28 +00:00
await CollectionsService.instance.addToCollection(collectionID, files);
await dialog.hide();
widget.selectedFiles.clearAll();
return true;
2020-10-28 12:03:28 +00:00
} catch (e, s) {
_logger.severe("Could not add to album", e, s);
2020-10-28 12:03:28 +00:00
await dialog.hide();
showGenericErrorDialog(context);
}
return false;
2020-10-28 12:03:28 +00:00
}
Future<Collection> _createAlbum(String albumName) async {
var collection;
2021-01-08 17:02:41 +00:00
final dialog = createProgressDialog(context, "creating album...");
2020-10-28 12:03:28 +00:00
await dialog.show();
try {
collection = await CollectionsService.instance.createAlbum(albumName);
} catch (e, s) {
_logger.severe(e, s);
await dialog.hide();
showGenericErrorDialog(context);
} finally {
await dialog.hide();
}
return collection;
}
}