import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:f0ckapp/models/mediaitem_model.dart'; const List mediaTypes = ["alles", "image", "video", "audio"]; const List mediaModes = ["sfw", "nsfw", "untagged", "all"]; class ApiService extends GetConnect { RxList mediaItems = [].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 setTag(String? newTag) async { tag.value = newTag; return await fetchMedia(reset: true); } Future setType(int newType) async { type.value = newType >= 0 && newType < mediaTypes.length ? newType : 0; return await fetchMedia(reset: true); } Future setMode(int newMode) async { mode.value = newMode >= 0 && newMode < mediaModes.length ? newMode : 0; return await fetchMedia(reset: true); } Future 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 response = await get(url.toString()); if (response.isOk && response.body is List) { List 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; } } }