Contractor flow for managing portfolio projects, certifications, service areas, and public profile sharing
PortfolioGridScreen — KPI strip + category carousel above masonry grid. usePortfolio(contractorId) fetches all projects.
Complete gut renovation of a 1960s galley kitchen into a modern open-concept space. Custom shaker cabinets, quartz countertops, and a tile backsplash.
They transformed our outdated kitchen into something we see in magazines. Professional, on time, and the quality is outstanding.
ProjectDetailScreen — hero image, B/A carousel with toggle modes, detail-stats for cost/duration. useQuery(api.portfolio.getProject, { projectId })
Tell homeowners about this project. Include key details that showcase your work.
AddProjectScreen — multi-step wizard (3 steps). Category chips use flexWrap. useMutation(api.portfolio.createProject)
Upload before and after photos to showcase your transformation.
Select which after photo appears as the project thumbnail.
AddProjectPhotosStep — before/after upload grids with removable thumbnails. Cover photo selector.
Add materials used and project cost range to help homeowners understand your work.
AddProjectDetailsStep — materials tag input, cost range dual fields, duration chips. useMutation(api.portfolio.createProject)
BeforeAfterEditor — side-by-side/slider toggle, crop & adjust tools, caption inputs, drag-to-reorder pairs. onSave callback to parent wizard
$18K–$25K
$8K–$12K
$10K–$15K
Get a free estimate from JR Construction.
PublicProfileScreen — hero-stats trio, trust bar with response time, top 3 portfolio, CTA. useQuery(api.portfolio.getPublicProfile, { contractorId })
OH-GC-2024-88412 • Exp: Dec 2026
Policy #INS-334821 • Exp: Mar 2026
Uploaded Jan 15, 2026
Expired Nov 2025
CertificationsScreen — badge-grid tiles, cert rows with status, warning tipcard for expired. useQuery(api.portfolio.getCertifications) + useMutation(api.portfolio.uploadCert)
ServiceAreaScreen — map with radius overlay, zip code manager, stat-row area stats, info tipcard. useMutation(api.portfolio.updateServiceArea)
SharePromoteScreen — shareable link, QR code, social buttons, embed code, biz card mockup, conversion tipcard. useQuery(api.portfolio.getShareableProfile)
contractorProfile — business name, avatar, bio, service areaportfolioProjects — title, category, description, photos, materials, cost range, duration, testimonial, coverPhotoId, statusportfolioPhotos — projectId, storageId, type (before/after/cover), caption, ordercertifications — contractorId, type, licenseNumber, expirationDate, documentStorageId, verificationStatus (verified/pending/expired)serviceAreas — contractorId, zipCodes[], maxTravelDistance, radiusCenter (lat/lng)contractorBadges — contractorId, badgeType (verified/insured/topRated/fastResponse), earnedAt, activeapi.portfolio.listProjects — query by contractorId, optional category filterapi.portfolio.getProject — single project with photos & testimonialapi.portfolio.createProject — mutation, multi-step (info → photos → details)api.portfolio.updateProject — mutation, partial updateapi.portfolio.deleteProject — soft delete with archivalapi.portfolio.getCertifications — query all certs for contractorapi.portfolio.uploadCert — mutation, file upload + verification triggerapi.portfolio.updateServiceArea — mutation, zip codes + travel distanceapi.portfolio.getPublicProfile — public query for homeowner-facing viewapi.portfolio.getShareableProfile — generates share link & QR payloadusePortfolio(contractorId) — portfolio grid data + filter stateuseProjectDetail(projectId) — single project with B/A photo pairsusePhotoUpload() — handles image picker, compression, Convex storageuseBeforeAfterEditor() — crop, rotate, caption state managementusePublicProfile(contractorId) — public-facing aggregated profileuseCertifications() — cert list + upload + verification pollinguseServiceArea() — zip codes, radius, map region stateuseShareProfile() — share link generation, QR code, social intentsPortfolioGrid — masonry layout with KPI strip + category carouselProjectCard — cover photo, title, category badge, B/A indicatorBeforeAfterViewer — side-by-side + slider modes with captionsPhotoUploadGrid — grid with add/remove, max count limitMaterialTag — tag input with auto-complete suggestionsCertificationCard — cert row with status badge (verified/pending/expired)BadgeGrid — 2x2 badge tiles with earned/progress statesTrustBar — aggregated trust metrics (rating, jobs, response)KPIStrip — horizontal stat row (projects, B/A pairs, reviews, rating)ServiceAreaMap — Leaflet map with radius overlay (SSR-safe lazy load)ShareLinkBox — copy-to-clipboard link displayQRCodeDisplay — generated QR with download optionSocialShareGrid — platform-specific share intentsBusinessCardPreview — mockup with QR + branding