From a1ca45c2b9677175deec8960d2e4ed3ded85aebb Mon Sep 17 00:00:00 2001 From: otsmr Date: Wed, 13 May 2026 13:41:50 +0200 Subject: [PATCH] fix shortcut ordering --- lib/src/database/daos/shortcuts.dao.dart | 6 +- .../callback_dispatcher.background.dart | 7 +- lib/src/services/flame.service.dart | 30 +++-- .../shortcut_row.comp.dart | 103 ++++++++++++------ 4 files changed, 87 insertions(+), 59 deletions(-) diff --git a/lib/src/database/daos/shortcuts.dao.dart b/lib/src/database/daos/shortcuts.dao.dart index 60352143..66938956 100644 --- a/lib/src/database/daos/shortcuts.dao.dart +++ b/lib/src/database/daos/shortcuts.dao.dart @@ -14,11 +14,7 @@ class ShortcutsDao extends DatabaseAccessor with _$ShortcutsDaoMixin { ShortcutsDao(super.db); Stream> watchAllShortcuts() { - return (select(shortcuts)..orderBy([ - (t) => - OrderingTerm(expression: t.usageCounter, mode: OrderingMode.desc), - ])) - .watch(); + return select(shortcuts).watch(); } Future getShortcutByEmoji(String emoji) { diff --git a/lib/src/services/background/callback_dispatcher.background.dart b/lib/src/services/background/callback_dispatcher.background.dart index 2e518128..3b689615 100644 --- a/lib/src/services/background/callback_dispatcher.background.dart +++ b/lib/src/services/background/callback_dispatcher.background.dart @@ -37,11 +37,12 @@ void callbackDispatcher() { await AppEnvironment.init(); switch (task) { case 'eu.twonly.periodic_task': - // if (await initBackgroundExecution()) { - // await handlePeriodicTask(); - // } + // if (await initBackgroundExecution()) { + // await handlePeriodicTask(); + // } break; case 'eu.twonly.processing_task': + case _ when task.startsWith('progressing_finish_uploads_'): if (await initBackgroundExecution()) { await handleProcessingTask(); } diff --git a/lib/src/services/flame.service.dart b/lib/src/services/flame.service.dart index 75c40db8..1c86b101 100644 --- a/lib/src/services/flame.service.dart +++ b/lib/src/services/flame.service.dart @@ -96,23 +96,21 @@ Future incFlameCounter( final group = await twonlyDB.groupsDao.getGroup(groupId); if (group == null) return; - if (group.isDirectChat) { - final contacts = await twonlyDB.groupsDao.getGroupContact( - group.groupId, - ); - for (final contact in contacts) { - await twonlyDB.contactsDao.updateContact( - contact.userId, - ContactsCompanion( - mediaReceivedCounter: Value( - contacts.first.mediaReceivedCounter + (received ? 1 : 0), - ), - mediaSendCounter: Value( - contacts.first.mediaSendCounter + (received ? 0 : 1), - ), + final contacts = await twonlyDB.groupsDao.getGroupContact( + group.groupId, + ); + for (final contact in contacts) { + await twonlyDB.contactsDao.updateContact( + contact.userId, + ContactsCompanion( + mediaReceivedCounter: Value( + contacts.first.mediaReceivedCounter + (received ? 1 : 0), ), - ); - } + mediaSendCounter: Value( + contacts.first.mediaSendCounter + (received ? 0 : 1), + ), + ), + ); } final totalMediaCounter = group.totalMediaCounter + 1; diff --git a/lib/src/visual/views/camera/share_image_contact_selection_components/shortcut_row.comp.dart b/lib/src/visual/views/camera/share_image_contact_selection_components/shortcut_row.comp.dart index 4da1a065..101094a1 100644 --- a/lib/src/visual/views/camera/share_image_contact_selection_components/shortcut_row.comp.dart +++ b/lib/src/visual/views/camera/share_image_contact_selection_components/shortcut_row.comp.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:collection'; import 'package:flutter/material.dart'; import 'package:twonly/locator.dart'; @@ -20,6 +21,41 @@ class ShortcutRowComp extends StatefulWidget { } class _ShortcutRowCompState extends State { + List _shortcuts = []; + late StreamSubscription> shortcutSub; + + @override + void initState() { + super.initState(); + unawaited(initAsync()); + } + + Future initAsync() async { + shortcutSub = twonlyDB.shortcutsDao.watchAllShortcuts().listen((shortcuts) { + if (_shortcuts.isEmpty) { + shortcuts.sort((a, b) => b.usageCounter.compareTo(a.usageCounter)); + _shortcuts = shortcuts; + } else { + final map = {for (final s in shortcuts) s.id: s}; + final updated = []; + for (final old in _shortcuts) { + if (map.containsKey(old.id)) { + updated.add(map.remove(old.id)!); + } + } + updated.addAll(map.values); + _shortcuts = updated; + } + if (mounted) setState(() {}); + }); + } + + @override + void dispose() { + unawaited(shortcutSub.cancel()); + super.dispose(); + } + Future _openCreateDialog() async { await context.navPush(const AddNewShortcutView()); } @@ -27,6 +63,9 @@ class _ShortcutRowCompState extends State { Future _applyShortcut(Shortcut shortcut) async { await twonlyDB.shortcutsDao.incrementUsage(shortcut.id); final members = await twonlyDB.shortcutsDao.getShortcutMembers(shortcut.id); + for (final groupId in widget.selectedGroupIds.toList()) { + widget.updateSelectedGroupIds(groupId, false); + } for (final m in members) { widget.updateSelectedGroupIds(m.groupId, true); } @@ -36,46 +75,40 @@ class _ShortcutRowCompState extends State { Widget build(BuildContext context) { return SizedBox( height: 40, - child: StreamBuilder>( - stream: twonlyDB.shortcutsDao.watchAllShortcuts(), - builder: (context, snapshot) { - final shortcuts = snapshot.data ?? []; - return ListView( - scrollDirection: Axis.horizontal, + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + Row( children: [ - Row( - children: [ - ActionChip( + ActionChip( + padding: EdgeInsets.zero, + onPressed: _openCreateDialog, + label: _shortcuts.isEmpty + ? Text( + context.lang.createShortcut, + style: const TextStyle(fontSize: 9), + ) + : const Icon(Icons.add_reaction_outlined, size: 20), + shape: const StadiumBorder(), + ), + for (final shortcut in _shortcuts) + GestureDetector( + onLongPress: () { + context.navPush(AddNewShortcutView(shortcut: shortcut)); + }, + child: ActionChip( padding: EdgeInsets.zero, - onPressed: _openCreateDialog, - label: shortcuts.isEmpty - ? Text( - context.lang.createShortcut, - style: const TextStyle(fontSize: 9), - ) - : const Icon(Icons.add_reaction_outlined, size: 20), + onPressed: () => _applyShortcut(shortcut), + label: Text( + shortcut.emoji, + style: const TextStyle(fontSize: 18), + ), shape: const StadiumBorder(), ), - for (final shortcut in shortcuts) - GestureDetector( - onLongPress: () { - context.navPush(AddNewShortcutView(shortcut: shortcut)); - }, - child: ActionChip( - padding: EdgeInsets.zero, - onPressed: () => _applyShortcut(shortcut), - label: Text( - shortcut.emoji, - style: const TextStyle(fontSize: 18), - ), - shape: const StadiumBorder(), - ), - ), - ], - ), + ), ], - ); - }, + ), + ], ), ); }