import { createFileRoute } from '@tanstack/solid-router'
// **** Components ****
import { PageHeader } from '@/components/layout/page-header'
import { PageContainer } from '@/components/layout/page-container'
import {
IconCircleDashedPlus,
IconEye
} from '@tabler/icons-solidjs'
import { Button } from '@/components/ui/button'
import { Link } from '@tanstack/solid-router'
import {
Avatar,
AvatarFallback,
AvatarImage
} from '@/components/ui/avatar'
import {
AppCard,
AppCardContainer,
AppCardHeader,
CardContent
} from '@/components/ui/app-card'
import { Switch, Match, For, Show, Suspense } from 'solid-js'
// **** Utils ****
import { userRequiredGuard } from '@/lib/auth.guard'
import { Query } from '@tanstack/solid-db'
import { teamCollection } from '@/domain/team/team.collection'
import { teamMemberCollection } from '@/domain/team/team.collection'
import { userCollection } from '@/domain/user/user.collection'
import { eq } from '@tanstack/solid-db'
import { createSignal, createEffect, onCleanup } from 'solid-js'
import { buttonVariants } from '@/components/ui/button'
import { cn } from '@/lib/utils'
import { getInitials } from '@/lib/utils'
// **** Hooks ****
import { useLiveQuery } from '@tanstack/solid-db'
// **** Types ****
export const Route = createFileRoute('/_app/$slug/(shared)/workspaces/')({
remountDeps: (ctx) => [ctx.loaderDeps],
component: RouteComponent,
beforeLoad: async () => {
return await userRequiredGuard()
},
loader: async ({ context }) => {
const { session } = context
// await teamCollection.preload()
// await userCollection.preload()
// await teamMemberCollection.preload()
return {
orgId: session.activeOrganizationId
}
}
})
function RouteComponent() {
const rData = Route.useLoaderData()
const params = Route.useParams()
const [
createTeamDialogOpen,
setCreateTeamDialogOpen
] = createSignal(false)
const teamQb = new Query()
.from({ team: teamCollection })
.select(({ team }) => ({
id: team.id,
name: team.name
}))
const {
data: teams,
isReady: isTeamsReady,
} = useLiveQuery(() => ({
query: teamQb
}))
const teamMemberQb = new Query()
.from({ teamMember: teamMemberCollection })
.innerJoin({ team: teamCollection }, ({ teamMember, team }) =>
eq(teamMember.team_id, team.id)
)
.innerJoin({ user: userCollection }, ({ teamMember, user }) =>
eq(teamMember.user_id, user.id)
)
.where(({ team }) => eq(team.organization_id, rData().orgId))
.select(({ teamMember, user, team }) => ({
id: user.id,
name: user.name,
teamId: teamMember.team_id,
image: user.image,
teamName: team.name,
}))
const {
data: teamMembers,
isReady: isTeamMembersReady
} = useLiveQuery(() => ({
query: teamMemberQb
}))
createEffect(() => {
onCleanup(() => teamCollection.cleanup())
onCleanup(() => teamMemberCollection.cleanup())
onCleanup(() => userCollection.cleanup())
})
return (
Loading
}
>
setCreateTeamDialogOpen(true)}
>
Create new workspace
}
/>
)
}
type QueryTeamMember = {
id: string
name: string
image: string | undefined
teamId: string
teamName: string
}
function getTeamMembers(teamId: string, members: Array) {
return members.filter(m => m.teamId === teamId)
}
type TeamCardProps = {
team: {
id: string
name: string
},
slug: string,
members: Array
}
function TeamCard(props: TeamCardProps) {
return (
{props.team.name.charAt(0)}
{props.team.name}
No members in this workspace
}>
0
}
>
tm.teamId === props.team.id)
.slice(0, 3)
}
>
{m => (
{getInitials(m.name)}
)}
= 3
}>
{`+${getTeamMembers(props.team.id, props.members).length - 3}`}
View
)
}