diff --git a/assets/icons/danger.svg b/assets/icons/danger.svg new file mode 100644 index 0000000..947cddf --- /dev/null +++ b/assets/icons/danger.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/icon_contracts.svg b/assets/icons/icon_contracts.svg new file mode 100644 index 0000000..cf92caf --- /dev/null +++ b/assets/icons/icon_contracts.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/assets/icons/notify_icon.svg b/assets/icons/notify_icon.svg new file mode 100644 index 0000000..7eee2c6 --- /dev/null +++ b/assets/icons/notify_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/notify_icon_active.svg b/assets/icons/notify_icon_active.svg new file mode 100644 index 0000000..f45e8b8 --- /dev/null +++ b/assets/icons/notify_icon_active.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/tick_circle.svg b/assets/icons/tick_circle.svg new file mode 100644 index 0000000..ddb529b --- /dev/null +++ b/assets/icons/tick_circle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/lib/core/constants/assets.dart b/lib/core/constants/assets.dart index 980c0f0..fd5a45c 100644 --- a/lib/core/constants/assets.dart +++ b/lib/core/constants/assets.dart @@ -12,6 +12,9 @@ class AssetsManager { static const tendersActive = 'assets/icons/task-square_active.svg'; static const profile = 'assets/icons/profile-circle.svg'; static const profileActive = 'assets/icons/profile-circle_active.svg'; + static const contracts = 'assets/icons/icon_contracts.svg'; + static const notify = 'assets/icons/notify_icon.svg'; + static const notifyActive = 'assets/icons/notify_icon_active.svg'; // login page static const logo = 'assets/pngs/logo.png'; @@ -45,6 +48,7 @@ class AssetsManager { static const edit = 'assets/icons/edit.svg'; static const arrowRight = 'assets/icons/arrow-right.svg'; static const notification = 'assets/icons/notification.svg'; + static const danger = 'assets/icons/danger.svg'; static const calendar = 'assets/icons/calendar.svg'; static const menu = 'assets/icons/menu.svg'; static const thumbLike = 'assets/icons/thumb_like.svg'; @@ -62,6 +66,6 @@ class AssetsManager { //Liked tenders static const trash = 'assets/icons/trash.svg'; - static const arrowdownSmall = 'assets/icons/arrow_down_small.svg'; + static const arrowDownSmall = 'assets/icons/arrow_down_small.svg'; } diff --git a/lib/core/routes/app_shell/mobile_shell_page.dart b/lib/core/routes/app_shell/mobile_shell_page.dart index a1c9cf5..299b79d 100644 --- a/lib/core/routes/app_shell/mobile_shell_page.dart +++ b/lib/core/routes/app_shell/mobile_shell_page.dart @@ -48,6 +48,22 @@ class MobileShellPage extends StatelessWidget { iconPath: AssetsManager.tenders, activeIconPath: AssetsManager.tendersActive, ), + _bottomNavigationItem( + context: context, + text: TendersStrings.contracts, + isActive: navigationShell.currentIndex == 4, + onTap: () => onTap(4), + iconPath: AssetsManager.contracts, + activeIconPath: AssetsManager.contracts, + ), + _bottomNavigationItem( + context: context, + text: TendersStrings.notifications, + isActive: navigationShell.currentIndex == 3, + onTap: () => onTap(3), + iconPath: AssetsManager.notify, + activeIconPath: AssetsManager.notifyActive, + ), _bottomNavigationItem( context: context, text: ProfileStrings.profileTitle, @@ -76,7 +92,10 @@ class MobileShellPage extends StatelessWidget { width: 64.0.w(), height: 72.0.h(), child: Padding( - padding: EdgeInsets.only(top: 12.0.h(), bottom: 14.0.h()), + padding: + iconPath != AssetsManager.notify + ? EdgeInsets.only(top: 12.0.h(), bottom: 14.0.h()) + : EdgeInsets.only(top: 6.0.h(), bottom: 12.0.h()), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -84,10 +103,11 @@ class MobileShellPage extends StatelessWidget { Text( text, + maxLines: 1, style: TextStyle( - fontSize: 12.0.sp(), + fontSize: + iconPath == AssetsManager.notify ? 11.0.sp() : 12.0.sp(), fontWeight: FontWeight.w400, - color: isActive ? AppColors.primaryColor : AppColors.grey60, ), ), diff --git a/lib/views/home/pages/t_home_page.dart b/lib/views/home/pages/t_home_page.dart index 33eb811..8c7f835 100644 --- a/lib/views/home/pages/t_home_page.dart +++ b/lib/views/home/pages/t_home_page.dart @@ -128,7 +128,8 @@ class TabletHomePage extends StatelessWidget { width: double.infinity, height: 148, onTap: () { - YourTendersRouteData().push(context); + //YourTendersRouteData().push(context); + NotificationRouteData().push(context); }, ), ), diff --git a/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart b/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart index e892940..12c0fc2 100644 --- a/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart +++ b/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart @@ -165,6 +165,7 @@ class _LikedTendersDesktopPageState extends State { context: context, builder: (context) { return AlertDialog( + backgroundColor: AppColors.backgroundColor, title: const Text( LikedTendersStrings.selectPage, ), @@ -217,7 +218,8 @@ class _LikedTendersDesktopPageState extends State { ), SizedBox(width: 5.0.w()), SvgPicture.asset( - AssetsManager.arrowdownSmall, + AssetsManager.arrowDownSmall, + color: AppColors.grey80, ), SizedBox(width: 5.0.w()), ], diff --git a/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart b/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart index 6dc6ed6..3f73bd1 100644 --- a/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart +++ b/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart @@ -175,6 +175,7 @@ class _LikedTendersTabletPageState extends State { context: context, builder: (context) { return AlertDialog( + backgroundColor: AppColors.backgroundColor, title: const Text( LikedTendersStrings.selectPage, ), @@ -227,7 +228,8 @@ class _LikedTendersTabletPageState extends State { ), SizedBox(width: 5.0.w()), SvgPicture.asset( - AssetsManager.arrowdownSmall, + AssetsManager.arrowDownSmall, + color: AppColors.grey80, ), SizedBox(width: 5.0.w()), ], diff --git a/lib/views/notification/pages/d_notification_page.dart b/lib/views/notification/pages/d_notification_page.dart index 1f74b7e..9d04738 100644 --- a/lib/views/notification/pages/d_notification_page.dart +++ b/lib/views/notification/pages/d_notification_page.dart @@ -1,10 +1,209 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:tm_app/core/constants/assets.dart'; +import 'package:tm_app/core/theme/colors.dart'; +import 'package:tm_app/core/utils/size_config.dart'; +import 'package:tm_app/views/notification/strings/notification_strings.dart'; +import 'package:tm_app/views/shared/desktop_navigation_widget.dart'; -class DesktopNotificationPage extends StatelessWidget { +import '../../shared/main_tab_bar.dart'; +import '../widgets/notification_all_tab.dart'; +import '../widgets/notification_important_tab.dart'; +import '../widgets/notification_unread_tab.dart'; + +class DesktopNotificationPage extends StatefulWidget { const DesktopNotificationPage({super.key}); + @override + State createState() => + _DesktopNotificationPageState(); +} + +class _DesktopNotificationPageState extends State + with SingleTickerProviderStateMixin { + late TabController controller; + + @override + void initState() { + super.initState(); + controller = TabController(length: 3, vsync: this); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { - return const Scaffold(); + return Scaffold( + backgroundColor: AppColors.backgroundColor, + body: Column( + children: [ + DesktopNavigationWidget(currentIndex: 3), + + SizedBox(height: 60.0.h()), + + Expanded( + child: Center( + child: SizedBox( + width: 740, + child: Column( + children: [ + MainTabBar( + controller: controller, + titles: [ + NotificationStrings.all, + NotificationStrings.unread, + NotificationStrings.important, + ], + ), + + SizedBox(height: 12.0.h()), + + Padding( + padding: EdgeInsetsDirectional.only(end: 24.0.w()), + child: Align( + alignment: Alignment.centerRight, + child: InkWell( + onTap: () {}, + borderRadius: BorderRadius.circular(99), + child: Container( + width: 132.0.w(), + height: 32.0.h(), + decoration: BoxDecoration( + color: AppColors.primary20, + borderRadius: BorderRadius.circular(99), + ), + child: Center( + child: Text( + NotificationStrings.markAllAsReadButton, + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w500, + color: AppColors.mainBlue, + ), + ), + ), + ), + ), + ), + ), + SizedBox(height: 12.0.h()), + Expanded( + child: TabBarView( + controller: controller, + children: const [ + NotificationAllTab(), + NotificationUnreadTab(), + NotificationImportantTab(), + ], + ), + ), + SizedBox(height: 10.0.h()), + Row( + children: [ + const Spacer(), + Text( + 'page', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w300, + color: AppColors.grey60, + ), + ), + SizedBox(width: 10.0.w()), + InkWell( + onTap: () async { + final _ = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: AppColors.backgroundColor, + title: const Text('selectPage'), + content: SizedBox( + width: 200, + height: 300, + child: ListView.builder( + itemCount: 1, + itemBuilder: (context, index) { + final pageNumber = index + 1; + return ListTile( + title: Text( + '{LikedTendersStrings.page} $pageNumber', + ), + onTap: + () => Navigator.pop( + context, + pageNumber, + ), + ); + }, + ), + ), + ); + }, + ); + }, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: AppColors.grey30, + width: 1, + ), + borderRadius: BorderRadius.circular(4), + ), + child: Row( + children: [ + SizedBox(width: 5.0.w()), + Text( + 'currentPage', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w500, + color: AppColors.grey70, + ), + ), + SizedBox(width: 5.0.w()), + SvgPicture.asset( + AssetsManager.arrowDownSmall, + color: AppColors.grey80, + ), + SizedBox(width: 5.0.w()), + ], + ), + ), + ), + SizedBox(width: 5.0.w()), + Text( + 'of', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + SizedBox(width: 5.0.w()), + Text( + 'totalPages', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + ], + ), + + SizedBox(height: 30.0.h()), + ], + ), + ), + ), + ), + ], + ), + ); } } diff --git a/lib/views/notification/pages/t_notification_page.dart b/lib/views/notification/pages/t_notification_page.dart index 6a22aab..afd18e6 100644 --- a/lib/views/notification/pages/t_notification_page.dart +++ b/lib/views/notification/pages/t_notification_page.dart @@ -1,10 +1,200 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:tm_app/core/constants/assets.dart'; +import 'package:tm_app/core/theme/colors.dart'; +import 'package:tm_app/core/utils/size_config.dart'; +import 'package:tm_app/views/notification/strings/notification_strings.dart'; +import 'package:tm_app/views/shared/tablet_navigation_widget.dart'; +import 'package:tm_app/views/shared/tender_app_bar.dart'; -class TabletNotificationPage extends StatelessWidget { +import '../../shared/main_tab_bar.dart'; +import '../widgets/notification_all_tab.dart'; +import '../widgets/notification_important_tab.dart'; +import '../widgets/notification_unread_tab.dart'; + +class TabletNotificationPage extends StatefulWidget { const TabletNotificationPage({super.key}); + @override + State createState() => _TabletNotificationPageState(); +} + +class _TabletNotificationPageState extends State + with SingleTickerProviderStateMixin { + late TabController controller; + + @override + void initState() { + super.initState(); + controller = TabController(length: 3, vsync: this); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { - return const Scaffold(); + final GlobalKey key = GlobalKey(); + return Scaffold( + key: key, + backgroundColor: AppColors.backgroundColor, + appBar: tabletAppBar( + title: NotificationStrings.notificationTitle, + key: key, + ), + drawer: TabletNavigationWidget(currentIndex: 3), + body: Center( + child: SizedBox( + width: 720, + child: Column( + children: [ + MainTabBar( + controller: controller, + titles: [ + NotificationStrings.all, + NotificationStrings.unread, + NotificationStrings.important, + ], + ), + SizedBox(height: 12.0.h()), + Padding( + padding: EdgeInsetsDirectional.only(end: 24.0.w()), + child: Align( + alignment: Alignment.centerRight, + child: InkWell( + onTap: () {}, + borderRadius: BorderRadius.circular(99), + child: Container( + width: 132.0.w(), + height: 32.0.h(), + decoration: BoxDecoration( + color: AppColors.primary20, + borderRadius: BorderRadius.circular(99), + ), + child: Center( + child: Text( + NotificationStrings.markAllAsReadButton, + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w500, + color: AppColors.mainBlue, + ), + ), + ), + ), + ), + ), + ), + SizedBox(height: 12.0.h()), + Expanded( + child: TabBarView( + controller: controller, + children: [ + NotificationAllTab(), + NotificationUnreadTab(), + NotificationImportantTab(), + ], + ), + ), + SizedBox(height: 10.0.h()), + + Row( + children: [ + const Spacer(), + Text( + 'page', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w300, + color: AppColors.grey60, + ), + ), + SizedBox(width: 10.0.w()), + InkWell( + onTap: () async { + final _ = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: AppColors.backgroundColor, + title: const Text('selectPage'), + content: SizedBox( + width: 200, + height: 300, + child: ListView.builder( + itemCount: 1, + itemBuilder: (context, index) { + final pageNumber = index + 1; + return ListTile( + title: Text( + '{LikedTendersStrings.page} $pageNumber', + ), + onTap: + () => + Navigator.pop(context, pageNumber), + ); + }, + ), + ), + ); + }, + ); + }, + child: Container( + decoration: BoxDecoration( + border: Border.all(color: AppColors.grey30, width: 1), + borderRadius: BorderRadius.circular(4), + ), + child: Row( + children: [ + SizedBox(width: 5.0.w()), + Text( + 'currentPage', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w500, + color: AppColors.grey70, + ), + ), + SizedBox(width: 5.0.w()), + SvgPicture.asset( + AssetsManager.arrowDownSmall, + color: AppColors.grey80, + ), + SizedBox(width: 5.0.w()), + ], + ), + ), + ), + SizedBox(width: 5.0.w()), + Text( + 'of', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + SizedBox(width: 5.0.w()), + Text( + 'totalPages', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + ], + ), + + SizedBox(height: 30.0.h()), + ], + ), + ), + ), + ); } } diff --git a/lib/views/notification/widgets/notification_card.dart b/lib/views/notification/widgets/notification_card.dart index fc3479e..192ebaf 100644 --- a/lib/views/notification/widgets/notification_card.dart +++ b/lib/views/notification/widgets/notification_card.dart @@ -18,16 +18,34 @@ class NotificationCard extends StatelessWidget { margin: EdgeInsets.symmetric(horizontal: 24.0.w()), padding: EdgeInsets.symmetric(horizontal: 16.0.w(), vertical: 16.0.h()), decoration: BoxDecoration( - color: AppColors.mainBlue.withValues(alpha: 0.03), + color: + notification.title == 'Tender Submitted' + ? AppColors.orange10 + : notification.title == 'New Tender Invitation' + ? AppColors.mainBlue.withValues(alpha: 0.03) + : AppColors.green0, borderRadius: BorderRadius.circular(4), - border: Border.all(color: AppColors.mainBlue.withValues(alpha: 0.15)), + border: Border.all( + color: + notification.title == 'Tender Submitted' + ? AppColors.warningColor + : notification.title == 'New Tender Invitation' + ? AppColors.mainBlue.withValues(alpha: 0.15) + : AppColors.green20, + ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ - SvgPicture.asset(AssetsManager.notification), + SvgPicture.asset( + notification.title == 'Tender Submitted' + ? AssetsManager.danger + : notification.title == 'New Tender Invitation' + ? AssetsManager.notification + : AssetsManager.tickCircle, + ), SizedBox(width: 8.0.w()), Text( notification.title, diff --git a/lib/views/profile/pages/d_profile_page.dart b/lib/views/profile/pages/d_profile_page.dart index ad5b623..82e944c 100644 --- a/lib/views/profile/pages/d_profile_page.dart +++ b/lib/views/profile/pages/d_profile_page.dart @@ -67,7 +67,7 @@ class _DesktopProfilePageState extends State { return Column( children: [ DesktopNavigationWidget( - currentIndex: 2, // Tenders index + currentIndex: 4, // Tenders index ), SizedBox( width: 740, diff --git a/lib/views/profile/pages/t_profile_page.dart b/lib/views/profile/pages/t_profile_page.dart index 7802e08..0a8c44d 100644 --- a/lib/views/profile/pages/t_profile_page.dart +++ b/lib/views/profile/pages/t_profile_page.dart @@ -70,7 +70,7 @@ class _TabletProfilePageState extends State { backgroundColor: AppColors.backgroundColor, appBar: tabletAppBar(title: ProfileStrings.profileTitle, key: key), - drawer: TabletNavigationWidget(currentIndex: 2), + drawer: TabletNavigationWidget(currentIndex: 4), body: Padding( padding: EdgeInsets.symmetric( horizontal: 24.0.w(), diff --git a/lib/views/profile/strings/profile_strings.dart b/lib/views/profile/strings/profile_strings.dart index 69f5cf7..f3f18d3 100644 --- a/lib/views/profile/strings/profile_strings.dart +++ b/lib/views/profile/strings/profile_strings.dart @@ -11,4 +11,6 @@ class ProfileStrings { static const String businessType = 'Business Type'; static const String founded = 'Founded'; static const String logout = 'Logout'; + static const String contracts = 'Contracts'; + static const String notifications = 'Notifications'; } diff --git a/lib/views/shared/desktop_navigation_widget.dart b/lib/views/shared/desktop_navigation_widget.dart index 9ed5eab..5a4393c 100644 --- a/lib/views/shared/desktop_navigation_widget.dart +++ b/lib/views/shared/desktop_navigation_widget.dart @@ -66,11 +66,46 @@ class DesktopNavigationWidget extends StatelessWidget { SizedBox(width: 24), _navigationItem( context: context, - text: ProfileStrings.profileTitle, + text: TendersStrings.contracts, isActive: currentIndex == 2, onTap: () { if (currentIndex == 2) { return; + } else { + // Router.neglect(context, () => TendersRouteData().go(context)); + // context.read().getTenders(); + } + }, + iconPath: AssetsManager.contracts, + activeIconPath: AssetsManager.contracts, + ), + SizedBox(width: 24), + _navigationItem( + context: context, + text: TendersStrings.notifications, + isActive: currentIndex == 3, + onTap: () { + if (currentIndex == 3) { + return; + } else { + Router.neglect( + context, + () => NotificationRouteData().go(context), + ); + //context.read().getTenders(); + } + }, + iconPath: AssetsManager.notify, + activeIconPath: AssetsManager.notifyActive, + ), + SizedBox(width: 24), + _navigationItem( + context: context, + text: ProfileStrings.profileTitle, + isActive: currentIndex == 4, + onTap: () { + if (currentIndex == 4) { + return; } else { Router.neglect(context, () => ProfileRouteData().go(context)); } @@ -96,7 +131,7 @@ class DesktopNavigationWidget extends StatelessWidget { return InkWell( onTap: onTap, child: SizedBox( - width: 100.0, + width: 115.0, height: 64, child: Row( mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/views/shared/tablet_navigation_widget.dart b/lib/views/shared/tablet_navigation_widget.dart index 5b50dd9..4ef8fb6 100644 --- a/lib/views/shared/tablet_navigation_widget.dart +++ b/lib/views/shared/tablet_navigation_widget.dart @@ -59,11 +59,41 @@ class TabletNavigationWidget extends StatelessWidget { ), _navigationItem( context: context, - text: ProfileStrings.profileTitle, + text: ProfileStrings.contracts, isActive: currentIndex == 2, onTap: () { if (currentIndex == 2) { return; + } else { + // context.pop(); + // Router.neglect(context, () => ProfileRouteData().go(context)); + } + }, + iconPath: AssetsManager.contracts, + activeIconPath: AssetsManager.contracts, + ), + _navigationItem( + context: context, + text: ProfileStrings.notifications, + isActive: currentIndex == 3, + onTap: () { + if (currentIndex == 3) { + return; + } else { + context.pop(); + Router.neglect(context, () => NotificationRouteData().go(context)); + } + }, + iconPath: AssetsManager.notify, + activeIconPath: AssetsManager.notifyActive, + ), + _navigationItem( + context: context, + text: ProfileStrings.profileTitle, + isActive: currentIndex == 4, + onTap: () { + if (currentIndex == 4) { + return; } else { context.pop(); Router.neglect(context, () => ProfileRouteData().go(context)); diff --git a/lib/views/tenders/strings/tenders_strings.dart b/lib/views/tenders/strings/tenders_strings.dart index 4a06dce..b4cced5 100644 --- a/lib/views/tenders/strings/tenders_strings.dart +++ b/lib/views/tenders/strings/tenders_strings.dart @@ -8,4 +8,6 @@ class TendersStrings { static const String dislike = 'Dislike'; static const String like = 'Like'; static const String tenderDeadlineLabel = 'Deadline'; + static const String contracts = 'Contracts'; + static const String notifications = 'Notifications'; } diff --git a/pubspec.lock b/pubspec.lock index 7f683a0..a6958c9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -177,14 +177,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" - country_flags: - dependency: "direct main" - description: - name: country_flags - sha256: "78a7bf8aabd7ae1a90087f0c517471ac9ebfe07addc652692f58da0f0f833196" - url: "https://pub.dev" - source: hosted - version: "3.3.0" crypto: dependency: transitive description: @@ -456,22 +448,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" - jovial_misc: - dependency: transitive - description: - name: jovial_misc - sha256: "4301011027d87b8b919cb862db84071a34448eadbb32cc8d40fe505424dfe69a" - url: "https://pub.dev" - source: hosted - version: "0.9.2" - jovial_svg: - dependency: transitive - description: - name: jovial_svg - sha256: "6791b1435547bdc0793081a166d41a8a313ebc61e4e5136fb7a3218781fb9e50" - url: "https://pub.dev" - source: hosted - version: "1.1.27" js: dependency: transitive description: @@ -608,6 +584,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "993381400e94d18469750e5b9dcb8206f15bc09f9da86b9e44a9b0092a0066db" + url: "https://pub.dev" + source: hosted + version: "2.2.18" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd" + url: "https://pub.dev" + source: hosted + version: "2.4.2" path_provider_linux: dependency: transitive description: