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