Skip to content

Commit 698624a

Browse files
committed
refactor: replace dedicated onboarding page with modal-based approach
- Remove CheckOnboarding middleware and its test - Delete standalone Onboarding.vue page component - Add new OnboardingModal.vue component for inline onboarding - Update MainV2.vue to integrate onboarding modal - Remove onboarding route from web.php - Simplify bootstrap/app.php by removing onboarding middleware This change improves UX by keeping users in context during onboarding rather than redirecting to a separate page.
1 parent e2a867b commit 698624a

File tree

7 files changed

+622
-736
lines changed

7 files changed

+622
-736
lines changed

app/Http/Middleware/CheckOnboarding.php

Lines changed: 0 additions & 57 deletions
This file was deleted.

bootstrap/app.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<?php
22

3-
use App\Http\Middleware\CheckOnboarding;
43
use App\Http\Middleware\HandleAppearance;
54
use App\Http\Middleware\HandleInertiaRequests;
65
use Illuminate\Foundation\Application;
@@ -18,7 +17,6 @@
1817
$middleware->encryptCookies(except: ['appearance', 'sidebar_state']);
1918

2019
$middleware->web(append: [
21-
CheckOnboarding::class,
2220
HandleAppearance::class,
2321
HandleInertiaRequests::class,
2422
AddLinkHeadersForPreloadedAssets::class,

resources/js/components/RealtimeAgent/OnboardingModal.vue

Lines changed: 555 additions & 0 deletions
Large diffs are not rendered by default.

resources/js/pages/Onboarding.vue

Lines changed: 0 additions & 526 deletions
This file was deleted.

resources/js/pages/RealtimeAgent/MainV2.vue

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,16 @@
6464
</div>
6565
</div>
6666

67+
<!-- Onboarding Modal -->
68+
<OnboardingModal
69+
v-model:open="showOnboardingModal"
70+
@complete="handleOnboardingComplete"
71+
/>
6772
</div>
6873
</template>
6974

7075
<script setup lang="ts">
71-
import { computed, onMounted, onUnmounted, watch } from 'vue';
76+
import { computed, onMounted, onUnmounted, watch, ref } from 'vue';
7277
import { router } from '@inertiajs/vue3';
7378
import axios from 'axios';
7479
import {
@@ -90,6 +95,7 @@ import TalkingPoints from '@/components/RealtimeAgent/Content/TalkingPoints.vue'
9095
import CommitmentsList from '@/components/RealtimeAgent/Actions/CommitmentsList.vue';
9196
import PostCallActions from '@/components/RealtimeAgent/Actions/PostCallActions.vue';
9297
import ContextualInformation from '@/components/ContextualInformation.vue';
98+
import OnboardingModal from '@/components/RealtimeAgent/OnboardingModal.vue';
9399
94100
// Utils
95101
@@ -108,6 +114,12 @@ const realtimeStore = useRealtimeAgentStore();
108114
const settingsStore = useSettingsStore();
109115
const openaiStore = useOpenAIStore();
110116
117+
// Onboarding state
118+
const showOnboardingModal = ref(false);
119+
const hasApiKey = ref(false);
120+
const hasMicPermission = ref(false);
121+
const hasScreenPermission = ref(false);
122+
111123
// Composables
112124
const overlayMode = useOverlayMode();
113125
const screenProtection = useScreenProtection();
@@ -287,9 +299,54 @@ const handleFunctionCall = (name: string, args: any) => {
287299
}
288300
};
289301
302+
// Check onboarding requirements
303+
const checkOnboardingRequirements = async () => {
304+
// Check if onboarding was already completed
305+
const onboardingCompleted = localStorage.getItem('onboarding_completed') === 'true';
306+
307+
// Check API key
308+
try {
309+
const apiResponse = await axios.get('/api/openai/status');
310+
hasApiKey.value = apiResponse.data.hasApiKey || false;
311+
} catch (error) {
312+
console.error('Failed to check API key status:', error);
313+
hasApiKey.value = false;
314+
}
315+
316+
// Check permissions if macPermissions API is available
317+
if ((window as any).macPermissions) {
318+
try {
319+
const micResult = await (window as any).macPermissions.checkPermission('microphone');
320+
hasMicPermission.value = micResult.success && micResult.status === 'authorized';
321+
322+
const screenResult = await (window as any).macPermissions.checkPermission('screen');
323+
hasScreenPermission.value = screenResult.success && screenResult.status === 'authorized';
324+
} catch (error) {
325+
console.error('Failed to check permissions:', error);
326+
}
327+
}
328+
329+
// Show onboarding modal if any requirement is missing
330+
if (!onboardingCompleted || !hasApiKey.value || !hasMicPermission.value) {
331+
showOnboardingModal.value = true;
332+
}
333+
};
334+
335+
// Handle onboarding completion
336+
const handleOnboardingComplete = async () => {
337+
// Re-check requirements
338+
await checkOnboardingRequirements();
339+
340+
// If everything is good, modal will close automatically
341+
showOnboardingModal.value = false;
342+
};
343+
290344
// Initialize function
291345
const initialize = async () => {
292346
try {
347+
// Check onboarding requirements first
348+
await checkOnboardingRequirements();
349+
293350
// Fetch templates
294351
const response = await axios.get('/templates');
295352
// The response has templates wrapped in a templates property
@@ -318,6 +375,15 @@ const toggleSession = () => {
318375
319376
320377
const startCall = async () => {
378+
// First check if all requirements are met
379+
await checkOnboardingRequirements();
380+
381+
// If onboarding modal is shown, don't start the call
382+
if (showOnboardingModal.value) {
383+
realtimeStore.setConnectionStatus('disconnected');
384+
return;
385+
}
386+
321387
let permissions;
322388
try {
323389
realtimeStore.setConnectionStatus('connecting');

routes/web.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@
1414
return Inertia::render('Welcome');
1515
})->name('home');
1616

17-
// Onboarding Route
18-
Route::get('/onboarding', function () {
19-
return Inertia::render('Onboarding');
20-
})->name('onboarding');
21-
2217
Route::get('dashboard', function () {
2318
return Inertia::render('Dashboard');
2419
})->name('dashboard');

tests/Unit/Middleware/CheckOnboardingTest.php

Lines changed: 0 additions & 145 deletions
This file was deleted.

0 commit comments

Comments
 (0)