diff --git a/src/components/experiments/ExperimentCard.tsx b/src/components/experiments/ExperimentCard.tsx index a9f9cb7..7f583cd 100644 --- a/src/components/experiments/ExperimentCard.tsx +++ b/src/components/experiments/ExperimentCard.tsx @@ -7,11 +7,16 @@ import { Text, CardHeader, Divider, - Box, + Spinner, + AspectRatio, } from "@chakra-ui/react"; import { RiFlaskLine } from "react-icons/ri"; import { formatTimePast } from "~/utils/dayjs"; +import Link from "next/link"; import { useRouter } from "next/router"; +import { BsPlusSquare } from "react-icons/bs"; +import { api } from "~/utils/api"; +import { useHandledAsyncCallback } from "~/utils/hooks"; type ExperimentData = { testScenarioCount: number; @@ -24,24 +29,17 @@ type ExperimentData = { }; export const ExperimentCard = ({ exp }: { exp: ExperimentData }) => { - const router = useRouter(); return ( - { - e.preventDefault(); - void router.push({ pathname: "/experiments/[id]", query: { id: exp.id } }, undefined, { - shallow: true, - }); - }} + href={{ pathname: "/experiments/[id]", query: { id: exp.id } }} > - + {exp.label} @@ -52,19 +50,19 @@ export const ExperimentCard = ({ exp }: { exp: ExperimentData }) => { - - Created {formatTimePast(exp.createdAt)} + + Created {formatTimePast(exp.createdAt)} - Updated {formatTimePast(exp.updatedAt)} + Updated {formatTimePast(exp.updatedAt)} - + ); }; const CountLabel = ({ label, count }: { label: string; count: number }) => { return ( - + {label} @@ -74,3 +72,26 @@ const CountLabel = ({ label, count }: { label: string; count: number }) => { ); }; + +export const NewExperimentCard = () => { + const router = useRouter(); + const utils = api.useContext(); + const createMutation = api.experiments.create.useMutation(); + const [createExperiment, isLoading] = useHandledAsyncCallback(async () => { + const newExperiment = await createMutation.mutateAsync({ label: "New Experiment" }); + await router.push({ pathname: "/experiments/[id]", query: { id: newExperiment.id } }); + }, [createMutation, router]); + + return ( + + + + + + New Experiment + + + + + ); +}; diff --git a/src/components/experiments/NewExperimentButton.tsx b/src/components/experiments/NewExperimentButton.tsx deleted file mode 100644 index 4478a57..0000000 --- a/src/components/experiments/NewExperimentButton.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Icon, Button, Spinner, Text, type ButtonProps } from "@chakra-ui/react"; -import { api } from "~/utils/api"; -import { useRouter } from "next/router"; -import { BsPlusSquare } from "react-icons/bs"; -import { useHandledAsyncCallback } from "~/utils/hooks"; - -export const NewExperimentButton = (props: ButtonProps) => { - const router = useRouter(); - const utils = api.useContext(); - const createMutation = api.experiments.create.useMutation(); - const [createExperiment, isLoading] = useHandledAsyncCallback(async () => { - const newExperiment = await createMutation.mutateAsync({ label: "New Experiment" }); - await utils.experiments.list.invalidate(); - await router.push({ pathname: "/experiments/[id]", query: { id: newExperiment.id } }); - }, [createMutation, router]); - - return ( - - ); -}; diff --git a/src/pages/experiments/index.tsx b/src/pages/experiments/index.tsx index cb2702b..c268b04 100644 --- a/src/pages/experiments/index.tsx +++ b/src/pages/experiments/index.tsx @@ -13,8 +13,7 @@ import { import { RiFlaskLine } from "react-icons/ri"; import AppShell from "~/components/nav/AppShell"; import { api } from "~/utils/api"; -import { NewExperimentButton } from "~/components/experiments/NewExperimentButton"; -import { ExperimentCard } from "~/components/experiments/ExperimentCard"; +import { ExperimentCard, NewExperimentCard } from "~/components/experiments/ExperimentCard"; import { signIn, useSession } from "next-auth/react"; export default function ExperimentsPage() { @@ -45,7 +44,7 @@ export default function ExperimentsPage() { return ( - + @@ -53,9 +52,9 @@ export default function ExperimentsPage() { - + {experiments?.data?.map((exp) => )} diff --git a/src/server/api/routers/experiments.router.ts b/src/server/api/routers/experiments.router.ts index 02931e8..9141847 100644 --- a/src/server/api/routers/experiments.router.ts +++ b/src/server/api/routers/experiments.router.ts @@ -25,7 +25,7 @@ export const experimentsRouter = createTRPCRouter({ }, }, orderBy: { - sortIndex: "asc", + sortIndex: "desc", }, }); diff --git a/src/utils/dayjs.ts b/src/utils/dayjs.ts index 5f1c606..2425333 100644 --- a/src/utils/dayjs.ts +++ b/src/utils/dayjs.ts @@ -5,16 +5,5 @@ import relativeTime from "dayjs/plugin/relativeTime"; dayjs.extend(duration); dayjs.extend(relativeTime); -export const formatTimePast = (date: Date) => { - const now = dayjs(); - const dayDiff = Math.floor(now.diff(date, "day")); - if (dayDiff > 0) return dayjs.duration(-dayDiff, "days").humanize(true); - - const hourDiff = Math.floor(now.diff(date, "hour")); - if (hourDiff > 0) return dayjs.duration(-hourDiff, "hours").humanize(true); - - const minuteDiff = Math.floor(now.diff(date, "minute")); - if (minuteDiff > 0) return dayjs.duration(-minuteDiff, "minutes").humanize(true); - - return "a few seconds ago"; -}; +export const formatTimePast = (date: Date) => + dayjs.duration(dayjs(date).diff(dayjs())).humanize(true);