Skip to content

onboarding updates and checks #1076

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open

Conversation

plyght
Copy link
Collaborator

@plyght plyght commented Jul 4, 2025

No description provided.

Copy link

coderabbitai bot commented Jul 4, 2025

📝 Walkthrough

Walkthrough

This update introduces a comprehensive onboarding and setup flow for the application, including multi-step onboarding, permissions validation, AI model download/install, and survey collection. It adds new UI components for onboarding, setup validation, calendar linking, and lab/debug features. Tauri backend commands and persistent storage are extended to track application open counts and manage onboarding/survey display logic. Localization files are updated with new strings for these features.

Changes

File(s) Change Summary
apps/desktop/src/components/settings/components/types.ts, .../views/lab.tsx, .../app.settings.tsx Activated the "lab" tab in settings and added a new "Debug" section with reset onboarding/survey actions using new UI and Tauri commands.
apps/desktop/src/components/setup-validator/index.tsx, .../permissions-validation-view.tsx, .../setup-complete-view.tsx Added a setup validator modal with permissions validation and setup completion views, including permission request logic, status polling, and completion handling.
apps/desktop/src/components/welcome-modal/index.tsx, .../model-selection-view.tsx, .../calendar-linking-view.tsx, .../welcome-view.tsx Refactored onboarding into a multi-step wizard: welcome, model selection (with download/install), calendar linking, survey, permissions, and completion. Added user profile state, step navigation, analytics, and dynamic UI. Updated welcome and model selection UIs.
apps/desktop/src/routes/app.tsx Updated onboarding and survey logic: tracks app open count, shows survey on second open, simplifies modal display, and removes separate individualization modal.
apps/desktop/src-tauri/src/commands.rs, .../lib.rs, .../store.rs Added Tauri commands and store key to track and increment the app open count, enabling conditional onboarding/survey logic based on usage.
apps/desktop/src/types/tauri.gen.ts Added TypeScript bindings for new Tauri commands to get and increment the app open count.
apps/desktop/src/locales/en/messages.po, .../ko/messages.po Updated and expanded localization entries for new onboarding, setup, permissions, and lab features.

Sequence Diagram(s)

Onboarding and Setup Flow

sequenceDiagram
    participant User
    participant App (Frontend)
    participant Tauri (Backend)
    participant Store

    User->>App (Frontend): Launches app
    App (Frontend)->>Tauri (Backend): increment_app_open_count
    Tauri (Backend)->>Store: Update AppOpenCount
    Tauri (Backend)-->>App (Frontend): Return new count

    App (Frontend)->>App (Frontend): Determine onboarding/survey needs
    App (Frontend)->>User: Show WelcomeModal (multi-step wizard)

    loop Onboarding Steps
        User->>App (Frontend): Interact with step (e.g., select model, link calendar, answer survey)
        App (Frontend)->>Tauri (Backend): (if needed) Request permission, download model, etc.
        Tauri (Backend)-->>App (Frontend): Respond with status/result
        App (Frontend)->>User: Update UI/progress
    end

    App (Frontend)->>User: Show setup complete view
    User->>App (Frontend): Click "Start Using Hyprnote"
    App (Frontend)->>App (Frontend): Close modal, show main app
Loading

Lab Debug Actions

sequenceDiagram
    User->>App (Frontend): Click "Reset Onboarding" or "Show Survey" in Lab tab
    App (Frontend)->>Tauri (Backend): Set onboarding/individualization flags
    Tauri (Backend)-->>App (Frontend): Confirm mutation
    App (Frontend)->>App (Frontend): Attempt to close settings, show main window, or reload
Loading

📜 Recent review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6dc72b3 and c4726a7.

📒 Files selected for processing (3)
  • apps/desktop/src/locales/en/messages.po (32 hunks)
  • apps/desktop/src/locales/ko/messages.po (32 hunks)
  • apps/docs/data/i18n.json (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • apps/docs/data/i18n.json
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/desktop/src/locales/en/messages.po
  • apps/desktop/src/locales/ko/messages.po
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: ci (macos, macos-latest)
  • GitHub Check: ci (windows, windows-latest)

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

‼️ IMPORTANT
Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged.

  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
apps/desktop/src/components/setup-validator/permissions-validation-view.tsx (2)

36-39: Remove redundant conditional styling

Both branches of the ternary operator result in bg-neutral-50, making the condition unnecessary.

       className={cn(
         "flex items-center justify-between rounded-md border p-3 transition-colors",
-        isGranted ? "bg-neutral-50 border-neutral-200" : "bg-neutral-50",
+        "bg-neutral-50",
+        isGranted && "border-neutral-200",
       )}

108-130: Consider showing user-facing error messages

Currently, all permission request errors are only logged to console. Users won't know if a permission request fails.

Consider adding error state handling and displaying error messages to users. For example:

const [error, setError] = useState<string | null>(null);

const micPermission = useMutation({
  mutationFn: () => listenerCommands.requestMicrophoneAccess(),
  onSuccess: () => {
    setError(null);
    permissionsStatus.refetch();
  },
  onError: (err) => {
    console.error(err);
    setError("Failed to request microphone permission. Please try again.");
  },
});
apps/desktop/src/components/welcome-modal/index.tsx (1)

114-117: Remove or implement the TODO comment

The comment says "Don't change step immediately" but there's no logic preventing immediate step change. Either implement a delay/condition or remove the misleading comment.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e723645 and 37a1ff2.

📒 Files selected for processing (12)
  • apps/desktop/src/components/settings/components/types.ts (2 hunks)
  • apps/desktop/src/components/settings/views/lab.tsx (2 hunks)
  • apps/desktop/src/components/setup-validator/index.tsx (1 hunks)
  • apps/desktop/src/components/setup-validator/permissions-validation-view.tsx (1 hunks)
  • apps/desktop/src/components/setup-validator/setup-complete-view.tsx (1 hunks)
  • apps/desktop/src/components/welcome-modal/index.tsx (3 hunks)
  • apps/desktop/src/components/welcome-modal/model-selection-view.tsx (4 hunks)
  • apps/desktop/src/locales/en/messages.po (33 hunks)
  • apps/desktop/src/locales/ko/messages.po (33 hunks)
  • apps/desktop/src/routes/app.settings.tsx (3 hunks)
  • apps/desktop/src/routes/app.tsx (2 hunks)
  • apps/docs/data/i18n.json (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
`**/*.{js,ts,tsx,rs}`: 1. No error handling. 2. No unused imports, variables, or functions. 3. For comments, keep it minimal. It should be about "Why", not "What".

**/*.{js,ts,tsx,rs}: 1. No error handling.
2. No unused imports, variables, or functions.
3. For comments, keep it minimal. It should be about "Why", not "What".

⚙️ Source: CodeRabbit Configuration File

List of files the instruction was applied to:

  • apps/desktop/src/routes/app.settings.tsx
  • apps/desktop/src/components/setup-validator/index.tsx
  • apps/desktop/src/routes/app.tsx
  • apps/desktop/src/components/setup-validator/setup-complete-view.tsx
  • apps/desktop/src/components/settings/views/lab.tsx
  • apps/desktop/src/components/welcome-modal/model-selection-view.tsx
  • apps/desktop/src/components/settings/components/types.ts
  • apps/desktop/src/components/setup-validator/permissions-validation-view.tsx
  • apps/desktop/src/components/welcome-modal/index.tsx
🧬 Code Graph Analysis (4)
apps/desktop/src/routes/app.settings.tsx (1)
apps/desktop/src/components/settings/views/lab.tsx (1)
  • Lab (12-26)
apps/desktop/src/routes/app.tsx (1)
apps/desktop/src/types/tauri.gen.ts (2)
  • isOnboardingNeeded (13-15)
  • isIndividualizationNeeded (25-27)
apps/desktop/src/components/welcome-modal/model-selection-view.tsx (1)
apps/desktop/src/components/toast/shared.tsx (1)
  • DownloadProgress (11-52)
apps/desktop/src/components/setup-validator/permissions-validation-view.tsx (4)
packages/ui/src/lib/utils.ts (1)
  • cn (4-6)
packages/ui/src/components/ui/button.tsx (1)
  • Button (37-89)
packages/ui/src/components/ui/spinner.tsx (1)
  • Spinner (58-58)
packages/ui/src/components/ui/pushable-button.tsx (1)
  • PushableButton (9-19)
🔇 Additional comments (19)
apps/docs/data/i18n.json (1)

4-5: LGTM: Translation count updates are consistent.

The increase from 281 to 306 total entries with corresponding missing count updates correctly reflects the addition of new translation keys for the onboarding features.

apps/desktop/src/components/settings/components/types.ts (2)

2-2: LGTM: FlaskConical icon import is correctly added.

The import is properly used in the TABS array for the lab tab configuration.


13-13: LGTM: Lab tab entry is properly enabled.

The uncommented lab tab entry correctly associates the "lab" name with the FlaskConical icon.

apps/desktop/src/routes/app.settings.tsx (4)

8-17: LGTM: Lab component import is correctly added.

The import is properly used in the conditional rendering logic.


59-60: LGTM: Lab tab title mapping is correctly added.

The title mapping function properly handles the "lab" case with appropriate localization.


101-102: LGTM: Lab tab sidebar rendering is correctly added.

The sidebar button rendering properly includes the lab tab with appropriate localization.


136-136: LGTM: Lab component conditional rendering is correctly added.

The Lab component is properly rendered when the lab tab is active.

apps/desktop/src/routes/app.tsx (3)

5-5: LGTM: useState import correctly removed.

The useState import is no longer needed since session state management has been removed.


45-45: LGTM: Onboarding logic simplified effectively.

The combined boolean condition isOnboardingNeeded || isIndividualizationNeeded properly consolidates the modal display logic, eliminating the need for session-based state management.


78-83: LGTM: WelcomeModal onClose handler simplified.

The simplified handler that only triggers router invalidation is cleaner and removes the complexity of managing multiple state flags.

apps/desktop/src/components/setup-validator/index.tsx (3)

1-12: LGTM: Clean imports and interface definition.

All imports are used and the interface clearly defines the component's props.


14-27: LGTM: State management and handlers are well-structured.

The view state management and transition handlers are clean and focused on single responsibilities.


29-61: LGTM: Modal structure and conditional rendering are correct.

The modal configuration and conditional view rendering properly handle the two-step setup flow with appropriate z-index layering for the particles background.

apps/desktop/src/components/setup-validator/setup-complete-view.tsx (1)

1-62: Clean setup completion view implementation!

The component is well-structured with smooth animations, proper localization support, and clear user feedback.

apps/desktop/src/components/settings/views/lab.tsx (1)

82-84: Add user feedback for error handling.

The error handler only logs to console. Users won't know if the reset operation failed.

Consider adding user-facing error feedback:

     onError: (error) => {
       console.error("Failed to reset onboarding:", error);
+      // Show error toast or update UI to indicate failure
+      // Example: toast.error("Failed to reset onboarding. Please try again.");
     },

Alternatively, add an error state to show inline error message:

 function ResetOnboarding() {
+  const [error, setError] = useState<string | null>(null);
   const resetMutation = useMutation({
     mutationFn: async () => {
       await commands.setOnboardingNeeded(true);
       await commands.setIndividualizationNeeded(true);
     },
     onSuccess: async () => {
+      setError(null);
       try {
         // Close the settings window
         const currentWindow = getCurrentWebviewWindow();
         await currentWindow.close();
 
         // Show the main window which should trigger onboarding
         windowsCommands.windowShow({ type: "main" });
       } catch (error) {
         console.error("Failed to reload main window:", error);
         // Fallback: just reload current window
         window.location.reload();
       }
     },
     onError: (error) => {
       console.error("Failed to reset onboarding:", error);
+      setError("Failed to reset onboarding. Please try again.");
     },
   });

Then display the error in the UI below the button.

⛔ Skipped due to learnings
Learnt from: plyght
PR: fastrepl/hyprnote#921
File: plugins/location-connectivity/src/error.rs:1-41
Timestamp: 2025-06-06T16:31:46.457Z
Learning: In the location-connectivity plugin (plugins/location-connectivity/), comprehensive error handling via LocationConnectivityError is necessary despite the "no error handling" guideline, as the plugin performs system-level operations (WiFi detection, persistent storage) that require proper error propagation to the frontend.
apps/desktop/src/locales/ko/messages.po (1)

1-1337: Localization file updates look good.

Source references updated and new strings added for the onboarding flow.

apps/desktop/src/components/welcome-modal/model-selection-view.tsx (1)

84-212: Excellent implementation of model download flow!

The download logic is well-structured with:

  • Proper state management for tracking download progress
  • Good UX with visual feedback for already installed vs downloading states
  • Concurrent downloads for efficiency
  • Clean separation between STT and LLM model handling
apps/desktop/src/locales/en/messages.po (1)

1-1337: English localization updates are complete.

All new strings are properly translated and source references are updated.

apps/desktop/src/components/setup-validator/permissions-validation-view.tsx (1)

179-179: Notification permission comparison is correct

The NotificationPermission type (in plugins/notification/js/bindings.gen.ts) is defined as:

export type NotificationPermission =
  "Granted" | "NotGrantedAndShouldRequest" | "NotGrantedAndShouldAskManual"

Therefore, checking permissionsStatus.data?.notification === "Granted" at line 179 in apps/desktop/src/components/setup-validator/permissions-validation-view.tsx is accurate. No changes required.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (1)
apps/desktop/src/components/welcome-modal/index.tsx (1)

184-194: Past review comment has been addressed.

The stale closure issue with currentStep has been properly fixed. The mutation function now accepts a step parameter and it's passed explicitly when calling the mutation.

🧹 Nitpick comments (2)
apps/desktop/src/components/welcome-modal/index.tsx (2)

237-240: Extract duplicated button visibility logic.

The conditions for showing back and close buttons are identical and duplicated. Consider extracting this into a helper function or constant.

+const getNonInteractiveSteps = (step: OnboardingStep) => 
+  step !== "welcome" && step !== "survey-story" && step !== "survey-thankyou";

-const showBackButton = currentStep !== "welcome" && currentStep !== "survey-story"
-  && currentStep !== "survey-thankyou";
-const showCloseButton = currentStep !== "welcome" && currentStep !== "survey-story"
-  && currentStep !== "survey-thankyou";
+const showBackButton = getNonInteractiveSteps(currentStep);
+const showCloseButton = getNonInteractiveSteps(currentStep);

196-227: Consider simplifying the back navigation logic.

The switch statement for handling back navigation is quite complex. Consider extracting this into a separate function or using a step transition map for better maintainability.

+const getBackStep = (currentStep: OnboardingStep, userProfile: UserProfile): OnboardingStep => {
+  const stepMap: Record<OnboardingStep, OnboardingStep> = {
+    "model-selection": "welcome",
+    "survey-story": "model-selection",
+    "survey-industry": "survey-story",
+    "survey-role": "survey-industry",
+    "survey-orgsize": "survey-role",
+    "survey-howheard": userProfile.industry === "student" ? "survey-industry" : "survey-orgsize",
+    "permissions-validation": "survey-thankyou",
+    "setup-complete": "permissions-validation",
+  };
+  return stepMap[currentStep] || currentStep;
+};

const handleBack = () => {
-  switch (currentStep) {
-    case "model-selection":
-      setCurrentStep("welcome");
-      break;
-    // ... rest of cases
-  }
+  setCurrentStep(getBackStep(currentStep, userProfile));
};
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7459342 and f5bac76.

📒 Files selected for processing (3)
  • apps/desktop/src/components/welcome-modal/index.tsx (3 hunks)
  • apps/desktop/src/locales/en/messages.po (26 hunks)
  • apps/desktop/src/locales/ko/messages.po (26 hunks)
✅ Files skipped from review due to trivial changes (1)
  • apps/desktop/src/locales/ko/messages.po
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/desktop/src/locales/en/messages.po
🧰 Additional context used
📓 Path-based instructions (1)
`**/*.{js,ts,tsx,rs}`: 1. No error handling. 2. No unused imports, variables, or functions. 3. For comments, keep it minimal. It should be about "Why", not "What".

**/*.{js,ts,tsx,rs}: 1. No error handling.
2. No unused imports, variables, or functions.
3. For comments, keep it minimal. It should be about "Why", not "What".

⚙️ Source: CodeRabbit Configuration File

List of files the instruction was applied to:

  • apps/desktop/src/components/welcome-modal/index.tsx
⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: ci (windows, windows-latest)
  • GitHub Check: ci (macos, macos-latest)
🔇 Additional comments (2)
apps/desktop/src/components/welcome-modal/index.tsx (2)

13-26: Verify all imports are used.

All imports appear to be used correctly in the component. The reorganization of imports looks good with clear grouping.


274-335: Well-structured conditional rendering flow.

The conditional rendering logic correctly handles all onboarding steps with appropriate props passed to each view component. The flow is logical and complete.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (6)
apps/desktop/src/components/welcome-modal/calendar-linking-view.tsx (2)

35-37: Consider making the auto-continue delay configurable.

The hardcoded 1500ms delay could be made configurable or use a more semantic approach for better maintainability.

-      setTimeout(() => {
-        onComplete();
-      }, 1500);
+      const AUTO_CONTINUE_DELAY = 1500;
+      setTimeout(() => {
+        onComplete();
+      }, AUTO_CONTINUE_DELAY);

99-103: Simplify the complex conditional logic.

The onClick handler has nested conditions that could be simplified for better readability.

-              onClick={() => {
-                if (provider.available && provider.id === "apple" && !isCalendarGranted) {
-                  requestCalendarAccess.mutate();
-                }
-              }}
+              onClick={() => {
+                const shouldRequestAccess = provider.available && 
+                  provider.id === "apple" && 
+                  !isCalendarGranted;
+                
+                if (shouldRequestAccess) {
+                  requestCalendarAccess.mutate();
+                }
+              }}
apps/desktop/src/components/setup-validator/permissions-validation-view.tsx (3)

91-93: Simplify the complex chained promise logic.

The nested promise chain for STT model checking could be simplified for better readability.

-        localSttCommands.getCurrentModel().then(model => model ? localSttCommands.isModelDownloaded(model) : false)
-          .catch(() => false),
+        localSttCommands.getCurrentModel()
+          .then(model => model ? localSttCommands.isModelDownloaded(model) : false)
+          .catch(() => false),

133-135: Extract complex boolean logic to improve readability.

The required permissions check could be extracted to a separate variable for better readability.

-  const requiredPermissionsGranted = permissionsStatus.data?.microphone === true
-    && permissionsStatus.data?.systemAudio === true
-    && permissionsStatus.data?.modelsInstalled === true;
+  const requiredPermissionsGranted = Boolean(
+    permissionsStatus.data?.microphone &&
+    permissionsStatus.data?.systemAudio &&
+    permissionsStatus.data?.modelsInstalled
+  );

145-145: Replace empty function with meaningful implementation or remove the property.

The empty function for AI models onRequest should either be removed or have a proper implementation.

-      onRequest: () => {}, // Models are installed during onboarding, no action needed
+      // Models are installed during onboarding, no action needed
+      onRequest: undefined,

Then update the PermissionItem component to handle undefined onRequest gracefully.

apps/desktop/src/components/welcome-modal/index.tsx (1)

54-367: Consider extracting step navigation logic to reduce component complexity.

The component has grown quite large with many responsibilities. Consider extracting the step navigation logic into a custom hook or separate module to improve maintainability.

For example, create a useOnboardingFlow hook that manages the current step and navigation logic:

const useOnboardingFlow = () => {
  const [currentStep, setCurrentStep] = useState<OnboardingStep>("welcome");
  const [userProfile, setUserProfile] = useState<UserProfile>({});
  
  // Move all the handler functions here
  // Return step state and handlers
};

Then use it in the component:

export function WelcomeModal({ isOpen, onClose }: WelcomeModalProps) {
  const { currentStep, userProfile, handlers } = useOnboardingFlow();
  // Simplified component logic
}
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 007a8e9 and 0586a18.

📒 Files selected for processing (9)
  • apps/desktop/src/components/setup-validator/permissions-validation-view.tsx (1 hunks)
  • apps/desktop/src/components/setup-validator/setup-complete-view.tsx (1 hunks)
  • apps/desktop/src/components/welcome-modal/calendar-linking-view.tsx (1 hunks)
  • apps/desktop/src/components/welcome-modal/index.tsx (3 hunks)
  • apps/desktop/src/components/welcome-modal/model-selection-view.tsx (5 hunks)
  • apps/desktop/src/components/welcome-modal/welcome-view.tsx (1 hunks)
  • apps/desktop/src/locales/en/messages.po (31 hunks)
  • apps/desktop/src/locales/ko/messages.po (31 hunks)
  • apps/docs/data/i18n.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (5)
  • apps/docs/data/i18n.json
  • apps/desktop/src/locales/en/messages.po
  • apps/desktop/src/components/setup-validator/setup-complete-view.tsx
  • apps/desktop/src/locales/ko/messages.po
  • apps/desktop/src/components/welcome-modal/model-selection-view.tsx
🧰 Additional context used
📓 Path-based instructions (1)
`**/*.{js,ts,tsx,rs}`: 1. No error handling. 2. No unused imports, variables, or functions. 3. For comments, keep it minimal. It should be about "Why", not "What".

**/*.{js,ts,tsx,rs}: 1. No error handling.
2. No unused imports, variables, or functions.
3. For comments, keep it minimal. It should be about "Why", not "What".

⚙️ Source: CodeRabbit Configuration File

List of files the instruction was applied to:

  • apps/desktop/src/components/welcome-modal/welcome-view.tsx
  • apps/desktop/src/components/welcome-modal/calendar-linking-view.tsx
  • apps/desktop/src/components/setup-validator/permissions-validation-view.tsx
  • apps/desktop/src/components/welcome-modal/index.tsx
🧬 Code Graph Analysis (2)
apps/desktop/src/components/welcome-modal/welcome-view.tsx (1)
packages/ui/src/components/ui/text-animate.tsx (1)
  • TextAnimate (302-386)
apps/desktop/src/components/setup-validator/permissions-validation-view.tsx (4)
packages/ui/src/lib/utils.ts (1)
  • cn (4-6)
packages/ui/src/components/ui/button.tsx (1)
  • Button (37-89)
packages/ui/src/components/ui/spinner.tsx (1)
  • Spinner (58-58)
packages/ui/src/components/ui/pushable-button.tsx (1)
  • PushableButton (9-19)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: ci (windows, windows-latest)
  • GitHub Check: ci (macos, macos-latest)
🔇 Additional comments (2)
apps/desktop/src/components/welcome-modal/welcome-view.tsx (1)

26-38: LGTM! Clean UI updates that improve messaging hierarchy.

The changes effectively establish a clear messaging hierarchy with the main heading and supporting tagline. The use of different animation styles (slideUp for the main heading, fadeIn for the tagline) and appropriate spacing creates a more polished onboarding experience that aligns with the privacy-focused messaging.

apps/desktop/src/components/welcome-modal/index.tsx (1)

194-204: Well-structured mutation to handle survey skipping.

The refactor to pass the step as a parameter to avoid stale closure issues is correctly implemented. The analytics tracking and navigation logic is well-organized.

Comment on lines +39 to +41
onError: (error) => {
console.error("Calendar access request failed:", error);
},
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Remove console.error to comply with coding guidelines.

The coding guidelines specify "No error handling" for .js/.ts/.tsx/.rs files. Remove the console.error statement.

-    onError: (error) => {
-      console.error("Calendar access request failed:", error);
-    },
+    onError: () => {},
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
onError: (error) => {
console.error("Calendar access request failed:", error);
},
onError: () => {},
🤖 Prompt for AI Agents
In apps/desktop/src/components/welcome-modal/calendar-linking-view.tsx around
lines 39 to 41, remove the console.error statement inside the onError callback
to comply with the coding guidelines that prohibit error handling in
.js/.ts/.tsx/.rs files. Simply delete the console.error line without replacing
it with any other error handling code.

const micPermission = useMutation({
mutationFn: () => listenerCommands.requestMicrophoneAccess(),
onSuccess: () => permissionsStatus.refetch(),
onError: console.error,
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Remove console.error statements to comply with coding guidelines.

The coding guidelines specify "No error handling" for .js/.ts/.tsx/.rs files. Remove all console.error statements.

-    onError: console.error,
+    onError: () => {},

Apply the same fix to lines 117, 123, and 129.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
onError: console.error,
- onError: console.error,
+ onError: () => {},
🤖 Prompt for AI Agents
In apps/desktop/src/components/setup-validator/permissions-validation-view.tsx
at lines 111, 117, 123, and 129, remove all console.error statements to comply
with the coding guidelines that prohibit error handling via console.error in
.js/.ts/.tsx/.rs files. Replace these console.error calls by either removing
them entirely or handling errors in a way that aligns with the guidelines, such
as silent failure or alternative logging mechanisms if specified.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
apps/desktop/src/components/welcome-modal/index.tsx (1)

179-180: Remove error handling to comply with coding guidelines.

The coding guidelines specify "No error handling" for .js/.ts/.tsx/.rs files. This console.error statement should be removed, even though it appears this was supposedly addressed in a previous commit.

-    } catch (error) {
-      console.error("Failed to send survey data:", error);
-    }
+    } catch (error) {
+      // Error silently ignored per coding guidelines
+    }
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7c55d78 and 9e158d5.

📒 Files selected for processing (10)
  • apps/desktop/src-tauri/src/commands.rs (1 hunks)
  • apps/desktop/src-tauri/src/lib.rs (1 hunks)
  • apps/desktop/src-tauri/src/store.rs (1 hunks)
  • apps/desktop/src/components/settings/views/lab.tsx (2 hunks)
  • apps/desktop/src/components/welcome-modal/index.tsx (2 hunks)
  • apps/desktop/src/locales/en/messages.po (35 hunks)
  • apps/desktop/src/locales/ko/messages.po (35 hunks)
  • apps/desktop/src/routes/app.tsx (3 hunks)
  • apps/desktop/src/types/tauri.gen.ts (1 hunks)
  • apps/docs/data/i18n.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (5)
  • apps/docs/data/i18n.json
  • apps/desktop/src/routes/app.tsx
  • apps/desktop/src/components/settings/views/lab.tsx
  • apps/desktop/src/locales/en/messages.po
  • apps/desktop/src/locales/ko/messages.po
🧰 Additional context used
📓 Path-based instructions (1)
`**/*.{js,ts,tsx,rs}`: 1. No error handling. 2. No unused imports, variables, or functions. 3. For comments, keep it minimal. It should be about "Why", not "What".

**/*.{js,ts,tsx,rs}: 1. No error handling.
2. No unused imports, variables, or functions.
3. For comments, keep it minimal. It should be about "Why", not "What".

⚙️ Source: CodeRabbit Configuration File

List of files the instruction was applied to:

  • apps/desktop/src-tauri/src/store.rs
  • apps/desktop/src-tauri/src/lib.rs
  • apps/desktop/src/types/tauri.gen.ts
  • apps/desktop/src-tauri/src/commands.rs
  • apps/desktop/src/components/welcome-modal/index.tsx
🔇 Additional comments (10)
apps/desktop/src-tauri/src/store.rs (1)

7-7: LGTM! Clean addition to the store key enum.

The new AppOpenCount variant follows the existing pattern and integrates well with the other store keys.

apps/desktop/src-tauri/src/lib.rs (1)

237-238: LGTM! Commands properly registered.

The new commands follow the same registration pattern as existing commands and are correctly integrated into the specta builder.

apps/desktop/src/types/tauri.gen.ts (1)

31-35: LGTM! Generated bindings are consistent with backend.

The TypeScript bindings correctly map the Rust u32 return type to number and follow the established pattern for command bindings.

apps/desktop/src-tauri/src/commands.rs (2)

83-91: LGTM! Clean implementation following existing patterns.

The get_app_open_count command correctly retrieves the count from store with appropriate default value and error handling.


93-110: LGTM! Increment operation is well-implemented.

The increment_app_open_count command properly handles the read-modify-write operation. While not atomic, this is acceptable for app open count tracking where concurrent access is unlikely.

apps/desktop/src/components/welcome-modal/index.tsx (5)

36-54: Well-structured type definitions for the onboarding flow.

The OnboardingStep union type and UserProfile interface provide clear type safety for the multi-step onboarding process.


56-61: Good state management setup for the refactored component.

The new props and state variables properly support the enhanced onboarding flow with survey functionality.


114-203: Comprehensive handler functions for onboarding flow.

The step transition handlers are well-organized and maintain proper state updates throughout the multi-step process. The survey data collection and analytics integration looks solid.


224-275: Robust navigation logic for the onboarding wizard.

The back button and close button handlers properly manage the complex state transitions between different onboarding steps and survey modes.


314-383: Clean conditional rendering for multi-step flow.

The step-based rendering logic clearly separates concerns and maintains good readability despite the complexity of the onboarding flow.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
apps/desktop/src/components/welcome-modal/index.tsx (1)

180-180: Remove console.error to comply with coding guidelines.

The coding guidelines specify "No error handling" for .js/.ts/.tsx/.rs files. Remove the console.error statement.

-      console.error("Failed to send survey data:", error);
🧹 Nitpick comments (1)
apps/desktop/src/components/welcome-modal/index.tsx (1)

124-124: Improve comment to explain "Why" not "What".

The comment explains what the code does rather than why it's structured this way. Consider explaining the reason for this design choice.

-    // Don't change step immediately - let ModelSelectionView complete first
+    // Step transition handled by ModelSelectionView to ensure download completion
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9e158d5 and 432112b.

📒 Files selected for processing (1)
  • apps/desktop/src/components/welcome-modal/index.tsx (2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
`**/*.{js,ts,tsx,rs}`: 1. No error handling. 2. No unused imports, variables, or functions. 3. For comments, keep it minimal. It should be about "Why", not "What".

**/*.{js,ts,tsx,rs}: 1. No error handling.
2. No unused imports, variables, or functions.
3. For comments, keep it minimal. It should be about "Why", not "What".

⚙️ Source: CodeRabbit Configuration File

List of files the instruction was applied to:

  • apps/desktop/src/components/welcome-modal/index.tsx
🧠 Learnings (1)
apps/desktop/src/components/welcome-modal/index.tsx (1)
Learnt from: plyght
PR: fastrepl/hyprnote#921
File: plugins/location-connectivity/src/error.rs:1-41
Timestamp: 2025-06-06T16:31:46.457Z
Learning: In the location-connectivity plugin (plugins/location-connectivity/), comprehensive error handling via LocationConnectivityError is necessary despite the "no error handling" guideline, as the plugin performs system-level operations (WiFi detection, persistent storage) that require proper error propagation to the frontend.
🔇 Additional comments (4)
apps/desktop/src/components/welcome-modal/index.tsx (4)

166-184: LGTM - Well-structured survey completion handler.

The survey completion logic correctly aggregates the user profile data and sends analytics events. The async/await pattern is appropriate for this use case.


205-221: LGTM - Properly structured mutation for survey skip.

The mutation correctly handles the survey skip analytics and navigation logic. The parameterized approach prevents stale closure issues.


223-265: LGTM - Comprehensive back navigation handler.

The switch statement effectively handles all possible back navigation scenarios across the multi-step flow. The conditional logic for different modes (survey-only vs full onboarding) is well-implemented.


314-381: LGTM - Clean conditional rendering pattern.

The step-based conditional rendering is clear and maintainable. Each step component receives appropriate props and handlers for the onboarding flow.

howDidYouHear?: string;
};

export function WelcomeModal({ isOpen, onClose, shouldShowSurvey = true, surveyOnly = false }: WelcomeModalProps) {
const navigate = useNavigate();
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Remove unused variable.

The navigate variable is declared but never used in the component. It only appears in the useEffect dependency array but is never called.

-  const navigate = useNavigate();

Also remove it from the useEffect dependency array:

-  }, [isOpen, onClose, navigate]);
+  }, [isOpen, onClose]);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const navigate = useNavigate();
- const navigate = useNavigate();
useEffect(() => {
// ... existing effect logic
- }, [isOpen, onClose, navigate]);
+ }, [isOpen, onClose]);
🤖 Prompt for AI Agents
In apps/desktop/src/components/welcome-modal/index.tsx at line 57, the variable
`navigate` is declared using useNavigate but is never used in the component.
Remove the declaration of `navigate` entirely and also remove it from the
dependency array of the useEffect hook where it currently appears. This will
clean up unused code and avoid unnecessary dependencies in the effect.

plyght and others added 2 commits July 9, 2025 19:42
Resolved merge conflicts in:
- apps/desktop/src/locales/en/messages.po: Combined onboarding UI strings with upstream changes
- apps/desktop/src/locales/ko/messages.po: Combined onboarding UI strings with upstream changes
- apps/docs/data/i18n.json: Updated translation counts to match upstream

🤖 Generated with [opencode](https://opencode.ai)

Co-Authored-By: opencode <noreply@opencode.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant