diff --git a/apps/web/app/jobs/page.tsx b/apps/web/app/jobs/page.tsx index e1a4546d..17aecf17 100644 --- a/apps/web/app/jobs/page.tsx +++ b/apps/web/app/jobs/page.tsx @@ -1,17 +1,7 @@ "use client"; import Link from "next/link"; -import { - ArrowUpRight, - Briefcase, - Clock3, - DollarSign, - Layers, - Plus, - Sparkles, - Users, - Zap, -} from "lucide-react"; +import { ArrowUpRight, Bookmark, Clock3, Search, SlidersHorizontal } from "lucide-react"; import { ShareJobButton } from "@/components/jobs/share-job-button"; import { JobFilters } from "@/components/jobs/job-filters"; import { Stars } from "@/components/stars"; @@ -19,8 +9,7 @@ import { EmptyState } from "@/components/ui/empty-state"; import { JobCardSkeleton } from "@/components/ui/skeleton"; import { useJobBoard } from "@/hooks/use-job-board"; import { formatDate, formatUsdc, shortenAddress } from "@/lib/format"; -import { cn } from "@/lib/utils"; -import type { BoardJob } from "@/hooks/use-job-board"; +import { useSavedJobsStore } from "@/lib/store/use-saved-jobs-store"; // ─── Status config ─────────────────────────────────────────────────────────── @@ -231,21 +220,9 @@ function JobCard({ job }: { job: BoardJob }) { // ─── Page ──────────────────────────────────────────────────────────────────── export default function JobsPage() { - const { - paginatedJobs, - loading, - error, - query, - activeTag, - sortBy, - availableTags, - minBudget, - maxBudget, - filterStatus, - actions, - } = useJobBoard(); - - const totalOpen = paginatedJobs.length; + const { jobs, loading, error, query, activeTag, sortBy, availableTags, actions } = + useJobBoard(); + const { toggleSaveJob, isSaved } = useSavedJobsStore(); function resetFilters() { actions.setQuery(""); @@ -349,6 +326,123 @@ export default function JobsPage() { ))} ) : ( +
+ {jobs.map((job) => ( +
+ +
+
+

+ {job.status} +

+

+ {job.title} +

+
+
+ + +
+
+ +

+ {job.description} +

+ +
+ {job.tags.map((tag) => ( + + {tag} + + ))} +
+ +
+
+

+ Budget +

+

+ {formatUsdc(job.budget_usdc)} +

+
+
+

+ Deadline +

+

+ + {formatDate(job.deadlineAt)} +

+
+
+

+ Milestones +

+

+ {job.milestones} tracked approvals +

+
+
+ +
+
+

+ Client +

+

+ {shortenAddress(job.client_address)} +

+
+
+
+ + {job.clientReputation.averageStars.toFixed(1)} +
+

+ {job.clientReputation.totalJobs} completed jobs on-chain +

+
+
+ + + +
+ ))} +
+ )} + + {!loading && jobs.length === 0 ? (