diff --git a/lib/pangea/common/network/urls.dart b/lib/pangea/common/network/urls.dart index 5bb4f2c86..433ef026c 100644 --- a/lib/pangea/common/network/urls.dart +++ b/lib/pangea/common/network/urls.dart @@ -65,6 +65,8 @@ class PApiUrls { "${PApiUrls.choreoEndpoint}/practice"; static String lemmaDictionary = "${PApiUrls.choreoEndpoint}/lemma_definition"; + static String lemmaDictionaryEdit = + "${PApiUrls.choreoEndpoint}/lemma_definition/edit"; static String morphDictionary = "${PApiUrls.choreoEndpoint}/morph_meaning"; static String activityPlanGeneration = diff --git a/lib/pangea/lemmas/lemma_edit_request.dart b/lib/pangea/lemmas/lemma_edit_request.dart new file mode 100644 index 000000000..568e5356e --- /dev/null +++ b/lib/pangea/lemmas/lemma_edit_request.dart @@ -0,0 +1,40 @@ +class LemmaEditRequest { + String lemma; + String partOfSpeech; + String lemmaLang; + String userL1; + + String? newMeaning; + List? newEmojis; + + LemmaEditRequest({ + required this.lemma, + required this.partOfSpeech, + required this.lemmaLang, + required this.userL1, + this.newMeaning, + this.newEmojis, + }); + + Map toJson() { + return { + "lemma": lemma, + "part_of_speech": partOfSpeech, + "lemma_lang": lemmaLang, + "user_l1": userL1, + "new_meaning": newMeaning, + "new_emojis": newEmojis, + }; + } + + factory LemmaEditRequest.fromJson(Map json) { + return LemmaEditRequest( + lemma: json["lemma"], + partOfSpeech: json["part_of_speech"], + lemmaLang: json["lemma_lang"], + userL1: json["user_l1"], + newMeaning: json["new_meaning"], + newEmojis: List.from(json["new_emojis"] ?? []), + ); + } +} diff --git a/lib/pangea/lemmas/lemma_info_repo.dart b/lib/pangea/lemmas/lemma_info_repo.dart index 5624a6f38..bd3bb785e 100644 --- a/lib/pangea/lemmas/lemma_info_repo.dart +++ b/lib/pangea/lemmas/lemma_info_repo.dart @@ -10,6 +10,7 @@ import 'package:fluffychat/pangea/common/config/environment.dart'; import 'package:fluffychat/pangea/common/network/requests.dart'; import 'package:fluffychat/pangea/common/network/urls.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; +import 'package:fluffychat/pangea/lemmas/lemma_edit_request.dart'; import 'package:fluffychat/pangea/lemmas/lemma_info_request.dart'; import 'package:fluffychat/pangea/lemmas/lemma_info_response.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -101,4 +102,35 @@ class LemmaInfoRepo { rethrow; } } + + static Future edit(LemmaEditRequest request) async { + final Requests req = Requests( + choreoApiKey: Environment.choreoApiKey, + accessToken: MatrixState.pangeaController.userController.accessToken, + ); + + final resp = await req.post( + url: PApiUrls.lemmaDictionaryEdit, + body: request.toJson(), + ); + + if (resp.statusCode != 200) { + throw Exception( + 'Failed to edit lemma: ${resp.statusCode} ${resp.body}', + ); + } + + final decodedBody = jsonDecode(utf8.decode(resp.bodyBytes)); + final response = LemmaInfoResponse.fromJson(decodedBody); + + set( + LemmaInfoRequest( + lemma: request.lemma, + partOfSpeech: request.partOfSpeech, + lemmaLang: request.lemmaLang, + userL1: request.userL1, + ), + response, + ); + } } diff --git a/lib/pangea/toolbar/widgets/word_zoom/lemma_meaning_builder.dart b/lib/pangea/toolbar/widgets/word_zoom/lemma_meaning_builder.dart index 7e2be07f9..2aede4816 100644 --- a/lib/pangea/toolbar/widgets/word_zoom/lemma_meaning_builder.dart +++ b/lib/pangea/toolbar/widgets/word_zoom/lemma_meaning_builder.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/constructs/construct_identifier.dart'; import 'package:fluffychat/pangea/learning_settings/constants/language_constants.dart'; +import 'package:fluffychat/pangea/lemmas/lemma_edit_request.dart'; import 'package:fluffychat/pangea/lemmas/lemma_info_repo.dart'; import 'package:fluffychat/pangea/lemmas/lemma_info_request.dart'; import 'package:fluffychat/pangea/lemmas/lemma_info_response.dart'; @@ -84,14 +86,34 @@ class LemmaMeaningBuilderState extends State { void toggleEditMode(bool value) => setState(() => editMode = value); Future editLemmaMeaning(String userEdit) async { - final originalMeaning = lemmaInfo; - - if (originalMeaning != null) { - LemmaInfoRepo.set( - _request, - LemmaInfoResponse(emoji: originalMeaning.emoji, meaning: userEdit), + try { + await LemmaInfoRepo.edit( + LemmaEditRequest( + lemma: widget.constructId.lemma, + partOfSpeech: widget.constructId.category, + lemmaLang: widget.langCode, + userL1: MatrixState + .pangeaController.languageController.userL1?.langCode ?? + LanguageKeys.defaultLanguage, + newMeaning: userEdit, + newEmojis: lemmaInfo?.emoji, + ), ); - + } catch (e, s) { + ErrorHandler.logError( + e: e, + s: s, + data: { + 'lemma': widget.constructId.lemma, + 'partOfSpeech': widget.constructId.category, + 'lemmaLang': widget.langCode, + 'userL1': MatrixState + .pangeaController.languageController.userL1?.langCode ?? + LanguageKeys.defaultLanguage, + 'newMeaning': userEdit, + }, + ); + } finally { toggleEditMode(false); _fetchLemmaMeaning(); }