This repository was archived by the owner on Dec 29, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathfirestore.dart
82 lines (63 loc) · 2.47 KB
/
firestore.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
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:cloud_firestore/cloud_firestore.dart';
import '../../elements.dart';
import '../../datastore.dart';
import '../../firestore.dart';
import '../../sync.dart';
import 'briefingdata.dart';
const ITEMS_COLLECTION = 'items';
class BriefingFirestoreSync extends FirestoreSync {
final InMemoryDatastore<CompositeData> datastore;
ReadList<ItemRecord> items;
Map<DataId, BriefingDataSync> dataSyncs = Map<DataId, BriefingDataSync>();
BriefingFirestoreSync(this.datastore) : super(datastore, ITEMS_COLLECTION);
void start() {
items = datastore.runQuery(StarQuery(), zone, FIRESTORE_PRIORITY).cast<ItemRecord>();
items.observe(zone.makeOperation(_itemsUpdated), zone);
}
void _itemsUpdated() {
List<ItemRecord> itemsList = items.elements;
for (int i = 0; i < itemsList.length; ++i) {
ItemRecord item = itemsList[i];
if (dataSyncs.containsKey(item.dataId)) {
continue;
}
BriefingDataSync dataSync = BriefingDataSync(this, item);
dataSyncs[item.dataId] = dataSync;
dataSync.start();
}
}
}
class BriefingDataSync extends DataSync<ItemRecord> {
BriefingDataSync(FirestoreSync firestoreSync, ItemRecord localState)
: super(firestoreSync, localState);
void observeLocalState(ItemRecord localState, Operation operation) {
localState.unread.observeRef(operation, zone);
}
ItemRecord _newItemRecord(VersionId version, bool unread) {
ItemRecord item =
ItemRecord(dataId, null, null, null, null, null, null, unread, BaseMutableList<Address>());
item.version = version;
return item;
}
ItemRecord initNetworkState() {
return _newItemRecord(VERSION_ZERO, false);
}
void setLocalData(ItemRecord localState, ItemRecord fromNetwork) {
localState.version = fromNetwork.version;
localState.unread.value = fromNetwork.unread.value;
}
ItemRecord copy(ItemRecord origin) {
return _newItemRecord(origin.version, origin.unread.value);
}
Map<String, dynamic> toJson(ItemRecord state) {
return {VERSION_FIELD: marshalVersion(state.version), UNREAD_FIELD: state.unread.value};
}
ItemRecord fromSnapshot(DocumentSnapshot snapshot) {
VersionId version = unmarshalVersion(snapshot.data[VERSION_FIELD]);
bool unread = snapshot.data[UNREAD_FIELD] as bool;
return _newItemRecord(version, unread);
}
}