fluffychat/lib/pangea/widgets/igc/word_data_card.dart
ggurdin 7d79ed4c4f
1125 merge upstream fluffychat into main (#1184)
* chore: Nicer invite selection view

* chore: Do not request thousands of users on invite page

* build(deps): bump rexml from 3.3.6 to 3.3.9 in /ios

Bumps [rexml](https://github.com/ruby/rexml) from 3.3.6 to 3.3.9.
- [Release notes](https://github.com/ruby/rexml/releases)
- [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md)
- [Commits](https://github.com/ruby/rexml/compare/v3.3.6...v3.3.9)

---
updated-dependencies:
- dependency-name: rexml
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* design: Highlight emoji only messages

* chore: Follow up emoji only messages

* Translated using Weblate (Galician)

Currently translated at 100.0% (672 of 672 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/

* Translated using Weblate (Russian)

Currently translated at 99.7% (670 of 672 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/

* design: New login design

* chore: Improve spaces design

* chore: Improve spaces design

* chore: Improved UX for creating groups and spaces

* Translated using Weblate (German)

Currently translated at 100.0% (672 of 672 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/

* feat: Better wallpapers with blur and opacity sliders and improved styles page

* chore: Follow up wallpaper configs

* chore: Add max length to state messages

* chore: Follow up wallpaper design

* feat: Open account manage url when using MAS

* chore: follow up wellknown fetch

* Translated using Weblate (Arabic)

Currently translated at 100.0% (674 of 674 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ar/

* Translated using Weblate (Estonian)

Currently translated at 100.0% (674 of 674 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (674 of 674 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (674 of 674 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/id/

* Translated using Weblate (Finnish)

Currently translated at 79.0% (533 of 674 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/fi/

* Translated using Weblate (Latvian)

Currently translated at 100.0% (674 of 674 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/lv/

* build: Add links to snapcraft.yaml file

* chore: Nicer empty page

* chore: Polish chat bubble colors

* chore: Follow up chat bubble design

* refactor: Remove unnecessary builder widget

* chore: Design adjustments

* chore: Follow up design

* refactor: Display two lines on new messages

* chore: Design follow up

* Translated using Weblate (Arabic)

Currently translated at 100.0% (678 of 678 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ar/

* Translated using Weblate (German)

Currently translated at 100.0% (678 of 678 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/

* Translated using Weblate (Estonian)

Currently translated at 99.7% (676 of 678 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/

* Translated using Weblate (Basque)

Currently translated at 100.0% (678 of 678 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/eu/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (678 of 678 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/uk/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (678 of 678 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/

* chore: Follow up message bubbles

* chore: Follow up design

* chore: Follow up design

* chore: Follow up colors

* chore: Follow up homeserverpicker UX

* chore: Design follow up

* feat: Add about server page

* chore: Follow up update snackbar

* chore: Polish login design

* chore: Follow up login page

* chore: Follow up homeserver picker

* chore: Follow up appbar shadow

* refactor: Performance boost for avatar widget

* Revert "refactor: Performance boost for avatar widget"

This reverts commit 58577bb9e8.

* Translated using Weblate (Estonian)

Currently translated at 100.0% (678 of 678 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (678 of 678 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/uk/

* Translated using Weblate (Latvian)

Currently translated at 100.0% (678 of 678 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/lv/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (687 of 687 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ar/

* Translated using Weblate (Estonian)

Currently translated at 100.0% (687 of 687 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/

* Translated using Weblate (Basque)

Currently translated at 100.0% (687 of 687 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/eu/

* Translated using Weblate (Galician)

Currently translated at 100.0% (687 of 687 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (687 of 687 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (687 of 687 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/id/

* Translated using Weblate (Latvian)

Currently translated at 100.0% (687 of 687 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/lv/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (687 of 687 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/uk/

* Translated using Weblate (Korean)

Currently translated at 100.0% (687 of 687 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ko/

* chore: Follow up homeserver input field

* refactor: Move to upstream geolocator

* chore: Follow up send file dialog

* Translated using Weblate (Spanish)

Currently translated at 74.6% (513 of 687 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/es/

* refactor: Migrate to newer keyboard shortcuts package

* refactor: Remove keyboard shortcuts

This package right now
makes the web app
nearly unusable as it
throws multiple errors on
every key press. The
package seems to be
unmaintained. I tried
two other packages
and none of them worked.

* build: Update matrix dart sdk to 0.35.0

* chore: Better FluffyChat Logo for PWA

* build: (deps): bump samuelmeuli/action-snapcraft from 2 to 3

Bumps [samuelmeuli/action-snapcraft](https://github.com/samuelmeuli/action-snapcraft) from 2 to 3.
- [Release notes](https://github.com/samuelmeuli/action-snapcraft/releases)
- [Commits](https://github.com/samuelmeuli/action-snapcraft/compare/v2...v3)

---
updated-dependencies:
- dependency-name: samuelmeuli/action-snapcraft
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: Follow up send file dialog

* feat: Add markdown context actions for text input

* build: Update flutter to 3.24.5

* build: Remove snapcraft build workaround

* chore: Better error message when join room failed

* chore: Follow up join room

* chore: Make error dialog show full error

* chore: Follow up loading dialog

* chore: Follow up loading dialog

* build: Snapcraft from local build file

* chore: Follow up build snap

* chore: Follow up snapcraft in ci

* build: Revert build snapcraft changes

* build: Try downgrading flutter web auth

* chore: add hint in pubspec.yaml regarding flutter_web_auth_2

* Translated using Weblate (Estonian)

Currently translated at 100.0% (688 of 688 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/

* Translated using Weblate (Galician)

Currently translated at 100.0% (688 of 688 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (688 of 688 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (688 of 688 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/id/

* Translated using Weblate (Irish)

Currently translated at 100.0% (688 of 688 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (688 of 688 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ar/

* Translated using Weblate (Basque)

Currently translated at 100.0% (688 of 688 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/eu/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (688 of 688 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/uk/

* Translated using Weblate (Latvian)

Currently translated at 100.0% (688 of 688 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/lv/

* Translated using Weblate (Italian)

Currently translated at 100.0% (688 of 688 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/it/

* Translated using Weblate (Estonian)

Currently translated at 100.0% (694 of 694 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (694 of 694 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (694 of 694 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ar/

* Translated using Weblate (Basque)

Currently translated at 100.0% (694 of 694 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/eu/

* Translated using Weblate (Irish)

Currently translated at 100.0% (694 of 694 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (694 of 694 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/id/

* Translated using Weblate (Latvian)

Currently translated at 100.0% (694 of 694 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/lv/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (695 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ar/

* Translated using Weblate (Estonian)

Currently translated at 100.0% (695 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (695 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/

* Translated using Weblate (Irish)

Currently translated at 99.8% (694 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/

* Translated using Weblate (German)

Currently translated at 99.5% (692 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/

* fix: dont use thumbnails for emoticons

* chore: Improve presence performance

* Translated using Weblate (Basque)

Currently translated at 100.0% (695 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/eu/

* Translated using Weblate (Galician)

Currently translated at 100.0% (695 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/

* Translated using Weblate (Italian)

Currently translated at 100.0% (695 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/it/

* Translated using Weblate (Irish)

Currently translated at 100.0% (695 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/

* Translated using Weblate (Russian)

Currently translated at 100.0% (695 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (695 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/uk/

* Translated using Weblate (Catalan)

Currently translated at 95.1% (661 of 695 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ca/

* build: Bump version

* chore: Follow up send file dialog for images

* chore: Follow up send multiple images

* build: Add android build workaround for new flutter version

* build: Use file selector to save files

* chore: Follow up save file on desktop

* chore: Adjust default linux window height

* refactor: Update to new receive sharing intent package

* fluffychat merge

* fluffychat merge

* fluffychat merge

* fix android build

* fluffychat merge

* fluffychat merge

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Krille <c.kussowski@famedly.com>
Co-authored-by: Krille-chan <christian-kussowski@posteo.de>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: josé m <correoxm@disroot.org>
Co-authored-by: v1s7 <v1s7@users.noreply.hosted.weblate.org>
Co-authored-by: Christian <christian-pauly@posteo.de>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Priit Jõerüüt <hwlate@joeruut.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: Linerly <linerly@proton.me>
Co-authored-by: Edgars Andersons <Edgars+Weblate@gaitenis.id.lv>
Co-authored-by: xabirequejo <xabi.rn@gmail.com>
Co-authored-by: Bezruchenko Simon <worcposj44@gmail.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Bruno Roh <kane.roh429@gmail.com>
Co-authored-by: Kimby <kimisaes@naver.com>
Co-authored-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
Co-authored-by: Angelo Schirinzi <muten619@hotmail.it>
Co-authored-by: Marek Vospěl <marek@vospel.cz>
Co-authored-by: Александр (Alexandr1995) <stupino19951406@gmail.com>
2024-12-09 14:17:44 -05:00

372 lines
11 KiB
Dart

import 'dart:developer';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/controllers/contextual_definition_controller.dart';
import 'package:fluffychat/pangea/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/models/language_model.dart';
import 'package:fluffychat/pangea/utils/bot_style.dart';
import 'package:fluffychat/pangea/utils/error_handler.dart';
import 'package:fluffychat/pangea/utils/firebase_analytics.dart';
import 'package:fluffychat/pangea/widgets/chat/toolbar_content_loading_indicator.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:http/http.dart';
import 'package:matrix/matrix.dart';
import '../../models/word_data_model.dart';
import '../flag.dart';
import 'card_error_widget.dart';
class WordDataCard extends StatefulWidget {
final bool hasInfo;
final String word;
final String fullText;
final String? choiceFeedback;
final String wordLang;
final String fullTextLang;
final Room room;
const WordDataCard({
super.key,
required this.word,
required this.wordLang,
required this.hasInfo,
required this.fullText,
required this.fullTextLang,
required this.room,
this.choiceFeedback,
});
@override
State<WordDataCard> createState() => WordDataCardController();
}
class WordDataCardController extends State<WordDataCard> {
final PangeaController controller = MatrixState.pangeaController;
bool isLoadingWordNet = false;
bool isLoadingContextualDefinition = false;
ContextualDefinitionResponseModel? contextualDefinitionRes;
WordData? wordData;
Object? wordNetError;
Object? definitionError;
LanguageModel? activeL1;
LanguageModel? activeL2;
Response get noLanguages => Response("", 405);
@override
void initState() {
if (!mounted) return;
activeL1 = controller.languageController.activeL1Model()!;
activeL2 = controller.languageController.activeL2Model()!;
if (activeL1 == null || activeL2 == null) {
wordNetError = noLanguages;
definitionError = noLanguages;
} else if (!widget.hasInfo) {
getContextualDefinition();
} else {
getWordNet();
}
super.initState();
}
@override
void didUpdateWidget(covariant WordDataCard oldWidget) {
// debugger(when: kDebugMode);
if (oldWidget.word != widget.word) {
if (!widget.hasInfo) {
getContextualDefinition();
} else {
getWordNet();
}
}
super.didUpdateWidget(oldWidget);
}
Future<void> getContextualDefinition() async {
ContextualDefinitionRequestModel? req;
try {
req = ContextualDefinitionRequestModel(
fullText: widget.fullText,
word: widget.word,
feedbackLang: activeL1?.langCode ?? LanguageKeys.defaultLanguage,
fullTextLang: widget.fullTextLang,
wordLang: widget.wordLang,
);
if (!mounted) return;
setState(() {
contextualDefinitionRes = null;
definitionError = null;
isLoadingContextualDefinition = true;
});
contextualDefinitionRes = await controller.definitions.get(req);
if (contextualDefinitionRes == null) {
definitionError = Exception("Error getting definition");
}
GoogleAnalytics.contextualRequest();
} catch (err, stack) {
debugger(when: kDebugMode);
ErrorHandler.logError(e: err, s: stack, data: req?.toJson());
definitionError = Exception("Error getting definition");
} finally {
if (mounted) setState(() => isLoadingContextualDefinition = false);
}
}
Future<void> getWordNet() async {
if (mounted) {
setState(() {
wordData = null;
isLoadingWordNet = true;
});
}
try {
wordData = await controller.wordNet.getWordDataGlobal(
word: widget.word,
fullText: widget.fullText,
userL1: activeL1?.langCode,
userL2: activeL2?.langCode,
);
} catch (err) {
ErrorHandler.logError(
e: err,
s: StackTrace.current,
data: {"word": widget.word, "hasInfo": widget.hasInfo},
);
wordNetError = err;
} finally {
if (mounted) setState(() => isLoadingWordNet = false);
}
}
void handleGetDefinitionButtonPress() {
if (isLoadingContextualDefinition) return;
getContextualDefinition();
}
@override
Widget build(BuildContext context) => WordDataCardView(controller: this);
}
class WordDataCardView extends StatelessWidget {
const WordDataCardView({
super.key,
required this.controller,
});
final WordDataCardController controller;
@override
Widget build(BuildContext context) {
if (controller.wordNetError != null) {
return CardErrorWidget(
error: controller.wordNetError!,
maxWidth: AppConfig.toolbarMinWidth,
);
}
if (controller.activeL1 == null || controller.activeL2 == null) {
ErrorHandler.logError(m: "should not be here");
return CardErrorWidget(
error: controller.noLanguages,
maxWidth: AppConfig.toolbarMinWidth,
);
}
return ConstrainedBox(
constraints: const BoxConstraints(
maxWidth: AppConfig.toolbarMinWidth,
maxHeight: AppConfig.toolbarMaxHeight,
),
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
if (controller.widget.choiceFeedback != null)
Text(
controller.widget.choiceFeedback!,
style: BotStyle.text(context),
),
const SizedBox(height: 5.0),
if (controller.wordData != null &&
controller.wordNetError == null &&
controller.activeL1 != null &&
controller.activeL2 != null)
WordNetInfo(
wordData: controller.wordData!,
activeL1: controller.activeL1!,
activeL2: controller.activeL2!,
),
if (controller.isLoadingWordNet)
const ToolbarContentLoadingIndicator(),
const SizedBox(height: 5.0),
// if (controller.widget.hasInfo &&
// !controller.isLoadingContextualDefinition &&
// controller.contextualDefinitionRes == null)
// Material(
// type: MaterialType.transparency,
// child: ListTile(
// leading: const BotFace(
// width: 40, expression: BotExpression.surprised),
// title: Text(L10n.of(context).askPangeaBot),
// onTap: controller.handleGetDefinitionButtonPress,
// ),
// ),
if (controller.isLoadingContextualDefinition)
const ToolbarContentLoadingIndicator(),
if (controller.contextualDefinitionRes != null)
Text(
controller.contextualDefinitionRes!.text,
style: BotStyle.text(context),
textAlign: TextAlign.center,
),
if (controller.definitionError != null)
Text(
L10n.of(context).sorryNoResults,
style: BotStyle.text(context),
textAlign: TextAlign.center,
),
],
),
),
),
);
}
}
class WordNetInfo extends StatelessWidget {
final WordData wordData;
final LanguageModel activeL1;
final LanguageModel activeL2;
const WordNetInfo({
super.key,
required this.wordData,
required this.activeL1,
required this.activeL2,
});
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SensesForLanguage(
wordData: wordData,
languageType: LanguageType.target,
language: activeL2,
),
const SizedBox(height: 10),
SensesForLanguage(
wordData: wordData,
languageType: LanguageType.base,
language: activeL1,
),
],
);
}
}
enum LanguageType {
target,
base,
}
class SensesForLanguage extends StatelessWidget {
String get exampleSentence => languageType == LanguageType.target
? wordData.targetExampleSentence
: wordData.baseExampleSentence;
String get definition => languageType == LanguageType.target
? wordData.targetDefinition
: wordData.baseDefinition;
String formattedTitle(BuildContext context) {
final String word = languageType == LanguageType.target
? wordData.targetWord
: wordData.baseWord;
String? pos = wordData.formattedPartOfSpeech(languageType);
if (pos == null || pos.isEmpty) pos = L10n.of(context).unkDisplayName;
return "$word (${wordData.formattedPartOfSpeech(languageType)})";
}
const SensesForLanguage({
super.key,
required this.wordData,
required this.languageType,
required this.language,
});
final LanguageModel language;
final LanguageType languageType;
final WordData wordData;
@override
Widget build(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LanguageFlag(language: language),
const SizedBox(width: 10),
Flexible(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
formattedTitle(context),
style: BotStyle.text(context, italics: true, bold: false),
),
const SizedBox(height: 4),
if (definition.isNotEmpty)
RichText(
text: TextSpan(
style: BotStyle.text(
context,
italics: false,
bold: false,
),
children: <TextSpan>[
TextSpan(
text: "${L10n.of(context).definition}: ",
style: const TextStyle(fontWeight: FontWeight.bold),
),
TextSpan(text: definition),
],
),
),
const SizedBox(height: 4),
if (exampleSentence.isNotEmpty)
RichText(
text: TextSpan(
style: BotStyle.text(
context,
italics: false,
bold: false,
),
children: <TextSpan>[
TextSpan(
text: "${L10n.of(context).exampleSentence}: ",
style: const TextStyle(
fontWeight: FontWeight.bold,
),
),
TextSpan(text: exampleSentence),
],
),
),
],
),
),
],
);
}
}