From e3ff9408c6067f181d7bb428ff27120ee85d812e Mon Sep 17 00:00:00 2001 From: Collin Bartlam Date: Wed, 18 Feb 2026 00:59:51 -0500 Subject: [PATCH 1/4] Sidebar organization implementation --- commet/lib/client/client_manager.dart | 6 + .../client/sidebar/resolved_sidebar_item.dart | 24 + commet/lib/client/sidebar/sidebar_data.dart | 61 ++ .../lib/client/sidebar/sidebar_manager.dart | 411 +++++++++++ commet/lib/client/sidebar/sidebar_model.dart | 28 + .../client/sidebar/sidebar_persistence.dart | 30 + commet/lib/ui/atoms/folder_icon.dart | 157 +++++ .../molecules/draggable_space_selector.dart | 658 ++++++++++++++++++ .../side_navigation_bar.dart | 54 +- pubspec.lock | 84 +-- 10 files changed, 1421 insertions(+), 92 deletions(-) create mode 100644 commet/lib/client/sidebar/resolved_sidebar_item.dart create mode 100644 commet/lib/client/sidebar/sidebar_data.dart create mode 100644 commet/lib/client/sidebar/sidebar_manager.dart create mode 100644 commet/lib/client/sidebar/sidebar_model.dart create mode 100644 commet/lib/client/sidebar/sidebar_persistence.dart create mode 100644 commet/lib/ui/atoms/folder_icon.dart create mode 100644 commet/lib/ui/molecules/draggable_space_selector.dart diff --git a/commet/lib/client/client_manager.dart b/commet/lib/client/client_manager.dart index 454ebd719..618b718cd 100644 --- a/commet/lib/client/client_manager.dart +++ b/commet/lib/client/client_manager.dart @@ -9,6 +9,7 @@ import 'package:commet/client/matrix/matrix_client.dart'; import 'package:commet/client/stale_info.dart'; import 'package:commet/client/tasks/client_connection_status_task.dart'; import 'package:commet/main.dart'; +import 'package:commet/client/sidebar/sidebar_manager.dart'; import 'package:commet/utils/notifying_list.dart'; class ClientManager { @@ -22,10 +23,12 @@ class ClientManager { late CallManager callManager; late final DirectMessagesAggregator directMessages; + late final SidebarManager sidebarManager; ClientManager() { directMessages = DirectMessagesAggregator(this); callManager = CallManager(this); + sidebarManager = SidebarManager(this); } List get rooms => _rooms; @@ -99,6 +102,8 @@ class ClientManager { isBackgroundService: isBackgroundService), ]); + newClientManager.sidebarManager.init(); + return newClientManager; } @@ -229,6 +234,7 @@ class ClientManager { } Future close() async { + sidebarManager.dispose(); for (var client in _clients.values) { client.close(); } diff --git a/commet/lib/client/sidebar/resolved_sidebar_item.dart b/commet/lib/client/sidebar/resolved_sidebar_item.dart new file mode 100644 index 000000000..8a197f023 --- /dev/null +++ b/commet/lib/client/sidebar/resolved_sidebar_item.dart @@ -0,0 +1,24 @@ +import 'package:commet/client/client.dart'; + +sealed class ResolvedSidebarItem { + const ResolvedSidebarItem(); +} + +class ResolvedSpace extends ResolvedSidebarItem { + final Space space; + const ResolvedSpace(this.space); +} + +class ResolvedFolder extends ResolvedSidebarItem { + final String id; + final String name; + final List spaces; + final bool isExpanded; + + const ResolvedFolder({ + required this.id, + required this.name, + required this.spaces, + this.isExpanded = false, + }); +} diff --git a/commet/lib/client/sidebar/sidebar_data.dart b/commet/lib/client/sidebar/sidebar_data.dart new file mode 100644 index 000000000..4a78e572d --- /dev/null +++ b/commet/lib/client/sidebar/sidebar_data.dart @@ -0,0 +1,61 @@ +import 'package:commet/client/sidebar/sidebar_model.dart'; + +class SidebarData { + static const String accountDataType = 'im.commet.space_sidebar'; + static const int currentVersion = 1; + + final int version; + final List items; + + const SidebarData({this.version = currentVersion, this.items = const []}); + + factory SidebarData.fromJson(Map json) { + final version = json['version'] as int? ?? currentVersion; + final rawItems = json['items'] as List? ?? []; + + final items = []; + for (final raw in rawItems) { + if (raw is! Map) continue; + + final type = raw['type'] as String?; + switch (type) { + case 'space': + final id = raw['id'] as String?; + if (id != null) items.add(SidebarSpace(id)); + break; + case 'folder': + final id = raw['id'] as String?; + final name = raw['name'] as String? ?? ''; + final children = (raw['children'] as List?) + ?.whereType() + .toList() ?? + []; + if (id != null && children.isNotEmpty) { + items.add(SidebarFolder(id: id, name: name, children: children)); + } + break; + } + } + + return SidebarData(version: version, items: items); + } + + Map toJson() { + return { + 'version': version, + 'items': items.map((item) { + return switch (item) { + SidebarSpace s => {'type': 'space', 'id': s.spaceId}, + SidebarFolder f => { + 'type': 'folder', + 'id': f.id, + 'name': f.name, + 'children': f.children, + }, + }; + }).toList(), + }; + } + + static SidebarData empty() => const SidebarData(); +} diff --git a/commet/lib/client/sidebar/sidebar_manager.dart b/commet/lib/client/sidebar/sidebar_manager.dart new file mode 100644 index 000000000..03667f08e --- /dev/null +++ b/commet/lib/client/sidebar/sidebar_manager.dart @@ -0,0 +1,411 @@ +import 'dart:async'; + +import 'package:commet/client/client.dart'; +import 'package:commet/client/client_manager.dart'; +import 'package:commet/client/sidebar/resolved_sidebar_item.dart'; +import 'package:commet/client/sidebar/sidebar_data.dart'; +import 'package:commet/client/sidebar/sidebar_model.dart'; +import 'package:commet/client/sidebar/sidebar_persistence.dart'; +import 'package:commet/utils/debounce.dart'; +import 'package:commet/utils/event_bus.dart'; +import 'package:uuid/uuid.dart'; + +class SidebarManager { + final ClientManager clientManager; + + List _rawItems = []; + List _resolvedItems = []; + final Set _expandedFolders = {}; + Client? _filterClient; + final Debouncer _persistDebouncer = + Debouncer(delay: const Duration(seconds: 2)); + + final List _subscriptions = []; + + List get items => _resolvedItems; + + final StreamController onSidebarChanged = + StreamController.broadcast(); + + SidebarManager(this.clientManager); + + void init() { + _loadFromAccountData(); + _resolve(); + + _subscriptions.addAll([ + clientManager.onSpaceAdded.listen((_) => _resolve()), + clientManager.onSpaceRemoved.listen((_) => _resolve()), + clientManager.onSync.stream.listen((_) => _checkAccountDataChanged()), + clientManager.onClientAdded.stream.listen((_) { + _loadFromAccountData(); + _resolve(); + }), + clientManager.onClientRemoved.stream.listen((_) => _resolve()), + EventBus.setFilterClient.stream.listen((client) { + _filterClient = client; + _resolve(); + }), + ]); + } + + void dispose() { + for (var sub in _subscriptions) { + sub.cancel(); + } + _persistDebouncer.cancel(); + onSidebarChanged.close(); + } + + void _loadFromAccountData() { + SidebarData? best; + int bestCount = -1; + + for (var client in clientManager.clients) { + var data = SidebarPersistence.readFromClient(client); + if (data.items.length > bestCount) { + best = data; + bestCount = data.items.length; + } + } + + _rawItems = List.from(best?.items ?? []); + } + + String? _lastAccountDataHash; + + void _checkAccountDataChanged() { + for (var client in clientManager.clients) { + var data = SidebarPersistence.readFromClient(client); + var hash = data.toJson().toString(); + if (_lastAccountDataHash == null) { + _lastAccountDataHash = hash; + return; + } + if (hash != _lastAccountDataHash) { + _lastAccountDataHash = hash; + _rawItems = List.from(data.items); + _resolve(); + return; + } + } + } + + void _resolve() { + final topLevelSpaces = clientManager.spaces + .where((s) => s.isTopLevel) + .where( + (s) => _filterClient == null || s.client == _filterClient) + .toList(); + + final spaceMap = {}; + for (var space in topLevelSpaces) { + spaceMap.putIfAbsent(space.identifier, () => space); + } + + final resolved = []; + final placedIds = {}; + + for (var item in _rawItems) { + switch (item) { + case SidebarSpace s: + final space = spaceMap[s.spaceId]; + if (space != null) { + resolved.add(ResolvedSpace(space)); + placedIds.add(s.spaceId); + } + break; + case SidebarFolder f: + final folderSpaces = []; + for (var childId in f.children) { + final space = spaceMap[childId]; + if (space != null) folderSpaces.add(space); + placedIds.add(childId); + } + + if (!folderSpaces.isEmpty) { + if (folderSpaces.length == 1) { + resolved.add(ResolvedSpace(folderSpaces.first)); + } else { + resolved.add(ResolvedFolder( + id: f.id, + name: f.name, + spaces: folderSpaces, + isExpanded: _expandedFolders.contains(f.id), + )); + } + } + break; + } + } + + final unplaced = topLevelSpaces + .where((s) => !placedIds.contains(s.identifier)) + .toList(); + + resolved.insertAll(0, unplaced.reversed.map((s) => ResolvedSpace(s))); + + _resolvedItems = resolved; + onSidebarChanged.add(null); + } + + void _debouncedPersist() { + _persistDebouncer.run(_persist); + } + + Future _persist() async { + final data = SidebarData(items: _rawItems); + _lastAccountDataHash = data.toJson().toString(); + await SidebarPersistence.writeToAllClients(clientManager.clients, data); + } + + void reorder(int oldIndex, int newIndex) { + final rawOld = _resolvedToRawIndex(oldIndex); + final rawNew = _resolvedToRawIndex(newIndex); + + if (rawOld == null) { + final item = _resolvedItems[oldIndex]; + if (item is! ResolvedSpace) return; + final spaceItem = SidebarSpace(item.space.identifier); + + if (rawNew != null) { + _rawItems.insert(rawNew, spaceItem); + } else { + _rawItems.add(spaceItem); + } + } else if (rawNew == null) { + final item = _rawItems.removeAt(rawOld); + _rawItems.insert(0, item); + } else { + final adjustedNew = rawNew > rawOld ? rawNew - 1 : rawNew; + final item = _rawItems.removeAt(rawOld); + _rawItems.insert(adjustedNew, item); + } + + _resolve(); + _debouncedPersist(); + } + + int? _resolvedToRawIndex(int resolvedIndex) { + if (resolvedIndex < 0 || resolvedIndex >= _resolvedItems.length) { + return _rawItems.length; + } + final resolved = _resolvedItems[resolvedIndex]; + switch (resolved) { + case ResolvedSpace s: + for (int i = 0; i < _rawItems.length; i++) { + final raw = _rawItems[i]; + if (raw is SidebarSpace && raw.spaceId == s.space.identifier) { + return i; + } + } + return null; + case ResolvedFolder f: + for (int i = 0; i < _rawItems.length; i++) { + final raw = _rawItems[i]; + if (raw is SidebarFolder && raw.id == f.id) return i; + } + return null; + } + } + + void createFolder( + String name, String spaceIdA, String spaceIdB, int insertIndex) { + final folderId = const Uuid().v4(); + + _rawItems.removeWhere((item) => + item is SidebarSpace && + (item.spaceId == spaceIdA || item.spaceId == spaceIdB)); + + _removeSpaceFromAnyFolder(spaceIdA); + _removeSpaceFromAnyFolder(spaceIdB); + + final folder = SidebarFolder( + id: folderId, + name: name, + children: [spaceIdA, spaceIdB], + ); + + final clampedIndex = insertIndex.clamp(0, _rawItems.length); + _rawItems.insert(clampedIndex, folder); + + _resolve(); + _debouncedPersist(); + } + + void addSpaceToFolder(String folderId, String spaceId) { + _rawItems + .removeWhere((item) => item is SidebarSpace && item.spaceId == spaceId); + + _removeSpaceFromAnyFolder(spaceId, exceptFolderId: folderId); + + for (int i = 0; i < _rawItems.length; i++) { + final item = _rawItems[i]; + if (item is SidebarFolder && item.id == folderId) { + if (!item.children.contains(spaceId)) { + _rawItems[i] = + item.copyWith(children: [...item.children, spaceId]); + } + break; + } + } + + _resolve(); + _debouncedPersist(); + } + + void addSpaceToFolderAt(String folderId, String spaceId, int index) { + _rawItems + .removeWhere((item) => item is SidebarSpace && item.spaceId == spaceId); + + _removeSpaceFromAnyFolder(spaceId, exceptFolderId: folderId); + + for (int i = 0; i < _rawItems.length; i++) { + final item = _rawItems[i]; + if (item is SidebarFolder && item.id == folderId) { + final children = List.from(item.children); + children.remove(spaceId); + final clampedIndex = index.clamp(0, children.length); + children.insert(clampedIndex, spaceId); + _rawItems[i] = item.copyWith(children: children); + break; + } + } + + _resolve(); + _debouncedPersist(); + } + + void _removeSpaceFromAnyFolder(String spaceId, {String? exceptFolderId}) { + for (int i = 0; i < _rawItems.length; i++) { + final item = _rawItems[i]; + if (item is SidebarFolder && + item.id != exceptFolderId && + item.children.contains(spaceId)) { + final newChildren = + item.children.where((c) => c != spaceId).toList(); + if (newChildren.length <= 1) { + _rawItems.removeAt(i); + for (var child in newChildren) { + _rawItems.insert(i, SidebarSpace(child)); + } + } else { + _rawItems[i] = item.copyWith(children: newChildren); + } + break; + } + } + } + + void removeSpaceFromFolder(String folderId, String spaceId) { + for (int i = 0; i < _rawItems.length; i++) { + final item = _rawItems[i]; + if (item is SidebarFolder && item.id == folderId) { + final newChildren = + item.children.where((c) => c != spaceId).toList(); + + if (newChildren.length <= 1) { + _rawItems.removeAt(i); + for (var child in newChildren) { + _rawItems.insert(i, SidebarSpace(child)); + } + } else { + _rawItems[i] = item.copyWith(children: newChildren); + } + + _rawItems.insert( + (i + 1).clamp(0, _rawItems.length), SidebarSpace(spaceId)); + break; + } + } + + _resolve(); + _debouncedPersist(); + } + + void moveSpaceOutOfFolder( + String folderId, String spaceId, int insertIndex) { + for (int i = 0; i < _rawItems.length; i++) { + final item = _rawItems[i]; + if (item is SidebarFolder && item.id == folderId) { + final newChildren = + item.children.where((c) => c != spaceId).toList(); + + if (newChildren.length <= 1) { + _rawItems.removeAt(i); + for (var child in newChildren) { + _rawItems.insert(i, SidebarSpace(child)); + } + } else { + _rawItems[i] = item.copyWith(children: newChildren); + } + break; + } + } + + final clampedIndex = insertIndex.clamp(0, _rawItems.length); + _rawItems.insert(clampedIndex, SidebarSpace(spaceId)); + + _resolve(); + _debouncedPersist(); + } + + void renameFolder(String folderId, String newName) { + for (int i = 0; i < _rawItems.length; i++) { + final item = _rawItems[i]; + if (item is SidebarFolder && item.id == folderId) { + _rawItems[i] = item.copyWith(name: newName); + break; + } + } + + _resolve(); + _debouncedPersist(); + } + + void ungroupFolder(String folderId) { + for (int i = 0; i < _rawItems.length; i++) { + final item = _rawItems[i]; + if (item is SidebarFolder && item.id == folderId) { + _rawItems.removeAt(i); + for (int j = 0; j < item.children.length; j++) { + _rawItems.insert(i + j, SidebarSpace(item.children[j])); + } + break; + } + } + + _expandedFolders.remove(folderId); + _resolve(); + _debouncedPersist(); + } + + void reorderWithinFolder(String folderId, int oldIndex, int newIndex) { + for (int i = 0; i < _rawItems.length; i++) { + final item = _rawItems[i]; + if (item is SidebarFolder && item.id == folderId) { + final children = List.from(item.children); + if (oldIndex < 0 || + oldIndex >= children.length || + newIndex < 0 || + newIndex >= children.length) return; + final moved = children.removeAt(oldIndex); + children.insert(newIndex, moved); + _rawItems[i] = item.copyWith(children: children); + break; + } + } + + _resolve(); + _debouncedPersist(); + } + + void toggleFolder(String folderId) { + if (_expandedFolders.contains(folderId)) { + _expandedFolders.remove(folderId); + } else { + _expandedFolders.add(folderId); + } + _resolve(); + } +} diff --git a/commet/lib/client/sidebar/sidebar_model.dart b/commet/lib/client/sidebar/sidebar_model.dart new file mode 100644 index 000000000..41ec92d2a --- /dev/null +++ b/commet/lib/client/sidebar/sidebar_model.dart @@ -0,0 +1,28 @@ +sealed class SidebarItem { + const SidebarItem(); +} + +class SidebarSpace extends SidebarItem { + final String spaceId; + const SidebarSpace(this.spaceId); +} + +class SidebarFolder extends SidebarItem { + final String id; + final String name; + final List children; + + const SidebarFolder({ + required this.id, + required this.name, + required this.children, + }); + + SidebarFolder copyWith({String? name, List? children}) { + return SidebarFolder( + id: id, + name: name ?? this.name, + children: children ?? this.children, + ); + } +} diff --git a/commet/lib/client/sidebar/sidebar_persistence.dart b/commet/lib/client/sidebar/sidebar_persistence.dart new file mode 100644 index 000000000..ef0950981 --- /dev/null +++ b/commet/lib/client/sidebar/sidebar_persistence.dart @@ -0,0 +1,30 @@ +import 'package:commet/client/client.dart'; +import 'package:commet/client/matrix/matrix_client.dart'; +import 'package:commet/client/sidebar/sidebar_data.dart'; + +class SidebarPersistence { + static SidebarData readFromClient(Client client) { + if (client is! MatrixClient) return SidebarData.empty(); + var data = + client.matrixClient.accountData[SidebarData.accountDataType]; + if (data == null) return SidebarData.empty(); + return SidebarData.fromJson(data.content); + } + + static Future writeToClient( + Client client, SidebarData data) async { + if (client is! MatrixClient) return; + await client.matrixClient.setAccountData( + client.matrixClient.userID!, + SidebarData.accountDataType, + data.toJson(), + ); + } + + static Future writeToAllClients( + List clients, SidebarData data) async { + await Future.wait( + clients.map((client) => writeToClient(client, data)), + ); + } +} diff --git a/commet/lib/ui/atoms/folder_icon.dart b/commet/lib/ui/atoms/folder_icon.dart new file mode 100644 index 000000000..a548a78b3 --- /dev/null +++ b/commet/lib/ui/atoms/folder_icon.dart @@ -0,0 +1,157 @@ +import 'package:commet/client/client.dart'; +import 'package:commet/config/layout_config.dart'; +import 'package:commet/ui/atoms/notification_badge.dart'; +import 'package:flutter/material.dart'; +import 'package:just_the_tooltip/just_the_tooltip.dart'; +import 'package:tiamat/tiamat.dart' as tiamat; + +class FolderIcon extends StatelessWidget { + const FolderIcon({ + super.key, + required this.name, + required this.spaces, + required this.isExpanded, + required this.onTap, + this.width = 70, + }); + + final String name; + final List spaces; + final bool isExpanded; + final VoidCallback onTap; + final double width; + + int get _highlightedNotificationCount => spaces.fold( + 0, (sum, s) => sum + s.displayHighlightedNotificationCount); + + @override + Widget build(BuildContext context) { + final iconSize = width - 14; + final radius = iconSize / 3.4; + final expandedWidth = width - 8; + + final container = AnimatedContainer( + duration: const Duration(milliseconds: 200), + width: isExpanded ? expandedWidth : iconSize, + height: iconSize, + decoration: BoxDecoration( + borderRadius: isExpanded + ? BorderRadius.vertical(top: Radius.circular(radius)) + : BorderRadius.circular(radius), + color: Theme.of(context).colorScheme.surfaceContainerHigh, + ), + clipBehavior: Clip.antiAlias, + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + child: isExpanded + ? _buildFolderOpenIcon(context, iconSize) + : _buildGrid(context, iconSize), + ), + ); + + Widget content = GestureDetector( + onTap: onTap, + child: SizedBox( + width: width, + height: iconSize + (isExpanded ? 2 : 4), + child: Padding( + padding: EdgeInsets.only(top: 2, bottom: isExpanded ? 0 : 2), + child: Center(child: container), + ), + ), + ); + + if (!Layout.mobile) { + content = JustTheTooltip( + content: Padding( + padding: const EdgeInsets.all(8.0), + child: tiamat.Text(name), + ), + preferredDirection: AxisDirection.right, + offset: 5, + tailLength: 5, + tailBaseWidth: 5, + backgroundColor: + Theme.of(context).colorScheme.surfaceContainerLowest, + child: content, + ); + } + + return Stack(children: [ + content, + if (_highlightedNotificationCount > 0) + Positioned( + right: 0, + top: 0, + child: SizedBox( + width: 20, + height: 20, + child: NotificationBadge(_highlightedNotificationCount), + ), + ), + ]); + } + + Widget _buildFolderOpenIcon(BuildContext context, double size) { + return SizedBox( + key: const ValueKey('folder_open'), + width: size, + height: size, + child: Icon( + Icons.folder_open, + size: size * 0.5, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ); + } + + Widget _buildGrid(BuildContext context, double size) { + final displaySpaces = spaces.take(4).toList(); + final cellSize = (size - 6) / 2; + + return SizedBox( + key: const ValueKey('grid'), + child: Padding( + padding: const EdgeInsets.all(2), + child: Wrap( + spacing: 2, + runSpacing: 2, + children: [ + for (var space in displaySpaces) + SizedBox( + width: cellSize, + height: cellSize, + child: ClipRRect( + borderRadius: BorderRadius.circular(4), + child: space.avatar != null + ? Image( + image: space.avatar!, + fit: BoxFit.cover, + ) + : tiamat.Avatar( + radius: cellSize / 2, + placeholderColor: space.color, + placeholderText: space.displayName, + ), + ), + ), + for (var i = displaySpaces.length; i < 4; i++) + SizedBox( + width: cellSize, + height: cellSize, + child: DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + color: Theme.of(context) + .colorScheme + .surfaceContainerHighest + .withValues(alpha: 0.3), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/commet/lib/ui/molecules/draggable_space_selector.dart b/commet/lib/ui/molecules/draggable_space_selector.dart new file mode 100644 index 000000000..ba79f4590 --- /dev/null +++ b/commet/lib/ui/molecules/draggable_space_selector.dart @@ -0,0 +1,658 @@ +import 'dart:async'; + +import 'package:commet/client/client.dart'; +import 'package:commet/client/sidebar/resolved_sidebar_item.dart'; +import 'package:commet/client/sidebar/sidebar_manager.dart'; +import 'package:commet/config/build_config.dart'; +import 'package:commet/config/layout_config.dart'; +import 'package:commet/ui/atoms/dot_indicator.dart'; +import 'package:commet/ui/atoms/folder_icon.dart'; +import 'package:commet/ui/atoms/space_icon.dart'; +import 'package:commet/ui/molecules/space_selector.dart'; +import 'package:commet/ui/atoms/adaptive_context_menu.dart'; +import 'package:commet/utils/scaled_app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; +import 'package:tiamat/tiamat.dart' as tiamat; + +class SidebarDragData { + final String? spaceId; + final String? folderId; + final String? fromFolderId; + final int sourceIndex; + + const SidebarDragData({ + this.spaceId, + this.folderId, + this.fromFolderId, + required this.sourceIndex, + }); + + bool get isDraggingFolder => folderId != null; + bool get isDraggingSpace => spaceId != null; +} + +class DraggableSpaceSelector extends StatefulWidget { + const DraggableSpaceSelector( + this.items, { + super.key, + required this.width, + required this.sidebarManager, + this.onSpaceSelected, + this.clearSelection, + this.shouldShowAvatarForSpace, + this.header, + this.footer, + }); + + final List items; + final double width; + final SidebarManager sidebarManager; + final void Function(Space space)? onSpaceSelected; + final void Function()? clearSelection; + final bool Function(Space space)? shouldShowAvatarForSpace; + final Widget? header; + final Widget? footer; + + @override + State createState() => + _DraggableSpaceSelectorState(); +} + +class _DraggableSpaceSelectorState extends State { + String get _promptCreateFolder => Intl.message("Create Folder", + name: "promptCreateFolder", desc: "Title for create folder dialog"); + + String get _promptRenameFolder => Intl.message("Rename Folder", + name: "promptRenameFolder", desc: "Title for rename folder dialog"); + + String get _promptFolderName => Intl.message("Folder name", + name: "promptFolderName", desc: "Hint text for folder name input"); + + String get _promptRename => Intl.message("Rename", + name: "promptRename", desc: "Button label to rename"); + + String get _promptCreate => Intl.message("Create", + name: "promptCreate", desc: "Button label to create"); + + String get _promptCancel => Intl.message("Cancel", + name: "promptCancel", desc: "Button label to cancel"); + + String get _promptUngroup => Intl.message("Ungroup", + name: "promptUngroup", desc: "Context menu option to ungroup a folder"); + + String get _promptRemoveFromFolder => Intl.message("Remove from folder", + name: "promptRemoveFromFolder", + desc: "Context menu option to remove a space from a folder"); + + bool _isDragging = false; + double _dragDistance = 0; + Timer? _contextMenuTimer; + List? _pendingContextItems; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Flexible( + child: ScrollConfiguration( + behavior: + ScrollConfiguration.of(context).copyWith(scrollbars: false), + child: SingleChildScrollView( + physics: + BuildConfig.ANDROID ? const BouncingScrollPhysics() : null, + child: Padding( + padding: EdgeInsets.fromLTRB( + 0, 0, 0, MediaQuery.of(context).scale().padding.bottom), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (widget.header != null) + Padding( + padding: SpaceSelector.padding, + child: widget.header!, + ), + if (widget.header != null) const tiamat.Seperator(), + for (int i = 0; i < widget.items.length; i++) + _buildDragItem(i, widget.items[i]), + if (_isDragging) + _buildInsertionZone(widget.items.length), + if (widget.footer != null) + Padding( + padding: SpaceSelector.padding, + child: widget.footer!, + ), + ], + ), + ), + ), + ), + ), + ], + ); + } + + Widget _buildDragItem(int index, ResolvedSidebarItem item) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (_isDragging) _buildInsertionZone(index), + switch (item) { + ResolvedSpace s => _buildDraggableSpace(index, s), + ResolvedFolder f => _buildDraggableFolder(index, f), + }, + ], + ); + } + + Widget _buildInsertionZone(int insertIndex) { + return DragTarget( + onWillAcceptWithDetails: (_) => true, + onAcceptWithDetails: (details) { + _handleInsertionDrop(details.data, insertIndex); + }, + builder: (context, candidates, rejected) { + final isHovered = candidates.isNotEmpty; + return AnimatedContainer( + duration: const Duration(milliseconds: 150), + height: isHovered ? 8 : 4, + margin: SpaceSelector.padding, + decoration: isHovered + ? BoxDecoration( + color: Theme.of(context).colorScheme.primary, + borderRadius: BorderRadius.circular(2), + ) + : null, + ); + }, + ); + } + + Widget _buildFolderInsertionZone(String folderId, int insertIndex) { + return DragTarget( + onWillAcceptWithDetails: (details) => details.data.isDraggingSpace, + onAcceptWithDetails: (details) { + if (details.data.fromFolderId == folderId) { + widget.sidebarManager.reorderWithinFolder( + folderId, + details.data.sourceIndex, + insertIndex, + ); + } else { + widget.sidebarManager + .addSpaceToFolderAt(folderId, details.data.spaceId!, insertIndex); + } + }, + builder: (context, candidates, rejected) { + final isHovered = candidates.isNotEmpty; + return AnimatedContainer( + duration: const Duration(milliseconds: 150), + height: isHovered ? 6 : 2, + margin: const EdgeInsets.symmetric(horizontal: 4), + decoration: isHovered + ? BoxDecoration( + color: Theme.of(context).colorScheme.primary, + borderRadius: BorderRadius.circular(2), + ) + : null, + ); + }, + ); + } + + void _handleInsertionDrop(SidebarDragData data, int insertIndex) { + if (data.isDraggingFolder) { + widget.sidebarManager.reorder(data.sourceIndex, insertIndex); + } else if (data.fromFolderId != null) { + widget.sidebarManager + .moveSpaceOutOfFolder(data.fromFolderId!, data.spaceId!, insertIndex); + } else { + widget.sidebarManager.reorder(data.sourceIndex, insertIndex); + } + } + + Widget _buildDraggableSpace(int index, ResolvedSpace item, + {String? folderId, int? indexInFolder, double? widthOverride}) { + final dragData = SidebarDragData( + spaceId: item.space.identifier, + fromFolderId: folderId, + sourceIndex: folderId != null ? (indexInFolder ?? index) : index, + ); + final w = widthOverride ?? widget.width; + + Widget spaceIcon = _buildSpaceIconWidget(item.space, width: w); + + Widget content = folderId == null + ? DragTarget( + onWillAcceptWithDetails: (details) => + details.data.isDraggingSpace && + details.data.spaceId != item.space.identifier, + onAcceptWithDetails: (details) { + _showCreateFolderDialog(details.data, item, index); + }, + builder: (context, candidates, rejected) { + final isHovered = candidates.isNotEmpty; + Widget child = spaceIcon; + if (isHovered) { + child = Container( + decoration: BoxDecoration( + border: Border.all( + color: Theme.of(context).colorScheme.primary, + width: 2, + ), + borderRadius: BorderRadius.circular(12), + ), + child: child, + ); + } + return child; + }, + ) + : spaceIcon; + + final contextItems = [ + if (folderId != null) + tiamat.ContextMenuItem( + text: _promptRemoveFromFolder, + icon: Icons.folder_off, + onPressed: () => widget.sidebarManager + .removeSpaceFromFolder(folderId, item.space.identifier), + ), + ]; + + return _wrapDraggable( + dragData, + contextItems.isNotEmpty + ? AdaptiveContextMenu(items: contextItems, child: content) + : content, + avatar: item.space.avatar, + placeholderColor: item.space.color, + placeholderText: item.space.displayName, + ); + } + + Widget _buildSpaceIconWidget(Space space, {double? width}) { + final w = width ?? widget.width; + return Stack( + alignment: Alignment.centerLeft, + children: [ + Padding( + padding: SpaceSelector.padding, + child: Padding( + padding: const EdgeInsets.fromLTRB(0, 2, 0, 2), + child: SpaceIcon( + displayName: space.displayName, + onUpdate: space.onUpdate, + avatar: space.avatar, + userAvatar: space.client.self!.avatar, + spaceId: space.identifier, + userColor: space.client.self!.defaultColor, + userDisplayName: space.client.self!.displayName, + highlightedNotificationCount: + space.displayHighlightedNotificationCount, + notificationCount: space.displayNotificationCount, + width: w, + placeholderColor: space.color, + onTap: () { + widget.onSpaceSelected?.call(space); + }, + showUser: + widget.shouldShowAvatarForSpace?.call(space) ?? false, + ), + ), + ), + if (space.displayNotificationCount > 0) _messageOverlay(), + ], + ); + } + + Widget _wrapDraggable( + SidebarDragData data, + Widget child, { + ImageProvider? avatar, + Color? placeholderColor, + String? placeholderText, + Widget? customFeedback, + List? mobileContextItems, + }) { + final feedbackWidget = customFeedback ?? + Material( + color: Colors.transparent, + child: Opacity( + opacity: 0.8, + child: SizedBox( + width: 56, + height: 56, + child: tiamat.Avatar( + radius: 28, + image: avatar, + placeholderColor: placeholderColor, + placeholderText: placeholderText, + ), + ), + ), + ); + + void onDragStarted() { + HapticFeedback.mediumImpact(); + _dragDistance = 0; + _contextMenuTimer?.cancel(); + + if (!Layout.desktop && + mobileContextItems != null && + mobileContextItems.isNotEmpty) { + _pendingContextItems = mobileContextItems; + _contextMenuTimer = Timer(const Duration(milliseconds: 1200), () { + if (_dragDistance < 50 && _pendingContextItems != null) { + HapticFeedback.mediumImpact(); + _showMobileContextMenu(_pendingContextItems!); + _pendingContextItems = null; + } + }); + } + + setState(() => _isDragging = true); + } + + void onDragUpdate(DragUpdateDetails details) { + _dragDistance += details.delta.distance; + if (_dragDistance >= 50) { + _contextMenuTimer?.cancel(); + _contextMenuTimer = null; + _pendingContextItems = null; + } + } + + void onDragEnded(DraggableDetails details) { + final wasDragging = _isDragging; + setState(() => _isDragging = false); + _contextMenuTimer?.cancel(); + _contextMenuTimer = null; + + _pendingContextItems = null; + + if (!details.wasAccepted && + wasDragging && + data.fromFolderId != null && + data.spaceId != null) { + widget.sidebarManager + .removeSpaceFromFolder(data.fromFolderId!, data.spaceId!); + } + } + + if (Layout.desktop) { + return Draggable( + data: data, + feedback: feedbackWidget, + childWhenDragging: Opacity(opacity: 0.3, child: child), + onDragStarted: onDragStarted, + onDragUpdate: onDragUpdate, + onDragEnd: onDragEnded, + child: child, + ); + } else { + return LongPressDraggable( + data: data, + delay: const Duration(milliseconds: 300), + feedback: feedbackWidget, + childWhenDragging: Opacity(opacity: 0.3, child: child), + hapticFeedbackOnStart: true, + onDragStarted: onDragStarted, + onDragUpdate: onDragUpdate, + onDragEnd: onDragEnded, + child: child, + ); + } + } + + void _showMobileContextMenu(List items) { + showDialog( + context: context, + builder: (dialogContext) => AlertDialog( + contentPadding: const EdgeInsets.symmetric(vertical: 8), + content: Column( + mainAxisSize: MainAxisSize.min, + children: items + .map((item) => ListTile( + leading: item.icon != null ? Icon(item.icon) : null, + title: Text(item.text), + onTap: () { + Navigator.of(dialogContext).pop(); + item.onPressed?.call(); + }, + )) + .toList(), + ), + ), + ); + } + + Widget _buildDraggableFolder(int index, ResolvedFolder folder) { + final folderContextItems = [ + tiamat.ContextMenuItem( + text: _promptRename, + icon: Icons.edit, + onPressed: () => _showRenameFolderDialog(folder), + ), + tiamat.ContextMenuItem( + text: _promptUngroup, + icon: Icons.folder_off, + onPressed: () => + widget.sidebarManager.ungroupFolder(folder.id), + ), + ]; + + final dragData = SidebarDragData( + folderId: folder.id, + sourceIndex: index, + ); + + Widget folderContent = Column( + mainAxisSize: MainAxisSize.min, + children: [ + DragTarget( + onWillAcceptWithDetails: (details) => + details.data.isDraggingSpace && + !folder.spaces + .any((s) => s.identifier == details.data.spaceId), + onAcceptWithDetails: (details) { + if (details.data.fromFolderId != null) { + widget.sidebarManager.removeSpaceFromFolder( + details.data.fromFolderId!, details.data.spaceId!); + } + widget.sidebarManager + .addSpaceToFolder(folder.id, details.data.spaceId!); + }, + builder: (context, candidates, rejected) { + final isHovered = candidates.isNotEmpty; + Widget icon = Stack( + alignment: Alignment.centerLeft, + children: [ + FolderIcon( + name: folder.name, + spaces: folder.spaces, + isExpanded: folder.isExpanded, + width: widget.width, + onTap: () => widget.sidebarManager + .toggleFolder(folder.id), + ), + if (_folderHasNotifications(folder)) _messageOverlay(), + ], + ); + + if (isHovered) { + icon = Container( + decoration: BoxDecoration( + border: Border.all( + color: Theme.of(context).colorScheme.primary, + width: 2, + ), + borderRadius: BorderRadius.circular(14), + ), + child: icon, + ); + } + return icon; + }, + ), + AnimatedSize( + duration: const Duration(milliseconds: 200), + curve: Curves.easeInOut, + alignment: Alignment.topCenter, + child: folder.isExpanded + ? _buildExpandedFolderChildren(folder) + : const SizedBox.shrink(), + ), + ], + ); + + Widget wrapped = Layout.desktop + ? AdaptiveContextMenu( + items: folderContextItems, + child: folderContent, + ) + : folderContent; + + return _wrapDraggable( + dragData, + wrapped, + mobileContextItems: folderContextItems, + customFeedback: Material( + color: Colors.transparent, + child: Opacity( + opacity: 0.8, + child: Container( + width: 56, + height: 56, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(56 / 3.4), + color: Theme.of(context).colorScheme.surfaceContainerHigh, + ), + child: Icon( + Icons.folder, + size: 28, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ), + ), + ); + } + + Widget _buildExpandedFolderChildren(ResolvedFolder folder) { + final spaces = folder.spaces; + final bottomRadius = (widget.width - 14) / 3.4; + return Container( + margin: const EdgeInsets.fromLTRB(4, 0, 4, 2), + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .surfaceContainerHigh, + borderRadius: + BorderRadius.vertical(bottom: Radius.circular(bottomRadius)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + for (int i = 0; i < spaces.length; i++) ...[ + if (_isDragging) _buildFolderInsertionZone(folder.id, i), + _buildDraggableSpace( + -1, + ResolvedSpace(spaces[i]), + folderId: folder.id, + indexInFolder: i, + widthOverride: widget.width - 8, + ), + ], + if (_isDragging) + _buildFolderInsertionZone(folder.id, spaces.length), + ], + ), + ); + } + + bool _folderHasNotifications(ResolvedFolder folder) { + return folder.spaces + .any((s) => s.displayNotificationCount > 0); + } + + Widget _messageOverlay() { + return const Positioned(left: -6, child: DotIndicator()); + } + + void _showCreateFolderDialog( + SidebarDragData dragData, ResolvedSpace targetItem, int targetIndex) { + showDialog( + context: context, + builder: (dialogContext) { + final controller = TextEditingController(); + return AlertDialog( + title: Text(_promptCreateFolder), + content: TextField( + controller: controller, + autofocus: true, + decoration: InputDecoration(hintText: _promptFolderName), + onSubmitted: (value) => + Navigator.of(dialogContext).pop(value), + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(dialogContext).pop(), + child: Text(_promptCancel), + ), + TextButton( + onPressed: () => + Navigator.of(dialogContext).pop(controller.text), + child: Text(_promptCreate), + ), + ], + ); + }, + ).then((name) { + if (name != null && name.isNotEmpty) { + widget.sidebarManager.createFolder( + name, + dragData.spaceId!, + targetItem.space.identifier, + targetIndex, + ); + } + }); + } + + void _showRenameFolderDialog(ResolvedFolder folder) { + showDialog( + context: context, + builder: (dialogContext) { + final controller = TextEditingController(text: folder.name); + return AlertDialog( + title: Text(_promptRenameFolder), + content: TextField( + controller: controller, + autofocus: true, + decoration: InputDecoration(hintText: _promptFolderName), + onSubmitted: (value) => + Navigator.of(dialogContext).pop(value), + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(dialogContext).pop(), + child: Text(_promptCancel), + ), + TextButton( + onPressed: () => + Navigator.of(dialogContext).pop(controller.text), + child: Text(_promptRename), + ), + ], + ); + }, + ).then((name) { + if (name != null && name.isNotEmpty) { + widget.sidebarManager.renameFolder(folder.id, name); + } + }); + } +} diff --git a/commet/lib/ui/organisms/side_navigation_bar/side_navigation_bar.dart b/commet/lib/ui/organisms/side_navigation_bar/side_navigation_bar.dart index 35f9a2e33..7cbb81a86 100644 --- a/commet/lib/ui/organisms/side_navigation_bar/side_navigation_bar.dart +++ b/commet/lib/ui/organisms/side_navigation_bar/side_navigation_bar.dart @@ -3,12 +3,12 @@ import 'dart:async'; import 'package:commet/client/client.dart'; import 'package:commet/client/client_manager.dart'; import 'package:commet/client/components/profile/profile_component.dart'; +import 'package:commet/client/sidebar/resolved_sidebar_item.dart'; import 'package:commet/config/layout_config.dart'; -import 'package:commet/ui/molecules/space_selector.dart'; +import 'package:commet/ui/molecules/draggable_space_selector.dart'; import 'package:commet/ui/organisms/side_navigation_bar/side_navigation_bar_direct_messages.dart'; import 'package:commet/ui/pages/get_or_create_room/get_or_create_room.dart'; import 'package:commet/utils/common_strings.dart'; -import 'package:commet/utils/event_bus.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:just_the_tooltip/just_the_tooltip.dart'; @@ -75,52 +75,37 @@ class _SideNavigationBarState extends State { String get promptAddSpace => Intl.message("Add Space", name: "promptAddSpace", desc: "Prompt to add a new space"); - late List topLevelSpaces; - - Client? filterClient; + late List sidebarItems; @override void initState() { _clientManager = Provider.of(context, listen: false); - void setFilterClient(Client? event) { - setState(() { - filterClient = event; - - getSpaces(); - }); - } - subs = [ - _clientManager.onSpaceChildUpdated.stream.listen((_) => onSpaceUpdate()), - _clientManager.onSpaceUpdated.stream.listen((_) => onSpaceUpdate()), - _clientManager.onSpaceRemoved.listen((_) => onSpaceUpdate()), - _clientManager.onSpaceAdded.listen((_) => onSpaceUpdate()), - _clientManager.onClientRemoved.stream.listen((_) => onSpaceUpdate()), + _clientManager.onSpaceRemoved.listen((_) => onSidebarUpdate()), + _clientManager.onSpaceAdded.listen((_) => onSidebarUpdate()), + _clientManager.onClientRemoved.stream.listen((_) => onSidebarUpdate()), + _clientManager.sidebarManager.onSidebarChanged.stream + .listen((_) => onSidebarUpdate()), + _clientManager.onSpaceChildUpdated.stream + .listen((_) => onSidebarUpdate()), + _clientManager.onSpaceUpdated.stream.listen((_) => onSidebarUpdate()), _clientManager.onDirectMessageRoomUpdated.stream .listen(onDirectMessageUpdated), - EventBus.setFilterClient.stream.listen(setFilterClient), ]; - getSpaces(); + getSidebarItems(); super.initState(); } - void getSpaces() { - if (filterClient != null) { - topLevelSpaces = filterClient!.spaces.where((e) => e.isTopLevel).toList(); - } else { - _clientManager = Provider.of(context, listen: false); - - topLevelSpaces = - _clientManager.spaces.where((e) => e.isTopLevel).toList(); - } + void getSidebarItems() { + sidebarItems = _clientManager.sidebarManager.items; } - void onSpaceUpdate() { + void onSidebarUpdate() { setState(() { - getSpaces(); + getSidebarItems(); }); } @@ -143,9 +128,10 @@ class _SideNavigationBarState extends State { child: Column( children: [ Expanded( - child: SpaceSelector( - topLevelSpaces, + child: DraggableSpaceSelector( + sidebarItems, width: 70, + sidebarManager: _clientManager.sidebarManager, clearSelection: widget.clearSpaceSelection, shouldShowAvatarForSpace: shouldShowAvatarForSpace, header: Column( @@ -188,7 +174,7 @@ class _SideNavigationBarState extends State { ), ], ), - onSelected: (space) { + onSpaceSelected: (space) { widget.onSpaceSelected?.call(space); }, ), diff --git a/pubspec.lock b/pubspec.lock index 465abe0ae..ec619c480 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: accessibility_tools - sha256: c29732e423175a51e0a6ace7df1255f5d77812c7c7b7101d8ba0186a43d533aa + sha256: "088cfe6d3520dbe86bb5259059c0d5f478fe113e09311023b0485e68879b34b2" url: "https://pub.dev" source: hosted - version: "2.8.0" + version: "2.7.1" adaptive_number: dependency: transitive description: @@ -174,10 +174,10 @@ packages: dependency: transitive description: name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.0" charcode: dependency: transitive description: @@ -218,14 +218,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" - code_assets: - dependency: transitive - description: - name: code_assets - sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" - url: "https://pub.dev" - source: hosted - version: "1.0.0" code_builder: dependency: transitive description: @@ -838,14 +830,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.1" - hooks: - dependency: transitive - description: - name: hooks - sha256: "7a08a0d684cb3b8fb604b78455d5d352f502b68079f7b80b831c62220ab0a4f6" - url: "https://pub.dev" - source: hosted - version: "1.0.1" hotkey_manager: dependency: transitive description: @@ -970,10 +954,10 @@ packages: dependency: transitive description: name: image_picker_ios - sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 + sha256: "956c16a42c0c708f914021666ffcd8265dde36e673c9fa68c81f7d085d9774ad" url: "https://pub.dev" source: hosted - version: "0.8.13+6" + version: "0.8.13+3" image_picker_linux: dependency: transitive description: @@ -1200,18 +1184,18 @@ packages: dependency: transitive description: name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.18" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.11.1" matrix: dependency: transitive description: @@ -1298,10 +1282,10 @@ packages: dependency: transitive description: name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.16.0" mime: dependency: transitive description: @@ -1326,14 +1310,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.16.13" - native_toolchain_c: - dependency: transitive - description: - name: native_toolchain_c - sha256: "89e83885ba09da5fdf2cdacc8002a712ca238c28b7f717910b34bcd27b0d03ac" - url: "https://pub.dev" - source: hosted - version: "0.17.4" nested: dependency: transitive description: @@ -1358,14 +1334,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" - objective_c: - dependency: transitive - description: - name: objective_c - sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" - url: "https://pub.dev" - source: hosted - version: "9.3.0" package_config: dependency: transitive description: @@ -1434,10 +1402,10 @@ packages: dependency: transitive description: name: path_provider_foundation - sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4" url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.5.1" path_provider_linux: dependency: transitive description: @@ -2018,26 +1986,26 @@ packages: dependency: transitive description: name: test - sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" + sha256: "65e29d831719be0591f7b3b1a32a3cda258ec98c58c7b25f7b84241bc31215bb" url: "https://pub.dev" source: hosted - version: "1.29.0" + version: "1.26.2" test_api: dependency: transitive description: name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.9" + version: "0.7.6" test_core: dependency: transitive description: name: test_core - sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" + sha256: "80bf5a02b60af04b09e14f6fe68b921aad119493e26e490deaca5993fef1b05a" url: "https://pub.dev" source: hosted - version: "0.6.15" + version: "0.6.11" timezone: dependency: transitive description: @@ -2162,10 +2130,10 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" + sha256: cfde38aa257dae62ffe79c87fab20165dfdf6988c1d31b58ebf59b9106062aad url: "https://pub.dev" source: hosted - version: "6.4.1" + version: "6.3.6" url_launcher_linux: dependency: transitive description: @@ -2194,10 +2162,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.1" url_launcher_windows: dependency: transitive description: @@ -2431,5 +2399,5 @@ packages: source: hosted version: "2.1.0" sdks: - dart: ">=3.10.3 <4.0.0" - flutter: ">=3.38.4" + dart: ">=3.9.0 <4.0.0" + flutter: ">=3.35.0" From ad4af84406618c8c71dfd397e0b3e7a51a86d497 Mon Sep 17 00:00:00 2001 From: Collin Bartlam Date: Wed, 18 Feb 2026 01:24:10 -0500 Subject: [PATCH 2/4] Fix formatting --- .../lib/client/sidebar/sidebar_manager.dart | 26 +++++------- .../client/sidebar/sidebar_persistence.dart | 6 +-- commet/lib/ui/atoms/folder_icon.dart | 7 ++-- .../molecules/draggable_space_selector.dart | 40 ++++++------------- 4 files changed, 27 insertions(+), 52 deletions(-) diff --git a/commet/lib/client/sidebar/sidebar_manager.dart b/commet/lib/client/sidebar/sidebar_manager.dart index 03667f08e..24c94b0e9 100644 --- a/commet/lib/client/sidebar/sidebar_manager.dart +++ b/commet/lib/client/sidebar/sidebar_manager.dart @@ -24,8 +24,7 @@ class SidebarManager { List get items => _resolvedItems; - final StreamController onSidebarChanged = - StreamController.broadcast(); + final StreamController onSidebarChanged = StreamController.broadcast(); SidebarManager(this.clientManager); @@ -94,8 +93,7 @@ class SidebarManager { void _resolve() { final topLevelSpaces = clientManager.spaces .where((s) => s.isTopLevel) - .where( - (s) => _filterClient == null || s.client == _filterClient) + .where((s) => _filterClient == null || s.client == _filterClient) .toList(); final spaceMap = {}; @@ -139,9 +137,8 @@ class SidebarManager { } } - final unplaced = topLevelSpaces - .where((s) => !placedIds.contains(s.identifier)) - .toList(); + final unplaced = + topLevelSpaces.where((s) => !placedIds.contains(s.identifier)).toList(); resolved.insertAll(0, unplaced.reversed.map((s) => ResolvedSpace(s))); @@ -243,8 +240,7 @@ class SidebarManager { final item = _rawItems[i]; if (item is SidebarFolder && item.id == folderId) { if (!item.children.contains(spaceId)) { - _rawItems[i] = - item.copyWith(children: [...item.children, spaceId]); + _rawItems[i] = item.copyWith(children: [...item.children, spaceId]); } break; } @@ -282,8 +278,7 @@ class SidebarManager { if (item is SidebarFolder && item.id != exceptFolderId && item.children.contains(spaceId)) { - final newChildren = - item.children.where((c) => c != spaceId).toList(); + final newChildren = item.children.where((c) => c != spaceId).toList(); if (newChildren.length <= 1) { _rawItems.removeAt(i); for (var child in newChildren) { @@ -301,8 +296,7 @@ class SidebarManager { for (int i = 0; i < _rawItems.length; i++) { final item = _rawItems[i]; if (item is SidebarFolder && item.id == folderId) { - final newChildren = - item.children.where((c) => c != spaceId).toList(); + final newChildren = item.children.where((c) => c != spaceId).toList(); if (newChildren.length <= 1) { _rawItems.removeAt(i); @@ -323,13 +317,11 @@ class SidebarManager { _debouncedPersist(); } - void moveSpaceOutOfFolder( - String folderId, String spaceId, int insertIndex) { + void moveSpaceOutOfFolder(String folderId, String spaceId, int insertIndex) { for (int i = 0; i < _rawItems.length; i++) { final item = _rawItems[i]; if (item is SidebarFolder && item.id == folderId) { - final newChildren = - item.children.where((c) => c != spaceId).toList(); + final newChildren = item.children.where((c) => c != spaceId).toList(); if (newChildren.length <= 1) { _rawItems.removeAt(i); diff --git a/commet/lib/client/sidebar/sidebar_persistence.dart b/commet/lib/client/sidebar/sidebar_persistence.dart index ef0950981..53f54a886 100644 --- a/commet/lib/client/sidebar/sidebar_persistence.dart +++ b/commet/lib/client/sidebar/sidebar_persistence.dart @@ -5,14 +5,12 @@ import 'package:commet/client/sidebar/sidebar_data.dart'; class SidebarPersistence { static SidebarData readFromClient(Client client) { if (client is! MatrixClient) return SidebarData.empty(); - var data = - client.matrixClient.accountData[SidebarData.accountDataType]; + var data = client.matrixClient.accountData[SidebarData.accountDataType]; if (data == null) return SidebarData.empty(); return SidebarData.fromJson(data.content); } - static Future writeToClient( - Client client, SidebarData data) async { + static Future writeToClient(Client client, SidebarData data) async { if (client is! MatrixClient) return; await client.matrixClient.setAccountData( client.matrixClient.userID!, diff --git a/commet/lib/ui/atoms/folder_icon.dart b/commet/lib/ui/atoms/folder_icon.dart index a548a78b3..6b60fcc5e 100644 --- a/commet/lib/ui/atoms/folder_icon.dart +++ b/commet/lib/ui/atoms/folder_icon.dart @@ -21,8 +21,8 @@ class FolderIcon extends StatelessWidget { final VoidCallback onTap; final double width; - int get _highlightedNotificationCount => spaces.fold( - 0, (sum, s) => sum + s.displayHighlightedNotificationCount); + int get _highlightedNotificationCount => + spaces.fold(0, (sum, s) => sum + s.displayHighlightedNotificationCount); @override Widget build(BuildContext context) { @@ -71,8 +71,7 @@ class FolderIcon extends StatelessWidget { offset: 5, tailLength: 5, tailBaseWidth: 5, - backgroundColor: - Theme.of(context).colorScheme.surfaceContainerLowest, + backgroundColor: Theme.of(context).colorScheme.surfaceContainerLowest, child: content, ); } diff --git a/commet/lib/ui/molecules/draggable_space_selector.dart b/commet/lib/ui/molecules/draggable_space_selector.dart index ba79f4590..06201a7c9 100644 --- a/commet/lib/ui/molecules/draggable_space_selector.dart +++ b/commet/lib/ui/molecules/draggable_space_selector.dart @@ -56,8 +56,7 @@ class DraggableSpaceSelector extends StatefulWidget { final Widget? footer; @override - State createState() => - _DraggableSpaceSelectorState(); + State createState() => _DraggableSpaceSelectorState(); } class _DraggableSpaceSelectorState extends State { @@ -117,8 +116,7 @@ class _DraggableSpaceSelectorState extends State { if (widget.header != null) const tiamat.Seperator(), for (int i = 0; i < widget.items.length; i++) _buildDragItem(i, widget.items[i]), - if (_isDragging) - _buildInsertionZone(widget.items.length), + if (_isDragging) _buildInsertionZone(widget.items.length), if (widget.footer != null) Padding( padding: SpaceSelector.padding, @@ -298,8 +296,7 @@ class _DraggableSpaceSelectorState extends State { onTap: () { widget.onSpaceSelected?.call(space); }, - showUser: - widget.shouldShowAvatarForSpace?.call(space) ?? false, + showUser: widget.shouldShowAvatarForSpace?.call(space) ?? false, ), ), ), @@ -439,8 +436,7 @@ class _DraggableSpaceSelectorState extends State { tiamat.ContextMenuItem( text: _promptUngroup, icon: Icons.folder_off, - onPressed: () => - widget.sidebarManager.ungroupFolder(folder.id), + onPressed: () => widget.sidebarManager.ungroupFolder(folder.id), ), ]; @@ -455,8 +451,7 @@ class _DraggableSpaceSelectorState extends State { DragTarget( onWillAcceptWithDetails: (details) => details.data.isDraggingSpace && - !folder.spaces - .any((s) => s.identifier == details.data.spaceId), + !folder.spaces.any((s) => s.identifier == details.data.spaceId), onAcceptWithDetails: (details) { if (details.data.fromFolderId != null) { widget.sidebarManager.removeSpaceFromFolder( @@ -475,8 +470,7 @@ class _DraggableSpaceSelectorState extends State { spaces: folder.spaces, isExpanded: folder.isExpanded, width: widget.width, - onTap: () => widget.sidebarManager - .toggleFolder(folder.id), + onTap: () => widget.sidebarManager.toggleFolder(folder.id), ), if (_folderHasNotifications(folder)) _messageOverlay(), ], @@ -547,9 +541,7 @@ class _DraggableSpaceSelectorState extends State { return Container( margin: const EdgeInsets.fromLTRB(4, 0, 4, 2), decoration: BoxDecoration( - color: Theme.of(context) - .colorScheme - .surfaceContainerHigh, + color: Theme.of(context).colorScheme.surfaceContainerHigh, borderRadius: BorderRadius.vertical(bottom: Radius.circular(bottomRadius)), ), @@ -566,16 +558,14 @@ class _DraggableSpaceSelectorState extends State { widthOverride: widget.width - 8, ), ], - if (_isDragging) - _buildFolderInsertionZone(folder.id, spaces.length), + if (_isDragging) _buildFolderInsertionZone(folder.id, spaces.length), ], ), ); } bool _folderHasNotifications(ResolvedFolder folder) { - return folder.spaces - .any((s) => s.displayNotificationCount > 0); + return folder.spaces.any((s) => s.displayNotificationCount > 0); } Widget _messageOverlay() { @@ -594,8 +584,7 @@ class _DraggableSpaceSelectorState extends State { controller: controller, autofocus: true, decoration: InputDecoration(hintText: _promptFolderName), - onSubmitted: (value) => - Navigator.of(dialogContext).pop(value), + onSubmitted: (value) => Navigator.of(dialogContext).pop(value), ), actions: [ TextButton( @@ -603,8 +592,7 @@ class _DraggableSpaceSelectorState extends State { child: Text(_promptCancel), ), TextButton( - onPressed: () => - Navigator.of(dialogContext).pop(controller.text), + onPressed: () => Navigator.of(dialogContext).pop(controller.text), child: Text(_promptCreate), ), ], @@ -633,8 +621,7 @@ class _DraggableSpaceSelectorState extends State { controller: controller, autofocus: true, decoration: InputDecoration(hintText: _promptFolderName), - onSubmitted: (value) => - Navigator.of(dialogContext).pop(value), + onSubmitted: (value) => Navigator.of(dialogContext).pop(value), ), actions: [ TextButton( @@ -642,8 +629,7 @@ class _DraggableSpaceSelectorState extends State { child: Text(_promptCancel), ), TextButton( - onPressed: () => - Navigator.of(dialogContext).pop(controller.text), + onPressed: () => Navigator.of(dialogContext).pop(controller.text), child: Text(_promptRename), ), ], From e1d2032d98a5e1837abcf966628887a7822d82c5 Mon Sep 17 00:00:00 2001 From: Collin Bartlam Date: Wed, 18 Feb 2026 01:48:54 -0500 Subject: [PATCH 3/4] Revert pubspec.lock to main --- pubspec.lock | 210 +++++++++++++++++++++++++-------------------------- 1 file changed, 101 insertions(+), 109 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index ec619c480..3f9320f5a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -17,14 +17,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.7.1" - adaptive_number: - dependency: transitive - description: - name: adaptive_number - sha256: "3a567544e9b5c9c803006f51140ad544aedc79604fd4f3f2c1380003f97c1d77" - url: "https://pub.dev" - source: hosted - version: "1.0.0" analyzer: dependency: "direct overridden" description: @@ -149,10 +141,10 @@ packages: dependency: transitive description: name: built_value - sha256: "7931c90b84bc573fef103548e354258ae4c9d28d140e41961df6843c5d60d4d8" + sha256: a30f0a0e38671e89a492c44d005b5545b830a961575bbd8336d42869ff71066d url: "https://pub.dev" source: hosted - version: "8.12.3" + version: "8.12.0" calendar_view: dependency: "direct overridden" description: @@ -222,10 +214,10 @@ packages: dependency: transitive description: name: code_builder - sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" + sha256: "11654819532ba94c34de52ff5feb52bd81cba1de00ef2ed622fd50295f9d4243" url: "https://pub.dev" source: hosted - version: "4.11.1" + version: "4.11.0" collection: dependency: transitive description: @@ -286,10 +278,10 @@ packages: dependency: transitive description: name: cross_file - sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" + sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608" url: "https://pub.dev" source: hosted - version: "0.3.5+2" + version: "0.3.5+1" crypto: dependency: transitive description: @@ -330,14 +322,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" - dart_jsonwebtoken: - dependency: transitive - description: - name: dart_jsonwebtoken - sha256: "0de65691c1d736e9459f22f654ddd6fd8368a271d4e41aa07e53e6301eff5075" - url: "https://pub.dev" - source: hosted - version: "3.3.1" dart_style: dependency: transitive description: @@ -350,18 +334,18 @@ packages: dependency: transitive description: name: dart_webrtc - sha256: "4ed7b9fa9924e5a81eb39271e2c2356739dd1039d60a13b86ba6c5f448625086" + sha256: "51bcda4ba5d7dd9e65a309244ce3ac0b58025e6e1f6d7442cee4cd02134ef65f" url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.6.0" dbus: dependency: transitive description: name: dbus - sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270 + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" url: "https://pub.dev" source: hosted - version: "0.7.12" + version: "0.7.11" desktop_drop: dependency: transitive description: @@ -444,14 +428,6 @@ packages: url: "https://github.com/Airyzz/material-flutter-packages.git" source: git version: "1.7.0" - ed25519_edwards: - dependency: transitive - description: - name: ed25519_edwards - sha256: "6ce0112d131327ec6d42beede1e5dfd526069b18ad45dcf654f15074ad9276cd" - url: "https://pub.dev" - source: hosted - version: "0.3.1" enhanced_enum: dependency: transitive description: @@ -464,10 +440,10 @@ packages: dependency: transitive description: name: equatable - sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b" + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.0.7" exif: dependency: transitive description: @@ -488,10 +464,10 @@ packages: dependency: transitive description: name: ffi - sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.1.4" file: dependency: transitive description: @@ -504,26 +480,26 @@ packages: dependency: transitive description: name: file_picker - sha256: "57d9a1dd5063f85fa3107fb42d1faffda52fdc948cefd5fe5ea85267a5fc7343" + sha256: "7872545770c277236fd32b022767576c562ba28366204ff1a5628853cf8f2200" url: "https://pub.dev" source: hosted - version: "10.3.10" + version: "10.3.7" file_selector_linux: dependency: transitive description: name: file_selector_linux - sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" + sha256: "80a877f5ec570c4fb3b40720a70b6f31e8bb1315a464b4d3e92fe82754d4b21a" url: "https://pub.dev" source: hosted - version: "0.9.4" + version: "0.9.3+3" file_selector_macos: dependency: transitive description: name: file_selector_macos - sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" + sha256: "44f24d102e368370951b98ffe86c7325b38349e634578312976607d28cc6d747" url: "https://pub.dev" source: hosted - version: "0.9.5" + version: "0.9.4+6" file_selector_platform_interface: dependency: transitive description: @@ -691,10 +667,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: ee8068e0e1cd16c4a82714119918efdeed33b3ba7772c54b5d094ab53f9b7fd1 + sha256: "306f0596590e077338312f38837f595c04f28d6cdeeac392d3d74df2f0003687" url: "https://pub.dev" source: hosted - version: "2.0.33" + version: "2.0.32" flutter_rust_bridge: dependency: transitive description: @@ -723,10 +699,10 @@ packages: dependency: transitive description: name: flutter_svg - sha256: "87fbd7c534435b6c5d9d98b01e1fd527812b82e68ddd8bd35fc45ed0fa8f0a95" + sha256: "055de8921be7b8e8b98a233c7a5ef84b3a6fcc32f46f1ebf5b9bb3576d108355" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.2.2" flutter_test: dependency: transitive description: flutter @@ -773,10 +749,10 @@ packages: dependency: transitive description: name: flutter_webrtc - sha256: "71a38363a5b50603e405c275f30de2eb90f980b0cc94b0e1e9d8b9d6a6b03bf0" + sha256: "16ca9e30d428bae3dd32933e875c9f67c5843d1fa726c37cf1fc479eb9294549" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.0" frontend_server_client: dependency: transitive description: @@ -802,10 +778,10 @@ packages: dependency: transitive description: name: get_it - sha256: "1d648d2dd2047d7f7450d5727ca24ee435f240385753d90b49650e3cdff32e56" + sha256: ae78de7c3f2304b8d81f2bb6e320833e5e81de942188542328f074978cc0efa9 url: "https://pub.dev" source: hosted - version: "9.2.0" + version: "8.3.0" glob: dependency: transitive description: @@ -938,26 +914,26 @@ packages: dependency: transitive description: name: image_picker_android - sha256: "518a16108529fc18657a3e6dde4a043dc465d16596d20ab2abd49a4cac2e703d" + sha256: a1cd1584fae64f6ecca63113fd5450e3483c097cc05e43a2f073330f62adcabe url: "https://pub.dev" source: hosted - version: "0.8.13+13" + version: "0.8.13+8" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" + sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.0" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: "956c16a42c0c708f914021666ffcd8265dde36e673c9fa68c81f7d085d9774ad" + sha256: "997d100ce1dda5b1ba4085194c5e36c9f8a1fb7987f6a36ab677a344cd2dc986" url: "https://pub.dev" source: hosted - version: "0.8.13+3" + version: "0.8.13+2" image_picker_linux: dependency: transitive description: @@ -1127,10 +1103,10 @@ packages: dependency: transitive description: name: lints - sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.0.0" list_counter: dependency: transitive description: @@ -1151,10 +1127,10 @@ packages: dependency: transitive description: name: livekit_client - sha256: "4b8ef07d4acbd21e43a1edfd05932c2d71cc0c433607cefe64afdfe87bb53962" + sha256: ddb4467d306be472898b2459c87768121aba030173b3664ef367f7f7f4c96897 url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.3" logger: dependency: transitive description: @@ -1218,10 +1194,10 @@ packages: dependency: transitive description: name: media_kit - sha256: ae9e79597500c7ad6083a3c7b7b7544ddabfceacce7ae5c9709b0ec16a5d6643 + sha256: dfd5ab85d49a1806b1314a0b81f3d14da48f0db0a657336b2d77c5f17db28944 url: "https://pub.dev" source: hosted - version: "1.2.6" + version: "1.2.2" media_kit_libs_android_video: dependency: transitive description: @@ -1274,10 +1250,10 @@ packages: dependency: transitive description: name: media_kit_video - sha256: afaa509e7b7e0bf247557a3a740cde903a52c34ace9810f94500e127bd7b043d + sha256: "813858c3fe84eb46679eb698695f60665e2bfbef757766fac4d2e683f926e15a" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "1.3.1" meta: dependency: transitive description: @@ -1306,10 +1282,10 @@ packages: dependency: transitive description: name: msix - sha256: b6b08e7a7b5d1845f2b1d31216d5b1fb558e98251efefe54eb79ed00d27bc2ac + sha256: f88033fcb9e0dd8de5b18897cbebbd28ea30596810f4a7c86b12b0c03ace87e5 url: "https://pub.dev" source: hosted - version: "3.16.13" + version: "3.16.12" nested: dependency: transitive description: @@ -1394,18 +1370,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e + sha256: "95c68a74d3cab950fd0ed8073d9fab15c1c06eb1f3eec68676e87aabc9ecee5a" url: "https://pub.dev" source: hosted - version: "2.2.22" + version: "2.2.21" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4" + sha256: "97390a0719146c7c3e71b6866c34f1cde92685933165c1c671984390d2aca776" url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.4.4" path_provider_linux: dependency: transitive description: @@ -1502,14 +1478,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "92aa3841d083cc4b0f4709b5c74fd6409a3e6ba833ffc7dc6a8fee096366acf5" - url: "https://pub.dev" - source: hosted - version: "4.0.0" pool: dependency: transitive description: @@ -1603,7 +1571,7 @@ packages: description: path: "." ref: master - resolved-ref: "12cb1ef04311ffd7a4ba0f651105a2364c6b2afb" + resolved-ref: "471e074120ce7bdffe39e351af0c8d13d1bcd64c" url: "https://github.com/daadu/receive_intent" source: git version: "0.2.7" @@ -1619,10 +1587,26 @@ packages: dependency: transitive description: name: safe_local_storage - sha256: "287ea1f667c0b93cdc127dccc707158e2d81ee59fba0459c31a0c7da4d09c755" + sha256: e9a21b6fec7a8aa62cc2585ff4c1b127df42f3185adbd2aca66b47abe2e80236 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + screen_brightness_android: + dependency: transitive + description: + name: screen_brightness_android + sha256: d34f5321abd03bc3474f4c381f53d189117eba0b039eac1916aa92cca5fd0a96 url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.1.3" + screen_brightness_platform_interface: + dependency: transitive + description: + name: screen_brightness_platform_interface + sha256: "737bd47b57746bc4291cab1b8a5843ee881af499514881b0247ec77447ee769c" + url: "https://pub.dev" + source: hosted + version: "2.1.0" screen_retriever: dependency: transitive description: @@ -1683,18 +1667,18 @@ packages: dependency: transitive description: name: shared_preferences - sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.3" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: cbc40be9be1c5af4dab4d6e0de4d5d3729e6f3d65b89d21e1815d57705644a6f + sha256: "07d552dbe8e71ed720e5205e760438ff4ecfb76ec3b32ea664350e2ca4b0c43b" url: "https://pub.dev" source: hosted - version: "2.4.20" + version: "2.4.16" shared_preferences_foundation: dependency: transitive description: @@ -1825,10 +1809,10 @@ packages: dependency: transitive description: name: source_span - sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.2" + version: "1.10.1" sprintf: dependency: transitive description: @@ -1865,10 +1849,10 @@ packages: dependency: transitive description: name: sqflite_common_ffi - sha256: "8d7b8749a516cbf6e9057f9b480b716ad14fc4f3d3873ca6938919cc626d9025" + sha256: "9faa2fedc5385ef238ce772589f7718c24cdddd27419b609bb9c6f703ea27988" url: "https://pub.dev" source: hosted - version: "2.3.7+1" + version: "2.3.6" sqflite_darwin: dependency: transitive description: @@ -1897,10 +1881,10 @@ packages: dependency: transitive description: name: sqlite3_flutter_libs - sha256: "1e800ebe7f85a80a66adacaa6febe4d5f4d8b75f244e9838a27cb2ffc7aec08d" + sha256: "69c80d812ef2500202ebd22002cbfc1b6565e9ff56b2f971e757fac5d42294df" url: "https://pub.dev" source: hosted - version: "0.5.41" + version: "0.5.40" sqlparser: dependency: transitive description: @@ -1954,10 +1938,10 @@ packages: dependency: transitive description: name: stringr - sha256: bcc6e5cef07142673ff454b0fe7ca153e433646c52edf729636980e8a47bd7b7 + sha256: "2846b6811c3cbb34c8937a35e623986e3fbf7203b3bb33ffe7f80e496ea3eff2" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.0.0" sync_http: dependency: transitive description: @@ -2106,10 +2090,10 @@ packages: dependency: transitive description: name: uri_parser - sha256: "051c62e5f693de98ca9f130ee707f8916e2266945565926be3ff20659f7853ce" + sha256: ff4d2c720aca3f4f7d5445e23b11b2d15ef8af5ddce5164643f38ff962dcb270 url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.0" url_launcher: dependency: transitive description: @@ -2122,10 +2106,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" + sha256: "1a109ee074e2a3b17ec3f2785248cb3e93c1e4abab878f637bc33267089f05a3" url: "https://pub.dev" source: hosted - version: "6.3.28" + version: "6.3.26" url_launcher_ios: dependency: transitive description: @@ -2202,10 +2186,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: "201e876b5d52753626af64b6359cd13ac6011b80728731428fd34bc840f71c9b" + sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc url: "https://pub.dev" source: hosted - version: "1.1.20" + version: "1.1.19" vector_math: dependency: transitive description: @@ -2230,6 +2214,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" + volume_controller: + dependency: transitive + description: + name: volume_controller + sha256: d75039e69c0d90e7810bfd47e3eedf29ff8543ea7a10392792e81f9bded7edf5 + url: "https://pub.dev" + source: hosted + version: "3.4.0" wakelock_plus: dependency: transitive description: @@ -2250,10 +2242,10 @@ packages: dependency: transitive description: name: watcher - sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.1.4" web: dependency: transitive description: @@ -2298,26 +2290,26 @@ packages: dependency: transitive description: name: webrtc_interface - sha256: ad0e5786b2acd3be72a3219ef1dde9e1cac071cf4604c685f11b61d63cdd6eb3 + sha256: "2e604a31703ad26781782fb14fa8a4ee621154ee2c513d2b9938e486fa695233" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.3.0" widgetbook: dependency: transitive description: name: widgetbook - sha256: "1877019a90c514c69be049255801487ef22fe0a86c33f81fd82c80cabe86d886" + sha256: d90510974c76e3d23588007dedfcf7f700dad778deadc013deb5b820a74342da url: "https://pub.dev" source: hosted - version: "3.21.0" + version: "3.20.1" widgetbook_annotation: dependency: transitive description: name: widgetbook_annotation - sha256: c074bcb262e32bfd62038557fd5ed51e88f4d14e24447ed60fa5e57854941dbb + sha256: "55504431b15eedef3c1fc4af2d108ac98b32610b59d4a4e2eea87a8515d17eef" url: "https://pub.dev" source: hosted - version: "3.10.0" + version: "3.9.0" widgetbook_generator: dependency: transitive description: From 92b12a50a2f780d68511ee0a6a2d2059c1d557bc Mon Sep 17 00:00:00 2001 From: Collin Bartlam Date: Wed, 18 Feb 2026 01:51:18 -0500 Subject: [PATCH 4/4] Revert pubspec.lock to main: attempt 2 --- pubspec.lock | 286 +++++++++++++++++++++++++++++---------------------- 1 file changed, 163 insertions(+), 123 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 3f9320f5a..dd7f6540b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,18 @@ packages: dependency: transitive description: name: accessibility_tools - sha256: "088cfe6d3520dbe86bb5259059c0d5f478fe113e09311023b0485e68879b34b2" + sha256: c29732e423175a51e0a6ace7df1255f5d77812c7c7b7101d8ba0186a43d533aa url: "https://pub.dev" source: hosted - version: "2.7.1" + version: "2.8.0" + adaptive_number: + dependency: transitive + description: + name: adaptive_number + sha256: "3a567544e9b5c9c803006f51140ad544aedc79604fd4f3f2c1380003f97c1d77" + url: "https://pub.dev" + source: hosted + version: "1.0.0" analyzer: dependency: "direct overridden" description: @@ -141,10 +149,10 @@ packages: dependency: transitive description: name: built_value - sha256: a30f0a0e38671e89a492c44d005b5545b830a961575bbd8336d42869ff71066d + sha256: "7931c90b84bc573fef103548e354258ae4c9d28d140e41961df6843c5d60d4d8" url: "https://pub.dev" source: hosted - version: "8.12.0" + version: "8.12.3" calendar_view: dependency: "direct overridden" description: @@ -166,10 +174,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" charcode: dependency: transitive description: @@ -210,14 +218,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" + source: hosted + version: "1.0.0" code_builder: dependency: transitive description: name: code_builder - sha256: "11654819532ba94c34de52ff5feb52bd81cba1de00ef2ed622fd50295f9d4243" + sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" url: "https://pub.dev" source: hosted - version: "4.11.0" + version: "4.11.1" collection: dependency: transitive description: @@ -278,10 +294,10 @@ packages: dependency: transitive description: name: cross_file - sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608" + sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" url: "https://pub.dev" source: hosted - version: "0.3.5+1" + version: "0.3.5+2" crypto: dependency: transitive description: @@ -322,6 +338,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + dart_jsonwebtoken: + dependency: transitive + description: + name: dart_jsonwebtoken + sha256: "0de65691c1d736e9459f22f654ddd6fd8368a271d4e41aa07e53e6301eff5075" + url: "https://pub.dev" + source: hosted + version: "3.3.1" dart_style: dependency: transitive description: @@ -334,18 +358,18 @@ packages: dependency: transitive description: name: dart_webrtc - sha256: "51bcda4ba5d7dd9e65a309244ce3ac0b58025e6e1f6d7442cee4cd02134ef65f" + sha256: "4ed7b9fa9924e5a81eb39271e2c2356739dd1039d60a13b86ba6c5f448625086" url: "https://pub.dev" source: hosted - version: "1.6.0" + version: "1.7.0" dbus: dependency: transitive description: name: dbus - sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270 url: "https://pub.dev" source: hosted - version: "0.7.11" + version: "0.7.12" desktop_drop: dependency: transitive description: @@ -428,6 +452,14 @@ packages: url: "https://github.com/Airyzz/material-flutter-packages.git" source: git version: "1.7.0" + ed25519_edwards: + dependency: transitive + description: + name: ed25519_edwards + sha256: "6ce0112d131327ec6d42beede1e5dfd526069b18ad45dcf654f15074ad9276cd" + url: "https://pub.dev" + source: hosted + version: "0.3.1" enhanced_enum: dependency: transitive description: @@ -440,10 +472,10 @@ packages: dependency: transitive description: name: equatable - sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" + sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b" url: "https://pub.dev" source: hosted - version: "2.0.7" + version: "2.0.8" exif: dependency: transitive description: @@ -464,10 +496,10 @@ packages: dependency: transitive description: name: ffi - sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" file: dependency: transitive description: @@ -480,26 +512,26 @@ packages: dependency: transitive description: name: file_picker - sha256: "7872545770c277236fd32b022767576c562ba28366204ff1a5628853cf8f2200" + sha256: "57d9a1dd5063f85fa3107fb42d1faffda52fdc948cefd5fe5ea85267a5fc7343" url: "https://pub.dev" source: hosted - version: "10.3.7" + version: "10.3.10" file_selector_linux: dependency: transitive description: name: file_selector_linux - sha256: "80a877f5ec570c4fb3b40720a70b6f31e8bb1315a464b4d3e92fe82754d4b21a" + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" url: "https://pub.dev" source: hosted - version: "0.9.3+3" + version: "0.9.4" file_selector_macos: dependency: transitive description: name: file_selector_macos - sha256: "44f24d102e368370951b98ffe86c7325b38349e634578312976607d28cc6d747" + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" url: "https://pub.dev" source: hosted - version: "0.9.4+6" + version: "0.9.5" file_selector_platform_interface: dependency: transitive description: @@ -667,10 +699,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "306f0596590e077338312f38837f595c04f28d6cdeeac392d3d74df2f0003687" + sha256: ee8068e0e1cd16c4a82714119918efdeed33b3ba7772c54b5d094ab53f9b7fd1 url: "https://pub.dev" source: hosted - version: "2.0.32" + version: "2.0.33" flutter_rust_bridge: dependency: transitive description: @@ -699,10 +731,10 @@ packages: dependency: transitive description: name: flutter_svg - sha256: "055de8921be7b8e8b98a233c7a5ef84b3a6fcc32f46f1ebf5b9bb3576d108355" + sha256: "87fbd7c534435b6c5d9d98b01e1fd527812b82e68ddd8bd35fc45ed0fa8f0a95" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" flutter_test: dependency: transitive description: flutter @@ -749,10 +781,10 @@ packages: dependency: transitive description: name: flutter_webrtc - sha256: "16ca9e30d428bae3dd32933e875c9f67c5843d1fa726c37cf1fc479eb9294549" + sha256: "71a38363a5b50603e405c275f30de2eb90f980b0cc94b0e1e9d8b9d6a6b03bf0" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" frontend_server_client: dependency: transitive description: @@ -778,10 +810,10 @@ packages: dependency: transitive description: name: get_it - sha256: ae78de7c3f2304b8d81f2bb6e320833e5e81de942188542328f074978cc0efa9 + sha256: "1d648d2dd2047d7f7450d5727ca24ee435f240385753d90b49650e3cdff32e56" url: "https://pub.dev" source: hosted - version: "8.3.0" + version: "9.2.0" glob: dependency: transitive description: @@ -806,6 +838,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.1" + hooks: + dependency: transitive + description: + name: hooks + sha256: "7a08a0d684cb3b8fb604b78455d5d352f502b68079f7b80b831c62220ab0a4f6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" hotkey_manager: dependency: transitive description: @@ -914,26 +954,26 @@ packages: dependency: transitive description: name: image_picker_android - sha256: a1cd1584fae64f6ecca63113fd5450e3483c097cc05e43a2f073330f62adcabe + sha256: "518a16108529fc18657a3e6dde4a043dc465d16596d20ab2abd49a4cac2e703d" url: "https://pub.dev" source: hosted - version: "0.8.13+8" + version: "0.8.13+13" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: "997d100ce1dda5b1ba4085194c5e36c9f8a1fb7987f6a36ab677a344cd2dc986" + sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 url: "https://pub.dev" source: hosted - version: "0.8.13+2" + version: "0.8.13+6" image_picker_linux: dependency: transitive description: @@ -1103,10 +1143,10 @@ packages: dependency: transitive description: name: lints - sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.1.0" list_counter: dependency: transitive description: @@ -1127,10 +1167,10 @@ packages: dependency: transitive description: name: livekit_client - sha256: ddb4467d306be472898b2459c87768121aba030173b3664ef367f7f7f4c96897 + sha256: "4b8ef07d4acbd21e43a1edfd05932c2d71cc0c433607cefe64afdfe87bb53962" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" logger: dependency: transitive description: @@ -1160,18 +1200,18 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.18" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" matrix: dependency: transitive description: @@ -1194,10 +1234,10 @@ packages: dependency: transitive description: name: media_kit - sha256: dfd5ab85d49a1806b1314a0b81f3d14da48f0db0a657336b2d77c5f17db28944 + sha256: ae9e79597500c7ad6083a3c7b7b7544ddabfceacce7ae5c9709b0ec16a5d6643 url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.6" media_kit_libs_android_video: dependency: transitive description: @@ -1250,18 +1290,18 @@ packages: dependency: transitive description: name: media_kit_video - sha256: "813858c3fe84eb46679eb698695f60665e2bfbef757766fac4d2e683f926e15a" + sha256: afaa509e7b7e0bf247557a3a740cde903a52c34ace9810f94500e127bd7b043d url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "2.0.1" meta: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" mime: dependency: transitive description: @@ -1282,10 +1322,18 @@ packages: dependency: transitive description: name: msix - sha256: f88033fcb9e0dd8de5b18897cbebbd28ea30596810f4a7c86b12b0c03ace87e5 + sha256: b6b08e7a7b5d1845f2b1d31216d5b1fb558e98251efefe54eb79ed00d27bc2ac + url: "https://pub.dev" + source: hosted + version: "3.16.13" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: "89e83885ba09da5fdf2cdacc8002a712ca238c28b7f717910b34bcd27b0d03ac" url: "https://pub.dev" source: hosted - version: "3.16.12" + version: "0.17.4" nested: dependency: transitive description: @@ -1310,6 +1358,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" + url: "https://pub.dev" + source: hosted + version: "9.3.0" package_config: dependency: transitive description: @@ -1370,18 +1426,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "95c68a74d3cab950fd0ed8073d9fab15c1c06eb1f3eec68676e87aabc9ecee5a" + sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e url: "https://pub.dev" source: hosted - version: "2.2.21" + version: "2.2.22" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "97390a0719146c7c3e71b6866c34f1cde92685933165c1c671984390d2aca776" + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.6.0" path_provider_linux: dependency: transitive description: @@ -1478,6 +1534,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "92aa3841d083cc4b0f4709b5c74fd6409a3e6ba833ffc7dc6a8fee096366acf5" + url: "https://pub.dev" + source: hosted + version: "4.0.0" pool: dependency: transitive description: @@ -1571,7 +1635,7 @@ packages: description: path: "." ref: master - resolved-ref: "471e074120ce7bdffe39e351af0c8d13d1bcd64c" + resolved-ref: "12cb1ef04311ffd7a4ba0f651105a2364c6b2afb" url: "https://github.com/daadu/receive_intent" source: git version: "0.2.7" @@ -1587,26 +1651,10 @@ packages: dependency: transitive description: name: safe_local_storage - sha256: e9a21b6fec7a8aa62cc2585ff4c1b127df42f3185adbd2aca66b47abe2e80236 - url: "https://pub.dev" - source: hosted - version: "2.0.1" - screen_brightness_android: - dependency: transitive - description: - name: screen_brightness_android - sha256: d34f5321abd03bc3474f4c381f53d189117eba0b039eac1916aa92cca5fd0a96 + sha256: "287ea1f667c0b93cdc127dccc707158e2d81ee59fba0459c31a0c7da4d09c755" url: "https://pub.dev" source: hosted - version: "2.1.3" - screen_brightness_platform_interface: - dependency: transitive - description: - name: screen_brightness_platform_interface - sha256: "737bd47b57746bc4291cab1b8a5843ee881af499514881b0247ec77447ee769c" - url: "https://pub.dev" - source: hosted - version: "2.1.0" + version: "2.0.3" screen_retriever: dependency: transitive description: @@ -1667,18 +1715,18 @@ packages: dependency: transitive description: name: shared_preferences - sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "07d552dbe8e71ed720e5205e760438ff4ecfb76ec3b32ea664350e2ca4b0c43b" + sha256: cbc40be9be1c5af4dab4d6e0de4d5d3729e6f3d65b89d21e1815d57705644a6f url: "https://pub.dev" source: hosted - version: "2.4.16" + version: "2.4.20" shared_preferences_foundation: dependency: transitive description: @@ -1809,10 +1857,10 @@ packages: dependency: transitive description: name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" url: "https://pub.dev" source: hosted - version: "1.10.1" + version: "1.10.2" sprintf: dependency: transitive description: @@ -1849,10 +1897,10 @@ packages: dependency: transitive description: name: sqflite_common_ffi - sha256: "9faa2fedc5385ef238ce772589f7718c24cdddd27419b609bb9c6f703ea27988" + sha256: "8d7b8749a516cbf6e9057f9b480b716ad14fc4f3d3873ca6938919cc626d9025" url: "https://pub.dev" source: hosted - version: "2.3.6" + version: "2.3.7+1" sqflite_darwin: dependency: transitive description: @@ -1881,10 +1929,10 @@ packages: dependency: transitive description: name: sqlite3_flutter_libs - sha256: "69c80d812ef2500202ebd22002cbfc1b6565e9ff56b2f971e757fac5d42294df" + sha256: "1e800ebe7f85a80a66adacaa6febe4d5f4d8b75f244e9838a27cb2ffc7aec08d" url: "https://pub.dev" source: hosted - version: "0.5.40" + version: "0.5.41" sqlparser: dependency: transitive description: @@ -1938,10 +1986,10 @@ packages: dependency: transitive description: name: stringr - sha256: "2846b6811c3cbb34c8937a35e623986e3fbf7203b3bb33ffe7f80e496ea3eff2" + sha256: bcc6e5cef07142673ff454b0fe7ca153e433646c52edf729636980e8a47bd7b7 url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.2.1" sync_http: dependency: transitive description: @@ -1970,26 +2018,26 @@ packages: dependency: transitive description: name: test - sha256: "65e29d831719be0591f7b3b1a32a3cda258ec98c58c7b25f7b84241bc31215bb" + sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" url: "https://pub.dev" source: hosted - version: "1.26.2" + version: "1.29.0" test_api: dependency: transitive description: name: test_api - sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.9" test_core: dependency: transitive description: name: test_core - sha256: "80bf5a02b60af04b09e14f6fe68b921aad119493e26e490deaca5993fef1b05a" + sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" url: "https://pub.dev" source: hosted - version: "0.6.11" + version: "0.6.15" timezone: dependency: transitive description: @@ -2090,10 +2138,10 @@ packages: dependency: transitive description: name: uri_parser - sha256: ff4d2c720aca3f4f7d5445e23b11b2d15ef8af5ddce5164643f38ff962dcb270 + sha256: "051c62e5f693de98ca9f130ee707f8916e2266945565926be3ff20659f7853ce" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.2" url_launcher: dependency: transitive description: @@ -2106,18 +2154,18 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "1a109ee074e2a3b17ec3f2785248cb3e93c1e4abab878f637bc33267089f05a3" + sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" url: "https://pub.dev" source: hosted - version: "6.3.26" + version: "6.3.28" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: cfde38aa257dae62ffe79c87fab20165dfdf6988c1d31b58ebf59b9106062aad + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" url: "https://pub.dev" source: hosted - version: "6.3.6" + version: "6.4.1" url_launcher_linux: dependency: transitive description: @@ -2146,10 +2194,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" url_launcher_windows: dependency: transitive description: @@ -2186,10 +2234,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc + sha256: "201e876b5d52753626af64b6359cd13ac6011b80728731428fd34bc840f71c9b" url: "https://pub.dev" source: hosted - version: "1.1.19" + version: "1.1.20" vector_math: dependency: transitive description: @@ -2214,14 +2262,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" - volume_controller: - dependency: transitive - description: - name: volume_controller - sha256: d75039e69c0d90e7810bfd47e3eedf29ff8543ea7a10392792e81f9bded7edf5 - url: "https://pub.dev" - source: hosted - version: "3.4.0" wakelock_plus: dependency: transitive description: @@ -2242,10 +2282,10 @@ packages: dependency: transitive description: name: watcher - sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a" + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" url: "https://pub.dev" source: hosted - version: "1.1.4" + version: "1.2.1" web: dependency: transitive description: @@ -2290,26 +2330,26 @@ packages: dependency: transitive description: name: webrtc_interface - sha256: "2e604a31703ad26781782fb14fa8a4ee621154ee2c513d2b9938e486fa695233" + sha256: ad0e5786b2acd3be72a3219ef1dde9e1cac071cf4604c685f11b61d63cdd6eb3 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" widgetbook: dependency: transitive description: name: widgetbook - sha256: d90510974c76e3d23588007dedfcf7f700dad778deadc013deb5b820a74342da + sha256: "1877019a90c514c69be049255801487ef22fe0a86c33f81fd82c80cabe86d886" url: "https://pub.dev" source: hosted - version: "3.20.1" + version: "3.21.0" widgetbook_annotation: dependency: transitive description: name: widgetbook_annotation - sha256: "55504431b15eedef3c1fc4af2d108ac98b32610b59d4a4e2eea87a8515d17eef" + sha256: c074bcb262e32bfd62038557fd5ed51e88f4d14e24447ed60fa5e57854941dbb url: "https://pub.dev" source: hosted - version: "3.9.0" + version: "3.10.0" widgetbook_generator: dependency: transitive description: @@ -2391,5 +2431,5 @@ packages: source: hosted version: "2.1.0" sdks: - dart: ">=3.9.0 <4.0.0" - flutter: ">=3.35.0" + dart: ">=3.10.3 <4.0.0" + flutter: ">=3.38.4" \ No newline at end of file