Skip to content
Open
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import 'package:flutter/material.dart';
import 'package:omi/pages/settings/integrations_page.dart';

class OnboardingIntegrationsWrapper extends StatelessWidget {
final VoidCallback goNext;
final VoidCallback onSkip;
final VoidCallback goBack;

const OnboardingIntegrationsWrapper({
super.key,
required this.goNext,
required this.onSkip,
required this.goBack,
});

@override
Widget build(BuildContext context) {
return IntegrationsPage(
onBackPressed: goBack,
bottomWidget: Padding(
padding: const EdgeInsets.only(top: 8),
child: Row(
children: [
Expanded(
child: TextButton(
onPressed: onSkip,
style: TextButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: Text(
'Skip',
style: TextStyle(
color: Colors.grey.shade400,
fontSize: 16,
fontWeight: FontWeight.w500,
),
),
),
),
const SizedBox(width: 12),
Expanded(
flex: 2,
child: ElevatedButton(
onPressed: goNext,
style: ElevatedButton.styleFrom(
backgroundColor: Colors.white,
foregroundColor: Colors.black,
padding: const EdgeInsets.symmetric(vertical: 16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: const Text(
'Continue',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
),
),
],
),
),
);
}
}

47 changes: 35 additions & 12 deletions app/lib/pages/onboarding/wrapper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import 'package:omi/pages/onboarding/speech_profile_widget.dart';
import 'package:omi/pages/onboarding/user_review_page.dart';
import 'package:omi/pages/onboarding/welcome/page.dart';
import 'package:omi/pages/onboarding/device_onboarding/device_onboarding_wrapper.dart';
import 'package:omi/pages/onboarding/integrations/onboarding_integrations_wrapper.dart';
import 'package:omi/providers/home_provider.dart';
import 'package:omi/providers/onboarding_provider.dart';
import 'package:omi/services/auth_service.dart';
Expand All @@ -39,13 +40,14 @@ class _OnboardingWrapperState extends State<OnboardingWrapper> with TickerProvid
static const int kNamePage = 1;
static const int kPrimaryLanguagePage = 2;
static const int kPermissionsPage = 3;
static const int kUserReviewPage = 4;
static const int kWelcomePage = 5;
static const int kFindDevicesPage = 6;
static const int kSpeechProfilePage = 7; // Now always the last index
static const int kImportPage = 4;
static const int kUserReviewPage = 5;
static const int kWelcomePage = 6;
static const int kFindDevicesPage = 7;
static const int kSpeechProfilePage = 8; // Now always the last index

// Special index values used in comparisons
static const List<int> kHiddenHeaderPages = [-1, 0, 1, 2, 3, 4, 5, 6, 7];
static const List<int> kHiddenHeaderPages = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8];

TabController? _controller;
late AnimationController _backgroundAnimationController;
Expand All @@ -55,7 +57,7 @@ class _OnboardingWrapperState extends State<OnboardingWrapper> with TickerProvid

@override
void initState() {
_controller = TabController(length: 8, vsync: this);
_controller = TabController(length: 9, vsync: this);
_controller!.addListener(() {
setState(() {});
// Update background image when page changes
Expand Down Expand Up @@ -132,6 +134,9 @@ class _OnboardingWrapperState extends State<OnboardingWrapper> with TickerProvid
case kPermissionsPage:
newImage = Assets.images.onboardingBg3.path;
break;
case kImportPage:
newImage = Assets.images.onboardingBg3.path;
break;
case kUserReviewPage:
newImage = Assets.images.onboardingBg6.path;
break;
Expand Down Expand Up @@ -175,6 +180,8 @@ class _OnboardingWrapperState extends State<OnboardingWrapper> with TickerProvid
return Assets.images.onboardingBg4.path;
case kPermissionsPage:
return Assets.images.onboardingBg3.path;
case kImportPage:
return Assets.images.onboardingBg3.path;
case kUserReviewPage:
return Assets.images.onboardingBg6.path;
default:
Expand Down Expand Up @@ -223,10 +230,24 @@ class _OnboardingWrapperState extends State<OnboardingWrapper> with TickerProvid
}),
PermissionsWidget(
goNext: () {
_goNext(); // Go to User Review page
_goNext(); // Go to Integrations page
MixpanelManager().onboardingStepCompleted('Permissions');
},
),
OnboardingIntegrationsWrapper(
goNext: () {
_goNext(); // Go to User Review page
MixpanelManager().onboardingStepCompleted('Integrations');
},
onSkip: () {
_goNext(); // Go to User Review page
MixpanelManager().onboardingStepCompleted('Integrations Skipped');
},
goBack: () {
// Go back to Permissions page
_controller!.animateTo(kPermissionsPage);
},
),
UserReviewPage(
goNext: () {
_goNext(); // Go to Welcome page
Expand Down Expand Up @@ -313,7 +334,9 @@ class _OnboardingWrapperState extends State<OnboardingWrapper> with TickerProvid
pages[kAuthPage],
],
)
: _controller!.index == kNamePage ||
: _controller!.index == kImportPage
? pages[_controller!.index]
: _controller!.index == kNamePage ||
_controller!.index == kPrimaryLanguagePage ||
_controller!.index == kPermissionsPage ||
_controller!.index == kUserReviewPage ||
Expand Down Expand Up @@ -348,9 +371,9 @@ class _OnboardingWrapperState extends State<OnboardingWrapper> with TickerProvid
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(
7,
8,
(index) {
int pageIndex = index + 1; // Name=1, Lang=2, ..., Speech=7
int pageIndex = index + 1; // Name=1, Lang=2, ..., Speech=8
return Container(
margin: const EdgeInsets.symmetric(horizontal: 4.0),
width: pageIndex == _controller!.index ? 12.0 : 8.0,
Expand Down Expand Up @@ -473,9 +496,9 @@ class _OnboardingWrapperState extends State<OnboardingWrapper> with TickerProvid
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(
6,
8,
(index) {
int pageIndex = index + 1; // Name=1, Lang=2, ..., Speech=6
int pageIndex = index + 1; // Name=1, Lang=2, ..., Speech=8
return Container(
margin: const EdgeInsets.symmetric(horizontal: 4.0),
width: pageIndex == _controller!.index ? 12.0 : 8.0,
Expand Down
52 changes: 34 additions & 18 deletions app/lib/pages/settings/integrations_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,16 @@ extension IntegrationAppExtension on IntegrationApp {
}

class IntegrationsPage extends StatefulWidget {
const IntegrationsPage({super.key});
final bool hideAppBar;
final VoidCallback? onBackPressed;
final Widget? bottomWidget;

const IntegrationsPage({
super.key,
this.hideAppBar = false,
this.onBackPressed,
this.bottomWidget,
});

@override
State<IntegrationsPage> createState() => _IntegrationsPageState();
Expand Down Expand Up @@ -598,23 +607,25 @@ class _IntegrationsPageState extends State<IntegrationsPage> with WidgetsBinding

return Scaffold(
backgroundColor: const Color(0xFF000000),
appBar: AppBar(
backgroundColor: const Color(0xFF000000),
elevation: 0,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.white),
onPressed: () => Navigator.pop(context),
),
title: const Text(
'Chat Tools',
style: TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.w600,
),
),
centerTitle: true,
),
appBar: widget.hideAppBar
? null
: AppBar(
backgroundColor: const Color(0xFF000000),
elevation: 0,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.white),
onPressed: widget.onBackPressed ?? () => Navigator.pop(context),
),
title: const Text(
'Chat Tools',
style: TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.w600,
),
),
centerTitle: true,
),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(20),
Expand Down Expand Up @@ -660,6 +671,11 @@ class _IntegrationsPageState extends State<IntegrationsPage> with WidgetsBinding
],
),
),
// Optional bottom widget (for onboarding buttons)
if (widget.bottomWidget != null) ...[
const SizedBox(height: 24),
widget.bottomWidget!,
],
],
),
),
Expand Down