Skip to content

feat: add post-signup survey feature#4186

Open
gax97 wants to merge 1 commit intosuperplanehq:mainfrom
gax97:feat/post-signup-survey
Open

feat: add post-signup survey feature#4186
gax97 wants to merge 1 commit intosuperplanehq:mainfrom
gax97:feat/post-signup-survey

Conversation

@gax97
Copy link
Copy Markdown

@gax97 gax97 commented Apr 16, 2026

What's done

Add post-signup survey functionality including:

  • Database migrations and schema updates for survey responses
  • Backend models and API endpoints for survey data
  • Frontend React component for survey form
  • Authentication and configuration updates
  • Tests for models and components

How it works:

recording_demo.mov

Resolves: #4052

@superplanehq-integration
Copy link
Copy Markdown

👋 Commands for maintainers:

  • /sp start - Start an ephemeral machine (takes ~30s)
  • /sp stop - Stop a running machine (auto-executed on pr close)

Copy link
Copy Markdown
Contributor

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 4 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f484471. Configure here.

className="flex-1 px-4 py-2 text-sm font-medium text-gray-700 rounded-md border border-slate-300 bg-white hover:bg-slate-50 disabled:opacity-60"
>
Skip for now
</LoadingButton>
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.

Skip button missing loading prop

Medium Severity

The Skip LoadingButton passes loadingText="Skipping..." but never sets the loading prop. The Continue button correctly passes loading={loading === "continue"}, but the Skip button omits loading={loading === "skip"}. Because LoadingButton defaults loading to false, the spinner and "Skipping..." text never appear — the button just becomes disabled with the original label when the skip request is in flight.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit f484471. Configure here.

);
};

export default SignupSurvey;
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.

Prefer named exports

Low Severity

export default SignupSurvey adds a new default export for a page component under web_src/src. Named exports improve Vite compile behavior and IDE stability. See web_src/AGENTS.md (TypeScript).

Fix in Cursor Fix in Web

Triggered by project rule: SuperPlane frontend — Bugbot rules

Reviewed by Cursor Bugbot for commit f484471. Configure here.

placeholder="Tell us where"
maxLength={200}
className="mt-2 w-full px-3 py-2 outline-1 outline-slate-300 rounded-md shadow-md focus:outline-gray-800"
/>
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.

Prefer shadcn/ui primitives

Low Severity

A raw <input type="text"> is used for the "Other" source field, but @/components/ui/input provides a shadcn Input component. Use @/components/ui primitives instead of raw HTML when an equivalent exists.

Fix in Cursor Fix in Web

Triggered by project rule: SuperPlane frontend — Bugbot rules

Reviewed by Cursor Bugbot for commit f484471. Configure here.

if *req.SourceChannel == models.SourceChannelOther && nonEmpty(req.SourceOther) {
trimmed := strings.TrimSpace(*req.SourceOther)
if len(trimmed) > useCaseMaxLen {
trimmed = trimmed[:useCaseMaxLen]
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.

Byte-based string truncation corrupts multi-byte UTF-8

Medium Severity

len(trimmed) counts bytes and trimmed[:useCaseMaxLen] slices by bytes, not runes. For multi-byte UTF-8 input (e.g. CJK characters at 3 bytes each), the slice can cut a character in half, producing an invalid UTF-8 string. PostgreSQL in UTF-8 mode rejects invalid sequences, so this causes a 500 error for affected users. The frontend maxLength counts characters, so a user typing 500 CJK characters sends ~1500 bytes, triggering this truncation path.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit f484471. Configure here.

Add comprehensive post-signup survey functionality including:
- Database migrations and schema updates for survey responses
- Backend models and API endpoints for survey data
- Frontend React component for survey form
- Authentication and configuration updates
- Tests for models and components
@gax97 gax97 force-pushed the feat/post-signup-survey branch from f484471 to 2f4e240 Compare April 16, 2026 18:11
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.

Cloud: short survey after signup

1 participant