flutter-freaccess-hub/lib/backend/push_notifications/serialization_util.dart

173 lines
4.7 KiB
Dart

import 'dart:convert';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import '/backend/backend.dart';
import '/backend/schema/structs/index.dart';
import '../../flutter_flow/lat_lng.dart';
import '../../flutter_flow/place.dart';
import '../../flutter_flow/uploaded_file.dart';
/// SERIALIZATION HELPERS
String dateTimeRangeToString(DateTimeRange dateTimeRange) {
final startStr = dateTimeRange.start.millisecondsSinceEpoch.toString();
final endStr = dateTimeRange.end.millisecondsSinceEpoch.toString();
return '$startStr|$endStr';
}
String placeToString(FFPlace place) => jsonEncode({
'latLng': place.latLng.serialize(),
'name': place.name,
'address': place.address,
'city': place.city,
'state': place.state,
'country': place.country,
'zipCode': place.zipCode,
});
String uploadedFileToString(FFUploadedFile uploadedFile) =>
uploadedFile.serialize();
/// Converts the input value into a value that can be JSON encoded.
dynamic serializeParameter(dynamic value) {
switch (value.runtimeType) {
case DateTime:
return (value as DateTime).millisecondsSinceEpoch;
case DateTimeRange:
return dateTimeRangeToString(value as DateTimeRange);
case LatLng:
return (value as LatLng).serialize();
case Color:
return (value as Color).toCssString();
case FFPlace:
return placeToString(value as FFPlace);
case FFUploadedFile:
return uploadedFileToString(value as FFUploadedFile);
}
if (value is DocumentReference) {
return value.path;
}
if (value is FirestoreRecord) {
return (value as dynamic).reference.path;
}
return value;
}
String serializeParameterData(Map<String, dynamic> parameterData) => jsonEncode(
parameterData.map(
(key, value) => MapEntry(
key,
serializeParameter(value),
),
)..removeWhere((k, v) => v == null),
);
/// END SERIALIZATION HELPERS
/// DESERIALIZATION HELPERS
DateTimeRange? dateTimeRangeFromString(String dateTimeRangeStr) {
final pieces = dateTimeRangeStr.split('|');
if (pieces.length != 2) {
return null;
}
return DateTimeRange(
start: DateTime.fromMillisecondsSinceEpoch(int.parse(pieces.first)),
end: DateTime.fromMillisecondsSinceEpoch(int.parse(pieces.last)),
);
}
LatLng? latLngFromString(String? latLngStr) {
final pieces = latLngStr?.split(',');
if (pieces == null || pieces.length != 2) {
return null;
}
return LatLng(
double.parse(pieces.first.trim()),
double.parse(pieces.last.trim()),
);
}
FFPlace placeFromString(String placeStr) {
final serializedData = jsonDecode(placeStr) as Map<String, dynamic>;
final data = {
'latLng': serializedData.containsKey('latLng')
? latLngFromString(serializedData['latLng'] as String)
: const LatLng(0.0, 0.0),
'name': serializedData['name'] ?? '',
'address': serializedData['address'] ?? '',
'city': serializedData['city'] ?? '',
'state': serializedData['state'] ?? '',
'country': serializedData['country'] ?? '',
'zipCode': serializedData['zipCode'] ?? '',
};
return FFPlace(
latLng: data['latLng'] as LatLng,
name: data['name'] as String,
address: data['address'] as String,
city: data['city'] as String,
state: data['state'] as String,
country: data['country'] as String,
zipCode: data['zipCode'] as String,
);
}
FFUploadedFile uploadedFileFromString(String uploadedFileStr) =>
FFUploadedFile.deserialize(uploadedFileStr);
T? getParameter<T>(Map<String, dynamic> data, String paramName) {
try {
if (!data.containsKey(paramName)) {
return null;
}
final param = data[paramName];
switch (T) {
case String:
return param;
case double:
return param.toDouble();
case DateTime:
return DateTime.fromMillisecondsSinceEpoch(param) as T;
case DateTimeRange:
return dateTimeRangeFromString(param) as T;
case LatLng:
return latLngFromString(param) as T;
case Color:
return fromCssColor(param) as T;
case FFPlace:
return placeFromString(param) as T;
case FFUploadedFile:
return uploadedFileFromString(param) as T;
}
if (param is String) {
return FirebaseFirestore.instance.doc(param) as T;
}
return param;
} catch (e) {
print('Error parsing parameter "$paramName": $e');
return null;
}
}
Future<T?> getDocumentParameter<T>(
Map<String, dynamic> data,
String paramName,
RecordBuilder<T> recordBuilder,
) {
if (!data.containsKey(paramName)) {
return Future.value(null);
}
return FirebaseFirestore.instance
.doc(data[paramName])
.get()
.then((s) => recordBuilder(s));
}
/// END DESERIALIZATION HELPERS