diff --git a/apps/web/src/providers/workspace.tsx b/apps/web/src/providers/workspace.tsx index 87fdd24b..2791e8fb 100644 --- a/apps/web/src/providers/workspace.tsx +++ b/apps/web/src/providers/workspace.tsx @@ -7,6 +7,7 @@ import { api } from "~/utils/api"; interface WorkspaceContextProps { workspace: Workspace; isLoading: boolean; + hasLoaded: boolean; switchWorkspace: (_workspace: Workspace) => void; availableWorkspaces: Workspace[]; } @@ -43,6 +44,7 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({ const [availableWorkspaces, setAvailableWorkspaces] = useState( initialAvailableWorkspaces, ); + const [hasLoaded, setHasLoaded] = useState(false); const { data, isLoading } = api.workspace.all.useQuery(); @@ -55,7 +57,10 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({ }; useEffect(() => { - if (!data) return; + if (!data?.length) { + if (!isLoading) setHasLoaded(true); + return; + } const storedWorkspaceId: string | null = localStorage.getItem("workspacePublicId"); @@ -72,6 +77,7 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({ slug: workspace.slug, description: workspace.description, plan: workspace.plan, + hasLoaded: true, }; }) .filter((workspace) => workspace !== null) as Workspace[]; @@ -82,7 +88,7 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({ if (storedWorkspaceId !== null) { const newData = data; const selectedWorkspace = newData.find( - ({ workspace }) => workspace?.publicId === storedWorkspaceId, + ({ workspace }) => workspace.publicId === storedWorkspaceId, ); if (!selectedWorkspace?.workspace) return; @@ -114,7 +120,13 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({ return ( {children} diff --git a/apps/web/src/views/boards/index.tsx b/apps/web/src/views/boards/index.tsx index b8ca61fa..ed7b207a 100644 --- a/apps/web/src/views/boards/index.tsx +++ b/apps/web/src/views/boards/index.tsx @@ -11,7 +11,9 @@ import { NewBoardForm } from "./components/NewBoardForm"; export default function BoardsPage() { const { openModal, modalContentType } = useModal(); - const { workspace } = useWorkspace(); + const { workspace, hasLoaded } = useWorkspace(); + + if (hasLoaded && !workspace.publicId) openModal("NEW_WORKSPACE"); return ( <> diff --git a/packages/db/src/repository/workspace.repo.ts b/packages/db/src/repository/workspace.repo.ts index 6c3e66b7..a0f2483f 100644 --- a/packages/db/src/repository/workspace.repo.ts +++ b/packages/db/src/repository/workspace.repo.ts @@ -155,8 +155,8 @@ export const getBySlugWithBoards = (db: dbClient, workspaceSlug: string) => { }); }; -export const getAllByUserId = (db: dbClient, userId: string) => { - return db.query.workspaceMembers.findMany({ +export const getAllByUserId = async (db: dbClient, userId: string) => { + const result = await db.query.workspaceMembers.findMany({ columns: { role: true, }, @@ -168,6 +168,7 @@ export const getAllByUserId = (db: dbClient, userId: string) => { description: true, slug: true, plan: true, + deletedAt: true, }, // https://github.com/drizzle-team/drizzle-orm/issues/2903 // where: isNull(workspaces.deletedAt), @@ -179,6 +180,8 @@ export const getAllByUserId = (db: dbClient, userId: string) => { isNull(workspaceMembers.deletedAt), ), }); + + return result.filter((member) => !member.workspace.deletedAt); }; export const getMemberByPublicId = (db: dbClient, memberPublicId: string) => { @@ -216,7 +219,10 @@ export const isWorkspaceSlugAvailable = async ( columns: { id: true, }, - where: eq(workspaces.slug, workspaceSlug), + where: and( + eq(workspaces.slug, workspaceSlug), + isNull(workspaces.deletedAt), + ), }); return result === undefined;