refactor: change ordering of classes and functions

main
daniel-michel 2023-11-16 13:12:55 +01:00
parent 5c11b931c0
commit bbe2c6a718
5 changed files with 107 additions and 119 deletions

View File

@ -2,11 +2,6 @@ import 'dart:async';
import 'package:http/http.dart' as http;
class RateLimitStatus {
int consecutiveCount = 0;
Duration timeout = const Duration(seconds: 1);
}
class ApiManager {
String baseUrl;
Future<void> ongoingRequest = Future.value();
@ -59,3 +54,8 @@ class ApiManager {
}
}
}
class RateLimitStatus {
int consecutiveCount = 0;
Duration timeout = const Duration(seconds: 1);
}

View File

@ -1,3 +1,21 @@
String dateRelativeToNow(DateTime date) {
DateTime dateOnly = DateTime.utc(date.year, date.month, date.day);
DateTime now = DateTime.now().toUtc();
DateTime today = DateTime.utc(now.year, now.month, now.day);
Duration diff = dateOnly.difference(today);
return _durationToRelativeTimeString(diff);
}
String _durationToRelativeTimeString(Duration duration) {
if (duration.isNegative) {
return "${_durationApproximatedInWords(-duration)} ago";
} else if (duration == Duration.zero) {
return "now";
} else {
return "in ${_durationApproximatedInWords(duration)}";
}
}
String _durationApproximatedInWords(Duration duration) {
int seconds = duration.inSeconds;
int minutes = duration.inMinutes;
@ -36,21 +54,3 @@ String _durationApproximatedInWords(Duration duration) {
}
return centuries > 1 ? "$centuries centuries" : "a century";
}
String _durationToRelativeTimeString(Duration duration) {
if (duration.isNegative) {
return "${_durationApproximatedInWords(-duration)} ago";
} else if (duration == Duration.zero) {
return "now";
} else {
return "in ${_durationApproximatedInWords(duration)}";
}
}
String dateRelativeToNow(DateTime date) {
DateTime dateOnly = DateTime.utc(date.year, date.month, date.day);
DateTime now = DateTime.now().toUtc();
DateTime today = DateTime.utc(now.year, now.month, now.day);
Duration diff = dateOnly.difference(today);
return _durationToRelativeTimeString(diff);
}

View File

@ -0,0 +1,21 @@
import 'dart:async';
class DelayedFunctionCaller {
final Function function;
final Duration duration;
Timer? _timer;
DelayedFunctionCaller(this.function, this.duration);
void call() {
// If a timer is already active, return.
if (_timer != null && _timer!.isActive) {
return;
}
// Create a timer that calls the function after the specified duration.
_timer = Timer(duration, () {
function();
});
}
}

View File

@ -1,63 +1,6 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
class Review {
String score;
String by;
DateTime asOf;
int count;
Review(this.score, this.by, this.asOf, this.count);
Review.fromJsonEncodable(Map json)
: score = json["score"],
by = json["by"],
asOf = DateTime.parse(json["asOf"]),
count = json["count"];
Map toJsonEncodable() {
return {
"score": score,
"by": by,
"asOf": asOf.toIso8601String(),
"count": count,
};
}
}
typedef TitleInLanguage = ({String title, String language});
class DateWithPrecisionAndCountry {
DateTime date;
DatePrecision precision;
String country;
DateWithPrecisionAndCountry(this.date, this.precision, this.country);
DateWithPrecisionAndCountry.fromJsonEncodable(List<dynamic> json)
: date = DateTime.parse(json[0]),
precision = DatePrecision.values
.firstWhere((element) => element.name == json[1]),
country = json[2];
toJsonEncodable() {
return [date.toIso8601String(), precision.name, country];
}
@override
String toString() {
String dateString = switch (precision) {
DatePrecision.decade || DatePrecision.year => date.year.toString(),
DatePrecision.month => DateFormat("MMMM yyyy").format(date),
DatePrecision.day => DateFormat("MMMM d, yyyy").format(date),
DatePrecision.hour => DateFormat("MMMM d, yyyy, HH").format(date),
DatePrecision.minute => DateFormat("MMMM d, yyyy, HH:mm").format(date)
};
return "$dateString ($country)";
}
}
enum DatePrecision { decade, year, month, day, hour, minute }
class MovieData extends ChangeNotifier {
String _title;
DateWithPrecisionAndCountry _releaseDate;
@ -187,3 +130,60 @@ class MovieData extends ChangeNotifier {
: null);
}
}
enum DatePrecision { decade, year, month, day, hour, minute }
typedef TitleInLanguage = ({String title, String language});
class DateWithPrecisionAndCountry {
DateTime date;
DatePrecision precision;
String country;
DateWithPrecisionAndCountry(this.date, this.precision, this.country);
DateWithPrecisionAndCountry.fromJsonEncodable(List<dynamic> json)
: date = DateTime.parse(json[0]),
precision = DatePrecision.values
.firstWhere((element) => element.name == json[1]),
country = json[2];
toJsonEncodable() {
return [date.toIso8601String(), precision.name, country];
}
@override
String toString() {
String dateString = switch (precision) {
DatePrecision.decade || DatePrecision.year => date.year.toString(),
DatePrecision.month => DateFormat("MMMM yyyy").format(date),
DatePrecision.day => DateFormat("MMMM d, yyyy").format(date),
DatePrecision.hour => DateFormat("MMMM d, yyyy, HH").format(date),
DatePrecision.minute => DateFormat("MMMM d, yyyy, HH:mm").format(date)
};
return "$dateString ($country)";
}
}
class Review {
String score;
String by;
DateTime asOf;
int count;
Review(this.score, this.by, this.asOf, this.count);
Review.fromJsonEncodable(Map json)
: score = json["score"],
by = json["by"],
asOf = DateTime.parse(json["asOf"]),
count = json["count"];
Map toJsonEncodable() {
return {
"score": score,
"by": by,
"asOf": asOf.toIso8601String(),
"count": count,
};
}
}

View File

@ -3,37 +3,10 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:release_schedule/api/movie_api.dart';
import 'package:release_schedule/api/wikidata_movie_api.dart';
import 'package:release_schedule/model/delayed_function_caller.dart';
import 'package:release_schedule/model/local_movie_storage.dart';
import 'package:release_schedule/model/movie.dart';
T? firstWhereOrNull<T>(List<T> list, bool Function(T element) test) {
try {
return list.firstWhere(test);
} catch (e) {
return null;
}
}
class DelayedFunctionCaller {
final Function function;
final Duration duration;
Timer? _timer;
DelayedFunctionCaller(this.function, this.duration);
void call() {
// If a timer is already active, return.
if (_timer != null && _timer!.isActive) {
return;
}
// Create a timer that calls the function after the specified duration.
_timer = Timer(duration, () {
function();
});
}
}
final movieManager = MovieManager(WikidataMovieApi(),
LocalMovieStorageGetStorage(WikidataMovieData.fromEncodable));
@ -161,16 +134,10 @@ class MovieManager extends ChangeNotifier {
}
}
class LiveSearch<CustomMovieData extends MovieData> extends ChangeNotifier {
String searchTerm = "";
List<CustomMovieData> searchResults = [];
Duration minTimeBetweenRequests = const Duration(milliseconds: 500);
Duration minTimeAfterChangeToRequest = const Duration(milliseconds: 200);
final MovieManager manager;
LiveSearch(this.manager);
void updateSearch(String search) {
searchTerm = search;
T? firstWhereOrNull<T>(List<T> list, bool Function(T element) test) {
try {
return list.firstWhere(test);
} catch (e) {
return null;
}
}