Skip to content

feat: add interactive onboarding tour with settings and compose page support - #125

Merged
itzzavdhesh merged 6 commits into
itzzavdhesh:mainfrom
yashyrs027:Dialog-Box
Aug 11, 2026
Merged

feat: add interactive onboarding tour with settings and compose page support#125
itzzavdhesh merged 6 commits into
itzzavdhesh:mainfrom
yashyrs027:Dialog-Box

Conversation

@yashyrs027

@yashyrs027 yashyrs027 commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

🚀 Program

SSOC

📝 Description

This PR implements a comprehensive Interactive Onboarding Tour for VoiceForge using React Joyride, helping first-time users understand the complete workflow of the application.

✨ Features Added

  • Added a guided onboarding tour covering:

    • Voice Recording
    • Voice Cloning
    • Camera Enablement
    • Message Input
    • Speech Generation
    • Video Preview
    • Tour Completion
  • Created a reusable OnboardingTour component for managing guided walkthroughs.

  • Added a custom useOnboarding hook to:

    • Manage onboarding state
    • Persist completion status
    • Restart the onboarding flow
  • Integrated onboarding targets into existing components using data-tour attributes:

    • VoiceRecorder
    • VoiceForge
    • VirtualCamera
    • TextToSpeech
    • Generate Speech Button
    • VideoPreview

🎨 UI/UX Improvements

  • Added onboarding/instruction dialogs to additional pages:

    • Compose Page
    • Settings Page
  • Added a "Restart Onboarding Tour" option in Settings.

  • Styled onboarding tooltips to match the VoiceForge design system.

♿ Accessibility Improvements

  • Keyboard navigation support
  • ESC key support for closing the tour
  • Screen-reader friendly tooltip content
  • Improved focus management
  • Mobile-responsive tooltip positioning

⚙️ State Management

  • Tour completion status is stored using:
localStorage.setItem(
  "voiceforge-tour-completed",
  "true"
);
  • Automatically launches onboarding for first-time users.

  • Supports restarting the onboarding experience from Settings.

🛡️ Error Handling

  • Gracefully skips missing targets.
  • Prevents application crashes when targeted elements are unavailable.
  • Maintains onboarding flow continuity.

📁 Files Added

  • client/src/components/OnboardingTour.jsx
  • client/src/hooks/useOnboarding.js

📁 Files Updated

  • client/src/App.jsx
  • client/src/pages/Settings.jsx
  • client/src/components/VoiceRecorder.jsx
  • client/src/components/VoiceForge.jsx
  • client/src/components/VirtualCamera.jsx
  • client/src/components/TextToSpeech.jsx
  • client/src/components/VideoPreview.jsx
  • Additional styling files as required

This implementation improves user onboarding, accessibility, discoverability of features, and overall first-time user experience while maintaining compatibility with the existing VoiceForge architecture.

🔗 Related Issue

Closes #109

🔄 Type of Change

  • 🐛 Bug fix
  • ✨ New feature
  • 🔍 SEO improvement
  • 🎨 Style / UI improvement
  • ♿ Accessibility improvement
  • 📝 Documentation
  • ⚙️ CI / configuration
  • 🧹 Refactor / cleanup

🧪 How to Test

  1. Clone the repository.

  2. Install dependencies:

    npm install
  3. Install React Joyride:

    npm install react-joyride
  4. Start the development server:

    npm run dev
  5. Open:

    http://localhost:5173
    
  6. Verify onboarding automatically appears for first-time users.

  7. Navigate through all onboarding steps.

  8. Verify highlighted elements correspond to:

    • Voice Recorder
    • Voice Clone
    • Virtual Camera
    • Text Input
    • Generate Speech
    • Video Preview
  9. Verify onboarding is available on:

    • Compose Page
    • Settings Page
  10. Open Settings and click "Restart Onboarding Tour".

  11. Verify the onboarding restarts correctly.

  12. Test on mobile viewport and confirm tooltip responsiveness.

  13. Verify onboarding completion is stored in LocalStorage.

📸 Screenshots

image image image

Before

  • No guided onboarding experience.
  • Limited onboarding coverage across pages.

After

  • Interactive guided tour implemented.
  • Onboarding available on Compose and Settings pages.
  • Restart onboarding option available.
  • Improved first-time user experience.

✅ Checklist

  • I am contributing under SSOC
  • My code follows the project's existing style
  • I have tested my changes in a browser
  • I have linked the related issue above
  • My PR title follows Conventional Commits format

Summary by cubic

Adds an interactive onboarding tour with react-joyride, now global in App and active across Onboarding, Call, Compose, and Settings. The tour auto-starts for new users, switches tabs as needed, and can be restarted from Settings.

  • New Features

    • Global OnboardingTour in App using useOnboarding with auto-start, tab-aware navigation, and completion memory.
    • data-tour targets added for record/clone, virtual camera, TTS input/generate, video preview, compose workspace/message/speak, settings overview/API key, and restart control.
    • Accessibility and UX: keyboard/ESC support, spotlight clicks, graceful skips for missing targets, improved ARIA on TTS controls, and custom Joyride styles in styles.css.
  • Refactors

    • Rewrote pages/Onboarding.jsx to a Joyride-based flow with unified callbacks.
    • Added hooks/useOnboarding.js; integrated OnboardingTour in App.
    • Updated VoiceRecorder, VirtualCamera, VideoPreview, TextToSpeech, and VoiceForge to expose tour targets and align with the tour.

Written for commit 422cf42. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added a guided onboarding tour covering key recording, voice, camera, composition, and settings features.
    • Tour steps automatically switch to the relevant app section and support skipping, restarting, and resuming.
    • Added a restart-tour option in Settings.
    • Added automatic tour completion tracking across sessions.
  • Improvements

    • Updated accessibility labels and onboarding markers throughout the interface.
    • Simplified voice recording interactions and refreshed onboarding visuals.

@vercel

vercel Bot commented Jun 5, 2026

Copy link
Copy Markdown

@yashyrs027 is attempting to deploy a commit to the itzzavdhesh's projects Team on Vercel.

A member of the Team first needs to authorize it.

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown

✍️ DCO Sign-off Needed

Hey @yashyrs027! 👋 One or more commits in this PR are missing a Signed-off-by: line.

Warning

  • b26837b Instruction-box
  • 4e8c1d4 add react-joyride dependency
  • e18c56a Merge branch 'main' into Dialog-Box
  • d1446af Merge branch 'main' into Dialog-Box
  • 27972ae Refactor onboarding component to use Joyride for tours
  • 422cf42 Merge branch 'main' into Dialog-Box

How to fix:

For the latest commit:

git commit --amend --signoff
git push --force-with-lease

For multiple commits, replace N with the number to update:

git rebase --signoff HEAD~N
git push --force-with-lease

This comment will update automatically after you push.


🤖 VoiceForge Automation · Updates automatically on edits

@coderabbitai

coderabbitai Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ce2f51ed-846a-44e5-aa5e-16dc00dbb710

📥 Commits

Reviewing files that changed from the base of the PR and between d1446af and 422cf42.

📒 Files selected for processing (9)
  • client/src/App.jsx
  • client/src/components/TextToSpeech.jsx
  • client/src/components/VideoPreview.jsx
  • client/src/components/VirtualCamera.jsx
  • client/src/components/VoiceForge.jsx
  • client/src/components/VoiceRecorder.jsx
  • client/src/pages/Onboarding.jsx
  • client/src/pages/Settings.jsx
  • client/src/styles.css

📝 Walkthrough

Walkthrough

Adds a React Joyride onboarding tour with persistent state, cross-tab navigation, annotated UI targets, App integration, Settings restart support, and Joyride-specific styling.

Changes

Interactive Onboarding Tour Feature

Layer / File(s) Summary
Onboarding state and event management
client/src/hooks/useOnboarding.js
useOnboarding manages tour execution, starting indexes, localStorage completion state, cross-window events, and start, stop, reset, and auto-start behavior.
Controlled Joyride tour flow
client/src/pages/Onboarding.jsx, client/src/components/OnboardingTour.jsx, client/src/styles.css
The tour defines ordered workflow steps, synchronizes steps with tabs, handles Joyride lifecycle events, recovers from missing targets, and applies custom tooltip and spotlight styles.
Tour targets and application integration
client/src/App.jsx, client/src/components/TextToSpeech.jsx, client/src/components/VideoPreview.jsx, client/src/components/VirtualCamera.jsx, client/src/components/VoiceForge.jsx, client/src/components/VoiceRecorder.jsx
App renders OnboardingTour with tab state. Workflow components expose data-tour targets and updated TextToSpeech labels and controls.
Settings restart control
client/src/pages/Settings.jsx
Settings adds tour markers, API-key state handling, and a restart button wired to resetTour.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant App
  participant OnboardingTour
  participant Joyride
  participant useOnboarding

  User->>App: Open application
  App->>OnboardingTour: Render activeTab and onSelectTab
  OnboardingTour->>useOnboarding: Read tour state
  OnboardingTour->>Joyride: Render controlled step
  User->>Joyride: Navigate or skip
  Joyride->>OnboardingTour: Send lifecycle callback
  OnboardingTour->>App: Select target tab
  OnboardingTour->>useOnboarding: Stop tour on completion
  useOnboarding->>useOnboarding: Persist completion state
Loading

Possibly related PRs

Suggested labels: type:feature, level:advanced, needs revision, large PR

Suggested reviewers: joyprakashk, rushi-k12, itsdakshjain

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR addresses most core objectives from issue #109: implemented interactive tour with React Joyride, auto-start for first-time users, skip capability, localStorage persistence, restart option in Settings, mobile responsiveness, and accessibility features. However, PR comments indicate three unresolved blocking/minor issues: missing react-joyride dependency in package.json, incorrect callback prop (onEvent instead of callback), and invalid overlayClickAction prop. Add react-joyride to package.json, change onEvent={handleCallback} to callback={handleCallback} in OnboardingTour.jsx, and replace overlayClickAction={false} with disableOverlayClose={true}.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change—adding an interactive onboarding tour with support for settings and compose pages.
Out of Scope Changes check ✅ Passed All code changes directly support the onboarding tour feature: new OnboardingTour component and useOnboarding hook, data-tour attributes on UI elements, integration with App/Settings/Onboarding pages, custom styling, and accessibility improvements—all within the scope of issue #109.
Description check ✅ Passed The PR description comprehensively details the onboarding tour feature implementation with clear feature list, files changed, testing steps, and alignment with the changeset.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 Biome (2.5.6)
client/src/components/TextToSpeech.jsx

File contains syntax errors that prevent linting: Line 238: Expected corresponding JSX closing tag for 'button'.

client/src/App.jsx

File contains syntax errors that prevent linting: Line 158: Expected corresponding JSX closing tag for 'main'.

client/src/pages/Settings.jsx

File contains syntax errors that prevent linting: Line 370: expected > but instead found <; Line 361: Expected corresponding JSX closing tag for 'input'.; Line 359: Expected corresponding JSX closing tag for 'label'.; Line 798: Unexpected token. Did you mean {'}'} or &rbrace;?; Line 799: expected < but instead the file ends


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown

🎉 PR Ready for Mentor Review

Hey @yashyrs027! 👋 Your PR passed all checks and is now in the SSOC review queue.

Note

🔗 Closing: #109 · 📐 1535 lines across 11 file(s) · 📬 Already requested or no eligible reviewer found

@joyprakashk @rushi-k12, this PR is ready for your review — please confirm scope, check behavior and tests, then approve or request changes.

Important

This is not an approval. Please wait for mentor feedback before expecting a merge. If changes are requested, push them to this same branch and keep the PR focused on the linked issue.


🤖 VoiceForge Automation · Updates automatically on edits

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
client/src/hooks/useOnboarding.js (1)

6-12: ⚡ Quick win

Document the localStorage error fallback behavior.

Returning true when localStorage access fails (line 10) prevents the tour from auto-starting in private browsing or restricted contexts. While this is reasonable defensive behavior, it's not immediately obvious and could confuse future maintainers.

📝 Suggested clarification

Add a brief comment explaining the rationale:

 function hasCompletedTour() {
   try {
     return localStorage.getItem(ONBOARDING_STORAGE_KEY) === "true";
   } catch {
+    // Treat as completed in restricted contexts to prevent auto-start errors
     return true;
   }
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@client/src/hooks/useOnboarding.js` around lines 6 - 12, Add a brief inline
comment inside the hasCompletedTour function (near the try/catch and
ONBOARDING_STORAGE_KEY usage) explaining that when localStorage access throws
(e.g., private browsing or restricted contexts) the function intentionally
returns true to prevent auto-starting the onboarding tour; note that this is a
defensive choice to avoid repeatedly showing the tour when persistence is
unavailable.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@client/src/components/OnboardingTour.jsx`:
- Around line 166-169: The onboarding is forcing restarts because useOnboarding
is called with ignoreCompletion: true; remove the ignoreCompletion option from
the useOnboarding call in the OnboardingTour component (leave autoStart: true
and the destructured runTour/stopTour as-is) so the hook respects stored
completion state and the tour only auto-starts for first-time users; keep
resetTour behavior unchanged via settings event sync.
- Around line 1-8: The OnboardingTour component imports react-joyride (ACTIONS,
EVENTS, Joyride, STATUS) but the package is missing from project manifests; add
react-joyride to the client's dependencies by running in the client folder
(e.g., cd client && npm install react-joyride --save) or add "react-joyride":
"<appropriate-version>" to client/package.json and run npm install to update
package-lock.json so the import in client/src/components/OnboardingTour.jsx
resolves.

---

Nitpick comments:
In `@client/src/hooks/useOnboarding.js`:
- Around line 6-12: Add a brief inline comment inside the hasCompletedTour
function (near the try/catch and ONBOARDING_STORAGE_KEY usage) explaining that
when localStorage access throws (e.g., private browsing or restricted contexts)
the function intentionally returns true to prevent auto-starting the onboarding
tour; note that this is a defensive choice to avoid repeatedly showing the tour
when persistence is unavailable.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 32f667d6-59e1-44fa-9ec2-db5e4fb56606

📥 Commits

Reviewing files that changed from the base of the PR and between ee7a134 and b26837b.

📒 Files selected for processing (11)
  • client/src/App.jsx
  • client/src/components/OnboardingTour.jsx
  • client/src/components/TextToSpeech.jsx
  • client/src/components/VideoPreview.jsx
  • client/src/components/VirtualCamera.jsx
  • client/src/components/VoiceForge.jsx
  • client/src/components/VoiceRecorder.jsx
  • client/src/hooks/useOnboarding.js
  • client/src/pages/Onboarding.jsx
  • client/src/pages/Settings.jsx
  • client/src/styles.css

Comment on lines +1 to +8
import React from "react";
import {
ACTIONS,
EVENTS,
Joyride,
STATUS,
} from "react-joyride";
import useOnboarding from "../hooks/useOnboarding.js";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Verify react-joyride is missing from package.json and show installation command

echo "=== Checking package.json for react-joyride ==="
if grep -q "react-joyride" package.json; then
  echo "✓ Found in package.json"
  jq '.dependencies["react-joyride"], .devDependencies["react-joyride"]' package.json
else
  echo "✗ Not found in package.json"
fi

echo ""
echo "=== Installation command ==="
echo "npm install react-joyride"
echo ""
echo "=== Or with specific version ==="
echo "npm install react-joyride@^2.7.0"

Repository: itzzavdhesh/VoiceForge

Length of output: 265


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Find all package.json files ==="
find . -name package.json -print

echo
echo "=== Check react-joyride presence in all package.json ==="
while IFS= read -r pj; do
  echo "--- $pj ---"
  node - <<'NODE' "$pj"
const fs = require('fs');
const path = process.argv[1];
const file = process.argv[2] || path; // fallback
const p = file;
const data = JSON.parse(fs.readFileSync(p,'utf8'));
const deps = data.dependencies || {};
const dev = data.devDependencies || {};
const v = deps["react-joyride"] ?? dev["react-joyride"] ?? null;
console.log(v ? `react-joyride: ${v}` : "react-joyride: not present");
NODE "$pj"
done < <(find . -name package.json -print)

echo
echo "=== Search lockfiles for react-joyride ==="
rg -n --hidden --no-ignore-vcs "react-joyride" package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null || true

Repository: itzzavdhesh/VoiceForge

Length of output: 393


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Find all package.json files ==="
mapfile -t pjs < <(find . -name package.json -print)
printf '%s\n' "${pjs[@]}"

echo
echo "=== Check react-joyride presence in all package.json ==="
for pj in "${pjs[@]}"; do
  echo "--- $pj ---"
  node - "$pj" <<'NODE'
const fs = require('fs');
const pj = process.argv[2];
const data = JSON.parse(fs.readFileSync(pj,'utf8'));
const deps = data.dependencies || {};
const dev = data.devDependencies || {};
const v = deps["react-joyride"] ?? dev["react-joyride"] ?? null;
console.log(v ? `react-joyride: ${v}` : "react-joyride: not present");
NODE
done

echo
echo "=== Search lockfiles for react-joyride ==="
for f in package-lock.json yarn.lock pnpm-lock.yaml; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    rg -n "react-joyride" "$f" || true
  fi
done

Repository: itzzavdhesh/VoiceForge

Length of output: 177


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Find all package.json files ==="
mapfile -t pjs < <(find . -name package.json -print)
printf '%s\n' "${pjs[@]}"

echo
echo "=== Check react-joyride presence in all package.json ==="
for pj in "${pjs[@]}"; do
  echo "--- $pj ---"
  node - "$pj" <<'NODE'
const fs = require('fs');
const pj = process.argv[2];
const data = JSON.parse(fs.readFileSync(pj,'utf8'));
const deps = data.dependencies || {};
const dev = data.devDependencies || {};
const v = deps["react-joyride"] ?? dev["react-joyride"] ?? null;
console.log(v ? `react-joyride: ${v}` : "react-joyride: not present");
NODE
done

echo
echo "=== Search lockfiles for react-joyride ==="
for f in package-lock.json yarn.lock pnpm-lock.yaml; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    rg -n "react-joyride" "$f" || true
  fi
done

Repository: itzzavdhesh/VoiceForge

Length of output: 177


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Find all package.json files ==="
mapfile -t pjs < <(find . -name package.json -print)
printf '%s\n' "${pjs[@]}"

echo
echo "=== Check react-joyride presence in all package.json ==="
for pj in "${pjs[@]}"; do
  echo "--- $pj ---"
  node - "$pj" <<'NODE'
const fs = require('fs');
const pj = process.argv[2];
const data = JSON.parse(fs.readFileSync(pj,'utf8'));
const deps = data.dependencies || {};
const dev = data.devDependencies || {};
const v = deps["react-joyride"] ?? dev["react-joyride"] ?? null;
console.log(v ? `react-joyride: ${v}` : "react-joyride: not present");
NODE
done

echo
echo "=== Search lockfiles for react-joyride ==="
for f in package-lock.json yarn.lock pnpm-lock.yaml; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    rg -n "react-joyride" "$f" || true
  fi
done

Repository: itzzavdhesh/VoiceForge

Length of output: 177


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Find all package.json files ==="
mapfile -t pjs < <(find . -name package.json -print)
printf '%s\n' "${pjs[@]}"

echo
echo "=== Check react-joyride presence in all package.json files ==="
node <<'NODE'
const fs = require('fs');
const { execSync } = require('child_process');

const pjs = execSync('find . -name package.json -print', { encoding: 'utf8' })
  .trim().split('\n').filter(Boolean);

for (const pj of pjs) {
  const data = JSON.parse(fs.readFileSync(pj, 'utf8'));
  const deps = data.dependencies || {};
  const dev = data.devDependencies || {};
  const v = deps["react-joyride"] ?? dev["react-joyride"] ?? null;
  console.log(`${pj}: ${v ? `react-joyride: ${v}` : 'react-joyride: not present'}`);
}
NODE

echo
echo "=== Search lockfiles for react-joyride ==="
for f in package-lock.json yarn.lock pnpm-lock.yaml; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    rg -n "react-joyride" "$f" || true
  fi
done

# also search recursively for lockfiles in case they are nested
echo
echo "=== Search nested lockfiles for react-joyride ==="
for lf in $(find . -name package-lock.json -o -name yarn.lock -o -name pnpm-lock.yaml 2>/dev/null); do
  echo "--- $lf ---"
  rg -n "react-joyride" "$lf" || true
done

Repository: itzzavdhesh/VoiceForge

Length of output: 177


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Find all package.json files ==="
mapfile -t pjs < <(find . -name package.json -print 2>/dev/null || true)
printf '%s\n' "${pjs[@]}" | cat

echo
echo "=== react-joyride presence in all package.json files ==="
for pj in "${pjs[@]}"; do
  echo "--- $pj ---"
  if rg -n '"react-joyride"\s*:' "$pj" >/dev/null 2>&1; then
    val="$(jq -r '.dependencies["react-joyride"] // .devDependencies["react-joyride"] // empty' "$pj" 2>/dev/null || true)"
    if [ -n "$val" ]; then
      echo "react-joyride: $val"
    else
      echo "react-joyride: present (value not readable)"
    fi
  else
    echo "react-joyride: not present"
  fi
done

echo
echo "=== Search lockfiles at repo root (if present) ==="
for f in package-lock.json yarn.lock pnpm-lock.yaml; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    rg -n "react-joyride" "$f" || true
  fi
done

echo
echo "=== Search nested lockfiles ==="
mapfile -t lfs < <(find . -name package-lock.json -o -name yarn.lock -o -name pnpm-lock.yaml 2>/dev/null || true)
if [ "${`#lfs`[@]}" -eq 0 ]; then
  echo "No nested lockfiles found."
else
  for lf in "${lfs[@]}"; do
    echo "--- $lf ---"
    rg -n "react-joyride" "$lf" || true
  done
fi

Repository: itzzavdhesh/VoiceForge

Length of output: 177


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== package.json files ==="
ls -1 package.json client/package.json server/package.json 2>/dev/null || true

echo
echo "=== react-joyride in package.json files (deps/devDeps) ==="
for pj in package.json client/package.json server/package.json; do
  if [ -f "$pj" ]; then
    echo "--- $pj ---"
    rg -n '"react-joyride"\s*:' "$pj" || echo "not present"
  fi
done

echo
echo "=== react-joyride in top-level lockfiles (if present) ==="
for lf in package-lock.json yarn.lock pnpm-lock.yaml; do
  if [ -f "$lf" ]; then
    echo "--- $lf ---"
    rg -n "react-joyride" "$lf" || echo "no matches"
  fi
done

echo
echo "=== react-joyride in nested lockfiles (limited to common names, if any) ==="
for lf in $(find . -name package-lock.json -o -name yarn.lock -o -name pnpm-lock.yaml 2>/dev/null); do
  echo "--- $lf ---"
  rg -n "react-joyride" "$lf" || echo "no matches"
done

Repository: itzzavdhesh/VoiceForge

Length of output: 531


Add missing react-joyride dependency

react-joyride is imported in client/src/components/OnboardingTour.jsx but is not listed in dependencies/devDependencies in package.json, client/package.json, or server/package.json, and it doesn’t appear in package-lock.json. Add it (e.g., cd client && npm i react-joyride, or add to client/package.json dependencies).

🧰 Tools
🪛 GitHub Actions: CI / 0_build.txt

[error] 1-1: Vite/Rollup failed to resolve import "react-joyride" from "client/src/components/OnboardingTour.jsx". This is most likely unintended and can break the app at runtime. Fix by installing/adding the dependency or configuring Rollup externalize options (build.rollupOptions.external).

🪛 GitHub Actions: CI / build

[error] 1-1: Vite/Rollup failed to resolve import "react-joyride" from "client/src/components/OnboardingTour.jsx". Ensure the dependency is installed and resolvable (or add it to build.rollupOptions.external if intended).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@client/src/components/OnboardingTour.jsx` around lines 1 - 8, The
OnboardingTour component imports react-joyride (ACTIONS, EVENTS, Joyride,
STATUS) but the package is missing from project manifests; add react-joyride to
the client's dependencies by running in the client folder (e.g., cd client &&
npm install react-joyride --save) or add "react-joyride":
"<appropriate-version>" to client/package.json and run npm install to update
package-lock.json so the import in client/src/components/OnboardingTour.jsx
resolves.

Comment thread client/src/components/OnboardingTour.jsx Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4 issues found across 11 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="client/src/pages/Settings.jsx">

<violation number="1" location="client/src/pages/Settings.jsx:126">
P2: Restart button does not restart from beginning of onboarding flow. It restarts at Settings because current-tab-based initial step is used.</violation>
</file>

<file name="client/src/components/OnboardingTour.jsx">

<violation number="1" location="client/src/components/OnboardingTour.jsx:7">
P0: The `react-joyride` package is imported but not declared in any `package.json`. CI confirms the build fails with an unresolved import error. Add `react-joyride` to `client/package.json` dependencies (e.g. `npm install react-joyride`).</violation>
</file>

Reply with feedback, questions, or to request a fix.

Fix all with cubic | Re-trigger cubic

EVENTS,
Joyride,
STATUS,
} from "react-joyride";

@cubic-dev-ai cubic-dev-ai Bot Jun 5, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P0: The react-joyride package is imported but not declared in any package.json. CI confirms the build fails with an unresolved import error. Add react-joyride to client/package.json dependencies (e.g. npm install react-joyride).

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At client/src/components/OnboardingTour.jsx, line 7:

<comment>The `react-joyride` package is imported but not declared in any `package.json`. CI confirms the build fails with an unresolved import error. Add `react-joyride` to `client/package.json` dependencies (e.g. `npm install react-joyride`).</comment>

<file context>
@@ -0,0 +1,263 @@
+  EVENTS,
+  Joyride,
+  STATUS,
+} from "react-joyride";
+import useOnboarding from "../hooks/useOnboarding.js";
+
</file context>
Fix with cubic

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Working... View progress →

Comment thread client/src/components/OnboardingTour.jsx Outdated
Comment thread client/src/components/OnboardingTour.jsx Outdated
</div>
<button
type="button"
onClick={resetTour}

@cubic-dev-ai cubic-dev-ai Bot Jun 5, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Restart button does not restart from beginning of onboarding flow. It restarts at Settings because current-tab-based initial step is used.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At client/src/pages/Settings.jsx, line 126:

<comment>Restart button does not restart from beginning of onboarding flow. It restarts at Settings because current-tab-based initial step is used.</comment>

<file context>
@@ -106,7 +111,31 @@ export default function Settings() {
+          </div>
+          <button
+            type="button"
+            onClick={resetTour}
+            aria-label="Restart onboarding tour"
+            className="inline-flex min-h-11 items-center justify-center gap-2 rounded-md bg-moss px-4 font-bold text-white transition hover:bg-moss/90 dark:bg-glow dark:text-black dark:hover:bg-glow/90"
</file context>
Fix with cubic

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Working... View progress →

Repository owner deleted a comment from coderabbitai Bot Jun 6, 2026
@itzzavdhesh

Copy link
Copy Markdown
Owner

Hello @yashyrs027 , please resolve these 3 issue and you are good to go

🔴 Blocking — react-joyride is missing from package.json

The component imports from react-joyride, but the package is not declared as a dependency. Any developer who runs npm install will get a module-not-found error.

# Fix: inside the client/ directory
npm install react-joyride

This will add it to client/package.json automatically.


🔴 Blocking — Wrong Joyride callback prop (onEventcallback)

In OnboardingTour.jsx, you're passing:

<Joyride
  onEvent={handleCallback}   // ❌  this prop does not exist in react-joyride
  ...
/>

The correct prop is callback:

<Joyride
  callback={handleCallback}  // ✅
  ...
/>

Because onEvent is silently ignored, the entire handleCallback function (which drives step navigation, finishing, and skipping) never runs. The tour will show tooltips but clicking Next/Back/Skip/Finish will do nothing. This completely breaks the feature.


🟡 Minor — overlayClickAction is not a valid prop

overlayClickAction={false}   // ❌ not a real react-joyride prop

The correct prop to disable closing the tour when the overlay is clicked is:

disableOverlayClose          // ✅ (boolean flag, no value needed)

@itzzavdhesh
itzzavdhesh merged commit 3da0c3c into itzzavdhesh:main Aug 11, 2026
4 of 8 checks passed
@github-actions

Copy link
Copy Markdown

🎊 PR Merged Successfully

Hey @yashyrs027! 👋 Congratulations and thank you for your contribution to VoiceForge!

Note

🔗 Linked issue(s): #109 · ✅ Marked as merged and complete

Maintainers may still handle final cleanup, release notes, or follow-up tracking after the merge.


🤖 VoiceForge Automation · Updates automatically on edits

@github-actions github-actions Bot removed gssoc26 gssoc26 ELUSOC ELUSOC labels Aug 11, 2026
@itzzavdhesh itzzavdhesh added the ELUSOC ELUSOC label Aug 11, 2026
@itzzavdhesh itzzavdhesh added type:bug type:bug type:refactor type:refactor mentor:Anushreebasics GSSoC: Mentor-@Anushreebasics mentor:sabeenaviklar GSSoC: Mentor-@sabeenaviklar mentor:itsdakshjain GSSoC: Mentor-@itsdakshjain mentor:Nitya-003 Applied by mentor automation gssoc26 gssoc26 labels Aug 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

accessibility assignee-match bug Something isn't working client dco-missing docs-ok documentation Improvements or additions to documentation ELUSOC ELUSOC enhancement New feature or request gssoc:approved gssoc:approved gssoc26 gssoc26 Hard hard level:critical level linked-issue-ok mentor:Anushreebasics GSSoC: Mentor-@Anushreebasics mentor:itsdakshjain GSSoC: Mentor-@itsdakshjain mentor:Nitya-003 Applied by mentor automation mentor:sabeenaviklar GSSoC: Mentor-@sabeenaviklar pr-validated quality:clean quality:clean ready for review refactor size/xl SSoC26 SSOC template-ok type:accessibility type type:bug type:bug type:feature type:feature type:performance type:performance type:refactor type:refactor VETERAN VETERAN

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Add Interactive Onboarding Tour for New Users 🎯 | SSOC

3 participants