kopia lustrzana https://gitlab.com/mysocialportal/relatica
Refactor Timeline Grouping into RP provider
rodzic
1358a3e7b4
commit
f6cee22d3c
|
@ -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;
|
||||
}
|
|
@ -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
|
|
@ -3,6 +3,9 @@ import 'dart:io';
|
|||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../models/auth/profile.dart';
|
||||
import '../services/entry_manager_service.dart';
|
||||
|
||||
part 'globals_services.g.dart';
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
|
@ -12,3 +15,8 @@ SharedPreferences sharedPreferences(SharedPreferencesRef ref) =>
|
|||
@Riverpod(keepAlive: true)
|
||||
Directory applicationSupportDirectory(ApplicationSupportDirectoryRef ref) =>
|
||||
throw UnimplementedError();
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
EntryManagerService entryManagerService(
|
||||
EntryManagerServiceRef ref, Profile profile) =>
|
||||
EntryManagerService(profile);
|
||||
|
|
|
@ -37,5 +37,154 @@ final applicationSupportDirectoryProvider = Provider<Directory>.internal(
|
|||
);
|
||||
|
||||
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: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:flutter/material.dart' hide Visibility;
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:logging/logging.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_grouping_list_data.dart';
|
||||
import '../models/visibility.dart';
|
||||
import '../riverpod_controllers/circles_repo_services.dart';
|
||||
import '../serializers/friendica/link_preview_friendica_extensions.dart';
|
||||
import '../services/auth_service.dart';
|
||||
import '../services/connections_manager.dart';
|
||||
import '../services/feature_version_checker.dart';
|
||||
import '../services/timeline_manager.dart';
|
||||
|
@ -34,7 +37,7 @@ import '../utils/opengraph_preview_grabber.dart';
|
|||
import '../utils/snackbar_builder.dart';
|
||||
import '../utils/string_utils.dart';
|
||||
|
||||
class EditorScreen extends StatefulWidget {
|
||||
class EditorScreen extends ConsumerStatefulWidget {
|
||||
final String id;
|
||||
final String parentId;
|
||||
final bool forEditing;
|
||||
|
@ -43,10 +46,10 @@ class EditorScreen extends StatefulWidget {
|
|||
{super.key, this.id = '', this.parentId = '', required this.forEditing});
|
||||
|
||||
@override
|
||||
State<EditorScreen> createState() => _EditorScreenState();
|
||||
ConsumerState<EditorScreen> createState() => _EditorScreenState();
|
||||
}
|
||||
|
||||
class _EditorScreenState extends State<EditorScreen> {
|
||||
class _EditorScreenState extends ConsumerState<EditorScreen> {
|
||||
static final _logger = Logger('$EditorScreen');
|
||||
final contentController = TextEditingController();
|
||||
final spoilerController = TextEditingController();
|
||||
|
@ -596,12 +599,9 @@ class _EditorScreenState extends State<EditorScreen> {
|
|||
],
|
||||
);
|
||||
}
|
||||
final circles = context
|
||||
.watch<ActiveProfileSelector<TimelineManager>>()
|
||||
.activeEntry
|
||||
.andThen((tm) => tm.getTimelineGroupingListData(GroupingType.circle))
|
||||
.getValueOrElse(() => []);
|
||||
circles.sort((g1, g2) => g1.name.compareTo(g2.name));
|
||||
final profile = context.watch<AccountsService>().currentProfile;
|
||||
final circles =
|
||||
ref.watch(timelineGroupingListProvider(profile, GroupingType.circle));
|
||||
|
||||
final circleMenuItems = <DropdownMenuItem<TimelineGroupingListData>>[];
|
||||
circleMenuItems.add(DropdownMenuItem(
|
||||
|
|
|
@ -12,8 +12,10 @@ import '../controls/responsive_max_width.dart';
|
|||
import '../controls/standard_app_drawer.dart';
|
||||
import '../controls/timeline/timeline_panel.dart';
|
||||
import '../globals.dart';
|
||||
import '../models/auth/profile.dart';
|
||||
import '../models/timeline_grouping_list_data.dart';
|
||||
import '../models/timeline_identifiers.dart';
|
||||
import '../riverpod_controllers/circles_repo_services.dart';
|
||||
import '../riverpod_controllers/focus_mode.dart';
|
||||
import '../services/auth_service.dart';
|
||||
import '../services/network_status_service.dart';
|
||||
|
@ -52,6 +54,7 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
|
|||
Widget build(BuildContext context) {
|
||||
_logger.finest('Build');
|
||||
final accountService = getIt<AccountsService>();
|
||||
final profile = accountService.currentProfile;
|
||||
final nss = getIt<NetworkStatusService>();
|
||||
final focusMode = ref.watch(focusModeProvider);
|
||||
|
||||
|
@ -75,7 +78,7 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
|
|||
backgroundColor: Theme.of(context).canvasColor,
|
||||
title: focusMode.enabled
|
||||
? FocusModeStatusHeadline(disableTime: focusMode.disableTime)
|
||||
: buildTimelineSelector(context),
|
||||
: buildTimelineSelector(context, profile),
|
||||
),
|
||||
body: Center(
|
||||
child: Column(
|
||||
|
@ -102,7 +105,7 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
|
|||
));
|
||||
}
|
||||
|
||||
Widget buildTimelineSelector(BuildContext context) {
|
||||
Widget buildTimelineSelector(BuildContext context, Profile profile) {
|
||||
final standardTypes = [
|
||||
TimelineType.self,
|
||||
TimelineType.home,
|
||||
|
@ -115,23 +118,20 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
|
|||
.activeEntry
|
||||
.value;
|
||||
|
||||
final circles = manager
|
||||
.getTimelineGroupingListData(GroupingType.circle)
|
||||
.getValueOrElse(() => [])
|
||||
.toList();
|
||||
circles.sort((g1, g2) => g1.name.compareTo(g2.name));
|
||||
final circles = ref.watch(timelineGroupingListProvider(
|
||||
profile,
|
||||
GroupingType.circle,
|
||||
));
|
||||
|
||||
final groups = manager
|
||||
.getTimelineGroupingListData(GroupingType.group)
|
||||
.getValueOrElse(() => [])
|
||||
.toList();
|
||||
groups.sort((g1, g2) => g1.name.compareTo(g2.name));
|
||||
final groups = ref.watch(timelineGroupingListProvider(
|
||||
profile,
|
||||
GroupingType.group,
|
||||
));
|
||||
|
||||
final channels = manager
|
||||
.getTimelineGroupingListData(GroupingType.channel)
|
||||
.getValueOrElse(() => [])
|
||||
.toList();
|
||||
channels.sort((g1, g2) => g1.name.compareTo(g2.name));
|
||||
final channels = ref.watch(timelineGroupingListProvider(
|
||||
profile,
|
||||
GroupingType.channel,
|
||||
));
|
||||
|
||||
final items = [
|
||||
...standardTypes
|
||||
|
|
|
@ -3,7 +3,6 @@ import 'package:logging/logging.dart';
|
|||
import 'package:result_monad/result_monad.dart';
|
||||
|
||||
import '../data/interfaces/circles_repo_intf.dart';
|
||||
import '../friendica_client/friendica_client.dart';
|
||||
import '../models/auth/profile.dart';
|
||||
import '../models/entry_tree_item.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/timeline.dart';
|
||||
import '../models/timeline_entry.dart';
|
||||
import '../models/timeline_grouping_list_data.dart';
|
||||
import '../models/timeline_identifiers.dart';
|
||||
import '../models/visibility.dart';
|
||||
import 'entry_manager_service.dart';
|
||||
|
@ -42,35 +40,6 @@ class TimelineManager extends ChangeNotifier {
|
|||
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(
|
||||
String text, {
|
||||
String spoilerText = '',
|
||||
|
|
Ładowanie…
Reference in New Issue