From 360f9fdcee3a637e730ef82a6ac82f3f2476d6b4 Mon Sep 17 00:00:00 2001 From: Binu Baiju Date: Sun, 31 Aug 2025 11:42:47 +0530 Subject: [PATCH] fix: resolve GitHub profile pictures and recent projects refresh issues - Fix GitHub profile picture display by using correct avatar_url property - Add trackAccess mutation with proper authorization checks - Integrate project access tracking to refresh recent projects list Closes #2760 --- .../project/[id]/_hooks/use-start-project.tsx | 10 ++++++- .../src/server/api/routers/project/project.ts | 26 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/apps/web/client/src/app/project/[id]/_hooks/use-start-project.tsx b/apps/web/client/src/app/project/[id]/_hooks/use-start-project.tsx index 21f8d20270..49de34db24 100644 --- a/apps/web/client/src/app/project/[id]/_hooks/use-start-project.tsx +++ b/apps/web/client/src/app/project/[id]/_hooks/use-start-project.tsx @@ -36,13 +36,21 @@ export const useStartProject = () => { await apiUtils.project.createRequest.getPendingRequest.invalidate({ projectId: editorEngine.projectId }); }, }); + const { mutateAsync: trackProjectAccess } = api.project.trackAccess.useMutation({ + onSuccess: () => { + // Invalidate project list to refresh recent projects + apiUtils.project.list.invalidate(); + }, + }); useEffect(() => { if (project) { startSandbox(project); editorEngine.screenshot.lastScreenshotAt = project.metadata.updatedPreviewImgAt; + // Track project access to update "recent projects" list + trackProjectAccess({ projectId: project.id }).catch(console.error); } - }, [project]); + }, [project, trackProjectAccess]); const startSandbox = async (project: Project) => { try { diff --git a/apps/web/client/src/server/api/routers/project/project.ts b/apps/web/client/src/server/api/routers/project/project.ts index 37fdba0fca..7464917f39 100644 --- a/apps/web/client/src/server/api/routers/project/project.ts +++ b/apps/web/client/src/server/api/routers/project/project.ts @@ -1,5 +1,6 @@ import { env } from '@/env'; import { createTRPCRouter, protectedProcedure } from '@/server/api/trpc'; +import { TRPCError } from '@trpc/server'; import { trackEvent } from '@/utils/analytics/server'; import FirecrawlApp from '@mendable/firecrawl-js'; import { initModel } from '@onlook/ai'; @@ -403,4 +404,29 @@ export const projectRouter = createTRPCRouter({ return { success: true, tags: newTags }; }), + + trackAccess: protectedProcedure + .input(z.object({ projectId: z.string().uuid() })) + .mutation(async ({ ctx, input }) => { + // Check if user has access to this project + const membership = await ctx.db.query.userProjects.findFirst({ + where: and( + eq(userProjects.userId, ctx.user.id), + eq(userProjects.projectId, input.projectId), + ), + }); + + if (!membership) { + throw new TRPCError({ + code: 'FORBIDDEN', + message: 'You do not have access to this project' + }); + } + + await ctx.db.update(projects).set({ + updatedAt: new Date(), + }).where(eq(projects.id, input.projectId)); + + return { success: true }; + }), });