relatica/lib/models/filters/timeline_entry_filter.dart

116 wiersze
3.5 KiB
Dart

import 'package:uuid/uuid.dart';
import '../connection.dart';
import 'string_filter.dart';
enum TimelineEntryFilterAction {
hide,
warn,
;
factory TimelineEntryFilterAction.parse(String? value) {
return TimelineEntryFilterAction.values.firstWhere(
(v) => v.name == value,
orElse: () => warn,
);
}
}
class TimelineEntryFilter {
final String id;
final TimelineEntryFilterAction action;
final String name;
final List<StringFilter> authorFilters;
final List<StringFilter> domainFilters;
final List<StringFilter> keywordFilters;
final List<StringFilter> hashtagFilters;
const TimelineEntryFilter({
required this.id,
required this.action,
required this.name,
required this.authorFilters,
required this.domainFilters,
required this.keywordFilters,
required this.hashtagFilters,
});
factory TimelineEntryFilter.create({
String? id,
required TimelineEntryFilterAction action,
required String name,
List<Connection> authors = const [],
List<String> domains = const [],
List<String> keywords = const [],
List<String> hashtags = const [],
}) {
return TimelineEntryFilter(
id: id ?? const Uuid().v4(),
action: action,
name: name,
authorFilters: authors
.map((a) =>
StringFilter(filterString: a.id, type: ComparisonType.equals))
.toList(),
domainFilters: domains
.map((d) => d.startsWith('*')
? StringFilter(
filterString: d.substring(1),
type: ComparisonType.endsWithIgnoreCase,
)
: StringFilter(
filterString: d,
type: ComparisonType.equalsIgnoreCase,
))
.toList(),
keywordFilters: keywords
.map((k) => StringFilter(
filterString: k, type: ComparisonType.containsIgnoreCase))
.toList(),
hashtagFilters: hashtags
.map((h) => StringFilter(
filterString: h, type: ComparisonType.equalsIgnoreCase))
.toList(),
);
}
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is TimelineEntryFilter &&
runtimeType == other.runtimeType &&
id == other.id;
@override
int get hashCode => id.hashCode;
Map<String, dynamic> toJson() => {
'id': id,
'action': action.name,
'name': name,
'authorFilters': authorFilters.map((f) => f.toJson()).toList(),
'domainFilters': domainFilters.map((f) => f.toJson()).toList(),
'keywordFilters': keywordFilters.map((f) => f.toJson()).toList(),
'hashtagFilters': hashtagFilters.map((f) => f.toJson()).toList(),
};
factory TimelineEntryFilter.fromJson(Map<String, dynamic> json) =>
TimelineEntryFilter(
id: json['id'],
action: TimelineEntryFilterAction.parse(json['action']),
name: json['name'],
authorFilters: (json['authorFilters'] as List<dynamic>)
.map((json) => StringFilter.fromJson(json))
.toList(),
domainFilters: (json['domainFilters'] as List<dynamic>)
.map((json) => StringFilter.fromJson(json))
.toList(),
keywordFilters: (json['keywordFilters'] as List<dynamic>)
.map((json) => StringFilter.fromJson(json))
.toList(),
hashtagFilters: (json['hashtagFilters'] as List<dynamic>)
.map((json) => StringFilter.fromJson(json))
.toList(),
);
}