diff --git a/packages/core/lib/injection/di.dart b/packages/core/lib/injection/di.dart index e6505b4..1e31ba5 100644 --- a/packages/core/lib/injection/di.dart +++ b/packages/core/lib/injection/di.dart @@ -1,8 +1,6 @@ -import 'package:flutter_map_tile_caching/flutter_map_tile_caching.dart'; -import 'package:get_it/get_it.dart'; import 'package:logger/logger.dart'; +import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/data/services/network_status.dart'; -import 'package:rasadyar_core/infrastructure/local/hive_local_storage.dart'; final diCore = GetIt.instance; diff --git a/packages/core/lib/presentation/widget/marquee/r_marquee.dart b/packages/core/lib/presentation/widget/marquee/r_marquee.dart new file mode 100644 index 0000000..4035a16 --- /dev/null +++ b/packages/core/lib/presentation/widget/marquee/r_marquee.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class RMarquee extends StatefulWidget { + const RMarquee({super.key, required this.text, this.duration = const Duration(seconds: 5)}); + + final String text; + final Duration duration; + + @override + State createState() => _RMarqueeState(); +} + +class _RMarqueeState extends State with SingleTickerProviderStateMixin { + late ScrollController _scrollController; + late double _textWidth; + late double _screenWidth; + + @override + void initState() { + super.initState(); + _scrollController = ScrollController(); + + WidgetsBinding.instance.addPostFrameCallback((_) { + _startScrolling(); + }); + } + + void _startScrolling() async { + while (true) { + await _scrollController.animateTo( + _scrollController.position.maxScrollExtent, + duration: widget.duration, + curve: Curves.linear, + ); + + await _scrollController.animateTo(0, duration: Duration(seconds: 0), curve: Curves.linear); + } + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 40, + child: ListView( + controller: _scrollController, + scrollDirection: Axis.horizontal, + children: [ + Text(widget.text, style: AppFonts.yekan16Bold), + SizedBox(width: 50), + ], + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 9a8b1a3..32b68cb 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -22,6 +22,9 @@ export 'list_item/list_item_with_out_number.dart'; export 'list_row_item.dart'; export 'list_view/list_view.dart'; export 'loading_widget.dart'; +// other +export 'logo_widget.dart'; +export 'marquee/r_marquee.dart'; export 'overlay_dropdown_widget/view.dart'; export 'pagination/pagination_from_until.dart'; export 'pagination/show_more.dart'; @@ -29,6 +32,3 @@ export 'tabs/new_tab.dart'; export 'tabs/r_segment.dart'; export 'tabs/tab.dart'; export 'vec_widget.dart'; - -// other -export 'logo_widget.dart'; diff --git a/packages/livestock/lib/injection/live_stock_di.dart b/packages/livestock/lib/injection/live_stock_di.dart index 328896d..d7915b2 100644 --- a/packages/livestock/lib/injection/live_stock_di.dart +++ b/packages/livestock/lib/injection/live_stock_di.dart @@ -26,7 +26,7 @@ Future setupLiveStockDI() async { await tokenService.saveBaseUrl('https://api.dam.rasadyar.net/'); } - await FMTCStore(mapStoreKey).manage.create(); + // First register AppInterceptor with lazy callbacks diff --git a/packages/livestock/lib/presentation/page/map/widget/map_widget/logic.dart b/packages/livestock/lib/presentation/page/map/widget/map_widget/logic.dart index 2c1cbd5..3b02375 100644 --- a/packages/livestock/lib/presentation/page/map/widget/map_widget/logic.dart +++ b/packages/livestock/lib/presentation/page/map/widget/map_widget/logic.dart @@ -22,7 +22,9 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { Timer? _debounceTimer; RxBool isLoading = false.obs; - late FMTCTileProvider tileProvider; +/* FMTCTileProvider tileProvider = FMTCTileProvider( + stores: {mapStoreKey: BrowseStoreStrategy.readUpdateCreate}, + );*/ RxList markerLocations = RxList(); RootLogic rootLogic = Get.find(); @@ -57,8 +59,6 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { } }); - tileProvider = FMTCTileProvider(stores: {mapStoreKey: BrowseStoreStrategy.readUpdateCreate}); - repository.addLocations(generateRandomLocations(currentLocation.value, 10, 100)); } diff --git a/packages/livestock/lib/presentation/page/map/widget/map_widget/view.dart b/packages/livestock/lib/presentation/page/map/widget/map_widget/view.dart index b89b725..0eafac7 100644 --- a/packages/livestock/lib/presentation/page/map/widget/map_widget/view.dart +++ b/packages/livestock/lib/presentation/page/map/widget/map_widget/view.dart @@ -15,6 +15,15 @@ class MapWidget extends GetView { child: Stack( fit: StackFit.expand, children: [ + + Positioned( + top: 10, + right: 0, + left: 0, + child: RMarquee(text: "This is scrolling text from right to left..."), + ), + + ObxValue((errorType) { if (errorType.isNotEmpty) { if (errorType.contains(ErrorLocationType.serviceDisabled)) { @@ -104,7 +113,6 @@ class MapWidget extends GetView { flags: InteractiveFlag.all & ~InteractiveFlag.rotate, ), initialZoom: 15, - onPositionChanged: (camera, hasGesture) { controller.currentZoom.value = camera.zoom; /* controller.debouncedUpdateVisibleMarkers( @@ -118,7 +126,7 @@ class MapWidget extends GetView { TileLayer( urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: 'ir.mnpc.rasadyar', - tileProvider: controller.tileProvider, + // tileProvider: controller.tileProvider, ), ObxValue((markers) { @@ -181,24 +189,26 @@ class MapWidget extends GetView { ); } - List buildMarkers(RxList latLng) => latLng - .map( - (element) => Marker( - point: element, - child: IconButton( - onPressed: () { - Get.bottomSheet( - detailsBottomSheet(), - isScrollControlled: true, - isDismissible: true, - ignoreSafeArea: false, - ); - }, - icon: Icon(CupertinoIcons.location_solid, color: AppColor.error), - ), - ), + List buildMarkers(RxList latLng) => + latLng + .map( + (element) => + Marker( + point: element, + child: IconButton( + onPressed: () { + Get.bottomSheet( + detailsBottomSheet(), + isScrollControlled: true, + isDismissible: true, + ignoreSafeArea: false, + ); + }, + icon: Icon(CupertinoIcons.location_solid, color: AppColor.error), + ), + ), ) - .toList(); + .toList(); Widget detailsBottomSheet() { return BaseBottomSheet( diff --git a/packages/livestock/lib/presentation/page/root/logic.dart b/packages/livestock/lib/presentation/page/root/logic.dart index dbc2e00..7d0443e 100644 --- a/packages/livestock/lib/presentation/page/root/logic.dart +++ b/packages/livestock/lib/presentation/page/root/logic.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'dart:math'; import 'package:flutter/material.dart'; @@ -10,15 +9,21 @@ import 'package:rasadyar_livestock/presentation/page/requests/view.dart'; import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; class RootLogic extends GetxController { - List pages = [ + // Unique nested keys for each Navigator + final List> navigatorKeys = [ + ?Get.nestedKey(0), // Map + ?Get.nestedKey(1), // Requests / RequestTagging + ?Get.nestedKey(2), // Profile + ]; + + List get pages => [ Navigator( - key: Get.nestedKey(0), + key: navigatorKeys[0], onGenerateRoute: (settings) => GetPageRoute(page: () => MapPage()), ), Navigator( - key: Get.nestedKey(1), - initialRoute: LiveStockRoutes.requests, + key: navigatorKeys[1], onGenerateRoute: (settings) { switch (settings.name) { case LiveStockRoutes.requests: @@ -32,7 +37,7 @@ class RootLogic extends GetxController { ), Navigator( - key: Get.nestedKey(2), + key: navigatorKeys[2], onGenerateRoute: (settings) => GetPageRoute(page: () => ProfilePage()), ), ]; @@ -40,60 +45,28 @@ class RootLogic extends GetxController { RxInt currentIndex = 0.obs; TokenStorageService tokenService = Get.find(); - late StreamSubscription> connectivitySubscription; - RxList connectivityResults = [].obs; - - DateTime? lastBackPressed; - @override void onInit() { super.onInit(); - connectivitySubscription = Connectivity().onConnectivityChanged.listen((result) { - if (result.isNotEmpty) { - connectivityResults.assignAll(result); - } - }); - - /* GetIt.instance.allReady().then((value) async { - await diLiveStock.get().addLocations(generateRandomPoints()); - });*/ } - List generateRandomPoints() { - final Random random = Random(); - final double centerLat = 35.824891; - final double centerLon = 50.948025; - final double radiusKm = 1.0; - final double kmToDegLat = 1 / 111.0; // 1 km ≈ 0.009° latitude - final double kmToDegLon = 1 / (111.0 * cos(centerLat * pi / 180)); // Adjust for longitude - - List points = []; - for (int i = 0; i < 100; i++) { - // Generate random angle (0 to 2π) and random radius (0 to 1 km, using sqrt for uniform distribution) - double theta = random.nextDouble() * 2 * pi; - double r = - sqrt(random.nextDouble()) * radiusKm; // Square root for uniform distribution in circle - // Convert polar coordinates to Cartesian, then to LatLng - double deltaLat = r * cos(theta) * kmToDegLat; - double deltaLon = r * sin(theta) * kmToDegLon; - double newLat = centerLat + deltaLat; - double newLon = centerLon + deltaLon; - points.add(LatLng(newLat, newLon)); - } - return points; - } @override void onReady() { - // TODO: implement onReady super.onReady(); } @override void onClose() { - connectivitySubscription.cancel(); super.onClose(); } - void changePage(int i) => currentIndex.value = i; + void changePage(int index) { + if (index == currentIndex.value) { + // Optional: pop to first route if the same tab is tapped + navigatorKeys[index].currentState?.popUntil((route) => route.isFirst); + } else { + currentIndex.value = index; + } + } } diff --git a/packages/livestock/lib/presentation/page/root/view.dart b/packages/livestock/lib/presentation/page/root/view.dart index ded02db..50d0863 100644 --- a/packages/livestock/lib/presentation/page/root/view.dart +++ b/packages/livestock/lib/presentation/page/root/view.dart @@ -16,7 +16,7 @@ class RootPage extends GetView { return; } final now = DateTime.now(); - if (controller.lastBackPressed == null || + /*if (controller.lastBackPressed == null || now.difference(controller.lastBackPressed!) > const Duration(seconds: 2)) { controller.lastBackPressed = now; Get.snackbar( @@ -28,7 +28,7 @@ class RootPage extends GetView { ); } else { await SystemNavigator.pop(); - } + }*/ } @override diff --git a/packages/livestock/lib/presentation/routes/app_pages.dart b/packages/livestock/lib/presentation/routes/app_pages.dart index 6ff7302..7aa11b5 100644 --- a/packages/livestock/lib/presentation/routes/app_pages.dart +++ b/packages/livestock/lib/presentation/routes/app_pages.dart @@ -39,7 +39,6 @@ sealed class LiveStockPages { Get.lazyPut(() => RequestsLogic()); Get.lazyPut(() => MapLogic()); Get.lazyPut(() => ProfileLogic()); - Get.lazyPut(() => ProfileLogic()); Get.lazyPut(() => MapWidgetLogic()); Get.lazyPut(() => BaseLogic()); }), diff --git a/packages/livestock/lib/presentation/routes/app_routes.dart b/packages/livestock/lib/presentation/routes/app_routes.dart index 3e6c6bb..823279b 100644 --- a/packages/livestock/lib/presentation/routes/app_routes.dart +++ b/packages/livestock/lib/presentation/routes/app_routes.dart @@ -8,8 +8,6 @@ sealed class LiveStockRoutes { static const requests = '/requests'; static const map = '/map'; static const profile = '/profile'; - - //static const requestTagging = '$init/tagging'; static const requestTagging = '$requests/tagging'; static const tagging = '/tagging'; }