Two-way review system for posters and contractors. Category ratings, photo evidence, public profiles, response management, and automated review requests.
PosterLeaveReview — 3 category ratings (Communication, Quality, Recommend), overall auto-computed as average
useQuery(api.jobs.jobs.get) • useMutation(api.users.reviews.submitContractorReview)
ContractorLeaveReview — Overall star rating + 3 categories (Communication, Preparation, Payment Timeliness)
useQuery(api.contractor.jobs.getJobDetail) • useMutation(api.users.reviews.submitPosterReview)
AlertDialog — Success confirmation with review preview card and community message
router.replace("/(poster)/jobs/{jobId}") on dismiss
ContractorReviews — Public profile with rating breakdown bars, category averages, filter/sort, review cards with responses
useContractorReviews() • useContractorProfile()
PosterReviews — Poster profile header, tabs for reviews given vs received, contractor info on each card
useQuery(api.users.reviews.getPosterReviews)
ReviewDetail — Full review with photos, category breakdown, contractor response thread, related job link, report action
useQuery(api.users.reviews.getReviewDetail)
ReviewRequestsDashboard — Funnel stats (sent → opened → responded → submitted), auto-request settings, pending/completed requests
useQuery(api.reviews.queries.getContractorRequestStats) • useQuery(api.reviews.queries.listContractorRequests)
RespondToReview — Original review display, response textarea, best practices tips, live public preview
useMutation(api.users.reviews.respondToReview) • 500 char limit
_id — Convex document IDjobId — v.id("jobs")reviewerId — v.id("users")revieweeId — v.id("users")reviewerRole — "poster" | "contractor"rating — Overall rating 1-5 (auto-computed average for poster)categoryRatings — { communication, quality, recommend }text — Written review (max 1000 chars)photos — Array of storage IDsresponse — Contractor response text (max 500 chars)responseAt — Timestamp of responsehelpfulVotes — Count of helpful votesisFeatured — Boolean, contractor can feature_creationTime — Auto timestampgetContractorReviews — Paginated reviews for a contractor profile, with filter/sort/rating paramsgetPosterReviews — Reviews given and received by a postergetReviewDetail — Single review with full data + related jobgetContractorRequestStats — Funnel metrics (sent, opened, responded, submitted)listContractorRequests — Timeline of individual review requests with statussubmitContractorReview — Poster submits review for contractor (3 category ratings + text)submitPosterReview — Contractor submits review for poster (overall rating + text)respondToReview — Contractor responds to a review (500 char limit)requestReview — Manually send review request to a postervoteHelpful — Toggle helpful vote on a reviewtoggleFeatured — Feature/unfeature a review on contractor profilereportReview — Flag a review for admin reviewuseContractorReviews() — Reviews list with filter/sort/pagination stateuseContractorProfile() — Profile data with aggregate ratingsuseReviewRequests() — Contractor review request pipelinePosterLeaveReview — app/(poster)/reviews/create.tsxContractorLeaveReview — app/(contractor)/reviews/create.tsxContractorReviews — app/(contractor)/(tabs)/(home)/reviews/index.tsxReviewRequestsDashboard — app/(contractor)/(tabs)/(home)/reviews/requests.tsx