fApp/lib/services/api_service.dart
Flummi 9655f15927
All checks were successful
Flutter Schmutter / build (push) Successful in 3m37s
v1.2.0+54
- screaming_possum.gif
2025-06-13 13:55:05 +02:00

95 lines
2.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.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 {
RxList<MediaItem> mediaItems = <MediaItem>[].obs;
RxnString tag = RxnString();
RxInt type = 0.obs;
RxInt mode = 0.obs;
RxBool random = false.obs;
bool _isFetching = false;
DateTime? _lastFetchTime;
final Duration _minFetchInterval = Duration(milliseconds: 500);
@override
void onInit() {
super.onInit();
everAll([tag, type, mode, random], (_) => fetchMedia(reset: true));
}
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;
}
}
}