Home renovation visualization powered by Gemini 3 Pro Image. Upload a room photo, describe your dream renovation, and get AI-generated before/after visualizations.
DayDreamFeedScreen — Empty state
useQuery(api.poster.designs.getFeed) returns empty array. Router push to design-studio on CTA press.
DayDreamFeedScreen — Populated masonry grid
useQuery(api.poster.designs.getFeed) with filter/sort state. useMutation(api.poster.designs.saveToCollection) for heart toggle.
PhotoUploadScreen
expo-image-picker for camera/gallery. Room type auto-detected via Gemini Flash. Crop via expo-image-manipulator.
DesignPromptScreen
STYLE_OPTIONS and ROOM_TYPES from designStudioService. useMutation(api.poster.designs.create) on generate.
GeneratingScreen
useQuery(api.poster.designs.getDesign) polls generation status. Gemini 3 Pro Image (Nano Banana Pro) model processes the request.
DesignResultScreen — Before/After slider
useQuery(api.poster.designs.getDesign) returns imageUrl + beforeImageUrl. Interactive slider via PanResponder.
DesignDetailScreen — Saved daydream viewer
useQuery(api.poster.designs.getDesign, { designId }). handleCreateJob() pushes to /(poster)/jobs/create with pre-filled params.
ShareQuoteScreen
Share.share() for native sharing. handleCreateJob() routes to /(poster)/jobs/create with designImageUrl, beforeImageUrl, roomType, description, jobTypeId params.
// designs table designs { _id: Id<"designs"> userId: Id<"posterUsers"> imageUrl: string beforeImageUrl: string? thumbnailUrl: string? description: string style: string? roomType: string? tags: string[] colorPalette: string[] analysis: string? suggestions: string[] estimatedCostRange: string? saveCount: number status: "generating" | "complete" | "failed" jobTypeId: string? jobTypeName: string? } // designSaves join table designSaves { designId: Id<"designs"> userId: Id<"posterUsers"> }
// Queries api.poster.designs.getFeed args: { limit, style?, roomType?, sort } returns: { designs[], hasMore } api.poster.designs.getDesign args: { designId } returns: Design + isSavedByMe + isOwnDesign // Mutations api.poster.designs.create args: { imageUrl, roomType, style, prompt } triggers: Gemini 3 Pro Image generation api.poster.designs.saveToCollection args: { designId } api.poster.designs.unsaveFromCollection args: { designId }
// React Hooks useDesignFeed(filters) wraps getFeed query + filter state useDesignGeneration() manages upload → prompt → generate flow polls design status until complete // Service designStudioService.ts STYLE_OPTIONS: string[] ROOM_TYPES: string[] getMasonryItemHeight() getMasonryGridConfig() formatRelativeTime() // AI Model Gemini 3 Pro Image model: gemini-3-pro-image-preview (Nano Banana Pro) Used for room visualization generation