import 'dart:convert'; import 'package:flutter/material.dart'; import '/backend/schema/structs/index.dart'; import '/backend/schema/enums/enums.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(); String? serializeParam( dynamic param, ParamType paramType, [ bool isList = false, ]) { try { if (param == null) { return null; } if (isList) { final serializedValues = (param as Iterable) .map((p) => serializeParam(p, paramType, false)) .where((p) => p != null) .map((p) => p!) .toList(); return json.encode(serializedValues); } switch (paramType) { case ParamType.int: return param.toString(); case ParamType.double: return param.toString(); case ParamType.String: return param; case ParamType.bool: return param ? 'true' : 'false'; case ParamType.DateTime: return (param as DateTime).millisecondsSinceEpoch.toString(); case ParamType.DateTimeRange: return dateTimeRangeToString(param as DateTimeRange); case ParamType.LatLng: return (param as LatLng).serialize(); case ParamType.Color: return (param as Color).toCssString(); case ParamType.FFPlace: return placeToString(param as FFPlace); case ParamType.FFUploadedFile: return uploadedFileToString(param as FFUploadedFile); case ParamType.JSON: return json.encode(param); case ParamType.DataStruct: return param is BaseStruct ? param.serialize() : null; case ParamType.Enum: return (param is Enum) ? param.serialize() : null; default: return null; } } catch (e) { print('Error serializing parameter: $e'); return 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; 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); enum ParamType { int, double, String, bool, DateTime, DateTimeRange, LatLng, Color, FFPlace, FFUploadedFile, JSON, DataStruct, Enum, } dynamic deserializeParam( String? param, ParamType paramType, bool isList, { StructBuilder? structBuilder, }) { try { if (param == null) { return null; } if (isList) { final paramValues = json.decode(param); if (paramValues is! Iterable || paramValues.isEmpty) { return null; } return paramValues .whereType() .map((p) => p) .map((p) => deserializeParam( p, paramType, false, structBuilder: structBuilder, )) .where((p) => p != null) .map((p) => p! as T) .toList(); } switch (paramType) { case ParamType.int: return int.tryParse(param); case ParamType.double: return double.tryParse(param); case ParamType.String: return param; case ParamType.bool: return param == 'true'; case ParamType.DateTime: final milliseconds = int.tryParse(param); return milliseconds != null ? DateTime.fromMillisecondsSinceEpoch(milliseconds) : null; case ParamType.DateTimeRange: return dateTimeRangeFromString(param); case ParamType.LatLng: return latLngFromString(param); case ParamType.Color: return fromCssColor(param); case ParamType.FFPlace: return placeFromString(param); case ParamType.FFUploadedFile: return uploadedFileFromString(param); case ParamType.JSON: return json.decode(param); case ParamType.DataStruct: final data = json.decode(param) as Map? ?? {}; return structBuilder != null ? structBuilder(data) : null; case ParamType.Enum: return deserializeEnum(param); default: return null; } } catch (e) { print('Error deserializing parameter: $e'); return null; } }