-
Notifications
You must be signed in to change notification settings - Fork 0
/
category.dart
107 lines (89 loc) · 2.8 KB
/
category.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import 'dart:io';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/foundation.dart';
import 'package:uuid/uuid.dart';
class CategoryModel extends ChangeNotifier{
String id;
String name;
List<String>images;
bool deleted;
CategoryModel({
this.id,
this.name,
this.images,
this.deleted = false,
}){
images = images ?? [];
}
List<dynamic> newImages;
final Firestore firestore = Firestore.instance;
DocumentReference get firestoreRef => firestore.document('categories/$id');
final FirebaseStorage storage = FirebaseStorage.instance;
StorageReference get storageRef => storage.ref().child('categories').child(id);
bool _loading = false;
bool get loading => _loading;
set loading(bool value){
_loading = value;
notifyListeners();
}
CategoryModel.fromDoc(DocumentSnapshot doc){
id = doc.documentID;
name = doc['name'] as String;
images = List<String>.from(doc.data['images'] as List<dynamic>);
deleted = (doc.data['deleted'] ?? false) as bool;
}
//code for cloning product when editing
CategoryModel clone(){
return CategoryModel(
id: id,
name: name,
images: List.from(images),
deleted: deleted,
);
}
Future<void> save()async{
loading = true;
final Map<String, dynamic> data = {
'name': name,
'deleted': deleted,
};
if (id == null) {
final doc = await firestore.collection('categories').add(data);
id = doc.documentID;
} else{
await firestoreRef.updateData(data);
}
//code for saving and updating Images to firebase storage
final List<String> updateImages = [];
for(final newImage in newImages){
if (images.contains(newImage)) {
updateImages.add(newImage as String);
} else{
final StorageUploadTask task = storageRef.child(Uuid().v1())
.putFile(newImage as File);
final StorageTaskSnapshot snapshot = await task.onComplete;
final String url = await snapshot.ref.getDownloadURL() as String;
updateImages.add(url);
}
}
//code for deleting images firebase storage and updating
for(final image in images){
if (!newImages.contains(image) && image.contains('firebase')) {
try{
final ref = await storage.getReferenceFromUrl(image);
await ref.delete();
}catch(e){
debugPrint('Failed to delete $image');
}
}
}
await firestoreRef.updateData({'images':updateImages});
images = updateImages;
loading = false;
}
//code for deleting category
void delete(){
firestoreRef.updateData({'deleted': true});
}
}