Fix/multiple company (#203)

* Refactor onboarding and dashboard logic; add silent team creation for users

- Removed unnecessary useCompany context in DashboardContent and SettingsSidebar components.
- Simplified onboarding setup logic to allow direct access to the dashboard for users without companies.
- Introduced WelcomeOnboarding component to handle user onboarding steps.
- Added migration to create silent teams for all users at signup, backfilling existing users without teams, and cleaning up incomplete companies.

* fix: update greeting logic and improve email handling in TIC extension

* Redirect to onboarding for users without companies and update onboarding flow

* Build issue fix

* Enhance onboarding experience by adding existing companies check
This commit is contained in:
Mattsson
2026-04-09 11:54:12 +02:00
committed by GitHub
parent dec9a37d2d
commit bf5a8d9195
24 changed files with 1101 additions and 1173 deletions
+26 -16
View File
@@ -136,27 +136,37 @@ export async function GET(request: NextRequest) {
}
}
// Check if user has completed onboarding (for any company they belong to)
const { data: membership } = await supabase
.from('company_members')
.select('company_id')
// Ensure user has a silent team (for new signups and existing users without one)
const { data: teamMembership } = await supabase
.from('team_members')
.select('team_id')
.eq('user_id', user.id)
.limit(1)
.single()
.maybeSingle()
if (membership?.company_id) {
const { data: settings } = await supabase
.from('company_settings')
.select('onboarding_complete')
.eq('company_id', membership.company_id)
.single()
if (!teamMembership) {
// Create team via service client (RPC requires auth.uid() which isn't available here)
const serviceClient = createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.SUPABASE_SERVICE_ROLE_KEY!,
{ cookies: { getAll: () => [], setAll: () => {} } }
)
if (!settings?.onboarding_complete) {
redirectPath = '/onboarding'
}
} else {
redirectPath = '/onboarding'
const teamId = crypto.randomUUID()
await serviceClient.from('teams').insert({
id: teamId,
name: 'Personal',
created_by: user.id,
})
await serviceClient.from('team_members').insert({
team_id: teamId,
user_id: user.id,
role: 'owner',
})
}
// Always redirect to dashboard — it handles zero-company and incomplete states
redirectPath = '/'
}
// Create redirect and explicitly set auth cookies on the response