Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 12 additions & 13 deletions app/lib/core/app_shell.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import 'package:omi/services/google_tasks_service.dart';
import 'package:omi/services/notifications.dart';
import 'package:omi/services/todoist_service.dart';
import 'package:omi/utils/alerts/app_snackbar.dart';
import 'package:omi/utils/analytics/mixpanel.dart';
import 'package:omi/utils/l10n_extensions.dart';
import 'package:omi/utils/logger.dart';
import 'package:omi/utils/platform/platform_manager.dart';
Expand Down Expand Up @@ -72,7 +71,7 @@ class _AppShellState extends State<AppShell> {
if (mounted) {
var app = await context.read<AppProvider>().getAppFromId(uri.pathSegments[1]);
if (app != null) {
PlatformManager.instance.mixpanel.track('App Opened From DeepLink', properties: {'appId': app.id});
PlatformManager.instance.analytics.track('App Opened From DeepLink', properties: {'appId': app.id});
if (mounted) {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => AppDetailPage(app: app)));
}
Expand All @@ -83,19 +82,19 @@ class _AppShellState extends State<AppShell> {
}
} else if (uri.pathSegments.first == 'wrapped') {
if (mounted) {
PlatformManager.instance.mixpanel.track('Wrapped Opened From DeepLink');
PlatformManager.instance.analytics.track('Wrapped Opened From DeepLink');
Navigator.of(context).push(MaterialPageRoute(builder: (context) => const Wrapped2025Page()));
}
} else if (uri.pathSegments.first == 'tasks' && uri.pathSegments.length > 1) {
if (mounted) {
final token = uri.pathSegments[1];
PlatformManager.instance.mixpanel.track('Shared Tasks Opened From DeepLink', properties: {'token': token});
PlatformManager.instance.analytics.track('Shared Tasks Opened From DeepLink', properties: {'token': token});
_handleSharedTasksDeepLink(token);
}
} else if (uri.pathSegments.first == 'unlimited') {
if (mounted) {
if (!context.read<UsageProvider>().showSubscriptionUI) return;
PlatformManager.instance.mixpanel.track('Plans Opened From DeepLink');
PlatformManager.instance.analytics.track('Plans Opened From DeepLink');
Navigator.of(context).push(MaterialPageRoute(builder: (context) => const UsagePage(showUpgradeDialog: true)));
}
} else if (uri.host == 'todoist' && uri.pathSegments.isNotEmpty && uri.pathSegments.first == 'callback') {
Expand Down Expand Up @@ -229,15 +228,15 @@ class _AppShellState extends State<AppShell> {
if (!mounted) return;

if (success) {
MixpanelManager().taskIntegrationEnabled(appName: 'todoist', success: true);
PlatformManager.instance.analytics.taskIntegrationEnabled(appName: 'todoist', success: true);
Logger.debug('✓ Todoist authentication completed successfully');
Logger.debug('✓ Task integration enabled: Todoist - authentication complete');
AppSnackbar.showSnackbar(context.l10n.successfullyConnectedTodoist);

// Notify task integration provider to refresh UI from Firebase
context.read<TaskIntegrationProvider>().refresh();
} else {
MixpanelManager().taskIntegrationAuthFailed(appName: 'todoist');
PlatformManager.instance.analytics.taskIntegrationAuthFailed(appName: 'todoist');
Logger.debug('Failed to complete Todoist authentication');
AppSnackbar.showSnackbarError(context.l10n.failedToConnectTodoistRetry);
}
Expand All @@ -250,7 +249,7 @@ class _AppShellState extends State<AppShell> {
if (!mounted) return;

if (success) {
MixpanelManager().taskIntegrationEnabled(appName: 'asana', success: true);
PlatformManager.instance.analytics.taskIntegrationEnabled(appName: 'asana', success: true);
Logger.debug('✓ Asana authentication completed successfully');
Logger.debug('✓ Task integration enabled: Asana - authentication complete');
AppSnackbar.showSnackbar(context.l10n.successfullyConnectedAsana);
Expand All @@ -263,7 +262,7 @@ class _AppShellState extends State<AppShell> {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => const AsanaSettingsPage()));
}
} else {
MixpanelManager().taskIntegrationAuthFailed(appName: 'asana');
PlatformManager.instance.analytics.taskIntegrationAuthFailed(appName: 'asana');
Logger.debug('Failed to complete Asana authentication');
AppSnackbar.showSnackbarError(context.l10n.failedToConnectAsanaRetry);
}
Expand All @@ -276,15 +275,15 @@ class _AppShellState extends State<AppShell> {
if (!mounted) return;

if (success) {
MixpanelManager().taskIntegrationEnabled(appName: 'google_tasks', success: true);
PlatformManager.instance.analytics.taskIntegrationEnabled(appName: 'google_tasks', success: true);
Logger.debug('✓ Google Tasks authentication completed successfully');
Logger.debug('✓ Task integration enabled: Google Tasks - authentication complete');
AppSnackbar.showSnackbar(context.l10n.successfullyConnectedGoogleTasks);

// Notify task integration provider to refresh UI from Firebase
context.read<TaskIntegrationProvider>().refresh();
} else {
MixpanelManager().taskIntegrationAuthFailed(appName: 'google_tasks');
PlatformManager.instance.analytics.taskIntegrationAuthFailed(appName: 'google_tasks');
Logger.debug('Failed to complete Google Tasks authentication');
AppSnackbar.showSnackbarError(context.l10n.failedToConnectGoogleTasksRetry);
}
Expand All @@ -297,7 +296,7 @@ class _AppShellState extends State<AppShell> {
if (!mounted) return;

if (success) {
MixpanelManager().taskIntegrationEnabled(appName: 'clickup', success: true);
PlatformManager.instance.analytics.taskIntegrationEnabled(appName: 'clickup', success: true);
Logger.debug('✓ ClickUp authentication completed successfully');
Logger.debug('✓ Task integration enabled: ClickUp - authentication complete');
AppSnackbar.showSnackbar(context.l10n.successfullyConnectedClickUp);
Expand All @@ -310,7 +309,7 @@ class _AppShellState extends State<AppShell> {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => const ClickUpSettingsPage()));
}
} else {
MixpanelManager().taskIntegrationAuthFailed(appName: 'clickup');
PlatformManager.instance.analytics.taskIntegrationAuthFailed(appName: 'clickup');
Logger.debug('Failed to complete ClickUp authentication');
AppSnackbar.showSnackbarError(context.l10n.failedToConnectClickUpRetry);
}
Expand Down
2 changes: 1 addition & 1 deletion app/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ Future _init() async {
bool isAuth = (await AuthService.instance.getIdToken()) != null;
print('DEBUG main: After getIdToken - isAuth=$isAuth, currentUser=${FirebaseAuth.instance.currentUser?.uid}');
if (isAuth) {
PlatformManager.instance.mixpanel.identify();
PlatformManager.instance.analytics.identify();
// Restore onboarding state from server if not already set locally
// This handles the case where cached credentials are used on startup
if (!SharedPreferencesUtil().onboardingCompleted) {
Expand Down
4 changes: 2 additions & 2 deletions app/lib/mobile/mobile_app.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:omi/utils/platform/platform_manager.dart';
import 'package:flutter/material.dart';

import 'package:provider/provider.dart';
Expand All @@ -8,7 +9,6 @@ import 'package:omi/pages/onboarding/device_selection.dart';
import 'package:omi/pages/onboarding/permissions/permissions_checker.dart';
import 'package:omi/pages/onboarding/wrapper.dart';
import 'package:omi/providers/auth_provider.dart';
import 'package:omi/utils/analytics/mixpanel.dart';

class MobileApp extends StatelessWidget {
const MobileApp({super.key});
Expand Down Expand Up @@ -81,7 +81,7 @@ class _PermissionsGateState extends State<_PermissionsGate> {
if (_permissionsGranted!) {
return const HomePageWrapper();
}
MixpanelManager().permissionsInterstitialShown();
PlatformManager.instance.analytics.permissionsInterstitialShown();
return const PermissionsInterstitialPage();
}
}
Loading
Loading