@@ -18,52 +18,94 @@ import 'dart:convert';
1818
1919import 'package:cloud_firestore/cloud_firestore.dart' ;
2020import 'package:dogs_core/dogs_core.dart' ;
21+ import 'package:dogs_firestore/dogs_firestore.dart' ;
22+ import 'package:dogs_firestore/src/codec.dart' ;
23+ import 'package:dogs_firestore/src/converters.dart' ;
24+ import 'package:dogs_firestore/src/engine.dart' ;
2125
22- void installFirebaseInterop ([DogEngine ? engine]) {
23- engine ?? = DogEngine .instance;
24- engine.registerAutomatic (FirebaseTimestampConverter ());
25- engine.registerAutomatic (FirebaseGeoPointConverter ());
26- engine.registerAutomatic (FirebaseBlobConverter ());
27- }
26+ // ignore: non_constant_identifier_names
27+ DogPlugin FirebaseDogsPlugin ({
28+ FirebaseFirestore ? firestore,
29+ bool registerInteropConverters = true ,
30+ }) =>
31+ (engine) {
32+ firestore ?? = FirebaseFirestore .instance;
33+
34+ if (firestore == null ) {
35+ throw ArgumentError (
36+ "FirebaseFirestore instance must be provided or initialized before using FirebaseDogsPlugin." );
37+ }
38+
39+ if (registerInteropConverters) {
40+ engine.registerAutomatic (FirebaseTimestampConverter ());
41+ engine.registerAutomatic (FirebaseGeoPointConverter ());
42+ engine.registerAutomatic (FirebaseBlobConverter ());
43+ }
44+
45+ var forked = engine.getChildOrFork (#Firebase ,
46+ codec: FirebaseNativeCodec (), callback: (engine) {
47+ engine.registerAutomatic (DateTimeToTimestampConverter ());
48+ engine.registerAutomatic (Uint8ListToBlobConverter ());
49+ engine.registerModeFactory (FirestoreDocumentOpmodeFactory ());
50+ });
2851
29- class FirebaseTimestampConverter extends DogConverter <Timestamp > with OperationMapMixin <Timestamp > {
30- FirebaseTimestampConverter () : super (isAssociated: true , struct: DogStructure <Timestamp >.synthetic ("Timestamp" ));
52+ final firestoreEngine = DogFirestoreEngine (forked, firestore! );
53+ engine.setMeta <DogFirestoreEngine >(firestoreEngine);
54+ };
55+
56+ class FirebaseTimestampConverter extends DogConverter <Timestamp >
57+ with OperationMapMixin <Timestamp > {
58+ FirebaseTimestampConverter ()
59+ : super (
60+ isAssociated: true ,
61+ struct: DogStructure <Timestamp >.synthetic ("Timestamp" ));
3162
3263 @override
3364 Map <Type , OperationMode <Timestamp > Function ()> get modes => {
34- NativeSerializerMode : () => NativeSerializerMode .create (
35- serializer: (value, engine) => engine.convertObjectToNative (value.toDate (), DateTime ),
36- deserializer: (value, engine) => Timestamp .fromDate (engine.convertObjectFromNative (value, DateTime )),
37- ),
38- };
65+ NativeSerializerMode : () => NativeSerializerMode .create (
66+ serializer: (value, engine) =>
67+ engine.convertObjectToNative (value.toDate (), DateTime ),
68+ deserializer: (value, engine) => Timestamp .fromDate (
69+ engine.convertObjectFromNative (value, DateTime )),
70+ ),
71+ };
3972}
4073
41- class FirebaseGeoPointConverter extends DogConverter <GeoPoint > with OperationMapMixin <GeoPoint > {
42- FirebaseGeoPointConverter () : super (isAssociated: true , struct: DogStructure <GeoPoint >.synthetic ("GeoPoint" ));
74+ class FirebaseGeoPointConverter extends DogConverter <GeoPoint >
75+ with OperationMapMixin <GeoPoint > {
76+ FirebaseGeoPointConverter ()
77+ : super (
78+ isAssociated: true ,
79+ struct: DogStructure <GeoPoint >.synthetic ("GeoPoint" ));
4380
4481 @override
4582 Map <Type , OperationMode <GeoPoint > Function ()> get modes => {
46- NativeSerializerMode : () => NativeSerializerMode .create (
47- serializer: (value, engine) => encode (value),
48- deserializer: (value, engine) => decode (value),
49- ),
50- };
83+ NativeSerializerMode : () => NativeSerializerMode .create (
84+ serializer: (value, engine) => encode (value),
85+ deserializer: (value, engine) => decode (value),
86+ ),
87+ };
88+
89+ static String encode (GeoPoint value) =>
90+ "${value .latitude },${value .longitude }" ;
5191
52- static String encode (GeoPoint value) => "${value .latitude },${value .longitude }" ;
5392 static GeoPoint decode (String value) {
5493 var parts = value.split (", " );
55- return GeoPoint (double .parse (parts[0 ].trim ()), double .parse (parts[1 ].trim ()));
94+ return GeoPoint (
95+ double .parse (parts[0 ].trim ()), double .parse (parts[1 ].trim ()));
5696 }
5797}
5898
59- class FirebaseBlobConverter extends DogConverter <Blob > with OperationMapMixin <Blob > {
60- FirebaseBlobConverter () : super (isAssociated: true , struct: DogStructure <Blob >.synthetic ("Blob" ));
99+ class FirebaseBlobConverter extends DogConverter <Blob >
100+ with OperationMapMixin <Blob > {
101+ FirebaseBlobConverter ()
102+ : super (isAssociated: true , struct: DogStructure <Blob >.synthetic ("Blob" ));
61103
62104 @override
63105 Map <Type , OperationMode <Blob > Function ()> get modes => {
64- NativeSerializerMode : () => NativeSerializerMode .create (
65- serializer: (value, engine) => base64Encode (value.bytes),
66- deserializer: (value, engine) => Blob (base64Decode (value)),
67- ),
68- };
69- }
106+ NativeSerializerMode : () => NativeSerializerMode .create (
107+ serializer: (value, engine) => base64Encode (value.bytes),
108+ deserializer: (value, engine) => Blob (base64Decode (value)),
109+ ),
110+ };
111+ }
0 commit comments