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 } />
{t => ( )}
) } 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
) }