diff --git a/lib/main.dart b/lib/main.dart index 445b0ebfb9811463f986f6ad57fdaf050c41ead2..8d9dbbe8b9e6fcafe59b80e0ce91d8f270ccdcfe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,10 +1,19 @@ +import 'dart:convert'; + import 'package:english_words/english_words.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:provider/provider.dart'; +import 'package:http/http.dart' as http; void main() { - runApp(MyApp()); + + runApp( + ChangeNotifierProvider( + create: (context) => MyAppState(), + child: const MyApp(), + ), + ); } class MyApp extends StatelessWidget { @@ -12,15 +21,26 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return ChangeNotifierProvider( - create: (context) => MyAppState(), - child: MaterialApp( - title: 'Namer App', - theme: ThemeData( - useMaterial3: true, - colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue), - ), - home: MyHomePage(), + var appState = context.watch<MyAppState>(); + return MaterialApp( + title: 'Namer App', + theme: ThemeData( + useMaterial3: true, + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange), + ), + home: FutureBuilder<List<WordPair>>( + future: appState.futureFavorites, + builder: (context, snapshot) { + if(snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if(snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}'),); + } else if(snapshot.hasData) { + return MyHomePage(); + } else { + return const Center(child: Text('No favorites yer.')); + } + } ), ); } @@ -28,20 +48,63 @@ class MyApp extends StatelessWidget { class MyAppState extends ChangeNotifier { var current = WordPair.random(); + List<WordPair> favorites = []; + late Future<List<WordPair>> futureFavorites; + + MyAppState() { + futureFavorites = fetchFavorites(); + } void getNext() { current = WordPair.random(); notifyListeners(); } - var favorites = <WordPair>[]; + Future<List<WordPair>> fetchFavorites() async { + final response = await http.get( + Uri.parse('http://localhost:3000/likes') + ); + List<WordPair> list = []; + var jsonData = jsonDecode(response.body); + for (Map<String, dynamic> obj in jsonData) { + List<String> res = obj["id"].split('_'); + list.add(WordPair(res[0], res[1])); + } + + favorites = [...list]; + notifyListeners(); + return list; + } - void toggleFavorite() { + Future<void> toggleFavorite() async{ + var uri = "http://localhost:3000/likes/${current.first}_${current.second}"; if (favorites.contains(current)) { - favorites.remove(current); + final http.Response resp = await http.delete(Uri.parse(uri)); + if(resp.statusCode != 200) { + return; + } + favorites.remove(current); + favorites = [...favorites]; } else { - favorites.add(current); + print("1"); + final http.Response resp = await http.post( + Uri.parse(uri), + headers: <String, String> { + 'Content-Type': 'application/json; charset=UTF-8', + }, + body: jsonEncode(<String, dynamic>{ + 'collectionId': "${current.first}_${current.second}", + 'like' : true, + }) + ); + print("2"); + if(resp.statusCode != 200) { + return; + } + + favorites = [...favorites, current]; } + print(favorites); notifyListeners(); } }