Skip to content

Commit

Permalink
Updated review page (#132)
Browse files Browse the repository at this point in the history
* started ticket

* changed review preview

* renamed cards

* more frontend changes

* changed to role card

* fixed fetching roles

* changed styling

* fixed borders

* added vertical line

* formatting

* fixed linting

* small frontend changes

* formatting

* Update page.tsx

small tailwind thing

---------

Co-authored-by: Alton Banushi <[email protected]>
  • Loading branch information
gpalmer27 and banushi-a authored Feb 17, 2025
1 parent 1d155e4 commit 5a04fbd
Show file tree
Hide file tree
Showing 8 changed files with 412 additions and 304 deletions.
3 changes: 3 additions & 0 deletions apps/web/public/svg/star.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
108 changes: 26 additions & 82 deletions apps/web/src/app/(pages)/(dashboard)/roles/page.tsx
Original file line number Diff line number Diff line change
@@ -1,115 +1,59 @@
"use client";

import { useEffect, useState } from "react";
import { z } from "zod";

import type {
ReviewType,
WorkEnvironmentType,
WorkTermType,
} from "@cooper/db/schema";
import { WorkEnvironment, WorkTerm } from "@cooper/db/schema";
import type { RoleType } from "@cooper/db/schema";
import { cn } from "@cooper/ui";
import { useToast } from "@cooper/ui/hooks/use-toast";

import LoadingResults from "~/app/_components/loading-results";
import NoResults from "~/app/_components/no-results";
import { ReviewCard } from "~/app/_components/reviews/review-card";
import { ReviewCardPreview } from "~/app/_components/reviews/review-card-preview";
import SearchFilter from "~/app/_components/search/search-filter";
import { RoleCardPreview } from "~/app/_components/reviews/role-card-preview";
import { RoleInfo } from "~/app/_components/reviews/role-info";
import { api } from "~/trpc/react";

export default function Roles({
searchParams,
}: {
searchParams?: {
search?: string;
cycle?: WorkTermType;
term?: WorkEnvironmentType;
};
}) {
const { toast } = useToast();
export default function Roles() {
const roles = api.role.list.useQuery();

const RolesSearchParam = z.object({
cycle: z
.nativeEnum(WorkTerm, {
message: "Invalid cycle type",
})
.optional(),
term: z
.nativeEnum(WorkEnvironment, {
message: "Invalid term type",
})
.optional(),
});

const validationResult = RolesSearchParam.safeParse(searchParams);
const [mounted, setMounted] = useState(false);

useEffect(() => {
setMounted(true);
}, []);

useEffect(() => {
if (mounted && !validationResult.success) {
toast({
title: "Invalid Search Parameters",
description: validationResult.error.issues
.map((issue) => issue.message)
.join(", "),
variant: "destructive",
});
setMounted(false);
}
}, [toast, mounted, validationResult]);

const reviews = api.review.list.useQuery({
search: searchParams?.search,
options: validationResult.success ? validationResult.data : {},
});

const [selectedReview, setSelectedReview] = useState<ReviewType | undefined>(
reviews.isSuccess ? reviews.data[0] : undefined,
const [selectedRole, setSelectedRole] = useState<RoleType | undefined>(
roles.isSuccess ? roles.data[0] : undefined,
);

useEffect(() => {
if (reviews.isSuccess) {
setSelectedReview(reviews.data[0]);
if (roles.isSuccess) {
setSelectedRole(roles.data[0]);
}
}, [reviews.isSuccess, reviews.data]);
}, [roles.isSuccess, roles.data]);

return (
<>
<SearchFilter search={searchParams?.search} {...validationResult.data} />
{reviews.isSuccess && reviews.data.length > 0 && (
<div className="mb-8 grid h-[70dvh] w-4/5 grid-cols-5 gap-4 lg:w-3/4">
<div className="col-span-2 gap-3 overflow-scroll pr-4">
{reviews.data.map((review, i) => {
{roles.isSuccess && roles.data.length > 0 && (
<div className="flex h-[100dvh] w-[95%] gap-4 divide-x divide-[#474747] pl-4 pr-4 lg:w-[95%]">
<div className="w-[28%] gap-3">
{roles.data.map((role, i) => {
return (
<div key={review.id} onClick={() => setSelectedReview(review)}>
<ReviewCardPreview
reviewObj={review}
<div key={role.id} onClick={() => setSelectedRole(role)}>
<RoleCardPreview
reviewObj={role}
className={cn(
"mb-4 hover:border-2",
selectedReview
? selectedReview.id === review.id &&
"border-2 bg-cooper-gray-100"
: !i && "border-2 bg-cooper-gray-100",
"mb-4 hover:bg-cooper-gray-100",
selectedRole
? selectedRole.id === role.id && "bg-cooper-gray-200"
: !i && "bg-cooper-gray-200",
)}
/>
</div>
);
})}
</div>
<div className="col-span-3 overflow-scroll">
{reviews.data.length > 0 && reviews.data[0] && (
<ReviewCard reviewObj={selectedReview ?? reviews.data[0]} />
<div className="col-span-3 w-[72%] overflow-auto p-1">
{roles.data.length > 0 && roles.data[0] && (
<RoleInfo roleObj={selectedRole ?? roles.data[0]} />
)}
</div>
</div>
)}
{reviews.isSuccess && reviews.data.length === 0 && <NoResults />}
{reviews.isPending && <LoadingResults />}
{roles.isSuccess && roles.data.length === 0 && <NoResults />}
{roles.isPending && <LoadingResults />}
</>
);
}
2 changes: 1 addition & 1 deletion apps/web/src/app/_components/form/rating.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export const Rating = forwardRef<HTMLInputElement, RatingProps>(
"size-20",
i < hoveredIndex || i < +getValues(name)
? "fill-cooper-yellow-500"
: "fill-cooper-gray-100",
: "fill-cooper-gray-200",
"pr-2 hover:cursor-pointer",
)}
onMouseEnter={() => setHoveredIndex(i + 1)}
Expand Down
88 changes: 0 additions & 88 deletions apps/web/src/app/_components/reviews/review-card-preview.tsx

This file was deleted.

Loading

0 comments on commit 5a04fbd

Please sign in to comment.