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: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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 = '',
|
||||||
|
|
Ładowanie…
Reference in New Issue