diff --git a/.metadata b/.metadata index b5c370f..fc44c8e 100644 --- a/.metadata +++ b/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "41456452f29d64e8deb623a3c927524bcf9f111b" + revision: "00b0c91f06209d9e4a41f71b7a512d6eb3b9c694" channel: "stable" project_type: app @@ -13,26 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + create_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + base_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 - platform: android - create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - - platform: ios - create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - - platform: linux - create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - - platform: macos - create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - - platform: web - create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - - platform: windows - create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b - base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b + create_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 + base_revision: 00b0c91f06209d9e4a41f71b7a512d6eb3b9c694 # User provided section diff --git a/android/.gitignore b/android/.gitignore index 6f56801..be3943c 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -5,9 +5,10 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +# See https://flutter.dev/to/reference-keystore key.properties **/*.keystore **/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index f41a6ab..0000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,78 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - id "dev.flutter.flutter-gradle-plugin" -} - -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} - - -android { - namespace "com.jgeek00.linkdy" - compileSdkVersion 36 - ndkVersion '27.0.12077973' - - compileOptions { - sourceCompatibility JavaVersion.VERSION_18 - targetCompatibility JavaVersion.VERSION_18 - } - - kotlinOptions { - jvmTarget = 18 - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - defaultConfig { - applicationId "com.jgeek00.linkdy" - minSdkVersion 26 - targetSdkVersion 36 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - } - - signingConfigs { - release { - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null - storePassword keystoreProperties['storePassword'] - } - } - - buildTypes { - release { - signingConfig signingConfigs.release - } - } -} - -flutter { - source '../..' -} - -dependencies {} diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 0000000..9c51069 --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +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") +} + +android { + namespace = "com.jgeek00.linkdy" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.jgeek00.linkdy" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 9a85826..5d15d09 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -3,15 +3,12 @@ - + android:icon="@mipmap/ic_launcher"> + @@ -51,4 +49,15 @@ android:name="flutterEmbedding" android:value="2" /> + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/example/my_linkding/MainActivity.kt b/android/app/src/main/kotlin/com/jgeek00/linkdy/MainActivity.kt similarity index 99% rename from android/app/src/main/kotlin/com/example/my_linkding/MainActivity.kt rename to android/app/src/main/kotlin/com/jgeek00/linkdy/MainActivity.kt index 773e247..06b45b3 100644 --- a/android/app/src/main/kotlin/com/example/my_linkding/MainActivity.kt +++ b/android/app/src/main/kotlin/com/jgeek00/linkdy/MainActivity.kt @@ -21,4 +21,5 @@ class MainActivity: FlutterActivity() { } super.onCreate(savedInstanceState) } -} \ No newline at end of file +} + diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index 041e887..0000000 --- a/android/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -buildscript { - ext.kotlin_version = '1.9.25' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000..dbee657 --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,24 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = + rootProject.layout.buildDirectory + .dir("../../build") + .get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/gradle.properties b/android/gradle.properties index 73c3168..fbee1d8 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,6 +1,2 @@ -org.gradle.jvmargs=-Xmx4G +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true -android.enableJetifier=true -android.defaults.buildfeatures.buildconfig=true -android.nonTransitiveRClass=false -android.nonFinalResIds=false diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 7142cc4..e4ef43f 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,8 +1,5 @@ -#Tue Jun 17 20:55:04 CEST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip -networkTimeout=10000 -validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip diff --git a/android/key.properties.sample b/android/key.properties.sample deleted file mode 100644 index b51dc2c..0000000 --- a/android/key.properties.sample +++ /dev/null @@ -1,4 +0,0 @@ -storePassword= # keystore password # -keyPassword= # keystore key password # -keyAlias= # key alias # -storeFile= # ./keystore-file-name.jks # \ No newline at end of file diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index 91f9f5a..0000000 --- a/android/settings.gradle +++ /dev/null @@ -1,29 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - 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") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } - - plugins { - id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.10.1' apply false -} - -include ":app" diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000..ca7fe06 --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,26 @@ +pluginManagement { + val flutterSdkPath = + run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.11.1" apply false + id("org.jetbrains.kotlin.android") version "2.2.20" apply false +} + +include(":app") diff --git a/lib/i18n/strings_cs.g.dart b/lib/i18n/strings_cs.g.dart index e505871..5e3150c 100644 --- a/lib/i18n/strings_cs.g.dart +++ b/lib/i18n/strings_cs.g.dart @@ -168,6 +168,7 @@ class _TranslationsSettingsCs implements TranslationsSettingsEn { @override String get moreInfoAppDescription => 'Odkaz na webové stránky aplikace'; @override String get moreApps => 'Moje další aplikace'; @override String get moreAppsDescription => 'Další projekty, kontakt, podpora a další'; + @override String get selectAnOption => 'Vyberte možnost'; @override late final _TranslationsSettingsCustomizationCs customization = _TranslationsSettingsCustomizationCs._(_root); @override late final _TranslationsSettingsGeneralSettingsCs generalSettings = _TranslationsSettingsGeneralSettingsCs._(_root); } @@ -598,6 +599,7 @@ extension on TranslationsCs { 'settings.moreInfoAppDescription' => 'Odkaz na webové stránky aplikace', 'settings.moreApps' => 'Moje další aplikace', 'settings.moreAppsDescription' => 'Další projekty, kontakt, podpora a další', + 'settings.selectAnOption' => 'Vyberte možnost', 'settings.customization.customization' => 'Přizpůsobení', 'settings.customization.customizationDescription' => 'Nastavte motiv aplikace a barevnou paletu.', 'settings.customization.theme' => 'Motiv', diff --git a/lib/i18n/strings_cs.i18n.json b/lib/i18n/strings_cs.i18n.json index 6ed03a2..dae683d 100644 --- a/lib/i18n/strings_cs.i18n.json +++ b/lib/i18n/strings_cs.i18n.json @@ -181,6 +181,7 @@ "moreInfoAppDescription": "Odkaz na webové stránky aplikace", "moreApps": "Moje další aplikace", "moreAppsDescription": "Další projekty, kontakt, podpora a další", + "selectAnOption": "Vyberte možnost", "customization": { "customization": "Přizpůsobení", "customizationDescription": "Nastavte motiv aplikace a barevnou paletu.", diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index 8a8ebf9..459ae42 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -319,6 +319,9 @@ class TranslationsSettingsEn { /// en: 'More apps, contact, donations and more' String get moreAppsDescription => 'More apps, contact, donations and more'; + /// en: 'Select an option' + String get selectAnOption => 'Select an option'; + late final TranslationsSettingsCustomizationEn customization = TranslationsSettingsCustomizationEn._(_root); late final TranslationsSettingsGeneralSettingsEn generalSettings = TranslationsSettingsGeneralSettingsEn._(_root); } @@ -1031,6 +1034,7 @@ extension on Translations { 'settings.moreInfoAppDescription' => 'Link to the app\'s information page', 'settings.moreApps' => 'My other apps', 'settings.moreAppsDescription' => 'More apps, contact, donations and more', + 'settings.selectAnOption' => 'Select an option', 'settings.customization.customization' => 'Customization', 'settings.customization.customizationDescription' => 'Set the app theme and color palette.', 'settings.customization.theme' => 'Theme', diff --git a/lib/i18n/strings_en.i18n.json b/lib/i18n/strings_en.i18n.json index ffb1dd6..f922b9e 100644 --- a/lib/i18n/strings_en.i18n.json +++ b/lib/i18n/strings_en.i18n.json @@ -181,6 +181,7 @@ "moreInfoAppDescription": "Link to the app's information page", "moreApps": "My other apps", "moreAppsDescription": "More apps, contact, donations and more", + "selectAnOption": "Select an option", "customization": { "customization": "Customization", "customizationDescription": "Set the app theme and color palette.", diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index aadd9bb..c7d3d83 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -168,6 +168,7 @@ class _TranslationsSettingsEs implements TranslationsSettingsEn { @override String get moreInfoAppDescription => 'Enlace a la página web de información de la aplicación'; @override String get moreApps => 'Mis otras aplicaciones'; @override String get moreAppsDescription => 'Más aplicaciones, contacto, donaciones y más'; + @override String get selectAnOption => 'Selecciona una opción'; @override late final _TranslationsSettingsCustomizationEs customization = _TranslationsSettingsCustomizationEs._(_root); @override late final _TranslationsSettingsGeneralSettingsEs generalSettings = _TranslationsSettingsGeneralSettingsEs._(_root); } @@ -598,6 +599,7 @@ extension on TranslationsEs { 'settings.moreInfoAppDescription' => 'Enlace a la página web de información de la aplicación', 'settings.moreApps' => 'Mis otras aplicaciones', 'settings.moreAppsDescription' => 'Más aplicaciones, contacto, donaciones y más', + 'settings.selectAnOption' => 'Selecciona una opción', 'settings.customization.customization' => 'Personalización', 'settings.customization.customizationDescription' => 'Configura el tema y la paleta de colores.', 'settings.customization.theme' => 'Tema', diff --git a/lib/i18n/strings_es.i18n.json b/lib/i18n/strings_es.i18n.json index f8e5167..f930b35 100644 --- a/lib/i18n/strings_es.i18n.json +++ b/lib/i18n/strings_es.i18n.json @@ -181,6 +181,7 @@ "moreInfoAppDescription": "Enlace a la página web de información de la aplicación", "moreApps": "Mis otras aplicaciones", "moreAppsDescription": "Más aplicaciones, contacto, donaciones y más", + "selectAnOption": "Selecciona una opción", "customization": { "customization": "Personalización", "customizationDescription": "Configura el tema y la paleta de colores.", diff --git a/lib/i18n/strings_tr.g.dart b/lib/i18n/strings_tr.g.dart index 7d53af9..32328bf 100644 --- a/lib/i18n/strings_tr.g.dart +++ b/lib/i18n/strings_tr.g.dart @@ -168,6 +168,7 @@ class _TranslationsSettingsTr implements TranslationsSettingsEn { @override String get moreInfoAppDescription => 'Uygulamanın bilgi sayfasına bağlantı'; @override String get moreApps => 'Diğer uygulamalarım'; @override String get moreAppsDescription => 'Daha fazla uygulama, iletişim, bağış ve daha fazlası'; + @override String get selectAnOption => 'Bir seçenek seçin'; @override late final _TranslationsSettingsCustomizationTr customization = _TranslationsSettingsCustomizationTr._(_root); @override late final _TranslationsSettingsGeneralSettingsTr generalSettings = _TranslationsSettingsGeneralSettingsTr._(_root); } @@ -598,6 +599,7 @@ extension on TranslationsTr { 'settings.moreInfoAppDescription' => 'Uygulamanın bilgi sayfasına bağlantı', 'settings.moreApps' => 'Diğer uygulamalarım', 'settings.moreAppsDescription' => 'Daha fazla uygulama, iletişim, bağış ve daha fazlası', + 'settings.selectAnOption' => 'Bir seçenek seçin', 'settings.customization.customization' => 'Özelleştirme', 'settings.customization.customizationDescription' => 'Uygulama temasını ve renk paletini ayarlayın.', 'settings.customization.theme' => 'Tema', diff --git a/lib/i18n/strings_tr.i18n.json b/lib/i18n/strings_tr.i18n.json index c475fa4..a071fcd 100644 --- a/lib/i18n/strings_tr.i18n.json +++ b/lib/i18n/strings_tr.i18n.json @@ -181,6 +181,7 @@ "moreInfoAppDescription": "Uygulamanın bilgi sayfasına bağlantı", "moreApps": "Diğer uygulamalarım", "moreAppsDescription": "Daha fazla uygulama, iletişim, bağış ve daha fazlası", + "selectAnOption": "Bir seçenek seçin", "customization": { "customization": "Özelleştirme", "customizationDescription": "Uygulama temasını ve renk paletini ayarlayın.", diff --git a/lib/screens/settings/ui/settings.dart b/lib/screens/settings/ui/settings.dart index 664e3b6..3158c3b 100644 --- a/lib/screens/settings/ui/settings.dart +++ b/lib/screens/settings/ui/settings.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_split_view/flutter_split_view.dart'; import 'package:linkdy/screens/settings/ui/customization/customization.dart'; import 'package:linkdy/screens/settings/provider/settings.provider.dart'; @@ -24,10 +23,11 @@ class SettingsScreen extends ConsumerWidget { return LayoutBuilder( builder: (context, constraints) { if (constraints.maxWidth > Sizes.tabletBreakpoint) { - return const SplitView.material( - hideDivider: true, - flexWidth: FlexWidth(mainViewFlexWidth: 1, secondaryViewFlexWidth: 2), - child: _List(tabletView: true), + return Row( + children: [ + const Expanded(flex: 1, child: _List(tabletView: true)), + Expanded(flex: 2, child: Material(child: const _DetailPanel())), + ], ); } else { return const _List(tabletView: false); @@ -163,7 +163,6 @@ class _SettingsTile extends ConsumerWidget { selectedItem: ref.watch(settingsProvider).selectedScreen, onTap: () { ref.read(settingsProvider.notifier).setSelectedScreen(thisItem); - SplitView.of(context).setSecondary(screenToNavigate); }, ); } else { @@ -178,3 +177,26 @@ class _SettingsTile extends ConsumerWidget { } } } + +class _DetailPanel extends ConsumerWidget { + const _DetailPanel(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final selectedScreen = ref.watch(settingsProvider).selectedScreen; + + switch (selectedScreen) { + case 0: + return const Customization(); + case 1: + return const GeneralSettings(); + default: + return Center( + child: Text( + t.settings.selectAnOption, + style: TextStyle(color: Theme.of(context).colorScheme.onSurfaceVariant), + ), + ); + } + } +} diff --git a/lib/widgets/bookmark_item/bookmark_context_menu.dart b/lib/widgets/bookmark_item/bookmark_context_menu.dart index 42d1149..419be0d 100644 --- a/lib/widgets/bookmark_item/bookmark_context_menu.dart +++ b/lib/widgets/bookmark_item/bookmark_context_menu.dart @@ -1,14 +1,10 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:super_context_menu/super_context_menu.dart'; import 'package:linkdy/models/data/bookmarks.dart'; import 'package:linkdy/i18n/strings.g.dart'; -// Wait until the context menu close animation animation finishes -Duration _durationTime = const Duration(milliseconds: 150); - class BookmarkContextMenu extends ConsumerWidget { final Widget child; final Bookmark bookmark; @@ -31,69 +27,119 @@ class BookmarkContextMenu extends ConsumerWidget { required this.onShareInternally, }); + void _showBottomSheet(BuildContext context) { + showModalBottomSheet( + context: context, + isDismissible: true, + builder: (ctx) => SafeArea( + bottom: true, + top: true, + child: Wrap( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 12), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 50, + height: 4, + decoration: BoxDecoration( + color: Colors.grey, + borderRadius: BorderRadius.circular(20), + ), + ), + ], + ), + ), + ListTile( + leading: Icon( + bookmark.unread == true ? Icons.mark_email_read_rounded : Icons.mark_as_unread_rounded, + ), + title: Text( + bookmark.unread == true + ? t.bookmarks.bookmarkOptions.markAsRead + : t.bookmarks.bookmarkOptions.markAsUnread, + ), + onTap: () { + Navigator.pop(ctx); + onReadUnread(bookmark); + }, + ), + ListTile( + leading: Icon( + bookmark.isArchived == true ? Icons.unarchive_rounded : Icons.archive_rounded, + ), + title: Text( + bookmark.isArchived == true + ? t.bookmarks.bookmarkOptions.unarchive + : t.bookmarks.bookmarkOptions.archive, + ), + onTap: () { + Navigator.pop(ctx); + onArchiveUnarchive(bookmark); + }, + ), + ExpansionTile( + leading: const Icon(Icons.share_rounded), + title: Text(t.bookmarks.bookmarkOptions.shareOptions), + children: [ + ListTile( + contentPadding: const EdgeInsets.only(left: 44), + leading: const Icon(Icons.input_rounded), + title: Text( + bookmark.shared == true + ? t.bookmarks.bookmarkOptions.unshareInternally + : t.bookmarks.bookmarkOptions.shareInternally, + ), + onTap: () { + Navigator.pop(ctx); + onShareInternally(bookmark); + }, + ), + ListTile( + contentPadding: const EdgeInsets.only(left: 44), + leading: const Icon(Icons.output_rounded), + title: Text(t.bookmarks.bookmarkOptions.shareThirdPartyApp), + onTap: () { + Navigator.pop(ctx); + Share.share(bookmark.url!); + }, + ), + ], + ), + ListTile( + leading: const Icon(Icons.edit_rounded), + title: Text(t.bookmarks.bookmarkOptions.edit), + onTap: () { + Navigator.pop(ctx); + onEdit(bookmark); + }, + ), + ListTile( + leading: Icon( + Icons.delete_rounded, + color: Theme.of(ctx).colorScheme.error, + ), + title: Text( + t.bookmarks.bookmarkOptions.delete, + style: TextStyle(color: Theme.of(ctx).colorScheme.error), + ), + onTap: () { + Navigator.pop(ctx); + onDelete(bookmark); + }, + ), + ], + ), + ), + ); + } + @override Widget build(BuildContext context, WidgetRef ref) { - return ContextMenuWidget( - menuProvider: (request) => Menu( - children: [ - MenuAction( - callback: () => Future.delayed(_durationTime).then((value) => onReadUnread(bookmark)), - title: bookmark.unread == true - ? t.bookmarks.bookmarkOptions.markAsRead - : t.bookmarks.bookmarkOptions.markAsUnread, - image: MenuImage.icon( - bookmark.unread == true ? Icons.mark_email_read_rounded : Icons.mark_as_unread_rounded, - ), - ), - MenuAction( - callback: () => Future.delayed(_durationTime).then((value) => onArchiveUnarchive(bookmark)), - title: bookmark.isArchived == true - ? t.bookmarks.bookmarkOptions.unarchive - : t.bookmarks.bookmarkOptions.archive, - image: MenuImage.icon( - bookmark.isArchived == true ? Icons.unarchive_rounded : Icons.archive_rounded, - ), - ), - Menu( - title: t.bookmarks.bookmarkOptions.shareOptions, - image: MenuImage.icon(Icons.share_rounded), - children: [ - MenuAction( - callback: () => Future.delayed(_durationTime).then((value) => onShareInternally(bookmark)), - title: bookmark.shared == true - ? t.bookmarks.bookmarkOptions.unshareInternally - : t.bookmarks.bookmarkOptions.shareInternally, - image: MenuImage.icon(Icons.input_rounded), - ), - MenuAction( - callback: () { - final box = context.findRenderObject() as RenderBox?; - Future.delayed(_durationTime).then( - (value) => Share.share( - bookmark.url!, - sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, - ), - ); - }, - title: t.bookmarks.bookmarkOptions.shareThirdPartyApp, - image: MenuImage.icon(Icons.output_rounded), - ), - ], - ), - MenuSeparator(), - MenuAction( - callback: () => Future.delayed(_durationTime).then((value) => onEdit(bookmark)), - title: t.bookmarks.bookmarkOptions.edit, - image: MenuImage.icon(Icons.edit_rounded), - ), - MenuAction( - callback: () => Future.delayed(_durationTime).then((value) => onDelete(bookmark)), - title: t.bookmarks.bookmarkOptions.delete, - image: MenuImage.icon(Icons.delete_rounded), - attributes: const MenuActionAttributes(destructive: true), - ), - ], - ), + return GestureDetector( + onLongPress: () => _showBottomSheet(context), child: child, ); } diff --git a/pubspec.lock b/pubspec.lock index d8a4d02..7a33a16 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -29,10 +29,10 @@ packages: dependency: "direct main" description: name: animations - sha256: "18938cefd7dcc04e1ecac0db78973761a01e4bc2d6bfae0cfa596bfeac9e96ab" + sha256: "9cb469212ea51be27097f23b519d594c01171721347b55df9334fff653659e7f" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" ansicolor: dependency: transitive description: @@ -61,10 +61,10 @@ packages: dependency: transitive description: name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.13.1" boolean_selector: dependency: transitive description: @@ -133,10 +133,10 @@ packages: dependency: transitive description: name: built_value - sha256: "6ae8a6435a8c6520c7077b107e77f1fb4ba7009633259a4d49a8afd8e7efc5e9" + sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56" url: "https://pub.dev" source: hosted - version: "8.12.4" + version: "8.12.6" characters: dependency: transitive description: @@ -237,26 +237,26 @@ packages: dependency: "direct main" description: name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" url: "https://pub.dev" source: hosted - version: "1.0.8" + version: "1.0.9" custom_lint: dependency: "direct dev" description: name: custom_lint - sha256: "9656925637516c5cf0f5da018b33df94025af2088fe09c8ae2ca54c53f2d9a84" + sha256: "409c485fd14f544af1da965d5a0d160ee57cd58b63eeaa7280a4f28cf5bda7f1" url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.5" custom_lint_builder: dependency: transitive description: name: custom_lint_builder - sha256: "6cdc8e87e51baaaba9c43e283ed8d28e59a0c4732279df62f66f7b5984655414" + sha256: "107e0a43606138015777590ee8ce32f26ba7415c25b722ff0908a6f5d7a4c228" url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.5" custom_lint_core: dependency: transitive description: @@ -281,22 +281,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.1" - device_info_plus: - dependency: transitive - description: - name: device_info_plus - sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" - url: "https://pub.dev" - source: hosted - version: "11.5.0" - device_info_plus_platform_interface: - dependency: transitive - description: - name: device_info_plus_platform_interface - sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f - url: "https://pub.dev" - source: hosted - version: "7.0.3" dio: dependency: "direct main" description: @@ -410,10 +394,10 @@ packages: dependency: "direct main" description: name: flutter_dotenv - sha256: d4130c4a43e0b13fefc593bc3961f2cb46e30cb79e253d4a526b1b5d24ae1ce4 + sha256: d41da11fb497314fbf89811ec30af02d1d898b47980a129f0a8c0a1720460ba2 url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.0.1" flutter_hooks: dependency: "direct main" description: @@ -459,23 +443,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.6.1" - flutter_split_view: - dependency: "direct main" - description: - path: "." - ref: master-alt - resolved-ref: a6aa2419243cc0abccf9474ce340790d6c0ded6f - url: "https://github.com/JGeek00/flutter_split_view" - source: git - version: "0.1.2" flutter_svg: dependency: "direct main" description: name: flutter_svg - sha256: "1ded017b39c8e15c8948ea855070a5ff8ff8b3d5e83f3446e02d6bb12add7ad9" + sha256: "35882981abcbfb8c15b286f0cd690ff25bac12d95eff3e25ee207f37d4c42e7f" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.3.0" flutter_test: dependency: "direct dev" description: flutter @@ -514,10 +489,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "7974313e217a7771557add6ff2238acb63f635317c35fa590d348fb238f00896" + sha256: "92d8cee7c57dff0a6c409c05597b460002434eccf7424a712283225b3962d03f" url: "https://pub.dev" source: hosted - version: "17.1.0" + version: "17.2.3" graphs: dependency: transitive description: @@ -530,10 +505,10 @@ packages: dependency: transitive description: name: hooks - sha256: e79ed1e8e1929bc6ecb6ec85f0cb519c887aa5b423705ded0d0f2d9226def388 + sha256: "025f060e86d2d4c3c47b56e33caf7f93bf9283340f26d23424ebcfccf34f621e" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.3" hooks_riverpod: dependency: "direct main" description: @@ -546,10 +521,10 @@ packages: dependency: transitive description: name: hotreloader - sha256: bc167a1163807b03bada490bfe2df25b0d744df359227880220a5cbd04e5734b + sha256: "66871df468fc24eee81f1a0a7cb98acc104716f9b7376d355437b48d633c4ebf" url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.4.0" html: dependency: transitive description: @@ -606,22 +581,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" - irondash_engine_context: - dependency: transitive - description: - name: irondash_engine_context - sha256: "2bb0bc13dfda9f5aaef8dde06ecc5feb1379f5bb387d59716d799554f3f305d7" - url: "https://pub.dev" - source: hosted - version: "0.5.5" - irondash_message_channel: - dependency: transitive - description: - name: irondash_message_channel - sha256: b4101669776509c76133b8917ab8cfc704d3ad92a8c450b92934dd8884a2f060 - url: "https://pub.dev" - source: hosted - version: "0.7.0" jni: dependency: transitive description: @@ -754,10 +713,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" + sha256: "468c26b4254ab01979fa5e4a98cb343ea3631b9acee6f21028997419a80e1a20" url: "https://pub.dev" source: hosted - version: "8.3.1" + version: "9.0.1" package_info_plus_platform_interface: dependency: transitive description: @@ -794,10 +753,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e + sha256: "149441ca6e4f38193b2e004c0ca6376a3d11f51fa5a77552d8bd4d2b0c0912ba" url: "https://pub.dev" source: hosted - version: "2.2.22" + version: "2.2.23" path_provider_foundation: dependency: transitive description: @@ -838,14 +797,6 @@ packages: url: "https://pub.dev" source: hosted version: "7.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: @@ -894,6 +845,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.0" + record_use: + dependency: transitive + description: + name: record_use + sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + url: "https://pub.dev" + source: hosted + version: "0.6.0" riverpod: dependency: transitive description: @@ -954,18 +913,18 @@ packages: dependency: transitive description: name: sentry - sha256: a49b4fb1cba576fe216347dc2a0e6d76076fb998e6012857db96f991c23b7b3c + sha256: f04095a25ff02b202a914174c73ec309570aa93d61098cb4a0a9e715b4aaa465 url: "https://pub.dev" source: hosted - version: "9.15.0" + version: "9.20.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: "25150030c93bd1d4b727ab61cfb09e99121c69ce90fa820bb9ca16dab433e43a" + sha256: "4f0a914d8c37e5015d7b86dd42b92dd265948fd31875b43e62ddfc2e7bea0e41" url: "https://pub.dev" source: hosted - version: "9.15.0" + version: "9.20.0" serial_csv: dependency: transitive description: @@ -978,10 +937,10 @@ packages: dependency: "direct main" description: name: share_plus - sha256: d7dc0630a923883c6328ca31b89aa682bacbf2f8304162d29f7c6aaff03a27a1 + sha256: "223873d106614442ea6f20db5a038685cc5b32a2fba81cdecaefbbae0523f7fa" url: "https://pub.dev" source: hosted - version: "11.1.0" + version: "12.0.2" share_plus_platform_interface: dependency: transitive description: @@ -994,18 +953,18 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" + sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.5" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8374d6200ab33ac99031a852eba4c8eb2170c4bf20778b3e2c9eccb45384fb41" + sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 url: "https://pub.dev" source: hosted - version: "2.4.21" + version: "2.4.23" shared_preferences_foundation: dependency: transitive description: @@ -1026,10 +985,10 @@ packages: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" shared_preferences_web: dependency: transitive description: @@ -1163,22 +1122,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" - super_context_menu: - dependency: "direct main" - description: - name: super_context_menu - sha256: "44570d342bea2381c57520f181016207c0ffde401f05f641e6dfec495fa728fe" - url: "https://pub.dev" - source: hosted - version: "0.9.1" - super_native_extensions: - dependency: transitive - description: - name: super_native_extensions - sha256: b9611dcb68f1047d6f3ef11af25e4e68a21b1a705bbcc3eb8cb4e9f5c3148569 - url: "https://pub.dev" - source: hosted - version: "0.9.1" term_glyph: dependency: transitive description: @@ -1231,10 +1174,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" + sha256: "3bb000251e55d4a209aa0e2e563309dc9bb2befea2295fd0cec1f51760aac572" url: "https://pub.dev" source: hosted - version: "6.3.28" + version: "6.3.29" url_launcher_ios: dependency: transitive description: @@ -1271,10 +1214,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f + sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.3" url_launcher_windows: dependency: transitive description: @@ -1295,10 +1238,10 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "7076216a10d5c390315fbe536a30f1254c341e7543e6c4c8a815e591307772b1" + sha256: "4d35a36400983c3457c289d4d553b5308f506ea84f7e51c7a564651b5525209a" url: "https://pub.dev" source: hosted - version: "1.1.20" + version: "1.2.1" vector_graphics_codec: dependency: transitive description: @@ -1311,10 +1254,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: "5a88dd14c0954a5398af544651c7fb51b457a2a556949bfb25369b210ef73a74" + sha256: "98e7e94de127b46a86ef46197fff84ff99f3d3b80a708390d717ad731efef598" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.2" vector_math: dependency: transitive description: @@ -1327,10 +1270,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" url: "https://pub.dev" source: hosted - version: "15.0.2" + version: "15.2.0" watcher: dependency: transitive description: @@ -1375,26 +1318,26 @@ packages: dependency: transitive description: name: webview_flutter_android - sha256: "2a03df01df2fd30b075d1e7f24c28aee593f2e5d5ac4c3c4283c5eda63717b24" + sha256: ad5182eff9a550925330cb9f0cb038eddfdd5712aba8b77aa0f0400e50f6e688 url: "https://pub.dev" source: hosted - version: "4.10.13" + version: "4.12.0" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - sha256: "63d26ee3aca7256a83ccb576a50272edd7cfc80573a4305caa98985feb493ee0" + sha256: "1221c1b12f5278791042f2ec2841743784cf25c5a644e23d6680e5d718824f04" url: "https://pub.dev" source: hosted - version: "2.14.0" + version: "2.15.1" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "2df8fd9ada04d699b9db8e79aa783a16e5d89b69e5b74009b87e16b59912cf98" + sha256: "82648217f537573e1ca9ae9952d3eacedca6ab5aee69dc84445fc763766dcea2" url: "https://pub.dev" source: hosted - version: "3.24.0" + version: "3.25.1" win32: dependency: transitive description: @@ -1403,14 +1346,6 @@ packages: url: "https://pub.dev" source: hosted version: "5.15.0" - win32_registry: - dependency: transitive - description: - name: win32_registry - sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" - url: "https://pub.dev" - source: hosted - version: "2.1.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 2a4e392..60e5da0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,22 +33,22 @@ dependencies: flutter_localizations: sdk: flutter cupertino_icons: ^1.0.8 - flutter_riverpod: ^2.6.1 + flutter_riverpod: 2.6.1 go_router: ^17.0.0 - riverpod_annotation: ^2.6.1 + riverpod_annotation: 2.6.1 dynamic_color: ^1.8.1 shared_preferences: ^2.5.3 url_launcher: ^6.3.2 animations: ^2.1.1 - segmented_button_slide: ^1.0.4 + segmented_button_slide: 1.0.4 dio: ^5.9.0 uuid: ^4.5.2 slang: ^4.7.2 slang_flutter: ^4.7.0 flutter_svg: ^2.2.3 flutter_custom_tabs: ^2.4.0 - share_plus: ^11.0.0 - package_info_plus: ^8.3.0 + share_plus: ^12.0.2 + package_info_plus: ^9.0.1 easy_autocomplete: ^1.6.0 sentry_flutter: ^9.8.0 flutter_dotenv: ^6.0.0 @@ -56,23 +56,18 @@ dependencies: http: ^1.6.0 webview_flutter: ^4.13.0 flutter_hooks: ^0.21.2 - hooks_riverpod: ^2.6.1 - flutter_split_view: - git: - url: https://github.com/JGeek00/flutter_split_view - ref: master-alt - super_context_menu: ^0.9.1 + hooks_riverpod: 2.6.1 listen_sharing_intent: ^1.9.2 slideable: ^0.0.3 dev_dependencies: build_runner: ^2.5.1 - custom_lint: ^0.7.5 + custom_lint: 0.7.5 flutter_lints: ^6.0.0 flutter_test: sdk: flutter - riverpod_generator: ^2.6.5 - riverpod_lint: ^2.6.5 + riverpod_generator: 2.6.5 + riverpod_lint: 2.6.5 slang_build_runner: ^4.7.0 flutter_native_splash: ^2.4.6 flutter_launcher_icons: ^0.14.4