diff --git a/.github/workflows/build-android.yml b/.github/workflows/build-android.yml index 561d011..8170964 100644 --- a/.github/workflows/build-android.yml +++ b/.github/workflows/build-android.yml @@ -28,10 +28,10 @@ jobs: uses: subosito/flutter-action@v2.3.0 - name: Install Android dependencies - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: "zulu" - java-version: "12.x" + distribution: 'zulu' + java-version: '17' - name: Checkout code uses: actions/checkout@v3 diff --git a/.metadata b/.metadata index ea58cb8..e720147 100644 --- a/.metadata +++ b/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "e1e47221e86272429674bec4f1bd36acc4fc7b77" + revision: "b0850beeb25f6d5b10426284f506557f66181b36" channel: "stable" project_type: app @@ -13,11 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: e1e47221e86272429674bec4f1bd36acc4fc7b77 - base_revision: e1e47221e86272429674bec4f1bd36acc4fc7b77 + create_revision: b0850beeb25f6d5b10426284f506557f66181b36 + base_revision: b0850beeb25f6d5b10426284f506557f66181b36 - platform: android - create_revision: e1e47221e86272429674bec4f1bd36acc4fc7b77 - base_revision: e1e47221e86272429674bec4f1bd36acc4fc7b77 + create_revision: b0850beeb25f6d5b10426284f506557f66181b36 + base_revision: b0850beeb25f6d5b10426284f506557f66181b36 # User provided section diff --git a/android/app/build.gradle b/android/app/build.gradle index 3f0112b..03c1f4d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,25 +1,26 @@ plugins { id "com.android.application" id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id "dev.flutter.flutter-gradle-plugin" } def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') +def localPropertiesFile = rootProject.file("local.properties") if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> + localPropertiesFile.withReader("UTF-8") { reader -> localProperties.load(reader) } } -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +def flutterVersionCode = localProperties.getProperty("flutter.versionCode") if (flutterVersionCode == null) { - flutterVersionCode = '1' + flutterVersionCode = "1" } -def flutterVersionName = localProperties.getProperty('flutter.versionName') +def flutterVersionName = localProperties.getProperty("flutter.versionName") if (flutterVersionName == null) { - flutterVersionName = '1.0' + flutterVersionName = "1.0" } def keystoreProperties = new Properties() @@ -34,32 +35,25 @@ if (keystorePropertiesFile.exists()) { } android { - namespace "codes.merritt.bargain" - compileSdkVersion flutter.compileSdkVersion - ndkVersion flutter.ndkVersion + namespace = "codes.merritt.bargain" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "codes.merritt.bargain" + applicationId = "codes.merritt.bargain" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion flutter.minSdkVersion - targetSdkVersion flutter.targetSdkVersion - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName + // minSdk = flutter.minSdkVersion + minSdk = 23 // Specified to accomodate super_context_menu + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInteger() + versionName = flutterVersionName } signingConfigs { @@ -71,18 +65,13 @@ android { } } - buildTypes { - release { - signingConfig signingConfigs.release - ndk { - debugSymbolLevel 'SYMBOL_TABLE' - } + buildTypes { + release { + signingConfig = signingConfigs.release } } } flutter { - source '../..' + source = "../.." } - -dependencies {} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 026e64d..27a93e9 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" + android:taskAffinity="" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" @@ -16,12 +17,12 @@ while the Flutter UI initializes. After that, this theme continues to determine the Window background behind the Flutter UI. --> + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/NormalTheme" + /> - - + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/example/unit_bargain_hunter/MainActivity.kt b/android/app/src/main/kotlin/codes/merritt/unit_bargain_hunter/MainActivity.kt similarity index 66% rename from android/app/src/main/kotlin/com/example/unit_bargain_hunter/MainActivity.kt rename to android/app/src/main/kotlin/codes/merritt/unit_bargain_hunter/MainActivity.kt index 4d3b29b..038ccf3 100644 --- a/android/app/src/main/kotlin/com/example/unit_bargain_hunter/MainActivity.kt +++ b/android/app/src/main/kotlin/codes/merritt/unit_bargain_hunter/MainActivity.kt @@ -2,5 +2,4 @@ package codes.merritt.bargain import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() { -} +class MainActivity: FlutterActivity() diff --git a/android/build.gradle b/android/build.gradle index f7eb7f6..d2ffbff 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,16 +1,3 @@ -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - allprojects { repositories { google() @@ -18,12 +5,12 @@ allprojects { } } -rootProject.buildDir = '../build' +rootProject.buildDir = "../build" subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { - project.evaluationDependsOn(':app') + project.evaluationDependsOn(":app") } tasks.register("clean", Delete) { diff --git a/android/gradle.properties b/android/gradle.properties index 94adc3a..3b5b324 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx1536M +org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 3c472b9..e1ca574 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index 55c4ca8..536165d 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -5,16 +5,21 @@ pluginManagement { def flutterSdkPath = properties.getProperty("flutter.sdk") assert flutterSdkPath != null, "flutter.sdk not set in local.properties" return flutterSdkPath - } - settings.ext.flutterSdkPath = flutterSdkPath() + }() - includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - plugins { - id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + repositories { + google() + mavenCentral() + gradlePluginPortal() } } -include ":app" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false +} -apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle" +include ":app" diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/app/app_widget.dart b/lib/app/app_widget.dart index 69c1503..968bfe7 100644 --- a/lib/app/app_widget.dart +++ b/lib/app/app_widget.dart @@ -14,7 +14,7 @@ import '../shortcuts/app_shortcuts.dart'; export 'cubit/app_cubit.dart'; class AppWidget extends StatefulWidget { - const AppWidget({Key? key}) : super(key: key); + const AppWidget({super.key}); @override State createState() => _AppWidgetState(); diff --git a/lib/app/widgets/custom_about_dialog.dart b/lib/app/widgets/custom_about_dialog.dart index 41025c3..b67062c 100644 --- a/lib/app/widgets/custom_about_dialog.dart +++ b/lib/app/widgets/custom_about_dialog.dart @@ -7,7 +7,7 @@ import '../app_widget.dart'; import 'widgets.dart'; class CustomAboutDialog extends StatelessWidget { - const CustomAboutDialog({Key? key}) : super(key: key); + const CustomAboutDialog({super.key}); @override Widget build(BuildContext context) { diff --git a/lib/app/widgets/emoji_text.dart b/lib/app/widgets/emoji_text.dart index 36c4859..e40b9c1 100644 --- a/lib/app/widgets/emoji_text.dart +++ b/lib/app/widgets/emoji_text.dart @@ -9,10 +9,10 @@ class EmojiText extends StatelessWidget { final TextStyle? textStyle; const EmojiText({ - Key? key, + super.key, required this.text, this.textStyle, - }) : super(key: key); + }); bool shouldBreak(bool isEmoji, int value) { if (isEmoji) { diff --git a/lib/calculator/calculator_page.dart b/lib/calculator/calculator_page.dart index 95f7046..b981b0b 100644 --- a/lib/calculator/calculator_page.dart +++ b/lib/calculator/calculator_page.dart @@ -17,7 +17,7 @@ import 'widgets/widgets.dart'; class CalculatorPage extends StatelessWidget { static const id = 'calculator_page'; - CalculatorPage({Key? key}) : super(key: key); + CalculatorPage({super.key}); final focusNode = FocusNode( debugLabel: 'Background node', @@ -65,9 +65,6 @@ class CalculatorPage extends StatelessWidget { appBar: appBar, drawer: drawer, body: const CalculatorView(), - floatingActionButton: const _FloatingActionButton(), - floatingActionButtonLocation: - FloatingActionButtonLocation.endTop, ), ), ), @@ -102,7 +99,7 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { @override final preferredSize = const Size.fromHeight(kToolbarHeight); - const CustomAppBar({Key? key}) : super(key: key); + const CustomAppBar({super.key}); @override Widget build(BuildContext context) { @@ -116,6 +113,9 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { child: AppBar( centerTitle: true, title: const _SheetNameWidget(), + actions: const [ + _ExtraActionsDropdown(), + ], ), ); }, @@ -123,8 +123,53 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { } } +/// A menu button for extra actions in the app bar related to the active sheet. +class _ExtraActionsDropdown extends StatelessWidget { + const _ExtraActionsDropdown(); + + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (context, state) { + return MenuAnchor( + menuChildren: [ + MenuItemButton( + leadingIcon: const Icon(Icons.edit), + onPressed: () => showModal(context, const SheetSettingsView()), + child: const Text('Rename sheet'), + ), + MenuItemButton( + leadingIcon: const Icon(Icons.refresh), + onPressed: () => _confirmResetSheet(context), + child: const Text('Reset sheet'), + ), + MenuItemButton( + leadingIcon: const Icon(Icons.delete), + onPressed: () { + showConfirmRemovalDialog(context, state.activeSheet!); + }, + child: const Text('Delete sheet'), + ), + ], + builder: (context, controller, child) { + return IconButton( + icon: const Icon(Icons.more_vert), + onPressed: () { + if (controller.isOpen) { + controller.close(); + } else { + controller.open(); + } + }); + }, + ); + }, + ); + } +} + class CalculatorView extends StatefulWidget { - const CalculatorView({Key? key}) : super(key: key); + const CalculatorView({super.key}); @override State createState() => _CalculatorViewState(); @@ -172,7 +217,7 @@ class _CalculatorViewState extends State { onTap: () => focusNode.requestFocus(), child: Focus( focusNode: focusNode, - child: const ScrollingItemsList(), + child: const _MainView(), ), ), ], @@ -182,17 +227,30 @@ class _CalculatorViewState extends State { } } -class ScrollingItemsList extends StatelessWidget { - const ScrollingItemsList({Key? key}) : super(key: key); +class _MainView extends StatelessWidget { + const _MainView(); @override Widget build(BuildContext context) { final calcCubit = context.read(); final mediaQuery = MediaQuery.of(context); - final Widget sheetNameWidget = (mediaQuery.isHandset) // - ? const SizedBox() - : const _SheetNameWidget(); + const Widget sheetNameWidget = _SheetNameWidget(); + + final Widget header; + if (mediaQuery.isHandset) { + header = const SizedBox(); + } else { + header = const Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // Ensure name widget is centered + SizedBox(width: 8), + sheetNameWidget, + _ExtraActionsDropdown(), + ], + ); + } return BlocBuilder( builder: (context, state) { @@ -220,7 +278,7 @@ class ScrollingItemsList extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - sheetNameWidget, + header, Expanded( child: SingleChildScrollView( controller: ScrollController(), @@ -256,41 +314,20 @@ class ScrollingItemsList extends StatelessWidget { /// Displays the sheet's name, and allows the user to change it. class _SheetNameWidget extends StatelessWidget { - const _SheetNameWidget({ - Key? key, - }) : super(key: key); + const _SheetNameWidget(); @override Widget build(BuildContext context) { return BlocBuilder( builder: (context, state) { - final nameTextWidget = Text( - state.activeSheet!.name, - style: Theme.of(context).textTheme.titleLarge, - ); - - const smallSpacer = SizedBox(width: 4); - - const editIcon = Opacity( - opacity: 0.6, - child: Icon( - Icons.edit, - size: 18, - ), - ); - return InkWell( borderRadius: BorderRadius.circular(8), onTap: () => showModal(context, const SheetSettingsView()), child: Padding( padding: const EdgeInsets.all(8.0), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - nameTextWidget, - smallSpacer, - editIcon, - ], + child: Text( + state.activeSheet!.name, + style: Theme.of(context).textTheme.titleLarge, ), ), ); @@ -299,53 +336,28 @@ class _SheetNameWidget extends StatelessWidget { } } -class _FloatingActionButton extends StatelessWidget { - const _FloatingActionButton(); - - @override - Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - - return Padding( - padding: EdgeInsets.only( - // On desktop the FAB is getting placed directly against the top of the - // screen, so we need to add some padding to make it look nicer. - top: (mediaQuery.isHandset) ? 0 : 16.0, +/// Show a dialog to confirm the user wants to reset the sheet. +void _confirmResetSheet(BuildContext context) { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Reset sheet?'), + content: const Text( + 'This will remove all items from the sheet.', ), - child: FloatingActionButton.small( - onPressed: () { - // Show a dialog to confirm the user wants to reset the sheet. - showDialog( - context: context, - builder: (context) => AlertDialog( - title: const Text('Reset sheet?'), - content: const Text( - 'This will remove all items from the sheet.', - ), - actions: [ - TextButton( - onPressed: () => Navigator.pop(context), - child: const Text('Cancel'), - ), - TextButton( - onPressed: () { - context.read().resetActiveSheet(); - Navigator.pop(context); - }, - child: const Text('Reset'), - ), - ], - ), - ); - }, - child: Transform.flip( - flipX: true, - child: const Icon( - Icons.refresh, - color: Colors.orange, - ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: const Text('Cancel'), ), - ), - ); - } + TextButton( + onPressed: () { + context.read().resetActiveSheet(); + Navigator.pop(context); + }, + child: const Text('Reset'), + ), + ], + ), + ); } diff --git a/lib/calculator/validators/cost_validator.dart b/lib/calculator/validators/cost_validator.dart index 788d5a2..9547011 100644 --- a/lib/calculator/validators/cost_validator.dart +++ b/lib/calculator/validators/cost_validator.dart @@ -52,15 +52,15 @@ class _CostByWeightValidator { // Convert to grams as the base unit for comparisons. static double _getUnitAsGrams(Unit unit, double quantity) { switch (unit.runtimeType) { - case Milligram: + case const (Milligram): return quantity / 1000; - case Gram: + case const (Gram): return quantity; - case Kilogram: + case const (Kilogram): return quantity * 1000; - case Ounce: + case const (Ounce): return quantity * 28.35; - case Pound: + case const (Pound): return quantity * 454; default: throw Exception('Error converting weight type'); @@ -123,13 +123,13 @@ class _CostByVolumeValidator { // Convert to Millilitres as the base unit for comparisons. static double _getUnitAsMilliletres(Unit unit, double quantity) { switch (unit.runtimeType) { - case Millilitre: + case const (Millilitre): return quantity; - case Litre: + case const (Litre): return quantity * 1000; - case FluidOunce: + case const (FluidOunce): return quantity * 29.574; - case Quart: + case const (Quart): return quantity * 946; default: throw Exception('Error converting volume type'); diff --git a/lib/calculator/widgets/compare_by_dropdown_button.dart b/lib/calculator/widgets/compare_by_dropdown_button.dart index a30bd92..0d2e402 100644 --- a/lib/calculator/widgets/compare_by_dropdown_button.dart +++ b/lib/calculator/widgets/compare_by_dropdown_button.dart @@ -6,8 +6,8 @@ import '../models/models.dart'; class CompareByDropdownButton extends StatelessWidget { const CompareByDropdownButton({ - Key? key, - }) : super(key: key); + super.key, + }); @override Widget build(BuildContext context) { diff --git a/lib/calculator/widgets/item_card.dart b/lib/calculator/widgets/item_card.dart index 858f897..2dae91d 100644 --- a/lib/calculator/widgets/item_card.dart +++ b/lib/calculator/widgets/item_card.dart @@ -18,9 +18,9 @@ class ItemCard extends StatelessWidget { final Item item; const ItemCard({ - Key? key, + super.key, required this.item, - }) : super(key: key); + }); @override Widget build(BuildContext context) { @@ -68,7 +68,7 @@ class ItemCard extends StatelessWidget { } class _ItemContents extends StatelessWidget { - const _ItemContents({Key? key}) : super(key: key); + const _ItemContents(); @override Widget build(BuildContext context) { @@ -125,9 +125,7 @@ class _ItemContents extends StatelessWidget { /// Only shown when there are more than 2 item cards. class _CloseButton extends ConsumerWidget { - const _CloseButton({ - Key? key, - }) : super(key: key); + const _CloseButton(); @override Widget build(BuildContext context, WidgetRef ref) { @@ -163,9 +161,7 @@ class _CloseButton extends ConsumerWidget { /// /// Lists the item's cost per gram, millilitre, etc. class _UnitCalculations extends StatelessWidget { - const _UnitCalculations({ - Key? key, - }) : super(key: key); + const _UnitCalculations(); @override Widget build(BuildContext context) { @@ -203,7 +199,7 @@ class _UnitCalculations extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 2), child: Text('\$$valueString/${cost.unit}'), ); - }).toList(), + }), ], ); }, diff --git a/lib/calculator/widgets/sheet_settings.dart b/lib/calculator/widgets/sheet_settings.dart index cceddff..5284773 100644 --- a/lib/calculator/widgets/sheet_settings.dart +++ b/lib/calculator/widgets/sheet_settings.dart @@ -92,7 +92,7 @@ class _SheetSettingsViewState extends State { style: TextButton.styleFrom( padding: const EdgeInsets.all(30), ), - onPressed: () => _showConfirmRemovalDialog(context, sheet), + onPressed: () => showConfirmRemovalDialog(context, sheet), child: const Text( 'Delete List', style: TextStyle(color: Colors.red), @@ -104,39 +104,38 @@ class _SheetSettingsViewState extends State { }, ); } +} - /// Confirm the user really wants to remove the sheet. - void _showConfirmRemovalDialog(BuildContext context, Sheet sheet) { - Future.delayed( - const Duration(seconds: 0), - () => showDialog( - context: context, - builder: (context) { - return AlertDialog( - content: Text('Remove sheet "${sheet.name}?"'), - actions: [ - TextButton( - onPressed: () { - calcCubit.removeSheet(sheet); - Navigator.pushNamedAndRemoveUntil( - context, - CalculatorPage.id, - (route) => false, - ); - }, - child: const Text( - 'REMOVE', - style: TextStyle(color: Colors.red), - ), - ), - TextButton( - onPressed: () => Navigator.pop(context), - child: const Text('CLOSE'), - ), - ], - ); - }, - ), - ); - } +/// Confirm the user really wants to remove the sheet. +void showConfirmRemovalDialog(BuildContext context, Sheet sheet) { + final calcCubit = context.read(); + + showDialog( + context: context, + builder: (context) { + return AlertDialog( + content: Text('Remove sheet "${sheet.name}?"'), + actions: [ + TextButton( + onPressed: () { + calcCubit.removeSheet(sheet); + Navigator.pushNamedAndRemoveUntil( + context, + CalculatorPage.id, + (route) => false, + ); + }, + child: const Text( + 'REMOVE', + style: TextStyle(color: Colors.red), + ), + ), + TextButton( + onPressed: () => Navigator.pop(context), + child: const Text('CLOSE'), + ), + ], + ); + }, + ); } diff --git a/lib/calculator/widgets/side_panel/sheet_tile.dart b/lib/calculator/widgets/side_panel/sheet_tile.dart index 055027a..48ccb3e 100644 --- a/lib/calculator/widgets/side_panel/sheet_tile.dart +++ b/lib/calculator/widgets/side_panel/sheet_tile.dart @@ -1,7 +1,9 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:helpers/helpers.dart'; +import 'package:super_context_menu/super_context_menu.dart'; import '../../../purchases/cubit/purchases_cubit.dart'; import '../../../purchases/pages/purchases_page.dart'; @@ -18,8 +20,8 @@ class SheetTile extends StatefulWidget { const SheetTile( this.sheet, { - Key? key, - }) : super(key: key); + super.key, + }); @override State createState() => _SheetTileState(); @@ -56,32 +58,27 @@ class _SheetTileState extends State { .proPurchased; final bool proFeaturesDisabled = !proPurchased && (index > 4); - // List buildListContextMenuItems(Sheet sheet) { - // return [ - // PopupMenuItem( - // child: const Text( - // 'Remove', - // style: TextStyle(color: Colors.red), - // ), - // onTap: () => _showConfirmRemovalDialog(context, sheet), - // ), - // ]; - // } - final Widget? subtitle = (sheet.subtitle != null) // ? Text(sheet.subtitle!) : null; - return Opacity( - opacity: (proFeaturesDisabled) ? 0.4 : 1.0, - child: GestureDetector( - // onSecondaryTapUp: (TapUpDetails details) { - // showContextMenu( - // context: context, - // offset: details.globalPosition, - // items: buildListContextMenuItems(sheet), - // ); - // }, + return ContextMenuWidget( + // Context menu is disabled on mobile, as it conflicts with the long + // press to reorder sheets. + // Instead, users can access such settings via the app bar. + contextMenuIsAllowed: (_) => !defaultTargetPlatform.isMobile, + menuProvider: (_) { + return Menu( + children: [ + MenuAction( + title: 'Remove', + callback: () => _showConfirmRemovalDialog(context, sheet), + ), + ], + ); + }, + child: Opacity( + opacity: (proFeaturesDisabled) ? 0.4 : 1.0, child: MouseRegion( onEnter: (_) => setState(() => isHovered = true), onExit: (_) => setState(() => isHovered = false), @@ -127,4 +124,35 @@ class _SheetTileState extends State { ), ); } + + /// Shows a dialog to confirm the removal of a [Sheet]. + Future _showConfirmRemovalDialog( + BuildContext context, + Sheet sheet, + ) async { + final bool? result = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text('Remove sheet?'), + content: Text( + 'Are you sure you want to remove the sheet "${sheet.name}"?'), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context, false), + child: const Text('Cancel'), + ), + TextButton( + onPressed: () => Navigator.pop(context, true), + child: const Text('Remove'), + ), + ], + ); + }, + ); + + if (result == true) { + calcCubit.removeSheet(sheet); + } + } } diff --git a/lib/calculator/widgets/side_panel/sheet_tile_list.dart b/lib/calculator/widgets/side_panel/sheet_tile_list.dart index c44d898..6183380 100644 --- a/lib/calculator/widgets/side_panel/sheet_tile_list.dart +++ b/lib/calculator/widgets/side_panel/sheet_tile_list.dart @@ -7,7 +7,7 @@ import 'sheet_tile.dart'; /// The scrolling list of tiles in the drawer for each calculator sheet. class SheetTileList extends StatefulWidget { - const SheetTileList({Key? key}) : super(key: key); + const SheetTileList({super.key}); @override State createState() => _SheetTileListState(); diff --git a/lib/calculator/widgets/side_panel/side_panel_view.dart b/lib/calculator/widgets/side_panel/side_panel_view.dart index 98642bf..3b46c67 100644 --- a/lib/calculator/widgets/side_panel/side_panel_view.dart +++ b/lib/calculator/widgets/side_panel/side_panel_view.dart @@ -1,7 +1,6 @@ import 'package:badges/badges.dart' as badges; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:helpers/helpers.dart'; import '../../../app/app_widget.dart'; import '../../../app/widgets/widgets.dart'; @@ -14,7 +13,7 @@ import 'sheet_tile_list.dart'; /// Holds the contents of the drawer for large displays, in the form of a /// navigation bar. class SidePanel extends StatefulWidget { - const SidePanel({Key? key}) : super(key: key); + const SidePanel({super.key}); @override State createState() => _SidePanelState(); @@ -24,7 +23,6 @@ class _SidePanelState extends State { @override Widget build(BuildContext context) { final calcCubit = context.read(); - final mediaQuery = MediaQuery.of(context); final addSheetButton = Opacity( opacity: 0.8, @@ -80,13 +78,7 @@ class _SidePanelState extends State { ], ); - if (mediaQuery.isHandset) return panelBody; - - return Container( - color: Theme.of(context).cardColor, - width: 180, - child: panelBody, - ); + return panelBody; } } diff --git a/lib/purchases/pages/purchase_successful_page.dart b/lib/purchases/pages/purchase_successful_page.dart index d960fae..d13c22c 100644 --- a/lib/purchases/pages/purchase_successful_page.dart +++ b/lib/purchases/pages/purchase_successful_page.dart @@ -5,7 +5,7 @@ import '../../calculator/calculator_page.dart'; class PurchaseSuccessfulPage extends StatelessWidget { static const id = 'purchase_successful_page'; - const PurchaseSuccessfulPage({Key? key}) : super(key: key); + const PurchaseSuccessfulPage({super.key}); @override Widget build(BuildContext context) { diff --git a/lib/purchases/pages/purchases_page.dart b/lib/purchases/pages/purchases_page.dart index d48eec6..bb664ce 100644 --- a/lib/purchases/pages/purchases_page.dart +++ b/lib/purchases/pages/purchases_page.dart @@ -8,7 +8,7 @@ import 'purchase_successful_page.dart'; class PurchasesPage extends StatelessWidget { static const id = 'purchases_page'; - const PurchasesPage({Key? key}) : super(key: key); + const PurchasesPage({super.key}); @override Widget build(BuildContext context) { diff --git a/lib/settings/widgets/settings_page.dart b/lib/settings/widgets/settings_page.dart index 2334a6d..11447f0 100644 --- a/lib/settings/widgets/settings_page.dart +++ b/lib/settings/widgets/settings_page.dart @@ -18,7 +18,7 @@ import '../settings.dart'; class SettingsPage extends StatelessWidget { static const String id = '/settings'; - const SettingsPage({Key? key}) : super(key: key); + const SettingsPage({super.key}); @override Widget build(BuildContext context) { @@ -34,7 +34,7 @@ class SettingsPage extends StatelessWidget { } class SettingsView extends StatelessWidget { - const SettingsView({Key? key}) : super(key: key); + const SettingsView({super.key}); @override Widget build(BuildContext context) { @@ -109,10 +109,9 @@ class _SectionCard extends StatelessWidget { final List children; const _SectionCard({ - Key? key, required this.title, required this.children, - }) : super(key: key); + }); @override Widget build(BuildContext context) { @@ -258,7 +257,7 @@ class _UnitFilterSettingsState extends State<_UnitFilterSettings> { }, ); }, - ).toList() + ) ]; return SingleChildScrollView( diff --git a/lib/shortcuts/app_shortcuts.dart b/lib/shortcuts/app_shortcuts.dart index 40cc452..b77c1e9 100644 --- a/lib/shortcuts/app_shortcuts.dart +++ b/lib/shortcuts/app_shortcuts.dart @@ -10,14 +10,14 @@ class AppShortcuts extends StatelessWidget { final Widget child; AppShortcuts({ - Key? key, + super.key, required this.child, - }) : super(key: key); + }); - final _shortcuts = { - LogicalKeySet( - LogicalKeyboardKey.control, + final _shortcuts = { + const SingleActivator( LogicalKeyboardKey.keyQ, + control: true, ): const QuitIntent(), }; diff --git a/lib/shortcuts/shortcuts.dart b/lib/shortcuts/shortcuts.dart index 57d1914..d011a4f 100644 --- a/lib/shortcuts/shortcuts.dart +++ b/lib/shortcuts/shortcuts.dart @@ -8,7 +8,7 @@ class LoggingShortcutManager extends ShortcutManager { LoggingShortcutManager({required super.shortcuts}); @override - KeyEventResult handleKeypress(BuildContext context, RawKeyEvent event) { + KeyEventResult handleKeypress(BuildContext context, KeyEvent event) { final KeyEventResult result = super.handleKeypress(context, event); if (result == KeyEventResult.handled) { log('''Handled shortcut diff --git a/pubspec.lock b/pubspec.lock index 0513016..da508b0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,42 +5,47 @@ packages: dependency: transitive description: name: _discoveryapis_commons - sha256: f8bb1fdbd77f3d5c1d62b5b0eca75fbf1e41bf4f6c62628f880582e2182ae45d + sha256: "113c4100b90a5b70a983541782431b82168b3cae166ab130649c36eb3559d498" url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.0.7" _fe_analyzer_shared: dependency: transitive description: name: _fe_analyzer_shared - sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 + sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 url: "https://pub.dev" source: hosted - version: "64.0.0" + version: "72.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.2" analyzer: dependency: transitive description: name: analyzer - sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" + sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.7.0" archive: dependency: transitive description: name: archive - sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d url: "https://pub.dev" source: hosted - version: "3.4.10" + version: "3.6.1" args: dependency: transitive description: name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.5.0" async: dependency: transitive description: @@ -61,18 +66,18 @@ packages: dependency: "direct main" description: name: bloc - sha256: "3820f15f502372d979121de1f6b97bfcf1630ebff8fe1d52fb2b0bfa49be5b49" + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" url: "https://pub.dev" source: hosted - version: "8.1.2" + version: "8.1.4" bloc_test: dependency: "direct dev" description: name: bloc_test - sha256: "02f04270be5abae8df171143e61a0058a7acbce5dcac887612e89bb40cca4c33" + sha256: "165a6ec950d9252ebe36dc5335f2e6eb13055f33d56db0eeb7642768849b43d2" url: "https://pub.dev" source: hosted - version: "9.1.5" + version: "9.1.7" boolean_selector: dependency: transitive description: @@ -101,10 +106,10 @@ packages: dependency: transitive description: name: build_daemon - sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" build_resolvers: dependency: transitive description: @@ -117,18 +122,18 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21" + sha256: dd09dd4e2b078992f42aac7f1a622f01882a8492fef08486b27ddde929c19f04 url: "https://pub.dev" source: hosted - version: "2.4.8" + version: "2.4.12" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 + sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 url: "https://pub.dev" source: hosted - version: "7.2.11" + version: "7.3.2" built_collection: dependency: transitive description: @@ -141,10 +146,10 @@ packages: dependency: transitive description: name: built_value - sha256: c9aabae0718ec394e5bc3c7272e6bb0dc0b32201a08fe185ec1d8401d3e39309 + sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb url: "https://pub.dev" source: hosted - version: "8.8.1" + version: "8.9.2" characters: dependency: transitive description: @@ -213,10 +218,10 @@ packages: dependency: transitive description: name: coverage - sha256: "8acabb8306b57a409bf4c83522065672ee13179297a6bb0cb9ead73948df7c76" + sha256: "576aaab8b1abdd452e0f656c3e73da9ead9d7880e15bdc494189d9c1a1baf0db" url: "https://pub.dev" source: hosted - version: "1.7.2" + version: "1.9.0" crypto: dependency: transitive description: @@ -229,10 +234,26 @@ packages: dependency: transitive description: name: dart_style - sha256: "40ae61a5d43feea6d24bd22c0537a6629db858963b99b4bc1c3db80676f32368" + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" url: "https://pub.dev" source: hosted - version: "2.3.4" + version: "2.3.6" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: "93429694c9253d2871b3af80cf11b3cbb5c65660d402ed7bf69854ce4a089f82" + url: "https://pub.dev" + source: hosted + version: "10.1.1" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba" + url: "https://pub.dev" + source: hosted + version: "7.0.1" diff_match_patch: dependency: transitive description: @@ -269,10 +290,10 @@ packages: dependency: transitive description: name: ffi - sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" file: dependency: transitive description: @@ -307,10 +328,10 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: e74efb89ee6945bcbce74a5b3a5a3376b088e5f21f55c263fc38cbdc6237faae + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.1.6" flutter_launcher_icons: dependency: "direct dev" description: @@ -323,10 +344,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "4.0.0" flutter_localizations: dependency: "direct main" description: flutter @@ -336,18 +357,18 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "30088ce826b5b9cfbf9e8bece34c716c8a59fa54461dcae1e4ac01a94639e762" + sha256: "04c4722cc36ec5af38acc38ece70d22d3c2123c61305d555750a091517bbe504" url: "https://pub.dev" source: hosted - version: "0.6.18+3" + version: "0.6.23" flutter_riverpod: dependency: "direct main" description: name: flutter_riverpod - sha256: da9591d1f8d5881628ccd5c25c40e74fc3eef50ba45e40c3905a06e1712412d5 + sha256: "0f1974eff5bbe774bf1d870e406fc6f29e3d6f1c46bd9c58e7172ff68a785d7d" url: "https://pub.dev" source: hosted - version: "2.4.9" + version: "2.5.1" flutter_test: dependency: "direct dev" description: flutter @@ -362,42 +383,42 @@ packages: dependency: "direct main" description: name: font_awesome_flutter - sha256: "1f93e5799f0e6c882819e8393a05c6ca5226010f289190f2242ec19f3f0fdba5" + sha256: "275ff26905134bcb59417cf60ad979136f1f8257f2f449914b2c3e05bbb4cd6f" url: "https://pub.dev" source: hosted - version: "9.2.0" + version: "10.7.0" freezed: dependency: "direct dev" description: name: freezed - sha256: "6c5031daae12c7072b3a87eff98983076434b4889ef2a44384d0cae3f82372ba" + sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e" url: "https://pub.dev" source: hosted - version: "2.4.6" + version: "2.5.7" freezed_annotation: dependency: "direct main" description: name: freezed_annotation - sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d + sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.4" frontend_server_client: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "4.0.0" get_it: dependency: transitive description: name: get_it - sha256: d0b88dc35a7f97fd91fec0cf8f165abd97a57977968d8fc02ba0bc92e14ba07e + sha256: d85128a5dae4ea777324730dc65edd9c9f43155c109d5cc0a69cab74139fbac1 url: "https://pub.dev" source: hosted - version: "7.6.6" + version: "7.7.0" glob: dependency: transitive description: @@ -410,34 +431,42 @@ packages: dependency: "direct main" description: name: google_fonts - sha256: e20ff62b158b96f392bfc8afe29dee1503c94fbea2cbe8186fd59b756b8ae982 + sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "6.2.1" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "5be191523702ba8d7a01ca97c17fca096822ccf246b0a9f11923a6ded06199b6" + url: "https://pub.dev" + source: hosted + version: "0.3.1+4" google_sign_in: dependency: "direct main" description: name: google_sign_in - sha256: "821f354c053d51a2d417b02d42532a19a6ea8057d2f9ebb8863c07d81c98aaf9" + sha256: "0b8787cb9c1a68ad398e8010e8c8766bfa33556d2ab97c439fb4137756d7308f" url: "https://pub.dev" source: hosted - version: "5.4.4" + version: "6.2.1" google_sign_in_android: dependency: transitive description: name: google_sign_in_android - sha256: bfd42c81c30c6faba16e0f62968d5505a87504aaa672b3155ee931461abb0a49 + sha256: "5a47ebec9af97daf0822e800e4f101c3340b5ebc3f6898cf860c1a71b53cf077" url: "https://pub.dev" source: hosted - version: "6.1.21" + version: "6.1.28" google_sign_in_ios: dependency: transitive description: name: google_sign_in_ios - sha256: f3336d9e44d4d28063ac90271f6db5caf99f0480cb07281330e7a432edb95226 + sha256: a058c9880be456f21e2e8571c1126eaacd570bdc5b6c6d9d15aea4bdf22ca9fe url: "https://pub.dev" source: hosted - version: "5.7.3" + version: "5.7.6" google_sign_in_platform_interface: dependency: transitive description: @@ -450,34 +479,34 @@ packages: dependency: transitive description: name: google_sign_in_web - sha256: "75cc41ebc53b1756320ee14d9c3018ad3e6cea298147dbcd86e9d0c8d6720b40" + sha256: "042805a21127a85b0dc46bba98a37926f17d2439720e8a459d27045d8ef68055" url: "https://pub.dev" source: hosted - version: "0.10.2+1" + version: "0.12.4+2" googleapis: dependency: "direct main" description: name: googleapis - sha256: c2f311bcd1b3e4052234162edc6b626a9013a7e1385d6aad37e9e6a6c5f89908 + sha256: "864f222aed3f2ff00b816c675edf00a39e2aaf373d728d8abec30b37bee1a81c" url: "https://pub.dev" source: hosted - version: "11.4.0" + version: "13.2.0" googleapis_auth: dependency: "direct main" description: name: googleapis_auth - sha256: af7c3a3edf9d0de2e1e0a77e994fae0a581c525fa7012af4fa0d4a52ed9484da + sha256: befd71383a955535060acde8792e7efc11d2fccd03dd1d3ec434e85b68775938 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.6.0" graphs: dependency: transitive description: name: graphs - sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" helpers: dependency: "direct main" description: @@ -507,10 +536,10 @@ packages: dependency: "direct main" description: name: http - sha256: d4872660c46d929f6b8a9ef4e7a7eff7e49bbf0c4ec3f385ee32df5119175139 + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.2" http_multi_server: dependency: transitive description: @@ -531,50 +560,50 @@ packages: dependency: transitive description: name: image - sha256: "004a2e90ce080f8627b5a04aecb4cdfac87d2c3f3b520aa291260be5a32c033d" + sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" url: "https://pub.dev" source: hosted - version: "4.1.4" + version: "4.2.0" in_app_purchase: dependency: "direct main" description: name: in_app_purchase - sha256: af00db44f0314eda24f5e7ff18a6b445ab95e11fcf49c53e4b7c6bef005eeecf + sha256: "960f26a08d9351fb8f89f08901f8a829d41b04d45a694b8f776121d9e41dcad6" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.2.0" in_app_purchase_android: dependency: "direct main" description: name: in_app_purchase_android - sha256: "8d24e7141d5da4e239045438cb990b98fe8fd3e8de6884fbc76ff4ecec30caf5" + sha256: "4c3f46f736a31902ec5392a75f41ea1ad292f27db00ed51153f3912d076d0efa" url: "https://pub.dev" source: hosted - version: "0.2.5+4" + version: "0.3.6+5" in_app_purchase_platform_interface: dependency: transitive description: name: in_app_purchase_platform_interface - sha256: "412efce2b9238c5ace4f057acad43f793ed06880e366d26ae322e796cadb051a" + sha256: "1d353d38251da5b9fea6635c0ebfc6bb17a2d28d0e86ea5e083bf64244f1fb4c" url: "https://pub.dev" source: hosted - version: "1.3.7" + version: "1.4.0" in_app_purchase_storekit: dependency: transitive description: name: in_app_purchase_storekit - sha256: c4b17a7f2ca8ddc7fd7996a8c32a3af6beddf91d651997c8675a5f23c103c9bc + sha256: "28a0577d9f4a5bdfb7aad96c347193e1225cc335c8003fbb98b875a67dab34cc" url: "https://pub.dev" source: hosted - version: "0.3.8+1" + version: "0.3.17+3" intl: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.19.0" io: dependency: transitive description: @@ -583,46 +612,86 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + irondash_engine_context: + dependency: transitive + description: + name: irondash_engine_context + sha256: cd7b769db11a2b5243b037c8a9b1ecaef02e1ae27a2d909ffa78c1dad747bb10 + url: "https://pub.dev" + source: hosted + version: "0.5.4" + irondash_message_channel: + dependency: transitive + description: + name: irondash_message_channel + sha256: b4101669776509c76133b8917ab8cfc704d3ad92a8c450b92934dd8884a2f060 + url: "https://pub.dev" + source: hosted + version: "0.7.0" js: dependency: transitive description: name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "0.7.1" json_annotation: dependency: "direct main" description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 + sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b + url: "https://pub.dev" + source: hosted + version: "6.8.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "6.7.1" + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "4.0.0" logger: dependency: "direct main" description: name: logger - sha256: "6bbb9d6f7056729537a4309bda2e74e18e5d9f14302489cc1e93f33b3fe32cac" + sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32" url: "https://pub.dev" source: hosted - version: "2.0.2+1" + version: "2.4.0" logging: dependency: transitive description: @@ -631,46 +700,54 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + macros: + dependency: transitive + description: + name: macros + sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" + url: "https://pub.dev" + source: hosted + version: "0.1.2-main.4" markdown: dependency: transitive description: name: markdown - sha256: acf35edccc0463a9d7384e437c015a3535772e09714cf60e07eeef3a15870dcd + sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 url: "https://pub.dev" source: hosted - version: "7.1.1" + version: "7.2.2" matcher: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.15.0" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" mockito: dependency: "direct dev" description: @@ -683,10 +760,10 @@ packages: dependency: "direct dev" description: name: mocktail - sha256: "80a996cd9a69284b3dc521ce185ffe9150cde69767c2d3a0720147d93c0cef53" + sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "1.0.4" msix: dependency: "direct dev" description: @@ -731,50 +808,50 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" + sha256: "4de6c36df77ffbcef0a5aefe04669d33f2d18397fea228277b852a2d4e58e860" url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "8.0.1" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.1" path: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_provider: dependency: "direct main" description: name: path_provider - sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + sha256: "490539678396d4c3c0b06efdaab75ae60675c3e0c66f72bc04c2e2c1e0e2abeb" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.9" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -795,10 +872,10 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" petitparser: dependency: transitive description: @@ -807,14 +884,22 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.2" + pixel_snap: + dependency: transitive + description: + name: pixel_snap + sha256: "677410ea37b07cd37ecb6d5e6c0d8d7615a7cf3bd92ba406fd1ac57e937d1fb0" + url: "https://pub.dev" + source: hosted + version: "0.1.5" platform: dependency: transitive description: name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: @@ -823,14 +908,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" - url: "https://pub.dev" - source: hosted - version: "3.7.3" pool: dependency: transitive description: @@ -843,10 +920,10 @@ packages: dependency: transitive description: name: provider - sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.1.2" pub_semver: dependency: "direct main" description: @@ -859,18 +936,18 @@ packages: dependency: transitive description: name: pubspec_parse - sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.3.0" riverpod: dependency: transitive description: name: riverpod - sha256: "942999ee48b899f8a46a860f1e13cee36f2f77609eb54c5b7a669bb20d550b11" + sha256: f21b32ffd26a36555e501b04f4a5dca43ed59e16343f1a30c13632b2351dfa4d url: "https://pub.dev" source: hosted - version: "2.4.9" + version: "2.5.1" screen_retriever: dependency: transitive description: @@ -907,10 +984,10 @@ packages: dependency: transitive description: name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "2.0.0" sky_engine: dependency: transitive description: flutter @@ -956,6 +1033,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -976,10 +1061,10 @@ packages: dependency: "direct main" description: name: store_checker - sha256: c9c1a93f11fa756fea23a2a08d7e54e84626a8d3c759cf49fc694a3a5afdc705 + sha256: "9e5841e4f922cc7f0283323ff3c78fd31ace14c22e988525d33355c35d7c815a" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.6.0" stream_channel: dependency: transitive description: @@ -1004,6 +1089,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + super_context_menu: + dependency: "direct main" + description: + name: super_context_menu + sha256: c21e8a2d5a2f304c5acf56b78c8fd21a36f83ea9aded513529de022dc0a077f3 + url: "https://pub.dev" + source: hosted + version: "0.8.19" + super_native_extensions: + dependency: transitive + description: + name: super_native_extensions + sha256: c24676825c9f3ae844676a843d45ad186f2270539ffe72be4277753e46d14e29 + url: "https://pub.dev" + source: hosted + version: "0.8.19" term_glyph: dependency: transitive description: @@ -1016,26 +1117,26 @@ packages: dependency: transitive description: name: test - sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f + sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" url: "https://pub.dev" source: hosted - version: "1.24.9" + version: "1.25.7" test_api: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.2" test_core: dependency: transitive description: name: test_core - sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a + sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" url: "https://pub.dev" source: hosted - version: "0.5.9" + version: "0.6.4" timing: dependency: transitive description: @@ -1056,26 +1157,26 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: d25bb0ca00432a5e1ee40e69c36c85863addf7cc45e433769d61bed3fe81fd96 + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.2.3" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f" + sha256: "94d8ad05f44c6d4e2ffe5567ab4d741b82d62e3c8e288cc1fcea45965edf47c9" url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.3.8" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e url: "https://pub.dev" source: hosted - version: "6.2.4" + version: "6.3.1" url_launcher_linux: dependency: transitive description: @@ -1088,42 +1189,42 @@ packages: dependency: transitive description: name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: a932c3a8082e118f80a475ce692fde89dc20fddb24c57360b96bc56f7035de1f + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" uuid: dependency: "direct main" description: name: uuid - sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90" url: "https://pub.dev" source: hosted - version: "3.0.7" + version: "4.4.2" vector_math: dependency: transitive description: @@ -1136,10 +1237,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "14.2.4" watcher: dependency: transitive description: @@ -1152,18 +1253,26 @@ packages: dependency: transitive description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "3.0.1" webkit_inspection_protocol: dependency: transitive description: @@ -1176,18 +1285,26 @@ packages: dependency: transitive description: name: win32 - sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + sha256: "015002c060f1ae9f41a818f2d5640389cc05283e368be19dc8d77cecb43c40c9" + url: "https://pub.dev" + source: hosted + version: "5.5.3" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "723b7f851e5724c55409bb3d5a32b203b3afe8587eaf5dafb93a5fed8ecda0d6" url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "1.1.4" window_manager: dependency: "direct main" description: name: window_manager - sha256: dcc865277f26a7dad263a47d0e405d77e21f12cb71f30333a52710a408690bd7 + sha256: "8699323b30da4cdbe2aa2e7c9de567a6abd8a97d9a5c850a3c86dcd0b34bbfbf" url: "https://pub.dev" source: hosted - version: "0.3.7" + version: "0.3.9" window_size: dependency: "direct main" description: @@ -1222,5 +1339,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0 <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.5.0-259.0.dev <4.0.0" + flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 8c11e40..85c5395 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,11 +19,11 @@ dependencies: sdk: flutter flutter_markdown: ^0.6.10 flutter_riverpod: ^2.0.0-dev.9 - font_awesome_flutter: ^9.1.0 + font_awesome_flutter: ^10.7.0 freezed_annotation: ^2.2.0 - google_fonts: ^5.1.0 - google_sign_in: ^5.4.4 - googleapis: ^11.2.0 + google_fonts: ^6.2.1 + google_sign_in: ^6.2.1 + googleapis: ^13.1.0 googleapis_auth: ^1.3.1 helpers: git: @@ -32,18 +32,19 @@ dependencies: hive: ^2.1.0 hive_flutter: ^1.1.0 http: ^1.0.0 - in_app_purchase: ^3.0.7 - in_app_purchase_android: ^0.2.3+5 - intl: ^0.18.0 + in_app_purchase: ^3.2.0 + in_app_purchase_android: ^0.3.6+5 + intl: ^0.19.0 json_annotation: ^4.8.0 logger: ^2.0.1 multi_split_view: ^2.1.0 - package_info_plus: ^4.0.2 + package_info_plus: ^8.0.0 path_provider: ^2.0.10 pub_semver: ^2.0.0 store_checker: ^1.0.0 + super_context_menu: ^0.8.17 url_launcher: ^6.0.20 - uuid: ^3.0.6 + uuid: ^4.4.2 window_manager: ^0.3.0 window_size: git: @@ -60,13 +61,13 @@ dev_dependencies: url: https://github.com/Merrit/flutter_app_builder.git ref: abe7d671ff5e5fc692bec8908285282a88d928c0 flutter_launcher_icons: ^0.13.1 - flutter_lints: ^2.0.0 + flutter_lints: ^4.0.0 flutter_test: sdk: flutter freezed: ^2.3.2 json_serializable: ^6.6.1 mockito: ^5.4.2 - mocktail: ^0.3.0 + mocktail: ^1.0.4 msix: ^3.5.1 flutter: