diff --git a/lib/main.dart b/lib/main.dart index dc3c6b916760dcce966369d2d9d477ac72fb9d18..34b056c4b3fadee967817912c90104897634be4a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,8 @@ import 'package:english_words/english_words.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert'; void main() { runApp(MyApp()); @@ -26,18 +28,109 @@ class MyApp extends StatelessWidget { class MyAppState extends ChangeNotifier { var current = WordPair.random(); + late Future<List<WordPair>> futureFavorites; + final String host = 'localhost:3000'; + final String path = ''; + var favorites = <WordPair>[]; + + final Map<String, String> headers = { + 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', + 'accept-language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7', + 'cache-control': 'no-cache', + 'pragma': 'no-cache', + 'priority': 'u=0, i', + 'sec-ch-ua': '"Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"macOS"', + 'sec-fetch-dest': 'document', + 'sec-fetch-mode': 'navigate', + 'sec-fetch-site': 'none', + 'sec-fetch-user': '?1', + 'upgrade-insecure-requests': '1', + 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36', + }; + + void printResponse(http.Response response, String operation) { + print('$operation response status: ${response.statusCode}'); + print('$operation response body: ${response.body}'); + } + + MyAppState(){ + futureFavorites = fetchFavorites(); + } + + Future<List<WordPair>> fetchFavorites() async { + try { + var response = await http.get( + Uri.http(host, path + '/likes'), + headers: headers, + ); + printResponse(response, 'Fetch favorites'); + + if (response.statusCode != 200) { + throw Exception('Failed to fetch favorites: ${response.statusCode} - ${response.body}'); + } + var json = jsonDecode(response.body); + + List<WordPair> getFavorites = []; + for (var e in json) { + getFavorites.add(WordPair(e['id'].split('_')[0], e['id'].split('_')[1])); + } + favorites = [...getFavorites]; + notifyListeners(); + return favorites; + } catch (e) { + print('Error fetching favorites: $e'); + return []; + } + } void getNext() { current = WordPair.random(); notifyListeners(); } - var favorites = <WordPair>[]; + + Future<void> deleteFavorites() async { + try { + var response = await http.delete( + Uri.http(host, path + '/likes/${current.first}_${current.second}'), + headers: headers, + ); + printResponse(response, 'Delete favorite'); + + if (response.statusCode != 200) { + throw Exception('Failed to delete favorite: ${response.statusCode} - ${response.body}'); + } + } catch (e) { + print('Error deleting favorite: $e'); + rethrow; + } + } + + Future<void> addFavorite() async { + try { + var response = await http.post( + Uri.http(host, path + '/likes/${current.first}_${current.second}'), + headers: headers, + ); + printResponse(response, 'Add favorite'); + + if (response.statusCode != 200) { + throw Exception('Failed to add favorite: ${response.statusCode} - ${response.body}'); + } + } catch (e) { + print('Error adding favorite: $e'); + rethrow; + } + } - void toggleFavorite() { + void toggleFavorite() async { if (favorites.contains(current)) { + await deleteFavorites(); favorites.remove(current); } else { + await addFavorite(); favorites.add(current); } notifyListeners(); diff --git a/pubspec.lock b/pubspec.lock index 39660c34ae54fd4cd8e8348cdb1510e518226105..c0a4868314b825dce565c512b20cf2c4c12fa123 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -75,6 +75,22 @@ packages: description: flutter source: sdk version: "0.0.0" + http: + dependency: "direct main" + description: + name: http + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" leak_tracker: dependency: transitive description: @@ -151,10 +167,10 @@ packages: dependency: "direct main" description: name: provider - sha256: "489024f942069c2920c844ee18bb3d467c69e48955a4f32d1677f71be103e310" + sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "6.1.5" sky_engine: dependency: transitive description: flutter @@ -208,6 +224,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.4" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" vector_math: dependency: transitive description: @@ -224,6 +248,14 @@ packages: url: "https://pub.dev" source: hosted version: "14.3.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" sdks: dart: ">=3.7.0-0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml index cbe4c31dd9ae720433ed57a488ffee5586a69cdf..e63b3ff913eb9101073ee04c9ef3eee5ee97152f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: english_words: ^4.0.0 provider: ^6.0.0 + http: ^1.4.0 dev_dependencies: flutter_test: