Skip to content

Commit

Permalink
log analytics events (#47)
Browse files Browse the repository at this point in the history
  • Loading branch information
numa08 authored Mar 14, 2024
1 parent b1911f6 commit fba7a6f
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 1 deletion.
4 changes: 4 additions & 0 deletions app/radio_qth_map/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/foundation.dart';
Expand Down Expand Up @@ -49,17 +50,20 @@ void main() async {
} else {
defaultLocale = const Locale("en");
}
final analytics = FirebaseAnalytics.instance;
final prefs = await SharedPreferences.getInstance();
runApp(
MultiProvider(
providers: [
Provider(create: (_) => analytics),
Provider(
create: (_) => FirestoreRepository(firestore: firestore),
),
ChangeNotifierProvider(create: (_) => LocaleNotifier(defaultLocale)),
ChangeNotifierProvider(
create: (_) => AuthStateNotifier(
auth: auth,
analytics: analytics,
prefs: prefs,
)),
],
Expand Down
11 changes: 10 additions & 1 deletion app/radio_qth_map/lib/repository/auth_state_notifier.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class AuthStateNotifier extends ChangeNotifier {
final FirebaseAuth auth;
final FirebaseAnalytics analytics;
final SharedPreferences prefs;

AuthStateNotifier({
required this.auth,
required this.analytics,
required this.prefs,
}) {
auth.authStateChanges().listen((_) {
Expand All @@ -21,7 +24,13 @@ class AuthStateNotifier extends ChangeNotifier {
return null;
}
try {
await auth.signInWithEmailLink(email: email, emailLink: emailLink);
final cred =
await auth.signInWithEmailLink(email: email, emailLink: emailLink);
if (cred.additionalUserInfo?.isNewUser == true) {
analytics.logSignUp(signUpMethod: "emailLink");
} else {
analytics.logLogin(loginMethod: "emailLink");
}
} catch (e) {
debugPrint('Failed to sign in with email link: $e');
} finally {
Expand Down
12 changes: 12 additions & 0 deletions app/radio_qth_map/lib/screen/add_operation_screen.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:file_picker/_internal/file_picker_web.dart';
import 'package:file_picker/file_picker.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
Expand Down Expand Up @@ -64,6 +65,7 @@ class _AddOperationScreenState extends State<AddOperationScreen> {
: () async {
final repository = context.read<FirestoreRepository>();
final auth = context.read<AuthStateNotifier>().auth;
final analytics = context.read<FirebaseAnalytics>();
// コールサインの表示設定を変更してから保存する
final id = await repository.storeOperations(
_logList
Expand All @@ -75,6 +77,16 @@ class _AddOperationScreenState extends State<AddOperationScreen> {
.toList(),
ownerId: auth.currentUser?.uid,
);
analytics.setUserProperty(
name: "operation_added",
value: "true",
);
analytics.logEvent(
name: "operation_added",
parameters: {
"operation_id": id,
},
);
if (context.mounted) {
context.pop(id);
}
Expand Down
12 changes: 12 additions & 0 deletions app/radio_qth_map/lib/screen/share_operation_dialog.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
Expand All @@ -17,6 +18,7 @@ class ShareOperationDialog extends StatelessWidget {
Widget build(BuildContext context) {
final repository = context.read<FirestoreRepository>();
final dateFormat = DateFormat.yMd(AppLocalizations.of(context)!.localeName);
final analytics = context.read<FirebaseAnalytics>();
return AlertDialog(
title: Text(AppLocalizations.of(context)!.share),
content: FutureBuilder(
Expand All @@ -36,6 +38,11 @@ class ShareOperationDialog extends StatelessWidget {
children: [
FilledButton.tonalIcon(
onPressed: () {
analytics.logShare(
contentType: "operation",
itemId: operationId,
method: "X",
);
final url = '${Uri.base.origin}/map/${operation.id!}';
launchUrlString(
'https://twitter.com/intent/tweet?text=${Uri.encodeComponent(shareText)}&hashtags=QTHMap&url=${Uri.encodeComponent(url)}');
Expand All @@ -52,6 +59,11 @@ class ShareOperationDialog extends StatelessWidget {
const SizedBox(height: 16),
FilledButton.tonalIcon(
onPressed: () async {
analytics.logShare(
contentType: "operation",
itemId: operationId,
method: "clipboard",
);
final text = """
$shareText
${Uri.base.origin}/map/${operation.id!}
Expand Down
19 changes: 19 additions & 0 deletions app/radio_qth_map/lib/widget/operation_map.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:async';

import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:intl/intl.dart';
Expand Down Expand Up @@ -263,7 +264,12 @@ class OperationMapState extends State<OperationMap>

void _showOperationDetail() async {
assert(_selectedOperation != null);
final analytics = context.read<FirebaseAnalytics>();
final operation = _selectedOperation!;
analytics.logSelectContent(
contentType: "operation",
itemId: operation.id!,
);
final sheetController = showBottomSheet(
context: context,
builder: (context) {
Expand Down Expand Up @@ -304,7 +310,14 @@ class OperationMapState extends State<OperationMap>
onPressed: () async {
final repository =
context.read<FirestoreRepository>();
final analytics = context.read<FirebaseAnalytics>();
await repository.deleteOperation(operation.id!);
analytics.logEvent(
name: "operation_deleted",
parameters: {
"operation_id": operation.id,
},
);
if (context.mounted) {
Navigator.pop(context);
ScaffoldMessenger.of(context).showSnackBar(
Expand All @@ -323,6 +336,12 @@ class OperationMapState extends State<OperationMap>
.deleted_operation_snackbar_action_undo,
onPressed: () async {
await repository.undoDeletion(operation);
analytics.logEvent(
name: "operation_deleted_undo",
parameters: {
"operation_id": operation.id,
},
);
},
),
),
Expand Down

0 comments on commit fba7a6f

Please sign in to comment.