Files
sim/apps/sim/app/workspace/page.tsx
Waleed 022e84c4b1 feat(creators): added referrers, code redemption, campaign tracking, etc (#3198)
* feat(creators): added referrers, code redemption, campaign tracking, etc

* more

* added zod

* remove default

* remove duplicate index

* update admin routes

* reran migrations

* lint

* move userstats record creation inside tx

* added reason for already attributed case

* cleanup referral attributes
2026-02-12 20:07:40 -08:00

143 lines
4.8 KiB
TypeScript

'use client'
import { useEffect } from 'react'
import { createLogger } from '@sim/logger'
import { useRouter } from 'next/navigation'
import { useSession } from '@/lib/auth/auth-client'
import { useReferralAttribution } from '@/hooks/use-referral-attribution'
const logger = createLogger('WorkspacePage')
export default function WorkspacePage() {
const router = useRouter()
const { data: session, isPending } = useSession()
useReferralAttribution()
useEffect(() => {
const redirectToFirstWorkspace = async () => {
// Wait for session to load
if (isPending) {
return
}
// If user is not authenticated, redirect to login
if (!session?.user) {
logger.info('User not authenticated, redirecting to login')
router.replace('/login')
return
}
try {
// Check if we need to redirect a specific workflow from old URL format
const urlParams = new URLSearchParams(window.location.search)
const redirectWorkflowId = urlParams.get('redirect_workflow')
if (redirectWorkflowId) {
// Try to get the workspace for this workflow
try {
const workflowResponse = await fetch(`/api/workflows/${redirectWorkflowId}`)
if (workflowResponse.ok) {
const workflowData = await workflowResponse.json()
const workspaceId = workflowData.data?.workspaceId
if (workspaceId) {
logger.info(
`Redirecting workflow ${redirectWorkflowId} to workspace ${workspaceId}`
)
router.replace(`/workspace/${workspaceId}/w/${redirectWorkflowId}`)
return
}
}
} catch (error) {
logger.error('Error fetching workflow for redirect:', error)
}
}
// Fetch user's workspaces
const response = await fetch('/api/workspaces')
if (!response.ok) {
throw new Error('Failed to fetch workspaces')
}
const data = await response.json()
const workspaces = data.workspaces || []
if (workspaces.length === 0) {
logger.warn('No workspaces found for user, creating default workspace')
try {
const createResponse = await fetch('/api/workspaces', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ name: 'My Workspace' }),
})
if (createResponse.ok) {
const createData = await createResponse.json()
const newWorkspace = createData.workspace
if (newWorkspace?.id) {
logger.info(`Created default workspace: ${newWorkspace.id}`)
router.replace(`/workspace/${newWorkspace.id}/w`)
return
}
}
logger.error('Failed to create default workspace')
} catch (createError) {
logger.error('Error creating default workspace:', createError)
}
// If we can't create a workspace, redirect to login to reset state
router.replace('/login')
return
}
// Get the first workspace (they should be ordered by most recent)
const firstWorkspace = workspaces[0]
logger.info(`Redirecting to first workspace: ${firstWorkspace.id}`)
// Redirect to the first workspace
router.replace(`/workspace/${firstWorkspace.id}/w`)
} catch (error) {
logger.error('Error fetching workspaces for redirect:', error)
// Don't redirect if there's an error - let the user stay on the page
}
}
// Only run this logic when we're at the root /workspace path
// If we're already in a specific workspace, the children components will handle it
if (typeof window !== 'undefined' && window.location.pathname === '/workspace') {
redirectToFirstWorkspace()
}
}, [session, isPending, router])
// Show loading state while we determine where to redirect
if (isPending) {
return (
<div className='flex h-screen w-full items-center justify-center'>
<div
className='h-[18px] w-[18px] animate-spin rounded-full'
style={{
background:
'conic-gradient(from 0deg, hsl(var(--muted-foreground)) 0deg 120deg, transparent 120deg 180deg, hsl(var(--muted-foreground)) 180deg 300deg, transparent 300deg 360deg)',
mask: 'radial-gradient(farthest-side, transparent calc(100% - 1.5px), black calc(100% - 1.5px))',
WebkitMask:
'radial-gradient(farthest-side, transparent calc(100% - 1.5px), black calc(100% - 1.5px))',
}}
/>
</div>
)
}
// If user is not authenticated, show nothing (redirect will happen)
if (!session?.user) {
return null
}
return null
}