This commit is contained in:
@ -1,110 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:get/get.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
|
||||
import 'package:f0ckapp/models/mediaitem_model.dart';
|
||||
|
||||
const List<String> mediaTypes = ["alles", "image", "video", "audio"];
|
||||
const List<String> mediaModes = ["sfw", "nsfw", "untagged", "all"];
|
||||
|
||||
class ApiService extends GetConnect {
|
||||
final _storage = const FlutterSecureStorage(
|
||||
aOptions: AndroidOptions(encryptedSharedPreferences: true),
|
||||
);
|
||||
RxList<MediaItem> mediaItems = <MediaItem>[].obs;
|
||||
RxnString tag = RxnString();
|
||||
RxInt type = 0.obs;
|
||||
RxInt mode = 0.obs;
|
||||
RxBool random = false.obs;
|
||||
RxBool muted = false.obs;
|
||||
|
||||
bool _isFetching = false;
|
||||
DateTime? _lastFetchTime;
|
||||
final Duration _minFetchInterval = Duration(milliseconds: 500);
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
loadMutedState();
|
||||
everAll([tag, type, mode, random], (_) => fetchMedia(reset: true));
|
||||
}
|
||||
|
||||
Future<void> loadMutedState() async {
|
||||
String? value = await _storage.read(key: 'muted');
|
||||
muted.value = value == 'true';
|
||||
}
|
||||
|
||||
Future<void> toggleMuted() async {
|
||||
muted.value = !muted.value;
|
||||
await _storage.write(key: 'muted', value: muted.value.toString());
|
||||
}
|
||||
|
||||
Future<void> setTag(String? newTag) async {
|
||||
tag.value = newTag;
|
||||
return await fetchMedia(reset: true);
|
||||
}
|
||||
|
||||
Future<void> setType(int newType) async {
|
||||
type.value = newType >= 0 && newType < mediaTypes.length ? newType : 0;
|
||||
return await fetchMedia(reset: true);
|
||||
}
|
||||
|
||||
Future<void> setMode(int newMode) async {
|
||||
mode.value = newMode >= 0 && newMode < mediaModes.length ? newMode : 0;
|
||||
return await fetchMedia(reset: true);
|
||||
}
|
||||
|
||||
Future<void> toggleRandom() async {
|
||||
random.value = !random.value;
|
||||
return await fetchMedia(reset: true);
|
||||
}
|
||||
|
||||
Future fetchMedia({int? id, bool reset = false}) async {
|
||||
if (!reset) {
|
||||
if (_isFetching) return;
|
||||
if (_lastFetchTime != null &&
|
||||
DateTime.now().difference(_lastFetchTime!) < _minFetchInterval) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
_lastFetchTime = DateTime.now();
|
||||
_isFetching = true;
|
||||
|
||||
if (reset) mediaItems.clear();
|
||||
|
||||
final int? older =
|
||||
id ?? (mediaItems.isNotEmpty ? mediaItems.last.id : null);
|
||||
final Uri url = Uri.parse('https://api.f0ck.me/items/get').replace(
|
||||
queryParameters: {
|
||||
'type': mediaTypes[type.value],
|
||||
'mode': mode.value.toString(),
|
||||
'random': (random.value ? 1 : 0).toString(),
|
||||
if (tag.value != null) 'tag': tag.value,
|
||||
if (older != null) 'older': older.toString(),
|
||||
},
|
||||
);
|
||||
|
||||
try {
|
||||
final Response<dynamic> response = await get(url.toString());
|
||||
|
||||
if (response.isOk && response.body is List) {
|
||||
List<MediaItem> newMedia = (response.body as List)
|
||||
.map((json) => MediaItem.fromJson(json))
|
||||
.toList();
|
||||
|
||||
if (reset) {
|
||||
mediaItems.assignAll(newMedia);
|
||||
} else {
|
||||
mediaItems.addAll(newMedia);
|
||||
}
|
||||
} else {
|
||||
debugPrint('Fehler beim Laden der MediaItems: ${response.statusText}');
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('Exception beim Laden der MediaItems: $e');
|
||||
} finally {
|
||||
_isFetching = false;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user