import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:loris/business_logic/account/account.dart'; import 'package:loris/business_logic/timeline/media.dart'; import '../settings.dart' as settings; import '../../global.dart' as global; class TimelinePartModel { late List threads; late int minId; late int maxId; } enum Visibility { public, unlisted, private, direct } class PostModel implements Comparable { late String id; late String uri; late String content; late Visibility visibility; late bool sensitive; late String spoilerText; late bool favourited; late bool reblogged; late AccountModel account; late List attachments; PostModel.fromJson(Map json) { id = json["id"] as String; uri = json["uri"] as String; content = json["content"] as String; visibility = Visibility.values.firstWhere( // ignore: prefer_interpolation_to_compose_strings (element) => element.toString() == "Visibility." + json["visibility"]); sensitive = json["sensitive"] as bool; spoilerText = json["spoiler_text"] as String; favourited = json["favourited"] as bool; reblogged = json["reblogged"] as bool; account = AccountModel.fromJson(json["account"]); attachments = []; List jsonAttachmentList = json["media_attachments"]; for (int i = 0; i < jsonAttachmentList.length; i++) { attachments.add(MediaAttachmentModel.fromJson(jsonAttachmentList[i])); } } @override int compareTo(dynamic b) { return id.compareTo(b.id); } Future getThread() async { final token = await settings.loadToken(); final baseUrl = await settings.loadInstanceUrl(); Map headers = {"Authorization": "Bearer $token"}; headers.addAll(global.defaultHeaders); final url = Uri( scheme: "https", host: baseUrl, path: "/api/v1/statuses/$id/context", ); final response = await http.get(url, headers: headers); if (response.statusCode != 200) { return ThreadModel([this]); } final json = jsonDecode(response.body); final List ancestorsJson = json["ancestors"]; List posts = [this]; int i = 0; while (i < ancestorsJson.length) { posts.add(PostModel.fromJson(ancestorsJson[i])); i++; } return ThreadModel(posts); } } class ThreadModel { late List posts; ThreadModel(List allPosts) { allPosts.sort(); posts = allPosts; } } Future getTimelineFromServer(String? olderThan) async { final token = await settings.loadToken(); Map query = {"limit": 1.toString()}; if (olderThan != null) { query.addAll({"max_id": olderThan}); } final baseUrl = await settings.loadInstanceUrl(); final url = Uri( scheme: "https", host: baseUrl, path: "/api/v1/timelines/home", queryParameters: query, ); Map headers = {"Authorization": "Bearer $token"}; headers.addAll(global.defaultHeaders); final response = await http.get(url, headers: headers); final List json = jsonDecode(response.body); final post = PostModel.fromJson(json[0]); return await post.getThread(); }