From e5d23f3bef303038a901a1e2435fcd4da8e60990 Mon Sep 17 00:00:00 2001 From: vedhavk Date: Wed, 22 Jul 2026 22:36:24 +0530 Subject: [PATCH 1/3] fix: Active Job Listings on Dashboard Home displaying a default count of 0 --- src/features/company-jobs/schemas/jobs.schema.ts | 5 +++++ src/features/company-jobs/types/jobs.types.ts | 5 +++++ .../company/active-job-listings-card.tsx | 14 +++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/features/company-jobs/schemas/jobs.schema.ts b/src/features/company-jobs/schemas/jobs.schema.ts index 11d2d3e7..b2c297a0 100644 --- a/src/features/company-jobs/schemas/jobs.schema.ts +++ b/src/features/company-jobs/schemas/jobs.schema.ts @@ -95,6 +95,11 @@ export const JobSchema = z.object({ if (typeof v === "boolean") return v; return null; }), + applicant_count: z.number().optional().nullable(), + applications_count: z.number().optional().nullable(), + total_applicants: z.number().optional().nullable(), + applicantCount: z.number().optional().nullable(), + applicationsCount: z.number().optional().nullable(), }); export const PaginationSchema = z diff --git a/src/features/company-jobs/types/jobs.types.ts b/src/features/company-jobs/types/jobs.types.ts index 92d56e37..8fffe0a8 100644 --- a/src/features/company-jobs/types/jobs.types.ts +++ b/src/features/company-jobs/types/jobs.types.ts @@ -52,6 +52,11 @@ export interface Job { deliverables?: string[] | string | null; stipend?: string | null; certificate_provided?: boolean | null; + applicant_count?: number | null; + applications_count?: number | null; + total_applicants?: number | null; + applicantCount?: number | null; + applicationsCount?: number | null; } export interface Pagination { diff --git a/src/features/home/components/company/active-job-listings-card.tsx b/src/features/home/components/company/active-job-listings-card.tsx index c9be89c7..658c73f7 100644 --- a/src/features/home/components/company/active-job-listings-card.tsx +++ b/src/features/home/components/company/active-job-listings-card.tsx @@ -12,6 +12,7 @@ import Link from "next/link"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; +import { useJobApplicants } from "@/features/company-jobs/hooks/use-job-applicants"; import { useJobs } from "@/features/company-jobs/hooks/use-jobs"; import type { Job } from "@/features/company-jobs/types"; import { cn } from "@/lib/utils"; @@ -24,6 +25,17 @@ const STATUS_STYLES: Record = { function JobRow({ job }: { job: Job }) { const statusStyle = STATUS_STYLES[job.status] ?? STATUS_STYLES.Draft; + const { data: applicantData } = useJobApplicants(job.id, { perPage: 1 }); + + const applicantCount = + job.applicant_count ?? + job.applications_count ?? + job.total_applicants ?? + job.applicantCount ?? + job.applicationsCount ?? + applicantData?.pagination.count ?? + 0; + return (
-

0

+

{applicantCount}

applicants

From 9755f67938713a2e60d64eaa9544753b9ee56f8c Mon Sep 17 00:00:00 2001 From: vedhavk Date: Thu, 23 Jul 2026 11:28:26 +0530 Subject: [PATCH 2/3] fix: use pageIndex for company jobs pagination --- src/features/company-jobs/api/jobs.api.ts | 12 +++-- .../company-jobs/schemas/jobs.schema.ts | 48 +++++-------------- 2 files changed, 19 insertions(+), 41 deletions(-) diff --git a/src/features/company-jobs/api/jobs.api.ts b/src/features/company-jobs/api/jobs.api.ts index 9c942fd3..747e2519 100644 --- a/src/features/company-jobs/api/jobs.api.ts +++ b/src/features/company-jobs/api/jobs.api.ts @@ -102,10 +102,14 @@ export async function fetchJobs( ): Promise { const query = new URLSearchParams(); - if (params?.pageIndex || params?.page) - query.set("page", String(params.page ?? params.pageIndex)); - if (params?.perPage || params?.per_page) - query.set("per_page", String(params.per_page ?? params.perPage)); + const page = params?.pageIndex ?? params?.page; + if (page !== undefined) query.set("pageIndex", String(page)); + + const perPage = params?.perPage ?? params?.per_page; + if (perPage !== undefined) { + query.set("perPage", String(perPage)); + query.set("per_page", String(perPage)); + } if (params?.search?.trim()) query.set("search", params.search.trim()); if (params?.sortBy || params?.sort_by) query.set("sort_by", (params.sort_by ?? params.sortBy) as string); diff --git a/src/features/company-jobs/schemas/jobs.schema.ts b/src/features/company-jobs/schemas/jobs.schema.ts index b2c297a0..0e7fc8df 100644 --- a/src/features/company-jobs/schemas/jobs.schema.ts +++ b/src/features/company-jobs/schemas/jobs.schema.ts @@ -159,48 +159,22 @@ export const JobsListDataSchema = z .transform((v) => v ?? ""), data: z.array(JobSchema).nullish(), jobs: z.array(JobSchema).nullish(), - pagination: z - .object({ - count: z - .number() - .nullish() - .transform((v) => v ?? 0), - total_pages: z - .number() - .nullish() - .transform((v) => v ?? 1), - current_page: z - .number() - .nullish() - .transform((v) => v ?? 1), - per_page: z - .number() - .nullish() - .transform((v) => v ?? 10), - next: z.string().nullable().optional(), - previous: z.string().nullable().optional(), - }) - .passthrough() - .optional() - .transform((v) => ({ - count: v?.count ?? 0, - totalPages: v?.total_pages ?? 1, - isNext: !!v?.next, - isPrev: !!v?.previous, - nextPage: v?.next ? (v.current_page ?? 1) + 1 : null, - })), + pagination: PaginationSchema.nullish().transform( + (v) => + v ?? { + count: 0, + totalPages: 1, + isNext: false, + isPrev: false, + nextPage: null, + }, + ), }) .transform((val) => ({ company_id: val.company_id, company_name: val.company_name, jobs: val.jobs ?? val.data ?? [], - pagination: val.pagination ?? { - count: 0, - totalPages: 1, - isNext: false, - isPrev: false, - nextPage: null, - }, + pagination: val.pagination, })); export const JobsListResponseSchema = DjangoResponse(JobsListDataSchema); From dc837bd2d08b23fdf59999f3e973c5214410ba1d Mon Sep 17 00:00:00 2001 From: vedhavk Date: Thu, 23 Jul 2026 20:50:17 +0530 Subject: [PATCH 3/3] fix: address Greptile review comments --- .../company-jobs/hooks/use-job-applicants.ts | 4 ++++ .../company/active-job-listings-card.tsx | 24 ++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/features/company-jobs/hooks/use-job-applicants.ts b/src/features/company-jobs/hooks/use-job-applicants.ts index 244ce8ae..99fed040 100644 --- a/src/features/company-jobs/hooks/use-job-applicants.ts +++ b/src/features/company-jobs/hooks/use-job-applicants.ts @@ -29,11 +29,15 @@ export function useJobApplicants( pageIndex?: number; perPage?: number; }, + options?: { + enabled?: boolean; + }, ) { return useQuery({ queryKey: JOB_APPLICANTS_KEYS.list(jobId, params), queryFn: () => fetchJobApplicants(jobId, params), refetchOnWindowFocus: false, + enabled: options?.enabled ?? true, }); } diff --git a/src/features/home/components/company/active-job-listings-card.tsx b/src/features/home/components/company/active-job-listings-card.tsx index 658c73f7..f1224224 100644 --- a/src/features/home/components/company/active-job-listings-card.tsx +++ b/src/features/home/components/company/active-job-listings-card.tsx @@ -12,9 +12,7 @@ import Link from "next/link"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; -import { useJobApplicants } from "@/features/company-jobs/hooks/use-job-applicants"; -import { useJobs } from "@/features/company-jobs/hooks/use-jobs"; -import type { Job } from "@/features/company-jobs/types"; +import { type Job, useJobApplicants, useJobs } from "@/features/company-jobs"; import { cn } from "@/lib/utils"; const STATUS_STYLES: Record = { @@ -25,16 +23,26 @@ const STATUS_STYLES: Record = { function JobRow({ job }: { job: Job }) { const statusStyle = STATUS_STYLES[job.status] ?? STATUS_STYLES.Draft; - const { data: applicantData } = useJobApplicants(job.id, { perPage: 1 }); - const applicantCount = + const embeddedCount = job.applicant_count ?? job.applications_count ?? job.total_applicants ?? job.applicantCount ?? - job.applicationsCount ?? - applicantData?.pagination.count ?? - 0; + job.applicationsCount; + + const hasEmbeddedCount = + embeddedCount !== undefined && embeddedCount !== null; + + const { data: applicantData } = useJobApplicants( + job.id, + { perPage: 1 }, + { enabled: !hasEmbeddedCount }, + ); + + const applicantCount = hasEmbeddedCount + ? embeddedCount + : (applicantData?.pagination.count ?? 0); return (