Refactor Timeline Grouping into RP provider

merge-requests/67/merge
Hank Grabowski 2024-11-27 19:37:47 -05:00
rodzic 1358a3e7b4
commit f6cee22d3c
7 zmienionych plików z 769 dodań i 57 usunięć

Wyświetl plik

@ -0,0 +1,121 @@
import 'package:logging/logging.dart';
import 'package:result_monad/result_monad.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import '../data/interfaces/circles_repo_intf.dart';
import '../data/memory/memory_circles_repo.dart';
import '../friendica_client/friendica_client.dart';
import '../models/auth/profile.dart';
import '../models/connection.dart';
import '../models/exec_error.dart';
import '../models/timeline_grouping_list_data.dart';
part 'circles_repo_services.g.dart';
final _crLogger = Logger('CirclesRepoProvider');
@Riverpod(keepAlive: true)
class CirclesRepo extends _$CirclesRepo {
late Profile userProfile;
@override
ICirclesRepo build(Profile profile) {
_crLogger.info('Creating for $profile');
userProfile = profile;
return MemoryCirclesRepo();
}
Future<void> refreshCircleData() async {
_crLogger.info('Refreshing member circle data ');
await TimelineGroupingListClient(profile)
.getTimelineGroupingListData()
.match(
onSuccess: (circles) {
state.addAllCircles(circles);
},
onError: (error) {
_crLogger.severe('Error getting list data: $error');
},
);
}
}
final _cpLogger = Logger('CirclesProvider');
@Riverpod(keepAlive: true)
class Circles extends _$Circles {
late Profile userProfile;
@override
List<TimelineGroupingListData> build(Profile profile) {
_cpLogger.info('Creating for $profile');
userProfile = profile;
final circles = ref.watch(circlesRepoProvider(userProfile)).getMyCircles();
if (circles.isEmpty) {
Future.delayed(const Duration(milliseconds: 1), refresh);
}
return circles;
}
Future<void> refresh() async {
_cpLogger.info('Refreshing cicrles provider');
await ref
.read(circlesRepoProvider(userProfile).notifier)
.refreshCircleData();
ref.invalidateSelf();
}
void upsertCircle(TimelineGroupingListData circle) {
ref.read(circlesRepoProvider(userProfile)).upsertCircle(circle);
ref.invalidateSelf();
}
void deleteCircle(TimelineGroupingListData circle) {
ref.read(circlesRepoProvider(userProfile)).deleteCircle(circle);
ref.invalidateSelf();
}
void clear() {
ref.read(circlesRepoProvider(userProfile)).clear();
ref.invalidateSelf();
}
void addAllCircles(List<TimelineGroupingListData> circles) {
ref.read(circlesRepoProvider(userProfile)).addAllCircles(circles);
ref.invalidateSelf();
}
void addConnectionToCircle(
TimelineGroupingListData circle, Connection connection) {
ref
.read(circlesRepoProvider(userProfile))
.addConnectionToCircle(circle, connection);
ref.invalidateSelf();
}
Result<List<Connection>, ExecError> getCircleMembers(
TimelineGroupingListData circle) =>
ref.read(circlesRepoProvider(userProfile)).getCircleMembers(circle);
Result<List<TimelineGroupingListData>, ExecError> getCirclesForUser(
String id) =>
ref.read(circlesRepoProvider(userProfile)).getCirclesForUser(id);
bool updateConnectionCircleData(
String id, List<TimelineGroupingListData> currentCircless) =>
ref
.read(circlesRepoProvider(userProfile))
.updateConnectionCircleData(id, currentCircless);
}
final _tglLogger = Logger('TimelineGroupingListProvider');
@Riverpod(keepAlive: true)
List<TimelineGroupingListData> timelineGroupingList(
TimelineGroupingListRef ref, Profile profile, GroupingType type) {
_tglLogger.info('Creating for $type for $profile');
final circles = ref.watch(circlesProvider(profile));
final result = circles.where((e) => e.groupingType == type).toList();
result.sort((g1, g2) => g1.name.compareTo(g2.name));
return result;
}

Wyświetl plik

@ -0,0 +1,465 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'circles_repo_services.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$timelineGroupingListHash() =>
r'f9a0b3f07c564f080f27bf4d1354a7ef22c38408';
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [timelineGroupingList].
@ProviderFor(timelineGroupingList)
const timelineGroupingListProvider = TimelineGroupingListFamily();
/// See also [timelineGroupingList].
class TimelineGroupingListFamily
extends Family<List<TimelineGroupingListData>> {
/// See also [timelineGroupingList].
const TimelineGroupingListFamily();
/// See also [timelineGroupingList].
TimelineGroupingListProvider call(
Profile profile,
GroupingType type,
) {
return TimelineGroupingListProvider(
profile,
type,
);
}
@override
TimelineGroupingListProvider getProviderOverride(
covariant TimelineGroupingListProvider provider,
) {
return call(
provider.profile,
provider.type,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'timelineGroupingListProvider';
}
/// See also [timelineGroupingList].
class TimelineGroupingListProvider
extends Provider<List<TimelineGroupingListData>> {
/// See also [timelineGroupingList].
TimelineGroupingListProvider(
Profile profile,
GroupingType type,
) : this._internal(
(ref) => timelineGroupingList(
ref as TimelineGroupingListRef,
profile,
type,
),
from: timelineGroupingListProvider,
name: r'timelineGroupingListProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$timelineGroupingListHash,
dependencies: TimelineGroupingListFamily._dependencies,
allTransitiveDependencies:
TimelineGroupingListFamily._allTransitiveDependencies,
profile: profile,
type: type,
);
TimelineGroupingListProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.profile,
required this.type,
}) : super.internal();
final Profile profile;
final GroupingType type;
@override
Override overrideWith(
List<TimelineGroupingListData> Function(TimelineGroupingListRef provider)
create,
) {
return ProviderOverride(
origin: this,
override: TimelineGroupingListProvider._internal(
(ref) => create(ref as TimelineGroupingListRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
profile: profile,
type: type,
),
);
}
@override
ProviderElement<List<TimelineGroupingListData>> createElement() {
return _TimelineGroupingListProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is TimelineGroupingListProvider &&
other.profile == profile &&
other.type == type;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, profile.hashCode);
hash = _SystemHash.combine(hash, type.hashCode);
return _SystemHash.finish(hash);
}
}
mixin TimelineGroupingListRef on ProviderRef<List<TimelineGroupingListData>> {
/// The parameter `profile` of this provider.
Profile get profile;
/// The parameter `type` of this provider.
GroupingType get type;
}
class _TimelineGroupingListProviderElement
extends ProviderElement<List<TimelineGroupingListData>>
with TimelineGroupingListRef {
_TimelineGroupingListProviderElement(super.provider);
@override
Profile get profile => (origin as TimelineGroupingListProvider).profile;
@override
GroupingType get type => (origin as TimelineGroupingListProvider).type;
}
String _$circlesRepoHash() => r'dff8b3ae45433b1e4f99aac4eb963541afb48653';
abstract class _$CirclesRepo extends BuildlessNotifier<ICirclesRepo> {
late final Profile profile;
ICirclesRepo build(
Profile profile,
);
}
/// See also [CirclesRepo].
@ProviderFor(CirclesRepo)
const circlesRepoProvider = CirclesRepoFamily();
/// See also [CirclesRepo].
class CirclesRepoFamily extends Family<ICirclesRepo> {
/// See also [CirclesRepo].
const CirclesRepoFamily();
/// See also [CirclesRepo].
CirclesRepoProvider call(
Profile profile,
) {
return CirclesRepoProvider(
profile,
);
}
@override
CirclesRepoProvider getProviderOverride(
covariant CirclesRepoProvider provider,
) {
return call(
provider.profile,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'circlesRepoProvider';
}
/// See also [CirclesRepo].
class CirclesRepoProvider
extends NotifierProviderImpl<CirclesRepo, ICirclesRepo> {
/// See also [CirclesRepo].
CirclesRepoProvider(
Profile profile,
) : this._internal(
() => CirclesRepo()..profile = profile,
from: circlesRepoProvider,
name: r'circlesRepoProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$circlesRepoHash,
dependencies: CirclesRepoFamily._dependencies,
allTransitiveDependencies:
CirclesRepoFamily._allTransitiveDependencies,
profile: profile,
);
CirclesRepoProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.profile,
}) : super.internal();
final Profile profile;
@override
ICirclesRepo runNotifierBuild(
covariant CirclesRepo notifier,
) {
return notifier.build(
profile,
);
}
@override
Override overrideWith(CirclesRepo Function() create) {
return ProviderOverride(
origin: this,
override: CirclesRepoProvider._internal(
() => create()..profile = profile,
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
profile: profile,
),
);
}
@override
NotifierProviderElement<CirclesRepo, ICirclesRepo> createElement() {
return _CirclesRepoProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is CirclesRepoProvider && other.profile == profile;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, profile.hashCode);
return _SystemHash.finish(hash);
}
}
mixin CirclesRepoRef on NotifierProviderRef<ICirclesRepo> {
/// The parameter `profile` of this provider.
Profile get profile;
}
class _CirclesRepoProviderElement
extends NotifierProviderElement<CirclesRepo, ICirclesRepo>
with CirclesRepoRef {
_CirclesRepoProviderElement(super.provider);
@override
Profile get profile => (origin as CirclesRepoProvider).profile;
}
String _$circlesHash() => r'a57a4b68ad07c884b2f38cef23e70a3b96e8fc12';
abstract class _$Circles
extends BuildlessNotifier<List<TimelineGroupingListData>> {
late final Profile profile;
List<TimelineGroupingListData> build(
Profile profile,
);
}
/// See also [Circles].
@ProviderFor(Circles)
const circlesProvider = CirclesFamily();
/// See also [Circles].
class CirclesFamily extends Family<List<TimelineGroupingListData>> {
/// See also [Circles].
const CirclesFamily();
/// See also [Circles].
CirclesProvider call(
Profile profile,
) {
return CirclesProvider(
profile,
);
}
@override
CirclesProvider getProviderOverride(
covariant CirclesProvider provider,
) {
return call(
provider.profile,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'circlesProvider';
}
/// See also [Circles].
class CirclesProvider
extends NotifierProviderImpl<Circles, List<TimelineGroupingListData>> {
/// See also [Circles].
CirclesProvider(
Profile profile,
) : this._internal(
() => Circles()..profile = profile,
from: circlesProvider,
name: r'circlesProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$circlesHash,
dependencies: CirclesFamily._dependencies,
allTransitiveDependencies: CirclesFamily._allTransitiveDependencies,
profile: profile,
);
CirclesProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.profile,
}) : super.internal();
final Profile profile;
@override
List<TimelineGroupingListData> runNotifierBuild(
covariant Circles notifier,
) {
return notifier.build(
profile,
);
}
@override
Override overrideWith(Circles Function() create) {
return ProviderOverride(
origin: this,
override: CirclesProvider._internal(
() => create()..profile = profile,
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
profile: profile,
),
);
}
@override
NotifierProviderElement<Circles, List<TimelineGroupingListData>>
createElement() {
return _CirclesProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is CirclesProvider && other.profile == profile;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, profile.hashCode);
return _SystemHash.finish(hash);
}
}
mixin CirclesRef on NotifierProviderRef<List<TimelineGroupingListData>> {
/// The parameter `profile` of this provider.
Profile get profile;
}
class _CirclesProviderElement
extends NotifierProviderElement<Circles, List<TimelineGroupingListData>>
with CirclesRef {
_CirclesProviderElement(super.provider);
@override
Profile get profile => (origin as CirclesProvider).profile;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member

Wyświetl plik

@ -3,6 +3,9 @@ import 'dart:io';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import '../models/auth/profile.dart';
import '../services/entry_manager_service.dart';
part 'globals_services.g.dart'; part 'globals_services.g.dart';
@Riverpod(keepAlive: true) @Riverpod(keepAlive: true)
@ -12,3 +15,8 @@ SharedPreferences sharedPreferences(SharedPreferencesRef ref) =>
@Riverpod(keepAlive: true) @Riverpod(keepAlive: true)
Directory applicationSupportDirectory(ApplicationSupportDirectoryRef ref) => Directory applicationSupportDirectory(ApplicationSupportDirectoryRef ref) =>
throw UnimplementedError(); throw UnimplementedError();
@Riverpod(keepAlive: true)
EntryManagerService entryManagerService(
EntryManagerServiceRef ref, Profile profile) =>
EntryManagerService(profile);

Wyświetl plik

@ -37,5 +37,154 @@ final applicationSupportDirectoryProvider = Provider<Directory>.internal(
); );
typedef ApplicationSupportDirectoryRef = ProviderRef<Directory>; typedef ApplicationSupportDirectoryRef = ProviderRef<Directory>;
String _$entryManagerServiceHash() =>
r'c3fdb3153999b0b9053b3a4aff0e6834b5a76d12';
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [entryManagerService].
@ProviderFor(entryManagerService)
const entryManagerServiceProvider = EntryManagerServiceFamily();
/// See also [entryManagerService].
class EntryManagerServiceFamily extends Family<EntryManagerService> {
/// See also [entryManagerService].
const EntryManagerServiceFamily();
/// See also [entryManagerService].
EntryManagerServiceProvider call(
Profile profile,
) {
return EntryManagerServiceProvider(
profile,
);
}
@override
EntryManagerServiceProvider getProviderOverride(
covariant EntryManagerServiceProvider provider,
) {
return call(
provider.profile,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'entryManagerServiceProvider';
}
/// See also [entryManagerService].
class EntryManagerServiceProvider extends Provider<EntryManagerService> {
/// See also [entryManagerService].
EntryManagerServiceProvider(
Profile profile,
) : this._internal(
(ref) => entryManagerService(
ref as EntryManagerServiceRef,
profile,
),
from: entryManagerServiceProvider,
name: r'entryManagerServiceProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$entryManagerServiceHash,
dependencies: EntryManagerServiceFamily._dependencies,
allTransitiveDependencies:
EntryManagerServiceFamily._allTransitiveDependencies,
profile: profile,
);
EntryManagerServiceProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.profile,
}) : super.internal();
final Profile profile;
@override
Override overrideWith(
EntryManagerService Function(EntryManagerServiceRef provider) create,
) {
return ProviderOverride(
origin: this,
override: EntryManagerServiceProvider._internal(
(ref) => create(ref as EntryManagerServiceRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
profile: profile,
),
);
}
@override
ProviderElement<EntryManagerService> createElement() {
return _EntryManagerServiceProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is EntryManagerServiceProvider && other.profile == profile;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, profile.hashCode);
return _SystemHash.finish(hash);
}
}
mixin EntryManagerServiceRef on ProviderRef<EntryManagerService> {
/// The parameter `profile` of this provider.
Profile get profile;
}
class _EntryManagerServiceProviderElement
extends ProviderElement<EntryManagerService> with EntryManagerServiceRef {
_EntryManagerServiceProviderElement(super.provider);
@override
Profile get profile => (origin as EntryManagerServiceProvider).profile;
}
// ignore_for_file: type=lint // ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member

Wyświetl plik

@ -1,4 +1,5 @@
import 'package:flutter/material.dart' hide Visibility; import 'package:flutter/material.dart' hide Visibility;
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:multi_trigger_autocomplete/multi_trigger_autocomplete.dart'; import 'package:multi_trigger_autocomplete/multi_trigger_autocomplete.dart';
@ -24,7 +25,9 @@ import '../models/media_attachment_uploads/new_entry_media_items.dart';
import '../models/timeline_entry.dart'; import '../models/timeline_entry.dart';
import '../models/timeline_grouping_list_data.dart'; import '../models/timeline_grouping_list_data.dart';
import '../models/visibility.dart'; import '../models/visibility.dart';
import '../riverpod_controllers/circles_repo_services.dart';
import '../serializers/friendica/link_preview_friendica_extensions.dart'; import '../serializers/friendica/link_preview_friendica_extensions.dart';
import '../services/auth_service.dart';
import '../services/connections_manager.dart'; import '../services/connections_manager.dart';
import '../services/feature_version_checker.dart'; import '../services/feature_version_checker.dart';
import '../services/timeline_manager.dart'; import '../services/timeline_manager.dart';
@ -34,7 +37,7 @@ import '../utils/opengraph_preview_grabber.dart';
import '../utils/snackbar_builder.dart'; import '../utils/snackbar_builder.dart';
import '../utils/string_utils.dart'; import '../utils/string_utils.dart';
class EditorScreen extends StatefulWidget { class EditorScreen extends ConsumerStatefulWidget {
final String id; final String id;
final String parentId; final String parentId;
final bool forEditing; final bool forEditing;
@ -43,10 +46,10 @@ class EditorScreen extends StatefulWidget {
{super.key, this.id = '', this.parentId = '', required this.forEditing}); {super.key, this.id = '', this.parentId = '', required this.forEditing});
@override @override
State<EditorScreen> createState() => _EditorScreenState(); ConsumerState<EditorScreen> createState() => _EditorScreenState();
} }
class _EditorScreenState extends State<EditorScreen> { class _EditorScreenState extends ConsumerState<EditorScreen> {
static final _logger = Logger('$EditorScreen'); static final _logger = Logger('$EditorScreen');
final contentController = TextEditingController(); final contentController = TextEditingController();
final spoilerController = TextEditingController(); final spoilerController = TextEditingController();
@ -596,12 +599,9 @@ class _EditorScreenState extends State<EditorScreen> {
], ],
); );
} }
final circles = context final profile = context.watch<AccountsService>().currentProfile;
.watch<ActiveProfileSelector<TimelineManager>>() final circles =
.activeEntry ref.watch(timelineGroupingListProvider(profile, GroupingType.circle));
.andThen((tm) => tm.getTimelineGroupingListData(GroupingType.circle))
.getValueOrElse(() => []);
circles.sort((g1, g2) => g1.name.compareTo(g2.name));
final circleMenuItems = <DropdownMenuItem<TimelineGroupingListData>>[]; final circleMenuItems = <DropdownMenuItem<TimelineGroupingListData>>[];
circleMenuItems.add(DropdownMenuItem( circleMenuItems.add(DropdownMenuItem(

Wyświetl plik

@ -12,8 +12,10 @@ import '../controls/responsive_max_width.dart';
import '../controls/standard_app_drawer.dart'; import '../controls/standard_app_drawer.dart';
import '../controls/timeline/timeline_panel.dart'; import '../controls/timeline/timeline_panel.dart';
import '../globals.dart'; import '../globals.dart';
import '../models/auth/profile.dart';
import '../models/timeline_grouping_list_data.dart'; import '../models/timeline_grouping_list_data.dart';
import '../models/timeline_identifiers.dart'; import '../models/timeline_identifiers.dart';
import '../riverpod_controllers/circles_repo_services.dart';
import '../riverpod_controllers/focus_mode.dart'; import '../riverpod_controllers/focus_mode.dart';
import '../services/auth_service.dart'; import '../services/auth_service.dart';
import '../services/network_status_service.dart'; import '../services/network_status_service.dart';
@ -52,6 +54,7 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
_logger.finest('Build'); _logger.finest('Build');
final accountService = getIt<AccountsService>(); final accountService = getIt<AccountsService>();
final profile = accountService.currentProfile;
final nss = getIt<NetworkStatusService>(); final nss = getIt<NetworkStatusService>();
final focusMode = ref.watch(focusModeProvider); final focusMode = ref.watch(focusModeProvider);
@ -75,7 +78,7 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
backgroundColor: Theme.of(context).canvasColor, backgroundColor: Theme.of(context).canvasColor,
title: focusMode.enabled title: focusMode.enabled
? FocusModeStatusHeadline(disableTime: focusMode.disableTime) ? FocusModeStatusHeadline(disableTime: focusMode.disableTime)
: buildTimelineSelector(context), : buildTimelineSelector(context, profile),
), ),
body: Center( body: Center(
child: Column( child: Column(
@ -102,7 +105,7 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
)); ));
} }
Widget buildTimelineSelector(BuildContext context) { Widget buildTimelineSelector(BuildContext context, Profile profile) {
final standardTypes = [ final standardTypes = [
TimelineType.self, TimelineType.self,
TimelineType.home, TimelineType.home,
@ -115,23 +118,20 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
.activeEntry .activeEntry
.value; .value;
final circles = manager final circles = ref.watch(timelineGroupingListProvider(
.getTimelineGroupingListData(GroupingType.circle) profile,
.getValueOrElse(() => []) GroupingType.circle,
.toList(); ));
circles.sort((g1, g2) => g1.name.compareTo(g2.name));
final groups = manager final groups = ref.watch(timelineGroupingListProvider(
.getTimelineGroupingListData(GroupingType.group) profile,
.getValueOrElse(() => []) GroupingType.group,
.toList(); ));
groups.sort((g1, g2) => g1.name.compareTo(g2.name));
final channels = manager final channels = ref.watch(timelineGroupingListProvider(
.getTimelineGroupingListData(GroupingType.channel) profile,
.getValueOrElse(() => []) GroupingType.channel,
.toList(); ));
channels.sort((g1, g2) => g1.name.compareTo(g2.name));
final items = [ final items = [
...standardTypes ...standardTypes

Wyświetl plik

@ -3,7 +3,6 @@ import 'package:logging/logging.dart';
import 'package:result_monad/result_monad.dart'; import 'package:result_monad/result_monad.dart';
import '../data/interfaces/circles_repo_intf.dart'; import '../data/interfaces/circles_repo_intf.dart';
import '../friendica_client/friendica_client.dart';
import '../models/auth/profile.dart'; import '../models/auth/profile.dart';
import '../models/entry_tree_item.dart'; import '../models/entry_tree_item.dart';
import '../models/exec_error.dart'; import '../models/exec_error.dart';
@ -11,7 +10,6 @@ import '../models/image_entry.dart';
import '../models/media_attachment_uploads/new_entry_media_items.dart'; import '../models/media_attachment_uploads/new_entry_media_items.dart';
import '../models/timeline.dart'; import '../models/timeline.dart';
import '../models/timeline_entry.dart'; import '../models/timeline_entry.dart';
import '../models/timeline_grouping_list_data.dart';
import '../models/timeline_identifiers.dart'; import '../models/timeline_identifiers.dart';
import '../models/visibility.dart'; import '../models/visibility.dart';
import 'entry_manager_service.dart'; import 'entry_manager_service.dart';
@ -42,35 +40,6 @@ class TimelineManager extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
Result<List<TimelineGroupingListData>, ExecError> getTimelineGroupingListData(
GroupingType type) {
if (circlesNotInitialized) {
_refreshCircleData();
circlesNotInitialized = false;
return Result.ok([]);
}
return Result.ok(circlesRepo
.getMyCircles()
.where((e) => e.groupingType == type)
.toList());
}
Future<void> _refreshCircleData() async {
_logger.finer('Refreshing member circle data ');
await TimelineGroupingListClient(profile)
.getTimelineGroupingListData()
.match(
onSuccess: (circles) {
circlesRepo.addAllCircles(circles);
notifyListeners();
},
onError: (error) {
_logger.severe('Error getting list data: $error');
},
);
}
FutureResult<bool, ExecError> createNewStatus( FutureResult<bool, ExecError> createNewStatus(
String text, { String text, {
String spoilerText = '', String spoilerText = '',