From ea78b213899c206310f0577cea2848dbe079169c Mon Sep 17 00:00:00 2001 From: Steffen Kleinle Date: Mon, 9 Dec 2024 12:53:07 +0100 Subject: [PATCH] Fix line ending characters --- .circleci/src/commands/prepare_project.yml | 20 +- .gitattributes | 12 + assets/icons/refresh.svg | 12 +- .../gruene_api_campaigns_service.dart | 648 ++--- .../campaigns/screens/flyer_detail.dart | 114 +- .../campaigns/screens/flyer_edit.dart | 268 +- .../campaigns/screens/poster_add_screen.dart | 308 +- lib/features/campaigns/widgets/map.dart | 792 +++--- .../campaigns/widgets/map_controller.dart | 46 +- lib/i18n/app_de.json | 260 +- pubspec.lock | 2526 ++++++++--------- pubspec.yaml | 246 +- 12 files changed, 2632 insertions(+), 2620 deletions(-) create mode 100644 .gitattributes diff --git a/.circleci/src/commands/prepare_project.yml b/.circleci/src/commands/prepare_project.yml index 1f1a2220..c0e5f26b 100644 --- a/.circleci/src/commands/prepare_project.yml +++ b/.circleci/src/commands/prepare_project.yml @@ -1,10 +1,10 @@ -steps: - - run: - name: Generate Translations - command: fvm dart run slang - - run: - name: Apply Production Environment - command: cp .env.prod .env - - run: - command: fvm dart run build_runner build - name: Generate Swagger API +steps: + - run: + name: Generate Translations + command: fvm dart run slang + - run: + name: Apply Production Environment + command: cp .env.prod .env + - run: + command: fvm dart run build_runner build + name: Generate Swagger API diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..ad7b527a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,12 @@ +# Automatically normalize line endings for all text-based files +# http://git-scm.com/docs/gitattributes#_end_of_line_conversion +* text=auto + +# For the following file types, normalize line endings to LF on +# checkin and prevent conversion to CRLF when they are checked out +# (this is required in order to prevent newline related issues like, +# for example, after the build script is run) +.* text eol=lf + +# specific for windows script files +*.bat text eol=crlf diff --git a/assets/icons/refresh.svg b/assets/icons/refresh.svg index 5ac45b29..36334c77 100644 --- a/assets/icons/refresh.svg +++ b/assets/icons/refresh.svg @@ -1,7 +1,7 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/lib/app/services/gruene_api_campaigns_service.dart b/lib/app/services/gruene_api_campaigns_service.dart index 5edc98d8..1af1935e 100644 --- a/lib/app/services/gruene_api_campaigns_service.dart +++ b/lib/app/services/gruene_api_campaigns_service.dart @@ -1,324 +1,324 @@ -import 'dart:typed_data'; - -import 'package:chopper/chopper.dart' as chopper; -import 'package:flutter/material.dart'; -import 'package:gruene_app/app/constants/config.dart'; -import 'package:gruene_app/features/campaigns/models/doors/door_create_model.dart'; -import 'package:gruene_app/features/campaigns/models/doors/door_detail_model.dart'; -import 'package:gruene_app/features/campaigns/models/doors/door_update_model.dart'; -import 'package:gruene_app/features/campaigns/models/flyer/flyer_create_model.dart'; -import 'package:gruene_app/features/campaigns/models/flyer/flyer_detail_model.dart'; -import 'package:gruene_app/features/campaigns/models/flyer/flyer_update_model.dart'; -import 'package:gruene_app/features/campaigns/models/marker_item_model.dart'; -import 'package:gruene_app/features/campaigns/models/posters/poster_create_model.dart'; -import 'package:gruene_app/features/campaigns/models/posters/poster_detail_model.dart'; -import 'package:gruene_app/features/campaigns/models/posters/poster_update_model.dart'; -import 'package:gruene_app/swagger_generated_code/gruene_api.swagger.dart'; -import 'package:http/http.dart'; -import 'package:http_parser/http_parser.dart'; -import 'package:intl/intl.dart'; -import 'package:maplibre_gl_platform_interface/maplibre_gl_platform_interface.dart'; - -part 'gruene_api_core.dart'; - -class GrueneApiCampaignsService { - late GrueneApi grueneApi; - - final PoiServiceType poiType; - - GrueneApiCampaignsService({required this.poiType}) { - grueneApi = _GrueneApiCore().getService(); - } - - Future> loadPoisInRegion(LatLng locationSW, LatLng locationNE) async { - final getPoisType = _getPoiGetType(); - final getPoisResult = await grueneApi.v1CampaignsPoisGet( - type: getPoisType, - bbox: [locationSW.latitude, locationSW.longitude, locationNE.latitude, locationNE.longitude].join(','), - ); - return getPoisResult.body!.data.map(_transformToMarkerItem).toList(); - } - - V1CampaignsPoisGetType _getPoiGetType() { - switch (poiType) { - case PoiServiceType.poster: - return V1CampaignsPoisGetType.poster; - case PoiServiceType.door: - return V1CampaignsPoisGetType.house; - case PoiServiceType.flyer: - return V1CampaignsPoisGetType.flyerSpot; - } - } - - CreatePoiType _getPoiCreateType() { - switch (poiType) { - case PoiServiceType.poster: - return CreatePoiType.poster; - case PoiServiceType.door: - return CreatePoiType.house; - case PoiServiceType.flyer: - return CreatePoiType.flyerSpot; - } - } - - MarkerItemModel _transformToMarkerItem(Poi poi) { - String statusSuffix = ''; - if (poi.poster != null) statusSuffix = '_${poi.poster!.status.name}'; - return MarkerItemModel( - id: int.parse(poi.id), - location: LatLng(poi.coords[0], poi.coords[1]), - status: '${poiType.name}$statusSuffix', - ); - } - - Future createNewPoster(PosterCreateModel newPoster) async { - final requestParam = CreatePoi( - coords: [newPoster.location.latitude, newPoster.location.longitude], - type: _getPoiCreateType(), - address: PoiAddress( - city: newPoster.city, - zip: newPoster.zipCode, - street: newPoster.street, - houseNumber: newPoster.houseNumber, - ), - ); - // saving POI - final newPoiResponse = await grueneApi.v1CampaignsPoisPost(body: requestParam); - - if (newPoiResponse.error == null && newPoster.photo != null) { - // saving Photo along with POI - var poiId = newPoiResponse.body!.id; - - _storePhoto(poiId, newPoster.photo!); - } - - return _transformToMarkerItem(newPoiResponse.body!); - } - - Future getPoiAsPosterDetail(String poiId) async { - return _getPoi(poiId, transformPoiToPosterDetail); - } - - Future getPoiAsDoorDetail(String poiId) { - return _getPoi(poiId, transformPoiToDoorDetail); - } - - Future getPoiAsFlyerDetail(String poiId) { - return _getPoi(poiId, transformPoiToFlyerDetail); - } - - DoorDetailModel transformPoiToDoorDetail(Poi? poi) { - if (poi!.type != PoiType.house) { - throw Exception('Unexpected PoiType'); - } - return DoorDetailModel( - id: poi.id, - street: poi.address!.street, - houseNumber: poi.address!.houseNumber, - zipCode: poi.address!.zip, - city: poi.address!.city, - openedDoors: poi.house!.countOpenedDoors.toInt(), - closedDoors: poi.house!.countClosedDoors.toInt(), - ); - } - - PosterDetailModel transformPoiToPosterDetail(Poi? poi) { - if (poi!.type != PoiType.poster) { - throw Exception('Unexpected PoiType'); - } - return PosterDetailModel( - id: poi.id, - thumbnailUrl: _getThumbnailImageUrl(poi), - imageUrl: _getImageUrl(poi), - street: poi.address!.street, - houseNumber: poi.address!.houseNumber, - zipCode: poi.address!.zip, - city: poi.address!.city, - status: transformToModelPosterStatus(poi.poster!.status), - comment: poi.poster!.comment ?? '', - ); - } - - static String? _getThumbnailImageUrl(Poi poi) { - if (poi.photos.isEmpty) { - return null; - } - - final thumbnail = poi.photos.expand((x) => x.srcset).where((x) => x.type == 'thumbnail').first; - return thumbnail.url; - } - - static String? _getImageUrl(Poi poi) { - if (poi.photos.isEmpty) { - return null; - } - - final image = poi.photos.map((x) => x.original).first; - return image.url; - } - - Future _getPoi(String poiId, T Function(Poi?) transform) async { - final poiResponse = await grueneApi.v1CampaignsPoisPoiIdGet(poiId: poiId); - return transform(poiResponse.body); - } - - Future deletePoi(String poiId) async { - // ignore: unused_local_variable - final deletePoiResponse = await grueneApi.v1CampaignsPoisPoiIdDelete(poiId: poiId); - } - - Future updatePoster(PosterUpdateModel posterUpdate) async { - var dtoUpdate = UpdatePoi( - address: PoiAddress( - street: posterUpdate.street, - houseNumber: posterUpdate.housenumber, - zip: posterUpdate.zipCode, - city: posterUpdate.city, - ), - poster: PoiPoster(status: transformToPoiPosterStatus(posterUpdate.status), comment: posterUpdate.comment), - ); - // ignore: unused_local_variable - var updatePoiResponse = await grueneApi.v1CampaignsPoisPoiIdPut(poiId: posterUpdate.id, body: dtoUpdate); - - if (posterUpdate.newPhoto != null || posterUpdate.removePreviousPhotos) { - debugPrint(updatePoiResponse.body!.photos.length.toString()); - for (var photo in updatePoiResponse.body!.photos) { - updatePoiResponse = await grueneApi.v1CampaignsPoisPoiIdPhotosPhotoIdDelete( - poiId: posterUpdate.id, - photoId: photo.id, - ); - } - } - if (posterUpdate.newPhoto != null) { - updatePoiResponse = await _storePhoto(posterUpdate.id, posterUpdate.newPhoto!); - } - - return _transformToMarkerItem(updatePoiResponse.body!); - } - - Future updateDoor(DoorUpdateModel doorUpdate) async { - var dtoUpdate = UpdatePoi( - address: PoiAddress( - street: doorUpdate.address.street, - houseNumber: doorUpdate.address.houseNumber, - zip: doorUpdate.address.zipCode, - city: doorUpdate.address.city, - ), - house: PoiHouse( - countOpenedDoors: doorUpdate.openedDoors.toDouble(), - countClosedDoors: doorUpdate.closedDoors.toDouble(), - ), - ); - var updatePoiResponse = await grueneApi.v1CampaignsPoisPoiIdPut(poiId: doorUpdate.id, body: dtoUpdate); - - return _transformToMarkerItem(updatePoiResponse.body!); - } - - Future updateFlyer(FlyerUpdateModel flyerUpdate) async { - var dtoUpdate = UpdatePoi( - address: PoiAddress( - street: flyerUpdate.address.street, - houseNumber: flyerUpdate.address.houseNumber, - zip: flyerUpdate.address.zipCode, - city: flyerUpdate.address.city, - ), - flyerSpot: PoiFlyerSpot( - flyerCount: flyerUpdate.flyerCount.toDouble(), - ), - ); - var updatePoiResponse = await grueneApi.v1CampaignsPoisPoiIdPut(poiId: flyerUpdate.id, body: dtoUpdate); - - return _transformToMarkerItem(updatePoiResponse.body!); - } - - PosterStatus transformToModelPosterStatus(PoiPosterStatus status) { - return switch (status) { - PoiPosterStatus.ok => PosterStatus.ok, - PoiPosterStatus.damaged => PosterStatus.damaged, - PoiPosterStatus.missing => PosterStatus.missing, - PoiPosterStatus.removed => PosterStatus.removed, - PoiPosterStatus.swaggerGeneratedUnknown => throw UnimplementedError(), - }; - } - - PoiPosterStatus transformToPoiPosterStatus(PosterStatus status) { - return switch (status) { - PosterStatus.ok => PoiPosterStatus.ok, - PosterStatus.damaged => PoiPosterStatus.damaged, - PosterStatus.missing => PoiPosterStatus.missing, - PosterStatus.removed => PoiPosterStatus.removed, - }; - } - - Future> _storePhoto(String poiId, Uint8List photo) async { - var timeStamp = DateFormat('yyMMdd_HHmmss').format(DateTime.now()); - // ignore: unused_local_variable - final savePoiPhotoResponse = await grueneApi.v1CampaignsPoisPoiIdPhotosPost( - poiId: poiId, - image: MultipartFile.fromBytes( - 'image', - photo, - filename: 'poi_${poiId}_$timeStamp.jpg', - contentType: MediaType('image', 'jpeg'), - ), - ); - return savePoiPhotoResponse; - } - - Future createNewDoor(DoorCreateModel newDoor) async { - final requestParam = CreatePoi( - coords: [newDoor.location.latitude, newDoor.location.longitude], - type: _getPoiCreateType(), - address: PoiAddress( - city: newDoor.address.city, - zip: newDoor.address.zipCode, - street: newDoor.address.street, - houseNumber: newDoor.address.houseNumber, - ), - house: PoiHouse( - countOpenedDoors: newDoor.openedDoors.toDouble(), - countClosedDoors: newDoor.closedDoors.toDouble(), - ), - ); - // saving POI - final newPoiResponse = await grueneApi.v1CampaignsPoisPost(body: requestParam); - - return _transformToMarkerItem(newPoiResponse.body!); - } - - Future createNewFlyer(FlyerCreateModel newFlyer) async { - final requestParam = CreatePoi( - coords: [newFlyer.location.latitude, newFlyer.location.longitude], - type: _getPoiCreateType(), - address: PoiAddress( - city: newFlyer.address.city, - zip: newFlyer.address.zipCode, - street: newFlyer.address.street, - houseNumber: newFlyer.address.houseNumber, - ), - flyerSpot: PoiFlyerSpot( - flyerCount: newFlyer.flyerCount.toDouble(), - ), - ); - // saving POI - final newPoiResponse = await grueneApi.v1CampaignsPoisPost(body: requestParam); - - return _transformToMarkerItem(newPoiResponse.body!); - } - - FlyerDetailModel transformPoiToFlyerDetail(Poi? poi) { - if (poi!.type != PoiType.flyerSpot) { - throw Exception('Unexpected PoiType'); - } - return FlyerDetailModel( - id: poi.id, - street: poi.address!.street, - houseNumber: poi.address!.houseNumber, - zipCode: poi.address!.zip, - city: poi.address!.city, - flyerCount: poi.flyerSpot!.flyerCount.toInt(), - ); - } -} - -enum PoiServiceType { poster, door, flyer } +import 'dart:typed_data'; + +import 'package:chopper/chopper.dart' as chopper; +import 'package:flutter/material.dart'; +import 'package:gruene_app/app/constants/config.dart'; +import 'package:gruene_app/features/campaigns/models/doors/door_create_model.dart'; +import 'package:gruene_app/features/campaigns/models/doors/door_detail_model.dart'; +import 'package:gruene_app/features/campaigns/models/doors/door_update_model.dart'; +import 'package:gruene_app/features/campaigns/models/flyer/flyer_create_model.dart'; +import 'package:gruene_app/features/campaigns/models/flyer/flyer_detail_model.dart'; +import 'package:gruene_app/features/campaigns/models/flyer/flyer_update_model.dart'; +import 'package:gruene_app/features/campaigns/models/marker_item_model.dart'; +import 'package:gruene_app/features/campaigns/models/posters/poster_create_model.dart'; +import 'package:gruene_app/features/campaigns/models/posters/poster_detail_model.dart'; +import 'package:gruene_app/features/campaigns/models/posters/poster_update_model.dart'; +import 'package:gruene_app/swagger_generated_code/gruene_api.swagger.dart'; +import 'package:http/http.dart'; +import 'package:http_parser/http_parser.dart'; +import 'package:intl/intl.dart'; +import 'package:maplibre_gl_platform_interface/maplibre_gl_platform_interface.dart'; + +part 'gruene_api_core.dart'; + +class GrueneApiCampaignsService { + late GrueneApi grueneApi; + + final PoiServiceType poiType; + + GrueneApiCampaignsService({required this.poiType}) { + grueneApi = _GrueneApiCore().getService(); + } + + Future> loadPoisInRegion(LatLng locationSW, LatLng locationNE) async { + final getPoisType = _getPoiGetType(); + final getPoisResult = await grueneApi.v1CampaignsPoisGet( + type: getPoisType, + bbox: [locationSW.latitude, locationSW.longitude, locationNE.latitude, locationNE.longitude].join(','), + ); + return getPoisResult.body!.data.map(_transformToMarkerItem).toList(); + } + + V1CampaignsPoisGetType _getPoiGetType() { + switch (poiType) { + case PoiServiceType.poster: + return V1CampaignsPoisGetType.poster; + case PoiServiceType.door: + return V1CampaignsPoisGetType.house; + case PoiServiceType.flyer: + return V1CampaignsPoisGetType.flyerSpot; + } + } + + CreatePoiType _getPoiCreateType() { + switch (poiType) { + case PoiServiceType.poster: + return CreatePoiType.poster; + case PoiServiceType.door: + return CreatePoiType.house; + case PoiServiceType.flyer: + return CreatePoiType.flyerSpot; + } + } + + MarkerItemModel _transformToMarkerItem(Poi poi) { + String statusSuffix = ''; + if (poi.poster != null) statusSuffix = '_${poi.poster!.status.name}'; + return MarkerItemModel( + id: int.parse(poi.id), + location: LatLng(poi.coords[0], poi.coords[1]), + status: '${poiType.name}$statusSuffix', + ); + } + + Future createNewPoster(PosterCreateModel newPoster) async { + final requestParam = CreatePoi( + coords: [newPoster.location.latitude, newPoster.location.longitude], + type: _getPoiCreateType(), + address: PoiAddress( + city: newPoster.city, + zip: newPoster.zipCode, + street: newPoster.street, + houseNumber: newPoster.houseNumber, + ), + ); + // saving POI + final newPoiResponse = await grueneApi.v1CampaignsPoisPost(body: requestParam); + + if (newPoiResponse.error == null && newPoster.photo != null) { + // saving Photo along with POI + var poiId = newPoiResponse.body!.id; + + _storePhoto(poiId, newPoster.photo!); + } + + return _transformToMarkerItem(newPoiResponse.body!); + } + + Future getPoiAsPosterDetail(String poiId) async { + return _getPoi(poiId, transformPoiToPosterDetail); + } + + Future getPoiAsDoorDetail(String poiId) { + return _getPoi(poiId, transformPoiToDoorDetail); + } + + Future getPoiAsFlyerDetail(String poiId) { + return _getPoi(poiId, transformPoiToFlyerDetail); + } + + DoorDetailModel transformPoiToDoorDetail(Poi? poi) { + if (poi!.type != PoiType.house) { + throw Exception('Unexpected PoiType'); + } + return DoorDetailModel( + id: poi.id, + street: poi.address!.street, + houseNumber: poi.address!.houseNumber, + zipCode: poi.address!.zip, + city: poi.address!.city, + openedDoors: poi.house!.countOpenedDoors.toInt(), + closedDoors: poi.house!.countClosedDoors.toInt(), + ); + } + + PosterDetailModel transformPoiToPosterDetail(Poi? poi) { + if (poi!.type != PoiType.poster) { + throw Exception('Unexpected PoiType'); + } + return PosterDetailModel( + id: poi.id, + thumbnailUrl: _getThumbnailImageUrl(poi), + imageUrl: _getImageUrl(poi), + street: poi.address!.street, + houseNumber: poi.address!.houseNumber, + zipCode: poi.address!.zip, + city: poi.address!.city, + status: transformToModelPosterStatus(poi.poster!.status), + comment: poi.poster!.comment ?? '', + ); + } + + static String? _getThumbnailImageUrl(Poi poi) { + if (poi.photos.isEmpty) { + return null; + } + + final thumbnail = poi.photos.expand((x) => x.srcset).where((x) => x.type == 'thumbnail').first; + return thumbnail.url; + } + + static String? _getImageUrl(Poi poi) { + if (poi.photos.isEmpty) { + return null; + } + + final image = poi.photos.map((x) => x.original).first; + return image.url; + } + + Future _getPoi(String poiId, T Function(Poi?) transform) async { + final poiResponse = await grueneApi.v1CampaignsPoisPoiIdGet(poiId: poiId); + return transform(poiResponse.body); + } + + Future deletePoi(String poiId) async { + // ignore: unused_local_variable + final deletePoiResponse = await grueneApi.v1CampaignsPoisPoiIdDelete(poiId: poiId); + } + + Future updatePoster(PosterUpdateModel posterUpdate) async { + var dtoUpdate = UpdatePoi( + address: PoiAddress( + street: posterUpdate.street, + houseNumber: posterUpdate.housenumber, + zip: posterUpdate.zipCode, + city: posterUpdate.city, + ), + poster: PoiPoster(status: transformToPoiPosterStatus(posterUpdate.status), comment: posterUpdate.comment), + ); + // ignore: unused_local_variable + var updatePoiResponse = await grueneApi.v1CampaignsPoisPoiIdPut(poiId: posterUpdate.id, body: dtoUpdate); + + if (posterUpdate.newPhoto != null || posterUpdate.removePreviousPhotos) { + debugPrint(updatePoiResponse.body!.photos.length.toString()); + for (var photo in updatePoiResponse.body!.photos) { + updatePoiResponse = await grueneApi.v1CampaignsPoisPoiIdPhotosPhotoIdDelete( + poiId: posterUpdate.id, + photoId: photo.id, + ); + } + } + if (posterUpdate.newPhoto != null) { + updatePoiResponse = await _storePhoto(posterUpdate.id, posterUpdate.newPhoto!); + } + + return _transformToMarkerItem(updatePoiResponse.body!); + } + + Future updateDoor(DoorUpdateModel doorUpdate) async { + var dtoUpdate = UpdatePoi( + address: PoiAddress( + street: doorUpdate.address.street, + houseNumber: doorUpdate.address.houseNumber, + zip: doorUpdate.address.zipCode, + city: doorUpdate.address.city, + ), + house: PoiHouse( + countOpenedDoors: doorUpdate.openedDoors.toDouble(), + countClosedDoors: doorUpdate.closedDoors.toDouble(), + ), + ); + var updatePoiResponse = await grueneApi.v1CampaignsPoisPoiIdPut(poiId: doorUpdate.id, body: dtoUpdate); + + return _transformToMarkerItem(updatePoiResponse.body!); + } + + Future updateFlyer(FlyerUpdateModel flyerUpdate) async { + var dtoUpdate = UpdatePoi( + address: PoiAddress( + street: flyerUpdate.address.street, + houseNumber: flyerUpdate.address.houseNumber, + zip: flyerUpdate.address.zipCode, + city: flyerUpdate.address.city, + ), + flyerSpot: PoiFlyerSpot( + flyerCount: flyerUpdate.flyerCount.toDouble(), + ), + ); + var updatePoiResponse = await grueneApi.v1CampaignsPoisPoiIdPut(poiId: flyerUpdate.id, body: dtoUpdate); + + return _transformToMarkerItem(updatePoiResponse.body!); + } + + PosterStatus transformToModelPosterStatus(PoiPosterStatus status) { + return switch (status) { + PoiPosterStatus.ok => PosterStatus.ok, + PoiPosterStatus.damaged => PosterStatus.damaged, + PoiPosterStatus.missing => PosterStatus.missing, + PoiPosterStatus.removed => PosterStatus.removed, + PoiPosterStatus.swaggerGeneratedUnknown => throw UnimplementedError(), + }; + } + + PoiPosterStatus transformToPoiPosterStatus(PosterStatus status) { + return switch (status) { + PosterStatus.ok => PoiPosterStatus.ok, + PosterStatus.damaged => PoiPosterStatus.damaged, + PosterStatus.missing => PoiPosterStatus.missing, + PosterStatus.removed => PoiPosterStatus.removed, + }; + } + + Future> _storePhoto(String poiId, Uint8List photo) async { + var timeStamp = DateFormat('yyMMdd_HHmmss').format(DateTime.now()); + // ignore: unused_local_variable + final savePoiPhotoResponse = await grueneApi.v1CampaignsPoisPoiIdPhotosPost( + poiId: poiId, + image: MultipartFile.fromBytes( + 'image', + photo, + filename: 'poi_${poiId}_$timeStamp.jpg', + contentType: MediaType('image', 'jpeg'), + ), + ); + return savePoiPhotoResponse; + } + + Future createNewDoor(DoorCreateModel newDoor) async { + final requestParam = CreatePoi( + coords: [newDoor.location.latitude, newDoor.location.longitude], + type: _getPoiCreateType(), + address: PoiAddress( + city: newDoor.address.city, + zip: newDoor.address.zipCode, + street: newDoor.address.street, + houseNumber: newDoor.address.houseNumber, + ), + house: PoiHouse( + countOpenedDoors: newDoor.openedDoors.toDouble(), + countClosedDoors: newDoor.closedDoors.toDouble(), + ), + ); + // saving POI + final newPoiResponse = await grueneApi.v1CampaignsPoisPost(body: requestParam); + + return _transformToMarkerItem(newPoiResponse.body!); + } + + Future createNewFlyer(FlyerCreateModel newFlyer) async { + final requestParam = CreatePoi( + coords: [newFlyer.location.latitude, newFlyer.location.longitude], + type: _getPoiCreateType(), + address: PoiAddress( + city: newFlyer.address.city, + zip: newFlyer.address.zipCode, + street: newFlyer.address.street, + houseNumber: newFlyer.address.houseNumber, + ), + flyerSpot: PoiFlyerSpot( + flyerCount: newFlyer.flyerCount.toDouble(), + ), + ); + // saving POI + final newPoiResponse = await grueneApi.v1CampaignsPoisPost(body: requestParam); + + return _transformToMarkerItem(newPoiResponse.body!); + } + + FlyerDetailModel transformPoiToFlyerDetail(Poi? poi) { + if (poi!.type != PoiType.flyerSpot) { + throw Exception('Unexpected PoiType'); + } + return FlyerDetailModel( + id: poi.id, + street: poi.address!.street, + houseNumber: poi.address!.houseNumber, + zipCode: poi.address!.zip, + city: poi.address!.city, + flyerCount: poi.flyerSpot!.flyerCount.toInt(), + ); + } +} + +enum PoiServiceType { poster, door, flyer } diff --git a/lib/features/campaigns/screens/flyer_detail.dart b/lib/features/campaigns/screens/flyer_detail.dart index 9bc935ea..092f766b 100644 --- a/lib/features/campaigns/screens/flyer_detail.dart +++ b/lib/features/campaigns/screens/flyer_detail.dart @@ -1,57 +1,57 @@ -import 'package:flutter/material.dart'; -import 'package:gruene_app/app/theme/theme.dart'; -import 'package:gruene_app/features/campaigns/models/flyer/flyer_detail_model.dart'; -import 'package:gruene_app/i18n/translations.g.dart'; - -class FlyerDetail extends StatelessWidget { - final FlyerDetailModel poi; - - const FlyerDetail({super.key, required this.poi}); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final labelTextStyle = theme.textTheme.labelSmall?.apply(color: Colors.black); - return Container( - padding: EdgeInsets.all(8), - child: Column( - children: [ - Container( - padding: EdgeInsets.symmetric(vertical: 5), - child: Row( - children: [ - Expanded( - child: Text( - t.campaigns.flyer.countFlyer, - style: labelTextStyle, - ), - ), - Align( - alignment: Alignment.centerRight, - child: Container( - padding: EdgeInsets.only(left: 6), - child: Text( - poi.flyerCount.toString(), - style: labelTextStyle, - ), - ), - ), - ], - ), - ), - Container( - height: 1.5, - color: ThemeColors.textLight, - ), - Container( - padding: EdgeInsets.symmetric(vertical: 4), - child: Text( - t.campaigns.posters.info_details, - style: theme.textTheme.labelSmall?.apply(color: Colors.black, fontWeightDelta: 2), - ), - ), - ], - ), - ); - } -} +import 'package:flutter/material.dart'; +import 'package:gruene_app/app/theme/theme.dart'; +import 'package:gruene_app/features/campaigns/models/flyer/flyer_detail_model.dart'; +import 'package:gruene_app/i18n/translations.g.dart'; + +class FlyerDetail extends StatelessWidget { + final FlyerDetailModel poi; + + const FlyerDetail({super.key, required this.poi}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final labelTextStyle = theme.textTheme.labelSmall?.apply(color: Colors.black); + return Container( + padding: EdgeInsets.all(8), + child: Column( + children: [ + Container( + padding: EdgeInsets.symmetric(vertical: 5), + child: Row( + children: [ + Expanded( + child: Text( + t.campaigns.flyer.countFlyer, + style: labelTextStyle, + ), + ), + Align( + alignment: Alignment.centerRight, + child: Container( + padding: EdgeInsets.only(left: 6), + child: Text( + poi.flyerCount.toString(), + style: labelTextStyle, + ), + ), + ), + ], + ), + ), + Container( + height: 1.5, + color: ThemeColors.textLight, + ), + Container( + padding: EdgeInsets.symmetric(vertical: 4), + child: Text( + t.campaigns.posters.info_details, + style: theme.textTheme.labelSmall?.apply(color: Colors.black, fontWeightDelta: 2), + ), + ), + ], + ), + ); + } +} diff --git a/lib/features/campaigns/screens/flyer_edit.dart b/lib/features/campaigns/screens/flyer_edit.dart index e55f0a1e..dcab2d0f 100644 --- a/lib/features/campaigns/screens/flyer_edit.dart +++ b/lib/features/campaigns/screens/flyer_edit.dart @@ -1,134 +1,134 @@ -import 'package:flutter/material.dart'; -import 'package:gruene_app/app/theme/theme.dart'; -import 'package:gruene_app/features/campaigns/models/flyer/flyer_detail_model.dart'; -import 'package:gruene_app/features/campaigns/models/flyer/flyer_update_model.dart'; -import 'package:gruene_app/features/campaigns/screens/door_edit.dart'; -import 'package:gruene_app/features/campaigns/screens/doors_add_screen.dart'; -import 'package:gruene_app/features/campaigns/screens/flyer_add_screen.dart'; -import 'package:gruene_app/features/campaigns/screens/map_consumer.dart'; -import 'package:gruene_app/features/campaigns/widgets/close_save_widget.dart'; -import 'package:gruene_app/features/campaigns/widgets/create_address_widget.dart'; -import 'package:gruene_app/features/campaigns/widgets/delete_and_save_widget.dart'; -import 'package:gruene_app/features/campaigns/widgets/text_input_field.dart'; -import 'package:gruene_app/i18n/translations.g.dart'; - -typedef OnSaveFlyerCallback = void Function(FlyerUpdateModel flyerUpdate); - -class FlyerEdit extends StatefulWidget { - final FlyerDetailModel flyer; - final OnSaveFlyerCallback onSave; - final OnDeletePoiCallback onDelete; - - const FlyerEdit({super.key, required this.flyer, required this.onSave, required this.onDelete}); - - @override - State createState() => _FlyerEditState(); -} - -class _FlyerEditState extends State with AddressMixin, FlyerValidator, ConfirmDelete { - @override - TextEditingController streetTextController = TextEditingController(); - @override - TextEditingController houseNumberTextController = TextEditingController(); - @override - TextEditingController zipCodeTextController = TextEditingController(); - @override - TextEditingController cityTextController = TextEditingController(); - - TextEditingController flyerCountTextController = TextEditingController(); - - @override - void dispose() { - disposeAddressTextControllers(); - super.dispose(); - } - - @override - void initState() { - streetTextController.text = widget.flyer.street; - houseNumberTextController.text = widget.flyer.houseNumber; - zipCodeTextController.text = widget.flyer.zipCode; - cityTextController.text = widget.flyer.city; - flyerCountTextController.text = widget.flyer.flyerCount.toString(); - super.initState(); - } - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final lightBorderColor = ThemeColors.textLight; - return Container( - padding: EdgeInsets.all(12), - child: Column( - children: [ - Container( - padding: EdgeInsets.symmetric(vertical: 6), - child: CloseSaveWidget(onSave: _saveFlyer, onClose: _closeDialog), - ), - Container( - padding: EdgeInsets.symmetric(vertical: 6), - child: Row( - children: [Text(t.campaigns.flyer.editFlyer, style: theme.textTheme.titleLarge)], - ), - ), - CreateAddressWidget( - streetTextController: streetTextController, - houseNumberTextController: houseNumberTextController, - zipCodeTextController: zipCodeTextController, - cityTextController: cityTextController, - inputBorderColor: lightBorderColor, - ), - Container( - padding: EdgeInsets.symmetric(vertical: 6), - child: Row( - children: [ - Expanded( - child: SizedBox(), - ), - Flexible( - child: TextInputField( - labelText: t.campaigns.flyer.countFlyer, - textController: flyerCountTextController, - inputType: InputFieldType.numbers1To999, - borderColor: lightBorderColor, - selectAllTextOnFocus: true, - ), - ), - ], - ), - ), - Container( - padding: EdgeInsets.only(top: 6, bottom: 24), - child: DeleteAndSaveWidget( - onDelete: () => confirmDelete(context, _onDeletePressed), - onSave: _saveFlyer, - ), - ), - ], - ), - ); - } - - void _closeDialog() { - Navigator.maybePop(context); - } - - void _onDeletePressed() { - widget.onDelete(widget.flyer.id); - _closeDialog(); - } - - void _saveFlyer() { - if (!context.mounted) return; - final validationResult = validateFlyer(flyerCountTextController.text, context); - if (validationResult == null) return; - - final updateModel = FlyerUpdateModel( - id: widget.flyer.id, - address: getAddress(), - flyerCount: validationResult.flyerCount, - ); - widget.onSave(updateModel); - _closeDialog(); - } -} +import 'package:flutter/material.dart'; +import 'package:gruene_app/app/theme/theme.dart'; +import 'package:gruene_app/features/campaigns/models/flyer/flyer_detail_model.dart'; +import 'package:gruene_app/features/campaigns/models/flyer/flyer_update_model.dart'; +import 'package:gruene_app/features/campaigns/screens/door_edit.dart'; +import 'package:gruene_app/features/campaigns/screens/doors_add_screen.dart'; +import 'package:gruene_app/features/campaigns/screens/flyer_add_screen.dart'; +import 'package:gruene_app/features/campaigns/screens/map_consumer.dart'; +import 'package:gruene_app/features/campaigns/widgets/close_save_widget.dart'; +import 'package:gruene_app/features/campaigns/widgets/create_address_widget.dart'; +import 'package:gruene_app/features/campaigns/widgets/delete_and_save_widget.dart'; +import 'package:gruene_app/features/campaigns/widgets/text_input_field.dart'; +import 'package:gruene_app/i18n/translations.g.dart'; + +typedef OnSaveFlyerCallback = void Function(FlyerUpdateModel flyerUpdate); + +class FlyerEdit extends StatefulWidget { + final FlyerDetailModel flyer; + final OnSaveFlyerCallback onSave; + final OnDeletePoiCallback onDelete; + + const FlyerEdit({super.key, required this.flyer, required this.onSave, required this.onDelete}); + + @override + State createState() => _FlyerEditState(); +} + +class _FlyerEditState extends State with AddressMixin, FlyerValidator, ConfirmDelete { + @override + TextEditingController streetTextController = TextEditingController(); + @override + TextEditingController houseNumberTextController = TextEditingController(); + @override + TextEditingController zipCodeTextController = TextEditingController(); + @override + TextEditingController cityTextController = TextEditingController(); + + TextEditingController flyerCountTextController = TextEditingController(); + + @override + void dispose() { + disposeAddressTextControllers(); + super.dispose(); + } + + @override + void initState() { + streetTextController.text = widget.flyer.street; + houseNumberTextController.text = widget.flyer.houseNumber; + zipCodeTextController.text = widget.flyer.zipCode; + cityTextController.text = widget.flyer.city; + flyerCountTextController.text = widget.flyer.flyerCount.toString(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final lightBorderColor = ThemeColors.textLight; + return Container( + padding: EdgeInsets.all(12), + child: Column( + children: [ + Container( + padding: EdgeInsets.symmetric(vertical: 6), + child: CloseSaveWidget(onSave: _saveFlyer, onClose: _closeDialog), + ), + Container( + padding: EdgeInsets.symmetric(vertical: 6), + child: Row( + children: [Text(t.campaigns.flyer.editFlyer, style: theme.textTheme.titleLarge)], + ), + ), + CreateAddressWidget( + streetTextController: streetTextController, + houseNumberTextController: houseNumberTextController, + zipCodeTextController: zipCodeTextController, + cityTextController: cityTextController, + inputBorderColor: lightBorderColor, + ), + Container( + padding: EdgeInsets.symmetric(vertical: 6), + child: Row( + children: [ + Expanded( + child: SizedBox(), + ), + Flexible( + child: TextInputField( + labelText: t.campaigns.flyer.countFlyer, + textController: flyerCountTextController, + inputType: InputFieldType.numbers1To999, + borderColor: lightBorderColor, + selectAllTextOnFocus: true, + ), + ), + ], + ), + ), + Container( + padding: EdgeInsets.only(top: 6, bottom: 24), + child: DeleteAndSaveWidget( + onDelete: () => confirmDelete(context, _onDeletePressed), + onSave: _saveFlyer, + ), + ), + ], + ), + ); + } + + void _closeDialog() { + Navigator.maybePop(context); + } + + void _onDeletePressed() { + widget.onDelete(widget.flyer.id); + _closeDialog(); + } + + void _saveFlyer() { + if (!context.mounted) return; + final validationResult = validateFlyer(flyerCountTextController.text, context); + if (validationResult == null) return; + + final updateModel = FlyerUpdateModel( + id: widget.flyer.id, + address: getAddress(), + flyerCount: validationResult.flyerCount, + ); + widget.onSave(updateModel); + _closeDialog(); + } +} diff --git a/lib/features/campaigns/screens/poster_add_screen.dart b/lib/features/campaigns/screens/poster_add_screen.dart index f5b9d698..89abeb67 100644 --- a/lib/features/campaigns/screens/poster_add_screen.dart +++ b/lib/features/campaigns/screens/poster_add_screen.dart @@ -1,154 +1,154 @@ -import 'dart:io'; - -import 'dart:typed_data'; -import 'package:flutter/material.dart'; -import 'package:gruene_app/app/services/nominatim_service.dart'; -import 'package:gruene_app/app/theme/theme.dart'; -import 'package:gruene_app/features/campaigns/helper/media_helper.dart'; -import 'package:gruene_app/features/campaigns/models/posters/poster_create_model.dart'; -import 'package:gruene_app/features/campaigns/screens/doors_add_screen.dart'; -import 'package:gruene_app/features/campaigns/widgets/create_address_widget.dart'; -import 'package:gruene_app/features/campaigns/widgets/save_cancel_on_create_widget.dart'; -import 'package:gruene_app/i18n/translations.g.dart'; -import 'package:maplibre_gl/maplibre_gl.dart'; - -class PosterAddScreen extends StatefulWidget { - final LatLng location; - final AddressModel address; - final File? photo; - - const PosterAddScreen({super.key, this.photo, required this.address, required this.location}); - - @override - State createState() => _PostersAddState(); -} - -class _PostersAddState extends State with AddressMixin { - @override - TextEditingController streetTextController = TextEditingController(); - @override - TextEditingController houseNumberTextController = TextEditingController(); - @override - TextEditingController zipCodeTextController = TextEditingController(); - @override - TextEditingController cityTextController = TextEditingController(); - File? _currentPhoto; - - @override - void initState() { - setAddress(widget.address); - _currentPhoto = widget.photo; - super.initState(); - } - - @override - void dispose() { - disposeAddressTextControllers(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - return Container( - margin: EdgeInsets.all(24), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: [ - Expanded( - child: Text( - t.campaigns.posters.addPoster, - style: theme.textTheme.displayMedium!.apply(color: theme.colorScheme.surface), - ), - ), - Container( - alignment: Alignment.centerRight, - width: 50, - height: 50, - decoration: BoxDecoration( - shape: BoxShape.circle, - border: Border.all(color: ThemeColors.background, width: 1), - gradient: LinearGradient( - colors: [Color(0xFF03BD4E), Color(0xFF875CFF)], - ), - ), - child: _getPhotoPreviewOrIcon(), - ), - ], - ), - CreateAddressWidget( - streetTextController: streetTextController, - houseNumberTextController: houseNumberTextController, - zipCodeTextController: zipCodeTextController, - cityTextController: cityTextController, - ), - SaveCancelOnCreateWidget(onSave: _onSavePressed), - ], - ), - ); - } - - Widget _getPhotoPreviewOrIcon() { - if (_currentPhoto != null) { - return Container( - width: 150, - height: 120, - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - shape: BoxShape.circle, - ), - child: GestureDetector( - onTap: _acquireNewPhoto, - child: Image.file( - _currentPhoto!, - fit: BoxFit.cover, - ), - ), - ); - } else { - return Center( - child: GestureDetector( - onTap: _acquireNewPhoto, - child: Icon( - Icons.photo_camera, - color: Colors.white, - size: 30.0, - ), - ), - ); - } - } - - void _acquireNewPhoto() async { - final photo = await MediaHelper.acquirePhoto(context); - - if (photo != null) { - setState(() { - _currentPhoto = photo; - }); - } - } - - void _onSavePressed(BuildContext localContext) async { - if (!localContext.mounted) return; - final reducedImage = await MediaHelper.resizeAndReduceImageFile(_currentPhoto); - - _saveAndReturn(reducedImage); - } - - void _saveAndReturn(Uint8List? reducedImage) { - Navigator.maybePop( - context, - PosterCreateModel( - location: widget.location, - street: streetTextController.text, - houseNumber: houseNumberTextController.text, - zipCode: zipCodeTextController.text, - city: cityTextController.text, - photo: reducedImage, - ), - ); - } -} +import 'dart:io'; + +import 'dart:typed_data'; +import 'package:flutter/material.dart'; +import 'package:gruene_app/app/services/nominatim_service.dart'; +import 'package:gruene_app/app/theme/theme.dart'; +import 'package:gruene_app/features/campaigns/helper/media_helper.dart'; +import 'package:gruene_app/features/campaigns/models/posters/poster_create_model.dart'; +import 'package:gruene_app/features/campaigns/screens/doors_add_screen.dart'; +import 'package:gruene_app/features/campaigns/widgets/create_address_widget.dart'; +import 'package:gruene_app/features/campaigns/widgets/save_cancel_on_create_widget.dart'; +import 'package:gruene_app/i18n/translations.g.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; + +class PosterAddScreen extends StatefulWidget { + final LatLng location; + final AddressModel address; + final File? photo; + + const PosterAddScreen({super.key, this.photo, required this.address, required this.location}); + + @override + State createState() => _PostersAddState(); +} + +class _PostersAddState extends State with AddressMixin { + @override + TextEditingController streetTextController = TextEditingController(); + @override + TextEditingController houseNumberTextController = TextEditingController(); + @override + TextEditingController zipCodeTextController = TextEditingController(); + @override + TextEditingController cityTextController = TextEditingController(); + File? _currentPhoto; + + @override + void initState() { + setAddress(widget.address); + _currentPhoto = widget.photo; + super.initState(); + } + + @override + void dispose() { + disposeAddressTextControllers(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Container( + margin: EdgeInsets.all(24), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Expanded( + child: Text( + t.campaigns.posters.addPoster, + style: theme.textTheme.displayMedium!.apply(color: theme.colorScheme.surface), + ), + ), + Container( + alignment: Alignment.centerRight, + width: 50, + height: 50, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all(color: ThemeColors.background, width: 1), + gradient: LinearGradient( + colors: [Color(0xFF03BD4E), Color(0xFF875CFF)], + ), + ), + child: _getPhotoPreviewOrIcon(), + ), + ], + ), + CreateAddressWidget( + streetTextController: streetTextController, + houseNumberTextController: houseNumberTextController, + zipCodeTextController: zipCodeTextController, + cityTextController: cityTextController, + ), + SaveCancelOnCreateWidget(onSave: _onSavePressed), + ], + ), + ); + } + + Widget _getPhotoPreviewOrIcon() { + if (_currentPhoto != null) { + return Container( + width: 150, + height: 120, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + shape: BoxShape.circle, + ), + child: GestureDetector( + onTap: _acquireNewPhoto, + child: Image.file( + _currentPhoto!, + fit: BoxFit.cover, + ), + ), + ); + } else { + return Center( + child: GestureDetector( + onTap: _acquireNewPhoto, + child: Icon( + Icons.photo_camera, + color: Colors.white, + size: 30.0, + ), + ), + ); + } + } + + void _acquireNewPhoto() async { + final photo = await MediaHelper.acquirePhoto(context); + + if (photo != null) { + setState(() { + _currentPhoto = photo; + }); + } + } + + void _onSavePressed(BuildContext localContext) async { + if (!localContext.mounted) return; + final reducedImage = await MediaHelper.resizeAndReduceImageFile(_currentPhoto); + + _saveAndReturn(reducedImage); + } + + void _saveAndReturn(Uint8List? reducedImage) { + Navigator.maybePop( + context, + PosterCreateModel( + location: widget.location, + street: streetTextController.text, + houseNumber: houseNumberTextController.text, + zipCode: zipCodeTextController.text, + city: cityTextController.text, + photo: reducedImage, + ), + ); + } +} diff --git a/lib/features/campaigns/widgets/map.dart b/lib/features/campaigns/widgets/map.dart index 07f42d88..9d10f64f 100644 --- a/lib/features/campaigns/widgets/map.dart +++ b/lib/features/campaigns/widgets/map.dart @@ -1,396 +1,396 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:gruene_app/app/constants/config.dart'; -import 'package:gruene_app/app/theme/theme.dart'; -import 'package:gruene_app/features/campaigns/helper/map_helper.dart'; -import 'package:gruene_app/features/campaigns/helper/marker_item_helper.dart'; -import 'package:gruene_app/features/campaigns/helper/marker_item_manager.dart'; -import 'package:gruene_app/features/campaigns/helper/util.dart'; -import 'package:gruene_app/features/campaigns/models/marker_item_model.dart'; -import 'package:gruene_app/features/campaigns/widgets/map_controller.dart'; -import 'package:maplibre_gl/maplibre_gl.dart'; - -typedef OnMapCreatedCallback = void Function(MapController controller); -typedef AddPOIClickedCallback = void Function(LatLng location); -typedef LoadVisibleItemsCallBack = void Function(LatLng locationSW, LatLng locationNE); -typedef GetMarkerImagesCallback = Map Function(); -typedef OnFeatureClickCallback = void Function(dynamic feature); -typedef OnNoFeatureClickCallback = void Function(); -typedef OnEditItemClickedCallback = void Function(); - -class MapContainer extends StatefulWidget { - final OnMapCreatedCallback? onMapCreated; - final AddPOIClickedCallback? addPOIClicked; - final LoadVisibleItemsCallBack? loadVisibleItems; - final GetMarkerImagesCallback? getMarkerImages; - final OnFeatureClickCallback? onFeatureClick; - final OnNoFeatureClickCallback? onNoFeatureClick; - - const MapContainer({ - super.key, - required this.onMapCreated, - required this.addPOIClicked, - required this.loadVisibleItems, - required this.getMarkerImages, - required this.onFeatureClick, - required this.onNoFeatureClick, - }); - - @override - State createState() => _MapContainerState(); -} - -class _MapContainerState extends State implements MapController { - MapLibreMapController? _controller; - final MarkerItemManager _markerItemManager = MarkerItemManager(); - bool _isMapInitialized = false; - - static const markerSourceName = 'markers'; - static const markerLayerName = 'markerSymbols'; - static const addMarkerAssetName = 'assets/symbols/add_marker.svg'; - - List popups = []; - - final LatLngBounds _cameraTargetBounds = LatLngBounds( - southwest: LatLng(46.8, 5.6), - northeast: LatLng(55.1, 15.5), - ); //typically Germany - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Stack( - children: [ - MapLibreMap( - // minMaxZoomPreference: MinMaxZoomPreference(14, 18), - styleString: Config.maplibreUrl, - onMapCreated: _onMapCreated, - initialCameraPosition: const CameraPosition(target: LatLng(52.528810, 13.379300), zoom: 16), - onStyleLoadedCallback: _onStyleLoadedCallback, - cameraTargetBounds: CameraTargetBounds(_cameraTargetBounds), - trackCameraPosition: true, - onCameraIdle: _onCameraIdle, - onMapClick: _onMapClick, - - // rotateGesturesEnabled: false, - ), - Center( - child: Container( - padding: - EdgeInsets.only(bottom: 65 /* height of the add_marker icon to position it exactly on the middle */), - child: GestureDetector( - onTap: _onIconTap, - child: SvgPicture.asset(addMarkerAssetName), - ), - ), - ), - ...popups, - ], - ), - ); - } - - void _onMapCreated(MapLibreMapController controller) async { - if (!mounted) return; - - setState(() { - _controller = controller; - _isMapInitialized = true; - }); - - final onMapCreated = widget.onMapCreated; - if (onMapCreated != null) { - onMapCreated(this); - } - } - - void _onIconTap() { - final addPOIClicked = widget.addPOIClicked; - - if (addPOIClicked != null) { - addPOIClicked(_controller!.cameraPosition!.target); - } - } - - void _onMapClick(Point point, LatLng coordinates) async { - final controller = _controller; - if (controller == null) { - return; - } - final targetLatLng = await controller.toLatLng(point); - if (!mounted) return; - - final onFeatureClick = widget.onFeatureClick; - final onNoFeatureClick = widget.onNoFeatureClick; - - final pixelRatio = MediaQuery.of(context).devicePixelRatio; - - final touchTargetSize = pixelRatio * 38.0; // corresponds to 1 cm roughly - final rect = Rect.fromCenter(center: Offset(point.x, point.y), width: touchTargetSize, height: touchTargetSize); - - final jsonFeatures = await controller.queryRenderedFeaturesInRect(rect, [markerLayerName], null); - final features = jsonFeatures.map((e) => e as Map).where((x) { - // if (x.containsKey('id')) return true; - if (x['properties'] == null) return false; - final properties = x['properties'] as Map; - if (properties['status_type'] == null) return false; - return true; - }).toList(); - - if (features.isNotEmpty && onFeatureClick != null) { - final feature = MapHelper.getClosestFeature(features, targetLatLng); - onFeatureClick(feature); - } else if (onNoFeatureClick != null) { - onNoFeatureClick(); - } - } - - void _onCameraIdle() async { - if (!_isMapInitialized) return; - final visRegion = await _controller?.getVisibleRegion(); - - widget.loadVisibleItems!(visRegion!.southwest, visRegion.northeast); - } - - void _onStyleLoadedCallback() async { - if (widget.getMarkerImages != null) { - widget.getMarkerImages!().forEach((x, y) async { - await addImageFromAsset(_controller!, x, y); - }); - } - - _controller!.addGeoJsonSource( - markerSourceName, - MarkerItemHelper.transformListToGeoJson([]).toJson(), - ); - - await _controller!.addSymbolLayer( - markerSourceName, - markerLayerName, - const SymbolLayerProperties( - iconImage: ['get', 'status_type'], - iconSize: 2, - iconAllowOverlap: true, - ), - enableInteraction: false, - filter: [ - '!', - ['has', 'point_count'], - ], - ); - } - - @override - void setMarkerSource(List poiList) { - _markerItemManager.addMarkers(poiList); - _controller!.setGeoJsonSource( - 'markers', - MarkerItemHelper.transformListToGeoJson(_markerItemManager.getMarkers()).toJson(), - ); - } - - @override - void addMarkerItem(MarkerItemModel markerItem) { - setMarkerSource([markerItem]); - } - - @override - void removeMarkerItem(int markerItemId) { - _markerItemManager.removeMarker(markerItemId); - _controller!.setGeoJsonSource( - 'markers', - MarkerItemHelper.transformListToGeoJson(_markerItemManager.getMarkers()).toJson(), - ); - } - - @override - Future> getScreenPointFromLatLng(LatLng coord) async { - final point = await _controller!.toScreenLocation(coord); - return point; - } - - @override - void showMapPopover( - LatLng coord, - Widget widget, - OnEditItemClickedCallback? onEditItemClicked, { - Size? desiredSize, - }) async { - if (!mounted) return; - - await moveMapIfItemIsOnBorder(coord); - final point = await getScreenPointFromLatLng(coord); - - _showPopOver( - point, - widget, - onEditItemClicked, - desiredSize: desiredSize!, - ); - } - - Future moveMapIfItemIsOnBorder(LatLng itemCoordinate) async { - const animationInMilliseconds = 300; - const borderThresholdInPercent = 0.18; - final centerCoord = _controller!.cameraPosition!.target; - final visibleRegion = await _controller!.getVisibleRegion(); - final visibleRegionHeight = visibleRegion.northeast.latitude - visibleRegion.southwest.latitude; - final visibleRegionWidth = visibleRegion.northeast.longitude - visibleRegion.southwest.longitude; - - double? newLatitude; - double? newLongitude; - - var verticalThresholdDistance = visibleRegionHeight * borderThresholdInPercent; - var horizontalThresholdDistance = visibleRegionWidth * borderThresholdInPercent; - - // check whether coordinate is in border region (defined as percentage of visible area) of visible area - if ((visibleRegion.northeast.latitude - verticalThresholdDistance) < itemCoordinate.latitude) { - final diff = itemCoordinate.latitude - (visibleRegion.northeast.latitude - verticalThresholdDistance); - newLatitude = centerCoord.latitude + (diff * 1.5); - } else if ((visibleRegion.southwest.latitude + verticalThresholdDistance) > itemCoordinate.latitude) { - newLatitude = centerCoord.latitude - (verticalThresholdDistance / 2); - } - if ((visibleRegion.northeast.longitude - horizontalThresholdDistance) < itemCoordinate.longitude) { - newLongitude = centerCoord.longitude + horizontalThresholdDistance; - } else if ((visibleRegion.southwest.longitude + horizontalThresholdDistance) > itemCoordinate.longitude) { - newLongitude = centerCoord.longitude - horizontalThresholdDistance; - } - - if (newLongitude != null || newLatitude != null) { - // find new target and animate camera - final newTarget = LatLng( - newLatitude ?? centerCoord.latitude, - newLongitude ?? centerCoord.longitude, - ); - // ignore: unused_local_variable - await _controller!.animateCamera( - CameraUpdate.newLatLng(newTarget), - duration: Duration(milliseconds: animationInMilliseconds), - ); - } - } - - void _showPopOver( - Point pointOnScreen, - Widget widget, - OnEditItemClickedCallback? onEditItemClicked, { - Size desiredSize = const Size(100, 100), - }) { - final mediaQuery = MediaQuery.of(context); - final pixelRatio = mediaQuery.devicePixelRatio; - - setState(() { - popups.clear(); - num popupHeight = desiredSize.height; - num popupWidth = desiredSize.width; - popups.add( - GestureDetector( - behavior: HitTestBehavior.translucent, - child: Container( - color: ThemeColors.secondary.withAlpha(30), - ), - onTap: () { - setState(() { - popups.clear(); - }); - }, - ), - ); - final heightArrowTriangle = 10.0; - popups.add( - Positioned( - top: ((pointOnScreen.y / pixelRatio) - popupHeight).toDouble() - (5 + heightArrowTriangle), - left: (pointOnScreen.x / pixelRatio) - (popupWidth / 2), - child: GestureDetector( - onTap: () => onTapPopup(onEditItemClicked), - child: Column( - children: [ - Container( - decoration: BoxDecoration( - color: ThemeColors.background, - borderRadius: BorderRadius.circular(5), - ), - padding: EdgeInsets.only(top: 3, left: 5, right: 5), - width: popupWidth.toDouble(), - height: popupHeight.toDouble(), - child: widget, - ), - Center( - child: ClipPath( - clipper: MyTriangle(), - child: Container( - color: ThemeColors.background, - width: 15, - height: heightArrowTriangle, - ), - ), - ), - ], - ), - ), - ), - ); - }); - } - - // void doShowPopup(Point point, Widget widget) { - // final mediaQuery = MediaQuery.of(context); - - // // var arrowDxOffset = (point.x / pixelRatio) - (popupWidth / 2); - // final pixelRatio = mediaQuery.devicePixelRatio; - // var arrowDxOffset = (point.x / pixelRatio) - (mediaQuery.size.width / 2); - // var arrowDyOffset = (point.y / pixelRatio) - 10; - // final contentDxOffset = arrowDxOffset < 100 && arrowDxOffset > 0 ? -50.0 : 0.0; - // debugPrint('Point: $point'); - // debugPrint('width: ${mediaQuery.size.width}'); - // debugPrint('pixelRatio: $pixelRatio'); - // debugPrint('arrowDxOffset: $arrowDxOffset'); - // debugPrint('arrowDyOffset: $arrowDyOffset'); - // debugPrint('contentDxOffset: $contentDxOffset'); - // showPopover( - // context: context, - // arrowHeight: 15, - // arrowWidth: 30, - // direction: PopoverDirection.top, - // contentDxOffset: contentDxOffset, - // arrowDyOffset: arrowDyOffset, - // arrowDxOffset: arrowDxOffset, - // barrierColor: Colors.transparent, - // bodyBuilder: (context) => widget, - // ); - // } - - void onTapPopup(OnEditItemClickedCallback? onEditItemClicked) { - if (onEditItemClicked == null) return; - setState(() { - popups.clear(); - }); - onEditItemClicked(); - } -} - -class MyTriangle extends CustomClipper { - @override - Path getClip(Size size) { - Path path = Path(); - path.addPolygon( - [ - // Offset(0, size.height), - // Offset(size.width / 2, 0), - // Offset(size.width, size.height), - Offset(0, 0), - Offset(size.width / 2, size.height), - Offset(size.width, 0), - ], - true, - ); - return path; - } - - @override - bool shouldReclip(covariant CustomClipper oldClipper) { - return false; - } -} +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:gruene_app/app/constants/config.dart'; +import 'package:gruene_app/app/theme/theme.dart'; +import 'package:gruene_app/features/campaigns/helper/map_helper.dart'; +import 'package:gruene_app/features/campaigns/helper/marker_item_helper.dart'; +import 'package:gruene_app/features/campaigns/helper/marker_item_manager.dart'; +import 'package:gruene_app/features/campaigns/helper/util.dart'; +import 'package:gruene_app/features/campaigns/models/marker_item_model.dart'; +import 'package:gruene_app/features/campaigns/widgets/map_controller.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; + +typedef OnMapCreatedCallback = void Function(MapController controller); +typedef AddPOIClickedCallback = void Function(LatLng location); +typedef LoadVisibleItemsCallBack = void Function(LatLng locationSW, LatLng locationNE); +typedef GetMarkerImagesCallback = Map Function(); +typedef OnFeatureClickCallback = void Function(dynamic feature); +typedef OnNoFeatureClickCallback = void Function(); +typedef OnEditItemClickedCallback = void Function(); + +class MapContainer extends StatefulWidget { + final OnMapCreatedCallback? onMapCreated; + final AddPOIClickedCallback? addPOIClicked; + final LoadVisibleItemsCallBack? loadVisibleItems; + final GetMarkerImagesCallback? getMarkerImages; + final OnFeatureClickCallback? onFeatureClick; + final OnNoFeatureClickCallback? onNoFeatureClick; + + const MapContainer({ + super.key, + required this.onMapCreated, + required this.addPOIClicked, + required this.loadVisibleItems, + required this.getMarkerImages, + required this.onFeatureClick, + required this.onNoFeatureClick, + }); + + @override + State createState() => _MapContainerState(); +} + +class _MapContainerState extends State implements MapController { + MapLibreMapController? _controller; + final MarkerItemManager _markerItemManager = MarkerItemManager(); + bool _isMapInitialized = false; + + static const markerSourceName = 'markers'; + static const markerLayerName = 'markerSymbols'; + static const addMarkerAssetName = 'assets/symbols/add_marker.svg'; + + List popups = []; + + final LatLngBounds _cameraTargetBounds = LatLngBounds( + southwest: LatLng(46.8, 5.6), + northeast: LatLng(55.1, 15.5), + ); //typically Germany + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + MapLibreMap( + // minMaxZoomPreference: MinMaxZoomPreference(14, 18), + styleString: Config.maplibreUrl, + onMapCreated: _onMapCreated, + initialCameraPosition: const CameraPosition(target: LatLng(52.528810, 13.379300), zoom: 16), + onStyleLoadedCallback: _onStyleLoadedCallback, + cameraTargetBounds: CameraTargetBounds(_cameraTargetBounds), + trackCameraPosition: true, + onCameraIdle: _onCameraIdle, + onMapClick: _onMapClick, + + // rotateGesturesEnabled: false, + ), + Center( + child: Container( + padding: + EdgeInsets.only(bottom: 65 /* height of the add_marker icon to position it exactly on the middle */), + child: GestureDetector( + onTap: _onIconTap, + child: SvgPicture.asset(addMarkerAssetName), + ), + ), + ), + ...popups, + ], + ), + ); + } + + void _onMapCreated(MapLibreMapController controller) async { + if (!mounted) return; + + setState(() { + _controller = controller; + _isMapInitialized = true; + }); + + final onMapCreated = widget.onMapCreated; + if (onMapCreated != null) { + onMapCreated(this); + } + } + + void _onIconTap() { + final addPOIClicked = widget.addPOIClicked; + + if (addPOIClicked != null) { + addPOIClicked(_controller!.cameraPosition!.target); + } + } + + void _onMapClick(Point point, LatLng coordinates) async { + final controller = _controller; + if (controller == null) { + return; + } + final targetLatLng = await controller.toLatLng(point); + if (!mounted) return; + + final onFeatureClick = widget.onFeatureClick; + final onNoFeatureClick = widget.onNoFeatureClick; + + final pixelRatio = MediaQuery.of(context).devicePixelRatio; + + final touchTargetSize = pixelRatio * 38.0; // corresponds to 1 cm roughly + final rect = Rect.fromCenter(center: Offset(point.x, point.y), width: touchTargetSize, height: touchTargetSize); + + final jsonFeatures = await controller.queryRenderedFeaturesInRect(rect, [markerLayerName], null); + final features = jsonFeatures.map((e) => e as Map).where((x) { + // if (x.containsKey('id')) return true; + if (x['properties'] == null) return false; + final properties = x['properties'] as Map; + if (properties['status_type'] == null) return false; + return true; + }).toList(); + + if (features.isNotEmpty && onFeatureClick != null) { + final feature = MapHelper.getClosestFeature(features, targetLatLng); + onFeatureClick(feature); + } else if (onNoFeatureClick != null) { + onNoFeatureClick(); + } + } + + void _onCameraIdle() async { + if (!_isMapInitialized) return; + final visRegion = await _controller?.getVisibleRegion(); + + widget.loadVisibleItems!(visRegion!.southwest, visRegion.northeast); + } + + void _onStyleLoadedCallback() async { + if (widget.getMarkerImages != null) { + widget.getMarkerImages!().forEach((x, y) async { + await addImageFromAsset(_controller!, x, y); + }); + } + + _controller!.addGeoJsonSource( + markerSourceName, + MarkerItemHelper.transformListToGeoJson([]).toJson(), + ); + + await _controller!.addSymbolLayer( + markerSourceName, + markerLayerName, + const SymbolLayerProperties( + iconImage: ['get', 'status_type'], + iconSize: 2, + iconAllowOverlap: true, + ), + enableInteraction: false, + filter: [ + '!', + ['has', 'point_count'], + ], + ); + } + + @override + void setMarkerSource(List poiList) { + _markerItemManager.addMarkers(poiList); + _controller!.setGeoJsonSource( + 'markers', + MarkerItemHelper.transformListToGeoJson(_markerItemManager.getMarkers()).toJson(), + ); + } + + @override + void addMarkerItem(MarkerItemModel markerItem) { + setMarkerSource([markerItem]); + } + + @override + void removeMarkerItem(int markerItemId) { + _markerItemManager.removeMarker(markerItemId); + _controller!.setGeoJsonSource( + 'markers', + MarkerItemHelper.transformListToGeoJson(_markerItemManager.getMarkers()).toJson(), + ); + } + + @override + Future> getScreenPointFromLatLng(LatLng coord) async { + final point = await _controller!.toScreenLocation(coord); + return point; + } + + @override + void showMapPopover( + LatLng coord, + Widget widget, + OnEditItemClickedCallback? onEditItemClicked, { + Size? desiredSize, + }) async { + if (!mounted) return; + + await moveMapIfItemIsOnBorder(coord); + final point = await getScreenPointFromLatLng(coord); + + _showPopOver( + point, + widget, + onEditItemClicked, + desiredSize: desiredSize!, + ); + } + + Future moveMapIfItemIsOnBorder(LatLng itemCoordinate) async { + const animationInMilliseconds = 300; + const borderThresholdInPercent = 0.18; + final centerCoord = _controller!.cameraPosition!.target; + final visibleRegion = await _controller!.getVisibleRegion(); + final visibleRegionHeight = visibleRegion.northeast.latitude - visibleRegion.southwest.latitude; + final visibleRegionWidth = visibleRegion.northeast.longitude - visibleRegion.southwest.longitude; + + double? newLatitude; + double? newLongitude; + + var verticalThresholdDistance = visibleRegionHeight * borderThresholdInPercent; + var horizontalThresholdDistance = visibleRegionWidth * borderThresholdInPercent; + + // check whether coordinate is in border region (defined as percentage of visible area) of visible area + if ((visibleRegion.northeast.latitude - verticalThresholdDistance) < itemCoordinate.latitude) { + final diff = itemCoordinate.latitude - (visibleRegion.northeast.latitude - verticalThresholdDistance); + newLatitude = centerCoord.latitude + (diff * 1.5); + } else if ((visibleRegion.southwest.latitude + verticalThresholdDistance) > itemCoordinate.latitude) { + newLatitude = centerCoord.latitude - (verticalThresholdDistance / 2); + } + if ((visibleRegion.northeast.longitude - horizontalThresholdDistance) < itemCoordinate.longitude) { + newLongitude = centerCoord.longitude + horizontalThresholdDistance; + } else if ((visibleRegion.southwest.longitude + horizontalThresholdDistance) > itemCoordinate.longitude) { + newLongitude = centerCoord.longitude - horizontalThresholdDistance; + } + + if (newLongitude != null || newLatitude != null) { + // find new target and animate camera + final newTarget = LatLng( + newLatitude ?? centerCoord.latitude, + newLongitude ?? centerCoord.longitude, + ); + // ignore: unused_local_variable + await _controller!.animateCamera( + CameraUpdate.newLatLng(newTarget), + duration: Duration(milliseconds: animationInMilliseconds), + ); + } + } + + void _showPopOver( + Point pointOnScreen, + Widget widget, + OnEditItemClickedCallback? onEditItemClicked, { + Size desiredSize = const Size(100, 100), + }) { + final mediaQuery = MediaQuery.of(context); + final pixelRatio = mediaQuery.devicePixelRatio; + + setState(() { + popups.clear(); + num popupHeight = desiredSize.height; + num popupWidth = desiredSize.width; + popups.add( + GestureDetector( + behavior: HitTestBehavior.translucent, + child: Container( + color: ThemeColors.secondary.withAlpha(30), + ), + onTap: () { + setState(() { + popups.clear(); + }); + }, + ), + ); + final heightArrowTriangle = 10.0; + popups.add( + Positioned( + top: ((pointOnScreen.y / pixelRatio) - popupHeight).toDouble() - (5 + heightArrowTriangle), + left: (pointOnScreen.x / pixelRatio) - (popupWidth / 2), + child: GestureDetector( + onTap: () => onTapPopup(onEditItemClicked), + child: Column( + children: [ + Container( + decoration: BoxDecoration( + color: ThemeColors.background, + borderRadius: BorderRadius.circular(5), + ), + padding: EdgeInsets.only(top: 3, left: 5, right: 5), + width: popupWidth.toDouble(), + height: popupHeight.toDouble(), + child: widget, + ), + Center( + child: ClipPath( + clipper: MyTriangle(), + child: Container( + color: ThemeColors.background, + width: 15, + height: heightArrowTriangle, + ), + ), + ), + ], + ), + ), + ), + ); + }); + } + + // void doShowPopup(Point point, Widget widget) { + // final mediaQuery = MediaQuery.of(context); + + // // var arrowDxOffset = (point.x / pixelRatio) - (popupWidth / 2); + // final pixelRatio = mediaQuery.devicePixelRatio; + // var arrowDxOffset = (point.x / pixelRatio) - (mediaQuery.size.width / 2); + // var arrowDyOffset = (point.y / pixelRatio) - 10; + // final contentDxOffset = arrowDxOffset < 100 && arrowDxOffset > 0 ? -50.0 : 0.0; + // debugPrint('Point: $point'); + // debugPrint('width: ${mediaQuery.size.width}'); + // debugPrint('pixelRatio: $pixelRatio'); + // debugPrint('arrowDxOffset: $arrowDxOffset'); + // debugPrint('arrowDyOffset: $arrowDyOffset'); + // debugPrint('contentDxOffset: $contentDxOffset'); + // showPopover( + // context: context, + // arrowHeight: 15, + // arrowWidth: 30, + // direction: PopoverDirection.top, + // contentDxOffset: contentDxOffset, + // arrowDyOffset: arrowDyOffset, + // arrowDxOffset: arrowDxOffset, + // barrierColor: Colors.transparent, + // bodyBuilder: (context) => widget, + // ); + // } + + void onTapPopup(OnEditItemClickedCallback? onEditItemClicked) { + if (onEditItemClicked == null) return; + setState(() { + popups.clear(); + }); + onEditItemClicked(); + } +} + +class MyTriangle extends CustomClipper { + @override + Path getClip(Size size) { + Path path = Path(); + path.addPolygon( + [ + // Offset(0, size.height), + // Offset(size.width / 2, 0), + // Offset(size.width, size.height), + Offset(0, 0), + Offset(size.width / 2, size.height), + Offset(size.width, 0), + ], + true, + ); + return path; + } + + @override + bool shouldReclip(covariant CustomClipper oldClipper) { + return false; + } +} diff --git a/lib/features/campaigns/widgets/map_controller.dart b/lib/features/campaigns/widgets/map_controller.dart index 0fe76c3c..1f63ee40 100644 --- a/lib/features/campaigns/widgets/map_controller.dart +++ b/lib/features/campaigns/widgets/map_controller.dart @@ -1,23 +1,23 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:gruene_app/features/campaigns/models/marker_item_model.dart'; -import 'package:gruene_app/features/campaigns/widgets/map.dart'; -import 'package:maplibre_gl_platform_interface/maplibre_gl_platform_interface.dart'; - -abstract class MapController { - void setMarkerSource(List poiList) {} - void addMarkerItem(MarkerItemModel markerItem) {} - void removeMarkerItem(int markerItemId) {} - - Future?> getScreenPointFromLatLng(LatLng coord) async { - return null; - } - - void showMapPopover( - LatLng coord, - Widget widget, - OnEditItemClickedCallback? onEditItemClicked, { - Size? desiredSize, - }) {} -} +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:gruene_app/features/campaigns/models/marker_item_model.dart'; +import 'package:gruene_app/features/campaigns/widgets/map.dart'; +import 'package:maplibre_gl_platform_interface/maplibre_gl_platform_interface.dart'; + +abstract class MapController { + void setMarkerSource(List poiList) {} + void addMarkerItem(MarkerItemModel markerItem) {} + void removeMarkerItem(int markerItemId) {} + + Future?> getScreenPointFromLatLng(LatLng coord) async { + return null; + } + + void showMapPopover( + LatLng coord, + Widget widget, + OnEditItemClickedCallback? onEditItemClicked, { + Size? desiredSize, + }) {} +} diff --git a/lib/i18n/app_de.json b/lib/i18n/app_de.json index 13740e1f..70100ce4 100644 --- a/lib/i18n/app_de.json +++ b/lib/i18n/app_de.json @@ -1,131 +1,131 @@ -{ - "common": { - "appName": "Grüne App", - "actions": { - "save": "Speichern", - "cancel": "Abbrechen", - "delete": "Löschen" - } - }, - "news": { - "news": "Artikel", - "label": "Artikel" - }, - "campaigns": { - "campaigns": "Wahlkampf", - "label": "Wahlkampf", - "filters": { - "focusAreas": "Fokusgebiete", - "routes": "Routen", - "visited_areas": "Besuchte Gebiete", - "polling_stations": "Wahllokale", - "experience_areas": "Erfahrungsgebiete" - }, - "posters": { - - "label": "Plakate", - "addPoster": "Plakat eintragen", - "editPoster": "Plakat bearbeiten", - "info_details": "Infos & Bearbeiten", - "delete_photo": "Foto löschen", - "replace_photo": "Foto ersetzen", - "status": { - "damaged": { - "label": "Beschädigt", - "hint": "Als zu ersetzen melden" - }, - "missing": { - "label": "Verschollen", - "hint": "Durch Fremdeinwirkung entfernt" - }, - "removed": { - "label": "Abgehangen", - "hint": "Dauerhaft entfernt" - } - }, - "status_damaged": "Beschädigt (Als zu ersetzen melden)", - "status_taken_down": "Als abgehängt markieren", - "comment": { - "label": "Beschreibung", - "hint": "Bitte gib hierzu weitere Informationen an" - }, - "deletePoster": { - "hint": "Bitte lösche Einträge ausschließlich, wenn es nicht anders geht. Markiere abgehängte Plakate als \"Abgehängt\"." - } - }, - "door": { - "label": "Haustür", - "addDoor": "Haustür eintragen", - "closedDoors": "Ungeöffnete Türen", - "editDoor": "Haustür bearbeiten", - "openedDoors": "Geöffnete Türen", - "noDoorsWarning": "Bitte gib mindestens eine Tür ein!", - "createDoor": { - "hint": "Bitte trage sowohl geöffnete, als auch verschlossen gebliebene Türen ein, damit wir eine genauere Statistik erhalten." - } - }, - "flyer": { - "label": "Flyer", - "addFlyer": "Wahlkampfstand eintragen", - "editFlyer": "Wahlkampfstand bearbeiten", - "countFlyer": "Anzahl der Flyer", - "noFlyerWarning": "Bitte geben Sie mindestens einen Flyer ein!" - }, - "deleteEntry": { - "label": "Eintrag löschen", - "confirmation_dialog": "Möchtest du diesen Eintrag wirklich löschen? Dies kann nicht rückgängig gemacht werden." - }, - "team": { - "label": "Team" - }, - "statistic": { - "label": "Statistik" - }, - "address": { - "street": "Straße", - "housenumber": "Hausnr.", - "zipcode": "PLZ", - "city_or_place": "Stadt / Ort" - } - }, - "profiles": { - "profiles": "Mitglieder", - "label": "Mitglieder" - }, - "mfa": { - "mfa": "Zwei-Faktor-Authentifizierung", - "label": "2FA" - }, - "settings": { - "settings": "App-Einstellungen", - "campaignsSettings": "Wahlkampf", - "inviteNonMember": "Nicht-Mitglied einladen", - "offlineMaps": "Offline-Karten", - "generalSettings": "App", - "pushNotifications": "Push Nachrichten", - "accessibility": "Barrierefreiheit", - "supportAndFeedback": "Support & Feedback", - "actionNetwork": "Action Network", - "newsletter": "Newsletter", - "legalSettings": "Rechtliches", - "legalNotice": "Impressum", - "dataProtectionStatement": "Datenschutzerklärung", - "termsOfUse": "Nutzungsbedingungen", - "logout": "Ausloggen" - }, - "tools": { - "tools": "Tools", - "label": "Tools" - }, - "login": { - "login": "Anmeldung", - "support": "Unterstützen", - "welcome": "Willkommen!", - "loginMembers": "Jetzt einloggen", - "loginNonMembers": "Login für Nicht-Parteimitglieder", - "dataProtection": "Datenschutz", - "legalNotice": "Impressum", - "discover": "App erkunden", - "discoverDescription": "Erfahre hier, was Dich erwartet." - } +{ + "common": { + "appName": "Grüne App", + "actions": { + "save": "Speichern", + "cancel": "Abbrechen", + "delete": "Löschen" + } + }, + "news": { + "news": "Artikel", + "label": "Artikel" + }, + "campaigns": { + "campaigns": "Wahlkampf", + "label": "Wahlkampf", + "filters": { + "focusAreas": "Fokusgebiete", + "routes": "Routen", + "visited_areas": "Besuchte Gebiete", + "polling_stations": "Wahllokale", + "experience_areas": "Erfahrungsgebiete" + }, + "posters": { + + "label": "Plakate", + "addPoster": "Plakat eintragen", + "editPoster": "Plakat bearbeiten", + "info_details": "Infos & Bearbeiten", + "delete_photo": "Foto löschen", + "replace_photo": "Foto ersetzen", + "status": { + "damaged": { + "label": "Beschädigt", + "hint": "Als zu ersetzen melden" + }, + "missing": { + "label": "Verschollen", + "hint": "Durch Fremdeinwirkung entfernt" + }, + "removed": { + "label": "Abgehangen", + "hint": "Dauerhaft entfernt" + } + }, + "status_damaged": "Beschädigt (Als zu ersetzen melden)", + "status_taken_down": "Als abgehängt markieren", + "comment": { + "label": "Beschreibung", + "hint": "Bitte gib hierzu weitere Informationen an" + }, + "deletePoster": { + "hint": "Bitte lösche Einträge ausschließlich, wenn es nicht anders geht. Markiere abgehängte Plakate als \"Abgehängt\"." + } + }, + "door": { + "label": "Haustür", + "addDoor": "Haustür eintragen", + "closedDoors": "Ungeöffnete Türen", + "editDoor": "Haustür bearbeiten", + "openedDoors": "Geöffnete Türen", + "noDoorsWarning": "Bitte gib mindestens eine Tür ein!", + "createDoor": { + "hint": "Bitte trage sowohl geöffnete, als auch verschlossen gebliebene Türen ein, damit wir eine genauere Statistik erhalten." + } + }, + "flyer": { + "label": "Flyer", + "addFlyer": "Wahlkampfstand eintragen", + "editFlyer": "Wahlkampfstand bearbeiten", + "countFlyer": "Anzahl der Flyer", + "noFlyerWarning": "Bitte geben Sie mindestens einen Flyer ein!" + }, + "deleteEntry": { + "label": "Eintrag löschen", + "confirmation_dialog": "Möchtest du diesen Eintrag wirklich löschen? Dies kann nicht rückgängig gemacht werden." + }, + "team": { + "label": "Team" + }, + "statistic": { + "label": "Statistik" + }, + "address": { + "street": "Straße", + "housenumber": "Hausnr.", + "zipcode": "PLZ", + "city_or_place": "Stadt / Ort" + } + }, + "profiles": { + "profiles": "Mitglieder", + "label": "Mitglieder" + }, + "mfa": { + "mfa": "Zwei-Faktor-Authentifizierung", + "label": "2FA" + }, + "settings": { + "settings": "App-Einstellungen", + "campaignsSettings": "Wahlkampf", + "inviteNonMember": "Nicht-Mitglied einladen", + "offlineMaps": "Offline-Karten", + "generalSettings": "App", + "pushNotifications": "Push Nachrichten", + "accessibility": "Barrierefreiheit", + "supportAndFeedback": "Support & Feedback", + "actionNetwork": "Action Network", + "newsletter": "Newsletter", + "legalSettings": "Rechtliches", + "legalNotice": "Impressum", + "dataProtectionStatement": "Datenschutzerklärung", + "termsOfUse": "Nutzungsbedingungen", + "logout": "Ausloggen" + }, + "tools": { + "tools": "Tools", + "label": "Tools" + }, + "login": { + "login": "Anmeldung", + "support": "Unterstützen", + "welcome": "Willkommen!", + "loginMembers": "Jetzt einloggen", + "loginNonMembers": "Login für Nicht-Parteimitglieder", + "dataProtection": "Datenschutz", + "legalNotice": "Impressum", + "discover": "App erkunden", + "discoverDescription": "Erfahre hier, was Dich erwartet." + } } \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index f944a632..397dd933 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,1263 +1,1263 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 - url: "https://pub.dev" - source: hosted - version: "72.0.0" - _macros: - dependency: transitive - description: dart - source: sdk - version: "0.3.2" - analyzer: - dependency: transitive - description: - name: analyzer - sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 - url: "https://pub.dev" - source: hosted - version: "6.7.0" - ansicolor: - dependency: transitive - description: - name: ansicolor - sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" - url: "https://pub.dev" - source: hosted - version: "2.0.3" - archive: - dependency: transitive - description: - name: archive - sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d - url: "https://pub.dev" - source: hosted - version: "3.6.1" - args: - dependency: transitive - description: - name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 - url: "https://pub.dev" - source: hosted - version: "2.6.0" - async: - dependency: transitive - description: - name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 - url: "https://pub.dev" - source: hosted - version: "2.12.0" - benchmark: - dependency: transitive - description: - name: benchmark - sha256: cb3eeea01e3f054df76ee9775ca680f3afa5f19f39b2bb426ba78ba27654493b - url: "https://pub.dev" - source: hosted - version: "0.3.0" - bloc: - dependency: transitive - description: - name: bloc - sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" - url: "https://pub.dev" - source: hosted - version: "8.1.4" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - build: - dependency: transitive - description: - name: build - sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - build_config: - dependency: transitive - description: - name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 - url: "https://pub.dev" - source: hosted - version: "1.1.1" - build_daemon: - dependency: transitive - description: - name: build_daemon - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" - url: "https://pub.dev" - source: hosted - version: "4.0.2" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" - url: "https://pub.dev" - source: hosted - version: "2.4.2" - build_runner: - dependency: "direct dev" - description: - name: build_runner - sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" - url: "https://pub.dev" - source: hosted - version: "2.4.13" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 - url: "https://pub.dev" - source: hosted - version: "7.3.2" - built_collection: - dependency: transitive - description: - name: built_collection - sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" - source: hosted - version: "5.1.1" - built_value: - dependency: transitive - description: - name: built_value - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb - url: "https://pub.dev" - source: hosted - version: "8.9.2" - camerawesome: - dependency: "direct main" - description: - name: camerawesome - sha256: "3619d5605fb14ab72c815532c1d9f635512c75df07b5a742b60a9a4b03b6081e" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - carousel_slider: - dependency: transitive - description: - name: carousel_slider - sha256: "7b006ec356205054af5beaef62e2221160ea36b90fb70a35e4deacd49d0349ae" - url: "https://pub.dev" - source: hosted - version: "5.0.0" - characters: - dependency: transitive - description: - name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.dev" - source: hosted - version: "1.3.0" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" - chopper: - dependency: "direct main" - description: - name: chopper - sha256: "40899b729fb6d8969d967264b189efaf2452bc3ccf6ed0782d00f1d8a6161c31" - url: "https://pub.dev" - source: hosted - version: "8.0.3" - chopper_generator: - dependency: "direct dev" - description: - name: chopper_generator - sha256: de438569cba1e2a2888e8d91e3c2ac60106574eea7f36823ed0334e96146328a - url: "https://pub.dev" - source: hosted - version: "8.0.3" - clock: - dependency: transitive - description: - name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" - source: hosted - version: "1.1.1" - code_builder: - dependency: transitive - description: - name: code_builder - sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" - url: "https://pub.dev" - source: hosted - version: "4.10.1" - collection: - dependency: transitive - description: - name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a - url: "https://pub.dev" - source: hosted - version: "1.18.0" - colorfilter_generator: - dependency: transitive - description: - name: colorfilter_generator - sha256: ccc2995e440b1d828d55d99150e7cad64624f3cb4a1e235000de3f93cf10d35c - url: "https://pub.dev" - source: hosted - version: "0.0.8" - convert: - dependency: transitive - description: - name: convert - sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.dev" - source: hosted - version: "3.1.2" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.dev" - source: hosted - version: "0.3.4+2" - crypto: - dependency: transitive - description: - name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.dev" - source: hosted - version: "3.0.6" - csslib: - dependency: transitive - description: - name: csslib - sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.dev" - source: hosted - version: "1.0.2" - csv: - dependency: transitive - description: - name: csv - sha256: c6aa2679b2a18cb57652920f674488d89712efaf4d3fdf2e537215b35fc19d6c - url: "https://pub.dev" - source: hosted - version: "6.0.0" - dart_sort_queue: - dependency: transitive - description: - name: dart_sort_queue - sha256: f3353ba8b4850e072d3368757f62edb79af34a9703c3e3df9c59342721f5f5b1 - url: "https://pub.dev" - source: hosted - version: "0.0.2+3" - dart_style: - dependency: transitive - description: - name: dart_style - sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" - url: "https://pub.dev" - source: hosted - version: "2.3.7" - dio: - dependency: "direct main" - description: - name: dio - sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" - url: "https://pub.dev" - source: hosted - version: "5.7.0" - dio_web_adapter: - dependency: transitive - description: - name: dio_web_adapter - sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 - url: "https://pub.dev" - source: hosted - version: "2.0.5" - ffi: - dependency: transitive - description: - name: ffi - sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" - url: "https://pub.dev" - source: hosted - version: "2.1.3" - file: - dependency: transitive - description: - name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" - source: hosted - version: "7.0.1" - fixnum: - dependency: transitive - description: - name: fixnum - sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" - source: hosted - version: "1.1.1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_appauth: - dependency: "direct main" - description: - name: flutter_appauth - sha256: "6ab0e7fb2cb66db472a71c00e0f0d0888f186d308beaef4bba1a6113fa861096" - url: "https://pub.dev" - source: hosted - version: "8.0.0+1" - flutter_appauth_platform_interface: - dependency: transitive - description: - name: flutter_appauth_platform_interface - sha256: ccf5e1d8c40dd35b297290b33cc1896648b4b92a2ec3f62a436c62a8eef9a9db - url: "https://pub.dev" - source: hosted - version: "8.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a - url: "https://pub.dev" - source: hosted - version: "8.1.6" - flutter_dotenv: - dependency: "direct main" - description: - name: flutter_dotenv - sha256: b7c7be5cd9f6ef7a78429cabd2774d3c4af50e79cb2b7593e3d5d763ef95c61b - url: "https://pub.dev" - source: hosted - version: "5.2.1" - flutter_inappwebview: - dependency: "direct main" - description: - name: flutter_inappwebview - sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5" - url: "https://pub.dev" - source: hosted - version: "6.1.5" - flutter_inappwebview_android: - dependency: transitive - description: - name: flutter_inappwebview_android - sha256: "62557c15a5c2db5d195cb3892aab74fcaec266d7b86d59a6f0027abd672cddba" - url: "https://pub.dev" - source: hosted - version: "1.1.3" - flutter_inappwebview_internal_annotations: - dependency: transitive - description: - name: flutter_inappwebview_internal_annotations - sha256: "5f80fd30e208ddded7dbbcd0d569e7995f9f63d45ea3f548d8dd4c0b473fb4c8" - url: "https://pub.dev" - source: hosted - version: "1.1.1" - flutter_inappwebview_ios: - dependency: transitive - description: - name: flutter_inappwebview_ios - sha256: "5818cf9b26cf0cbb0f62ff50772217d41ea8d3d9cc00279c45f8aabaa1b4025d" - url: "https://pub.dev" - source: hosted - version: "1.1.2" - flutter_inappwebview_macos: - dependency: transitive - description: - name: flutter_inappwebview_macos - sha256: c1fbb86af1a3738e3541364d7d1866315ffb0468a1a77e34198c9be571287da1 - url: "https://pub.dev" - source: hosted - version: "1.1.2" - flutter_inappwebview_platform_interface: - dependency: transitive - description: - name: flutter_inappwebview_platform_interface - sha256: cf5323e194096b6ede7a1ca808c3e0a078e4b33cc3f6338977d75b4024ba2500 - url: "https://pub.dev" - source: hosted - version: "1.3.0+1" - flutter_inappwebview_web: - dependency: transitive - description: - name: flutter_inappwebview_web - sha256: "55f89c83b0a0d3b7893306b3bb545ba4770a4df018204917148ebb42dc14a598" - url: "https://pub.dev" - source: hosted - version: "1.1.2" - flutter_inappwebview_windows: - dependency: transitive - description: - name: flutter_inappwebview_windows - sha256: "8b4d3a46078a2cdc636c4a3d10d10f2a16882f6be607962dbfff8874d1642055" - url: "https://pub.dev" - source: hosted - version: "0.6.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://pub.dev" - source: hosted - version: "5.0.0" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_native_splash: - dependency: "direct main" - description: - name: flutter_native_splash - sha256: ee5c9bd2b74ea8676442fd4ab876b5d41681df49276488854d6c81a5377c0ef1 - url: "https://pub.dev" - source: hosted - version: "2.4.2" - flutter_secure_storage: - dependency: "direct main" - description: - name: flutter_secure_storage - sha256: "165164745e6afb5c0e3e3fcc72a012fb9e58496fb26ffb92cf22e16a821e85d0" - url: "https://pub.dev" - source: hosted - version: "9.2.2" - flutter_secure_storage_linux: - dependency: transitive - description: - name: flutter_secure_storage_linux - sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b" - url: "https://pub.dev" - source: hosted - version: "1.2.1" - flutter_secure_storage_macos: - dependency: transitive - description: - name: flutter_secure_storage_macos - sha256: "1693ab11121a5f925bbea0be725abfcfbbcf36c1e29e571f84a0c0f436147a81" - url: "https://pub.dev" - source: hosted - version: "3.1.2" - flutter_secure_storage_platform_interface: - dependency: transitive - description: - name: flutter_secure_storage_platform_interface - sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 - url: "https://pub.dev" - source: hosted - version: "1.1.2" - flutter_secure_storage_web: - dependency: transitive - description: - name: flutter_secure_storage_web - sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - flutter_secure_storage_windows: - dependency: transitive - description: - name: flutter_secure_storage_windows - sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 - url: "https://pub.dev" - source: hosted - version: "3.1.2" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" - url: "https://pub.dev" - source: hosted - version: "2.0.10+1" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 - url: "https://pub.dev" - source: hosted - version: "4.0.0" - geotypes: - dependency: transitive - description: - name: geotypes - sha256: "5bedf57de92283133dd221e363812ef50eaaba414f0823b1974ef7d84b86991f" - url: "https://pub.dev" - source: hosted - version: "0.0.2" - get_it: - dependency: "direct main" - description: - name: get_it - sha256: ff97e5e7b2e82e63c82f5658c6ba2605ea831f0f7489b0d2fb255d817ec4eb5e - url: "https://pub.dev" - source: hosted - version: "8.0.0" - glob: - dependency: transitive - description: - name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - go_router: - dependency: "direct main" - description: - name: go_router - sha256: "6f1b756f6e863259a99135ff3c95026c3cdca17d10ebef2bba2261a25ddc8bbc" - url: "https://pub.dev" - source: hosted - version: "14.3.0" - google_fonts: - dependency: "direct main" - description: - name: google_fonts - sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 - url: "https://pub.dev" - source: hosted - version: "6.2.1" - graphs: - dependency: transitive - description: - name: graphs - sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - html: - dependency: transitive - description: - name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" - url: "https://pub.dev" - source: hosted - version: "0.15.5" - http: - dependency: "direct main" - description: - name: http - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 - url: "https://pub.dev" - source: hosted - version: "1.2.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - http_parser: - dependency: "direct main" - description: - name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" - source: hosted - version: "4.0.2" - image: - dependency: "direct main" - description: - name: image - sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d - url: "https://pub.dev" - source: hosted - version: "4.3.0" - intl: - dependency: "direct main" - description: - name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.dev" - source: hosted - version: "0.19.0" - io: - dependency: transitive - description: - name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" - json2yaml: - dependency: transitive - description: - name: json2yaml - sha256: da94630fbc56079426fdd167ae58373286f603371075b69bf46d848d63ba3e51 - url: "https://pub.dev" - source: hosted - version: "3.0.1" - json_annotation: - dependency: "direct main" - description: - name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" - source: hosted - version: "4.9.0" - json_serializable: - dependency: "direct dev" - description: - name: json_serializable - sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b - url: "https://pub.dev" - source: hosted - version: "6.8.0" - jwt_decoder: - dependency: "direct main" - description: - name: jwt_decoder - sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" - url: "https://pub.dev" - source: hosted - version: "2.0.1" - lints: - dependency: transitive - description: - name: lints - sha256: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413" - url: "https://pub.dev" - source: hosted - version: "5.0.0" - logger: - dependency: "direct main" - description: - name: logger - sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32" - url: "https://pub.dev" - source: hosted - version: "2.4.0" - logging: - dependency: transitive - description: - name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" - source: hosted - version: "1.3.0" - macros: - dependency: transitive - description: - name: macros - sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" - url: "https://pub.dev" - source: hosted - version: "0.1.2-main.4" - maplibre_gl: - dependency: "direct main" - description: - name: maplibre_gl - sha256: ea2fa443e7d5dc18db7f37a0f6f5af40642888c56b81a14441aeddea077adaea - url: "https://pub.dev" - source: hosted - version: "0.20.0" - maplibre_gl_platform_interface: - dependency: "direct main" - description: - name: maplibre_gl_platform_interface - sha256: "718c3503f36936fbf35c34d6ddf8bf770474c5ba1e6cb1d8caece44efae424af" - url: "https://pub.dev" - source: hosted - version: "0.20.0" - maplibre_gl_web: - dependency: transitive - description: - name: maplibre_gl_web - sha256: e7d71b08f24dca70e9c9cf841b096704a677e6239447d87220ec071355768149 - url: "https://pub.dev" - source: hosted - version: "0.20.0" - markdown: - dependency: transitive - description: - name: markdown - sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 - url: "https://pub.dev" - source: hosted - version: "7.2.2" - matcher: - dependency: transitive - description: - name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.dev" - source: hosted - version: "0.12.17" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev" - source: hosted - version: "0.11.1" - matrix2d: - dependency: transitive - description: - name: matrix2d - sha256: "188718dd3bc2a31e372cfd0791b0f77f4f13ea76164147342cc378d9132949e7" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - meta: - dependency: transitive - description: - name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 - url: "https://pub.dev" - source: hosted - version: "1.15.0" - mime: - dependency: transitive - description: - name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - package_config: - dependency: transitive - description: - name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - path: - dependency: transitive - description: - name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.dev" - source: hosted - version: "1.9.0" - path_parsing: - dependency: transitive - description: - name: path_parsing - sha256: "45f7d6bba1128761de5540f39d5ca000ea8a1f22f06b76b61094a60a2997bd0e" - url: "https://pub.dev" - source: hosted - version: "1.0.2" - path_provider: - dependency: transitive - description: - name: path_provider - sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 - url: "https://pub.dev" - source: hosted - version: "2.1.4" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a - url: "https://pub.dev" - source: hosted - version: "2.2.12" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 - url: "https://pub.dev" - source: hosted - version: "2.4.0" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" - source: hosted - version: "2.2.1" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" - source: hosted - version: "2.3.0" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.dev" - source: hosted - version: "6.0.2" - platform: - dependency: transitive - description: - name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" - source: hosted - version: "3.1.6" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - pool: - dependency: transitive - description: - name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" - source: hosted - version: "1.5.1" - provider: - dependency: transitive - description: - name: provider - sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c - url: "https://pub.dev" - source: hosted - version: "6.1.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 - url: "https://pub.dev" - source: hosted - version: "1.3.0" - qs_dart: - dependency: transitive - description: - name: qs_dart - sha256: be73d060d29c0716ded88380ba32e87ce8105f0ba234edb3edefa0d74d47d64b - url: "https://pub.dev" - source: hosted - version: "1.2.4" - rbush: - dependency: transitive - description: - name: rbush - sha256: "48b683421b4afb43a642f82c6aa31911e54f3069143d31c7d33cbe329df13403" - url: "https://pub.dev" - source: hosted - version: "1.1.1" - recase: - dependency: transitive - description: - name: recase - sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 - url: "https://pub.dev" - source: hosted - version: "4.1.0" - recursive_regex: - dependency: transitive - description: - name: recursive_regex - sha256: f7252e3d3dfd1665e594d9fe035eca6bc54139b1f2fee38256fa427ea41adc60 - url: "https://pub.dev" - source: hosted - version: "1.0.0" - rxdart: - dependency: transitive - description: - name: rxdart - sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" - url: "https://pub.dev" - source: hosted - version: "0.28.0" - shelf: - dependency: transitive - description: - name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 - url: "https://pub.dev" - source: hosted - version: "1.4.1" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 - url: "https://pub.dev" - source: hosted - version: "2.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - slang: - dependency: "direct main" - description: - name: slang - sha256: b04db2dbaf927b28600a2f8a272a3bf2ae309556dcc5d6beb02d66af0be39e4c - url: "https://pub.dev" - source: hosted - version: "4.1.0" - slang_flutter: - dependency: "direct main" - description: - name: slang_flutter - sha256: "59988f37bb8b50d96ee46832a8a389036c0da26c04b1b1d4aa6690c00f70eccf" - url: "https://pub.dev" - source: hosted - version: "4.1.0" - source_gen: - dependency: transitive - description: - name: source_gen - sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" - url: "https://pub.dev" - source: hosted - version: "1.5.0" - source_helper: - dependency: transitive - description: - name: source_helper - sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" - url: "https://pub.dev" - source: hosted - version: "1.3.4" - source_span: - dependency: transitive - description: - name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" - source: hosted - version: "1.10.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" - url: "https://pub.dev" - source: hosted - version: "1.12.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev" - source: hosted - version: "2.1.2" - stream_transform: - dependency: transitive - description: - name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "0bd04f5bb74fcd6ff0606a888a30e917af9bd52820b178eaa464beb11dca84b6" - url: "https://pub.dev" - source: hosted - version: "1.4.0" - swagger_dart_code_generator: - dependency: "direct dev" - description: - name: swagger_dart_code_generator - sha256: e6fab279c2adb3f91aa170c9126601d22e1485217dddc1443cf3c05eb6480d45 - url: "https://pub.dev" - source: hosted - version: "3.0.1" - sweepline_intersections: - dependency: transitive - description: - name: sweepline_intersections - sha256: a665c707200a4f07140a4029b41a7c4883beb3f04322cd8e08ebf650f69e1176 - url: "https://pub.dev" - source: hosted - version: "0.0.4" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - test_api: - dependency: transitive - description: - name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" - url: "https://pub.dev" - source: hosted - version: "0.7.3" - timing: - dependency: transitive - description: - name: timing - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - tuple: - dependency: "direct main" - description: - name: tuple - sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 - url: "https://pub.dev" - source: hosted - version: "2.0.2" - turf: - dependency: "direct main" - description: - name: turf - sha256: "75347c45a5c1de805db7cb182286f05a3770e01546626c4dc292709d15cbe436" - url: "https://pub.dev" - source: hosted - version: "0.0.10" - turf_equality: - dependency: transitive - description: - name: turf_equality - sha256: f0f44ffe389547941358e0d3d4a747db2bd56115b32ff1cede5e5bdf3126a3e2 - url: "https://pub.dev" - source: hosted - version: "0.1.0" - turf_pip: - dependency: transitive - description: - name: turf_pip - sha256: ba4fd414baffd5d7b30880658ad6db82461c49ec023f8ffd0c23d398ad8b14be - url: "https://pub.dev" - source: hosted - version: "0.0.2" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - universal_io: - dependency: transitive - description: - name: universal_io - sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" - url: "https://pub.dev" - source: hosted - version: "2.2.2" - vector_graphics: - dependency: transitive - description: - name: vector_graphics - sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" - url: "https://pub.dev" - source: hosted - version: "1.1.11+1" - vector_graphics_codec: - dependency: transitive - description: - name: vector_graphics_codec - sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da - url: "https://pub.dev" - source: hosted - version: "1.1.11+1" - vector_graphics_compiler: - dependency: transitive - description: - name: vector_graphics_compiler - sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" - url: "https://pub.dev" - source: hosted - version: "1.1.11+1" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - watcher: - dependency: transitive - description: - name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - weak_map: - dependency: transitive - description: - name: weak_map - sha256: "95ca338f0cdf5f0022cc283dfa4d97f6f6b03752f67eca85ebe6d7a679ffe3ed" - url: "https://pub.dev" - source: hosted - version: "3.0.1" - web: - dependency: transitive - description: - name: web - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb - url: "https://pub.dev" - source: hosted - version: "1.1.0" - web_socket: - dependency: transitive - description: - name: web_socket - sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" - url: "https://pub.dev" - source: hosted - version: "0.1.6" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" - url: "https://pub.dev" - source: hosted - version: "3.0.1" - webview_flutter: - dependency: "direct main" - description: - name: webview_flutter - sha256: "889a0a678e7c793c308c68739996227c9661590605e70b1f6cf6b9a6634f7aec" - url: "https://pub.dev" - source: hosted - version: "4.10.0" - webview_flutter_android: - dependency: transitive - description: - name: webview_flutter_android - sha256: "86c2d01c37c4578ee46560109cf2e18fb271f0d080a796f09188d0952352e057" - url: "https://pub.dev" - source: hosted - version: "4.0.2" - webview_flutter_platform_interface: - dependency: transitive - description: - name: webview_flutter_platform_interface - sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d - url: "https://pub.dev" - source: hosted - version: "2.10.0" - webview_flutter_wkwebview: - dependency: transitive - description: - name: webview_flutter_wkwebview - sha256: "3be297aa4ca78205abdd284cf55f168c35246c75b3079990ad8ba9d257681a30" - url: "https://pub.dev" - source: hosted - version: "3.16.2" - win32: - dependency: transitive - description: - name: win32 - sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2" - url: "https://pub.dev" - source: hosted - version: "5.8.0" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - xml: - dependency: transitive - description: - name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" - source: hosted - version: "6.5.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" -sdks: - dart: ">=3.5.3 <4.0.0" - flutter: ">=3.24.0" +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 + url: "https://pub.dev" + source: hosted + version: "72.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.2" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 + url: "https://pub.dev" + source: hosted + version: "6.7.0" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" + url: "https://pub.dev" + source: hosted + version: "2.0.3" + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" + args: + dependency: transitive + description: + name: args + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + url: "https://pub.dev" + source: hosted + version: "2.6.0" + async: + dependency: transitive + description: + name: async + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + url: "https://pub.dev" + source: hosted + version: "2.12.0" + benchmark: + dependency: transitive + description: + name: benchmark + sha256: cb3eeea01e3f054df76ee9775ca680f3afa5f19f39b2bb426ba78ba27654493b + url: "https://pub.dev" + source: hosted + version: "0.3.0" + bloc: + dependency: transitive + description: + name: bloc + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" + url: "https://pub.dev" + source: hosted + version: "8.1.4" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" + url: "https://pub.dev" + source: hosted + version: "2.4.13" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 + url: "https://pub.dev" + source: hosted + version: "7.3.2" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb + url: "https://pub.dev" + source: hosted + version: "8.9.2" + camerawesome: + dependency: "direct main" + description: + name: camerawesome + sha256: "3619d5605fb14ab72c815532c1d9f635512c75df07b5a742b60a9a4b03b6081e" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + carousel_slider: + dependency: transitive + description: + name: carousel_slider + sha256: "7b006ec356205054af5beaef62e2221160ea36b90fb70a35e4deacd49d0349ae" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + chopper: + dependency: "direct main" + description: + name: chopper + sha256: "40899b729fb6d8969d967264b189efaf2452bc3ccf6ed0782d00f1d8a6161c31" + url: "https://pub.dev" + source: hosted + version: "8.0.3" + chopper_generator: + dependency: "direct dev" + description: + name: chopper_generator + sha256: de438569cba1e2a2888e8d91e3c2ac60106574eea7f36823ed0334e96146328a + url: "https://pub.dev" + source: hosted + version: "8.0.3" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + url: "https://pub.dev" + source: hosted + version: "4.10.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + colorfilter_generator: + dependency: transitive + description: + name: colorfilter_generator + sha256: ccc2995e440b1d828d55d99150e7cad64624f3cb4a1e235000de3f93cf10d35c + url: "https://pub.dev" + source: hosted + version: "0.0.8" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + csv: + dependency: transitive + description: + name: csv + sha256: c6aa2679b2a18cb57652920f674488d89712efaf4d3fdf2e537215b35fc19d6c + url: "https://pub.dev" + source: hosted + version: "6.0.0" + dart_sort_queue: + dependency: transitive + description: + name: dart_sort_queue + sha256: f3353ba8b4850e072d3368757f62edb79af34a9703c3e3df9c59342721f5f5b1 + url: "https://pub.dev" + source: hosted + version: "0.0.2+3" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" + url: "https://pub.dev" + source: hosted + version: "2.3.7" + dio: + dependency: "direct main" + description: + name: dio + sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" + url: "https://pub.dev" + source: hosted + version: "5.7.0" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + equatable: + dependency: "direct main" + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" + ffi: + dependency: transitive + description: + name: ffi + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" + source: hosted + version: "2.1.3" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_appauth: + dependency: "direct main" + description: + name: flutter_appauth + sha256: "6ab0e7fb2cb66db472a71c00e0f0d0888f186d308beaef4bba1a6113fa861096" + url: "https://pub.dev" + source: hosted + version: "8.0.0+1" + flutter_appauth_platform_interface: + dependency: transitive + description: + name: flutter_appauth_platform_interface + sha256: ccf5e1d8c40dd35b297290b33cc1896648b4b92a2ec3f62a436c62a8eef9a9db + url: "https://pub.dev" + source: hosted + version: "8.0.0" + flutter_bloc: + dependency: "direct main" + description: + name: flutter_bloc + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a + url: "https://pub.dev" + source: hosted + version: "8.1.6" + flutter_dotenv: + dependency: "direct main" + description: + name: flutter_dotenv + sha256: b7c7be5cd9f6ef7a78429cabd2774d3c4af50e79cb2b7593e3d5d763ef95c61b + url: "https://pub.dev" + source: hosted + version: "5.2.1" + flutter_inappwebview: + dependency: "direct main" + description: + name: flutter_inappwebview + sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5" + url: "https://pub.dev" + source: hosted + version: "6.1.5" + flutter_inappwebview_android: + dependency: transitive + description: + name: flutter_inappwebview_android + sha256: "62557c15a5c2db5d195cb3892aab74fcaec266d7b86d59a6f0027abd672cddba" + url: "https://pub.dev" + source: hosted + version: "1.1.3" + flutter_inappwebview_internal_annotations: + dependency: transitive + description: + name: flutter_inappwebview_internal_annotations + sha256: "5f80fd30e208ddded7dbbcd0d569e7995f9f63d45ea3f548d8dd4c0b473fb4c8" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter_inappwebview_ios: + dependency: transitive + description: + name: flutter_inappwebview_ios + sha256: "5818cf9b26cf0cbb0f62ff50772217d41ea8d3d9cc00279c45f8aabaa1b4025d" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_macos: + dependency: transitive + description: + name: flutter_inappwebview_macos + sha256: c1fbb86af1a3738e3541364d7d1866315ffb0468a1a77e34198c9be571287da1 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_platform_interface: + dependency: transitive + description: + name: flutter_inappwebview_platform_interface + sha256: cf5323e194096b6ede7a1ca808c3e0a078e4b33cc3f6338977d75b4024ba2500 + url: "https://pub.dev" + source: hosted + version: "1.3.0+1" + flutter_inappwebview_web: + dependency: transitive + description: + name: flutter_inappwebview_web + sha256: "55f89c83b0a0d3b7893306b3bb545ba4770a4df018204917148ebb42dc14a598" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_windows: + dependency: transitive + description: + name: flutter_inappwebview_windows + sha256: "8b4d3a46078a2cdc636c4a3d10d10f2a16882f6be607962dbfff8874d1642055" + url: "https://pub.dev" + source: hosted + version: "0.6.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_native_splash: + dependency: "direct main" + description: + name: flutter_native_splash + sha256: ee5c9bd2b74ea8676442fd4ab876b5d41681df49276488854d6c81a5377c0ef1 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "165164745e6afb5c0e3e3fcc72a012fb9e58496fb26ffb92cf22e16a821e85d0" + url: "https://pub.dev" + source: hosted + version: "9.2.2" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "1693ab11121a5f925bbea0be725abfcfbbcf36c1e29e571f84a0c0f436147a81" + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" + url: "https://pub.dev" + source: hosted + version: "2.0.10+1" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + geotypes: + dependency: transitive + description: + name: geotypes + sha256: "5bedf57de92283133dd221e363812ef50eaaba414f0823b1974ef7d84b86991f" + url: "https://pub.dev" + source: hosted + version: "0.0.2" + get_it: + dependency: "direct main" + description: + name: get_it + sha256: ff97e5e7b2e82e63c82f5658c6ba2605ea831f0f7489b0d2fb255d817ec4eb5e + url: "https://pub.dev" + source: hosted + version: "8.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: "6f1b756f6e863259a99135ff3c95026c3cdca17d10ebef2bba2261a25ddc8bbc" + url: "https://pub.dev" + source: hosted + version: "14.3.0" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 + url: "https://pub.dev" + source: hosted + version: "6.2.1" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + html: + dependency: transitive + description: + name: html + sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + url: "https://pub.dev" + source: hosted + version: "0.15.5" + http: + dependency: "direct main" + description: + name: http + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + url: "https://pub.dev" + source: hosted + version: "1.2.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: "direct main" + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + image: + dependency: "direct main" + description: + name: image + sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d + url: "https://pub.dev" + source: hosted + version: "4.3.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json2yaml: + dependency: transitive + description: + name: json2yaml + sha256: da94630fbc56079426fdd167ae58373286f603371075b69bf46d848d63ba3e51 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b + url: "https://pub.dev" + source: hosted + version: "6.8.0" + jwt_decoder: + dependency: "direct main" + description: + name: jwt_decoder + sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + logger: + dependency: "direct main" + description: + name: logger + sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + macros: + dependency: transitive + description: + name: macros + sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" + url: "https://pub.dev" + source: hosted + version: "0.1.2-main.4" + maplibre_gl: + dependency: "direct main" + description: + name: maplibre_gl + sha256: ea2fa443e7d5dc18db7f37a0f6f5af40642888c56b81a14441aeddea077adaea + url: "https://pub.dev" + source: hosted + version: "0.20.0" + maplibre_gl_platform_interface: + dependency: "direct main" + description: + name: maplibre_gl_platform_interface + sha256: "718c3503f36936fbf35c34d6ddf8bf770474c5ba1e6cb1d8caece44efae424af" + url: "https://pub.dev" + source: hosted + version: "0.20.0" + maplibre_gl_web: + dependency: transitive + description: + name: maplibre_gl_web + sha256: e7d71b08f24dca70e9c9cf841b096704a677e6239447d87220ec071355768149 + url: "https://pub.dev" + source: hosted + version: "0.20.0" + markdown: + dependency: transitive + description: + name: markdown + sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 + url: "https://pub.dev" + source: hosted + version: "7.2.2" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + matrix2d: + dependency: transitive + description: + name: matrix2d + sha256: "188718dd3bc2a31e372cfd0791b0f77f4f13ea76164147342cc378d9132949e7" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" + source: hosted + version: "1.15.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "45f7d6bba1128761de5540f39d5ca000ea8a1f22f06b76b61094a60a2997bd0e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + url: "https://pub.dev" + source: hosted + version: "2.1.4" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a + url: "https://pub.dev" + source: hosted + version: "2.2.12" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + url: "https://pub.dev" + source: hosted + version: "2.4.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + provider: + dependency: transitive + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + qs_dart: + dependency: transitive + description: + name: qs_dart + sha256: be73d060d29c0716ded88380ba32e87ce8105f0ba234edb3edefa0d74d47d64b + url: "https://pub.dev" + source: hosted + version: "1.2.4" + rbush: + dependency: transitive + description: + name: rbush + sha256: "48b683421b4afb43a642f82c6aa31911e54f3069143d31c7d33cbe329df13403" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + recursive_regex: + dependency: transitive + description: + name: recursive_regex + sha256: f7252e3d3dfd1665e594d9fe035eca6bc54139b1f2fee38256fa427ea41adc60 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + slang: + dependency: "direct main" + description: + name: slang + sha256: b04db2dbaf927b28600a2f8a272a3bf2ae309556dcc5d6beb02d66af0be39e4c + url: "https://pub.dev" + source: hosted + version: "4.1.0" + slang_flutter: + dependency: "direct main" + description: + name: slang_flutter + sha256: "59988f37bb8b50d96ee46832a8a389036c0da26c04b1b1d4aa6690c00f70eccf" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" + url: "https://pub.dev" + source: hosted + version: "1.3.4" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + url: "https://pub.dev" + source: hosted + version: "1.12.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "0bd04f5bb74fcd6ff0606a888a30e917af9bd52820b178eaa464beb11dca84b6" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + swagger_dart_code_generator: + dependency: "direct dev" + description: + name: swagger_dart_code_generator + sha256: e6fab279c2adb3f91aa170c9126601d22e1485217dddc1443cf3c05eb6480d45 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + sweepline_intersections: + dependency: transitive + description: + name: sweepline_intersections + sha256: a665c707200a4f07140a4029b41a7c4883beb3f04322cd8e08ebf650f69e1176 + url: "https://pub.dev" + source: hosted + version: "0.0.4" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + url: "https://pub.dev" + source: hosted + version: "0.7.3" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + tuple: + dependency: "direct main" + description: + name: tuple + sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 + url: "https://pub.dev" + source: hosted + version: "2.0.2" + turf: + dependency: "direct main" + description: + name: turf + sha256: "75347c45a5c1de805db7cb182286f05a3770e01546626c4dc292709d15cbe436" + url: "https://pub.dev" + source: hosted + version: "0.0.10" + turf_equality: + dependency: transitive + description: + name: turf_equality + sha256: f0f44ffe389547941358e0d3d4a747db2bd56115b32ff1cede5e5bdf3126a3e2 + url: "https://pub.dev" + source: hosted + version: "0.1.0" + turf_pip: + dependency: transitive + description: + name: turf_pip + sha256: ba4fd414baffd5d7b30880658ad6db82461c49ec023f8ffd0c23d398ad8b14be + url: "https://pub.dev" + source: hosted + version: "0.0.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + universal_io: + dependency: transitive + description: + name: universal_io + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + weak_map: + dependency: transitive + description: + name: weak_map + sha256: "95ca338f0cdf5f0022cc283dfa4d97f6f6b03752f67eca85ebe6d7a679ffe3ed" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + web: + dependency: transitive + description: + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + webview_flutter: + dependency: "direct main" + description: + name: webview_flutter + sha256: "889a0a678e7c793c308c68739996227c9661590605e70b1f6cf6b9a6634f7aec" + url: "https://pub.dev" + source: hosted + version: "4.10.0" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + sha256: "86c2d01c37c4578ee46560109cf2e18fb271f0d080a796f09188d0952352e057" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d + url: "https://pub.dev" + source: hosted + version: "2.10.0" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + sha256: "3be297aa4ca78205abdd284cf55f168c35246c75b3079990ad8ba9d257681a30" + url: "https://pub.dev" + source: hosted + version: "3.16.2" + win32: + dependency: transitive + description: + name: win32 + sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2" + url: "https://pub.dev" + source: hosted + version: "5.8.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.5.3 <4.0.0" + flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index 028e1c68..2a6ea126 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,124 +1,124 @@ -name: gruene_app -description: "App for the German party BÜNDNIS 90/DIE GRÜNEN" -# The following line prevents the package from being accidentally published to -# pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev - -environment: - sdk: ^3.5.3 - -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. -dependencies: - flutter: - sdk: flutter - flutter_localizations: - sdk: flutter - flutter_bloc: ^8.1.6 - get_it: ^8.0.0 - dio: ^5.7.0 - slang: ^4.1.0 - slang_flutter: ^4.1.0 - go_router: ^14.3.0 - google_fonts: ^6.2.1 - flutter_svg: ^2.0.10+1 - flutter_appauth: ^8.0.0+1 - flutter_secure_storage: ^9.2.2 - flutter_dotenv: ^5.2.1 - flutter_inappwebview: ^6.1.5 - equatable: ^2.0.5 - logger: ^2.4.0 - jwt_decoder: ^2.0.1 - flutter_native_splash: ^2.4.2 - webview_flutter: ^4.10.0 - maplibre_gl: ^0.20.0 - maplibre_gl_platform_interface: ^0.20.0 -#--------- swagger_dart_code_generator -------------- - chopper: ^8.0.0 - json_annotation: ^4.8.0 -#---------------------------------------------------- - http: ^1.2.2 - turf: ^0.0.10 - camerawesome: ^2.1.0 - intl: ^0.19.0 - image: ^4.3.0 - http_parser: ^4.0.2 - tuple: ^2.0.2 - -dev_dependencies: - - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. - flutter_lints: ^5.0.0 -#--------- swagger_dart_code_generator -------------- - build_runner: ^2.3.3 - chopper_generator: ^8.0.0 - json_serializable: ^6.6.1 - swagger_dart_code_generator: ^3.0.1 -#---------------------------------------------------- - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - uses-material-design: true - assets: - - assets/bottom_navigation/ - - assets/icons/ - - assets/splash/ - - assets/graphics/ - - assets/symbols/ - - assets/symbols/posters/ - - assets/symbols/doors/ - - assets/symbols/flyer/ - - .env - - - # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/to/resolution-aware-images - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/to/asset-from-package - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/to/font-from-package - -flutter_native_splash: - color: "#ffffff" - image: assets/splash/logo.png - android_12: - color: "#ffffff" - image: assets/splash/logo_android12.png - web: false - android_gravity: center +name: gruene_app +description: "App for the German party BÜNDNIS 90/DIE GRÜNEN" +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +environment: + sdk: ^3.5.3 + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + flutter_localizations: + sdk: flutter + flutter_bloc: ^8.1.6 + get_it: ^8.0.0 + dio: ^5.7.0 + slang: ^4.1.0 + slang_flutter: ^4.1.0 + go_router: ^14.3.0 + google_fonts: ^6.2.1 + flutter_svg: ^2.0.10+1 + flutter_appauth: ^8.0.0+1 + flutter_secure_storage: ^9.2.2 + flutter_dotenv: ^5.2.1 + flutter_inappwebview: ^6.1.5 + equatable: ^2.0.5 + logger: ^2.4.0 + jwt_decoder: ^2.0.1 + flutter_native_splash: ^2.4.2 + webview_flutter: ^4.10.0 + maplibre_gl: ^0.20.0 + maplibre_gl_platform_interface: ^0.20.0 +#--------- swagger_dart_code_generator -------------- + chopper: ^8.0.0 + json_annotation: ^4.8.0 +#---------------------------------------------------- + http: ^1.2.2 + turf: ^0.0.10 + camerawesome: ^2.1.0 + intl: ^0.19.0 + image: ^4.3.0 + http_parser: ^4.0.2 + tuple: ^2.0.2 + +dev_dependencies: + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^5.0.0 +#--------- swagger_dart_code_generator -------------- + build_runner: ^2.3.3 + chopper_generator: ^8.0.0 + json_serializable: ^6.6.1 + swagger_dart_code_generator: ^3.0.1 +#---------------------------------------------------- + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + uses-material-design: true + assets: + - assets/bottom_navigation/ + - assets/icons/ + - assets/splash/ + - assets/graphics/ + - assets/symbols/ + - assets/symbols/posters/ + - assets/symbols/doors/ + - assets/symbols/flyer/ + - .env + + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package + +flutter_native_splash: + color: "#ffffff" + image: assets/splash/logo.png + android_12: + color: "#ffffff" + image: assets/splash/logo_android12.png + web: false + android_gravity: center ios_content_mode: scaleAspectFit \ No newline at end of file