pompo96 982a910ee3 Bugfixes:
Cant join team if in team
Profile page resets properly
Post button spam no longer leads to crash due to duplicate calls

Housekeeping:
Made some name changes
moved homescreenpages from layout -> homeFeed
Deleted 2 unused classes, authService.dart and old loginPage.dart then renamed startPage.dart -> loginPage.dart

Set up openApi on backend and added URL in Service classes
2025-05-25 11:40:03 +02:00

121 lines
3.4 KiB
Dart

import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:insparkspokalen_ui/models/postModel.dart';
import 'package:flutter/foundation.dart';
class FeedService extends ChangeNotifier {
final String baseUrl = 'https://group-10-15.pvt.dsv.su.se/mission/post';
List<PostModel> _posts = [];
List<PostModel> get posts => _posts;
/* Future<List<PostModel>> showFeed() async {
final endpoint = Uri.parse('$baseUrl/all');
try {
final response = await http.get(endpoint);
if (response.statusCode == 200) {
final List<dynamic> data = jsonDecode(response.body);
return data.map((json) => PostModel.fromJson(json)).toList();
} else {
return [];
}
} catch (e) {
return [];
}
} */
Future<void> loadPosts() async {
final endpoint = Uri.parse('$baseUrl/all');
try {
final response = await http.get(endpoint);
if (response.statusCode == 200) {
final List<dynamic> data = jsonDecode(response.body);
_posts = data.map((json) => PostModel.fromJson(json)).toList();
notifyListeners();
} else {
_posts = [];
notifyListeners();
}
} catch (e) {
_posts = [];
notifyListeners();
}
}
Future<PostModel> addPost(PostModel post) async {
final response = await http.post(
Uri.parse('$baseUrl/add'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode(post.toJson()),
);
if (response.statusCode == 200 || response.statusCode == 201) {
final decoded = jsonDecode(response.body);
// Om decoded bara är ett heltal, använd det som id
if (decoded is int) {
return PostModel(
id: decoded,
title: post.title,
body: post.body,
filename: post.filename,
filetype: post.filetype,
time: post.time,
locationname: post.locationname,
latitude: post.latitude,
longitude: post.longitude,
points: post.points,
teamid: post.teamid,
missionid: post.missionid,
approved: post.approved,
);
} else {
throw Exception("Oväntat svar från servern: $decoded");
}
} else {
throw Exception("Kunde inte skapa inlägg");
}
}
Future<void> deletePost(PostModel post) async {
if (post.id == null) {
throw Exception("Post har inget id och kan inte raderas");
}
final endpoint = Uri.parse('$baseUrl/delete/${post.id}');
final response = await http.delete(endpoint);
if (response.statusCode != 200) {
throw Exception("Kunde inte radera inlägg: ${response.body}");
}
}
Future<void> updatePostStatus(PostModel post, PostStatus newStatus) async {
final endpoint = Uri.parse('$baseUrl/setstatus/${post.id}');
try {
final response = await http.put(
endpoint,
headers: {"Content-Type": "application/json"},
body: jsonEncode({
"approved": newStatus.name,
"timeupdated": DateTime.now().toIso8601String(),
}),
);
if (response.statusCode != 200) {
throw Exception(
"Kunde inte uppdatera status. Servern svarade med ${response.statusCode}",
);
}
// Uppdatera lokalt efter lyckad PUT
await loadPosts();
} catch (e) {
throw Exception("Något gick fel vid statusuppdatering: $e");
}
}
}