add mixin with function to set lemma emoji and send analytics

This commit is contained in:
ggurdin 2025-12-02 12:33:09 -05:00
parent 305c08af73
commit c70e066e9e
No known key found for this signature in database
GPG key ID: A01CB41737CBB478
4 changed files with 52 additions and 35 deletions

View file

@ -4,13 +4,30 @@ import 'package:fluffychat/pangea/analytics_misc/put_analytics_controller.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/widgets/matrix.dart';
class EmojiAnalyticsController {
void sendEmojiAnalytics(
mixin LemmaEmojiSetter {
Future<void> setLemmaEmoji(
ConstructIdentifier constructId,
String emoji,
String? targetId,
) async {
if (constructId.userSetEmoji.isEmpty) {
_sendEmojiAnalytics(
constructId,
targetId: targetId,
);
}
await constructId.setUserLemmaInfo(
constructId.userLemmaInfo.copyWith(emojis: [emoji]),
);
}
void _sendEmojiAnalytics(
ConstructIdentifier constructId, {
String? eventId,
String? roomId,
String? targetId,
) {
}) {
MatrixState.pangeaController.putAnalytics.setState(
AnalyticsStream(
eventId: eventId,

View file

@ -84,6 +84,7 @@ class PangeaAnyState {
if (entry != null) {
try {
entry.entry.remove();
entry.entry.dispose();
} catch (err, s) {
ErrorHandler.logError(
e: err,
@ -117,6 +118,7 @@ class PangeaAnyState {
for (int i = 0; i < shouldRemove.length; i++) {
try {
shouldRemove[i].entry.remove();
shouldRemove[i].entry.dispose();
} catch (err, s) {
ErrorHandler.logError(
e: err,

View file

@ -7,8 +7,8 @@ import 'package:flutter/material.dart';
import 'package:shimmer/shimmer.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/analytics_misc/emoji_analytics_controller.dart';
import 'package:fluffychat/pangea/analytics_misc/get_analytics_controller.dart';
import 'package:fluffychat/pangea/analytics_misc/lemma_emoji_setter_mixin.dart';
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
import 'package:fluffychat/pangea/common/utils/overlay.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
@ -29,7 +29,8 @@ class LemmaHighlightEmojiRow extends StatefulWidget {
LemmaHighlightEmojiRowState createState() => LemmaHighlightEmojiRowState();
}
class LemmaHighlightEmojiRowState extends State<LemmaHighlightEmojiRow> {
class LemmaHighlightEmojiRowState extends State<LemmaHighlightEmojiRow>
with LemmaEmojiSetter {
bool _showShimmer = true;
String? _selectedEmoji;
@ -87,12 +88,10 @@ class LemmaHighlightEmojiRowState extends State<LemmaHighlightEmojiRow> {
Future<void> _setEmoji(String emoji, BuildContext context) async {
try {
setState(() => _selectedEmoji = emoji);
await widget.cId.setUserLemmaInfo(
widget.cId.userLemmaInfo.copyWith(emojis: [emoji]),
);
EmojiAnalyticsController.sendEmojiAnalytics(
await setLemmaEmoji(
widget.cId,
emoji,
"emoji-choice-item-$emoji-${widget.cId.lemma}",
);
} catch (e, s) {
debugger(when: kDebugMode);

View file

@ -2,12 +2,13 @@ import 'package:flutter/material.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/pangea/analytics_misc/lemma_emoji_setter_mixin.dart';
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
import 'package:fluffychat/pangea/common/utils/overlay.dart';
import 'package:fluffychat/pangea/events/models/pangea_token_model.dart';
import 'package:fluffychat/pangea/lemmas/lemma_emoji_picker.dart';
import 'package:fluffychat/pangea/toolbar/widgets/select_mode_buttons.dart';
import 'package:fluffychat/pangea/toolbar/widgets/word_zoom/lemma_meaning_builder.dart';
import 'package:fluffychat/widgets/future_loading_dialog.dart';
import 'package:fluffychat/widgets/matrix.dart';
class TokenEmojiButton extends StatefulWidget {
@ -32,15 +33,19 @@ class TokenEmojiButton extends StatefulWidget {
}
class TokenEmojiButtonState extends State<TokenEmojiButton>
with TickerProviderStateMixin {
with TickerProviderStateMixin, LemmaEmojiSetter {
final double buttonSize = 20.0;
SelectMode? _prevMode;
AnimationController? _controller;
Animation<double>? _sizeAnimation;
String? _emoji;
@override
void initState() {
super.initState();
_emoji = widget.token?.vocabConstructID.userSetEmoji.firstOrNull;
_initAnimation();
_prevMode = widget.selectModeNotifier.value;
widget.selectModeNotifier.addListener(_onUpdateSelectMode);
@ -55,8 +60,6 @@ class TokenEmojiButtonState extends State<TokenEmojiButton>
super.dispose();
}
String? get _emoji => widget.token?.vocabConstructID.userSetEmoji.firstOrNull;
void _initAnimation() {
if (MatrixState.pangeaController.subscriptionController.isSubscribed ==
false) {
@ -94,7 +97,7 @@ class TokenEmojiButtonState extends State<TokenEmojiButton>
void showTokenEmojiPopup() {
if (widget.targetId == null || widget.token == null) return;
OverlayUtil.showPositionedCard(
overlayKey: "overlay_emoji_selector_${widget.targetId}",
overlayKey: "overlay_emoji_selector",
context: context,
cardToShow: LemmaMeaningBuilder(
langCode:
@ -112,16 +115,9 @@ class TokenEmojiButtonState extends State<TokenEmojiButton>
),
child: LemmaEmojiPicker(
emojis: controller.lemmaInfo?.emoji ?? [],
onSelect: (emoji) async {
final resp = await showFutureLoadingDialog(
context: context,
future: () => _setTokenEmoji(emoji),
);
if (mounted && !resp.isError) {
MatrixState.pAnyState.closeOverlay(
"overlay_emoji_selector_${widget.targetId}",
);
}
onSelect: (emoji) {
_setTokenEmoji(emoji);
MatrixState.pAnyState.closeOverlay("overlay_emoji_selector");
},
loading: controller.isLoading,
),
@ -137,18 +133,21 @@ class TokenEmojiButtonState extends State<TokenEmojiButton>
);
}
Future<void> _setTokenEmoji(String emoji) async {
void _setTokenEmoji(String emoji) {
setState(() => _emoji = emoji);
if (widget.targetId == null || widget.token == null) return;
// await widget.token!.vocabConstructID.setEmojiWithXP(
// emoji: emoji,
// targetId: widget.targetId!,
// );
await widget.token!.vocabConstructID.setUserLemmaInfo(
widget.token!.vocabConstructID.userLemmaInfo.copyWith(
emojis: [emoji],
),
);
if (mounted) setState(() {});
setLemmaEmoji(
widget.token!.vocabConstructID,
emoji,
widget.targetId,
).catchError((e, s) {
ErrorHandler.logError(
data: widget.token!.toJson(),
e: e,
s: s,
);
});
}
@override