Switch DayView to client component

This commit is contained in:
Ryan Pandya 2025-01-15 20:21:38 -08:00
parent 86c88307df
commit 1e511c9509
4 changed files with 32 additions and 25 deletions

View File

@ -1,10 +1,17 @@
import { notFound } from "next/navigation"; import { notFound, redirect } from "next/navigation";
import { api } from "@/server/api/client"; import { api } from "@/server/api/client";
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import DayView from "@/components/dashboard/days/DayView"; import DayView from "@/components/dashboard/days/DayView";
import { getServerAuthSession } from "@/server/auth";
import LoadingSpinner from "@/components/ui/spinner"; import LoadingSpinner from "@/components/ui/spinner";
export default async function DayPage({ params }: { params: { dateQuery: string }; }) { export default async function DayPage({ params }: { params: { dateQuery: string }; }) {
const session = await getServerAuthSession();
if (!session) {
redirect("/");
}
let day; let day;
const { dateQuery } = await params; const { dateQuery } = await params;
const timezone = await api.users.getTimezone(); const timezone = await api.users.getTimezone();

View File

@ -1,7 +1,7 @@
"use client";
import { redirect } from "next/navigation"; import { redirect } from "next/navigation";
import { Separator } from "@/components/ui/separator"; import { Separator } from "@/components/ui/separator";
import { getServerAuthSession } from "@/server/auth"; import { ZDay, ZHour } from "@lifetracker/shared/types/days";
import { ZDay } from "@lifetracker/shared/types/days";
import EditableDayComment from "./EditableDayComment"; import EditableDayComment from "./EditableDayComment";
import { MoodStars } from "./MoodStars"; import { MoodStars } from "./MoodStars";
import Link from "next/link"; import Link from "next/link";
@ -10,26 +10,21 @@ import { ArrowLeftSquare, ArrowRightSquare } from "lucide-react";
import spacetime from "spacetime"; import spacetime from "spacetime";
import EditableHour from "@/components/dashboard/hours/EditableHour"; import EditableHour from "@/components/dashboard/hours/EditableHour";
import { DayMetrics } from "./DayMetrics"; import { DayMetrics } from "./DayMetrics";
import { api } from "@/server/api/client"; import { api } from "@/lib/trpc";
export default function DayView({
export default async function DayView({
day, day,
}: { }: {
day: ZDay; day: ZDay;
}) { }) {
const session = await getServerAuthSession();
if (!session) {
redirect("/");
}
const prevDay = spacetime(day.date).subtract(1, "day").format("iso-short"); const prevDay = spacetime(day.date).subtract(1, "day").format("iso-short");
const nextDay = spacetime(day.date).add(1, "day").format("iso-short"); const nextDay = spacetime(day.date).add(1, "day").format("iso-short");
const userMetrics = await api.metrics.list(); const { data: userMetrics } = api.metrics.list.useQuery();
const groupConsecutiveHours = (day: ZDay) => { const groupConsecutiveHours = (day: ZDay) => {
const result = []; const result = [];
let currentGroup = []; let currentGroup: ZHour[] = [];
for (const hour of day.hours) { for (const hour of day.hours) {
if (hour.categoryCode === null) { if (hour.categoryCode === null) {
@ -113,8 +108,9 @@ export default async function DayView({
</div> </div>
<Separator /> <Separator />
<ul> {day && userMetrics ?
{/* {consecutiveHours.map((group, i) => ( <ul>
{/* {consecutiveHours.map((group, i) => (
group.map((hour, j) => ( group.map((hour, j) => (
j == 0 ? ( j == 0 ? (
<li key={hour.time} id={"hour-" + i.toString()}> <li key={hour.time} id={"hour-" + i.toString()}>
@ -125,16 +121,17 @@ export default async function DayView({
)) ))
))} */} ))} */}
{ {
day.hours.map((hour, i) => ( day.hours.map((hour, i) => (
<li key={hour.time} id={"hour-" + i.toString()}> <li key={hour.time} id={"hour-" + i.toString()}>
<EditableHour hour={hour} i={i} j={0} hourGroup={[]} metrics={userMetrics} /> <EditableHour hour={hour} i={i} j={0} hourGroup={[]} metrics={userMetrics} />
</li>) </li>)
) )
} }
</ul> </ul>
: <LoadingSpinner />}
</div> </div>
); );

View File

@ -37,7 +37,7 @@ export default function EditableHour({
i: number, i: number,
j: number, j: number,
hourGroup: ZHour[], hourGroup: ZHour[],
metrics: ZMetric[], metrics: ZMetric[] | undefined,
isConsecutiveHour?: boolean, isConsecutiveHour?: boolean,
className?: string; className?: string;
}) { }) {
@ -114,6 +114,7 @@ export default function EditableHour({
function reload(newHour: ZHour) { function reload(newHour: ZHour) {
setHour(newHour); setHour(newHour);
} }
return ( return (
<div <div
data-hourid={hour.id} data-hourid={hour.id}
@ -177,6 +178,7 @@ export default function EditableHour({
(<Icon name={titleCase(m.icon)} size={24} (<Icon name={titleCase(m.icon)} size={24}
color={hour.foreground} color={hour.foreground}
tooltip={`${m.metricName}: ${m.value} ${m.unit}`} tooltip={`${m.metricName}: ${m.value} ${m.unit}`}
key={m.id}
/>) />)
: Array.from({ length: m.value }).map((_, index) => : Array.from({ length: m.value }).map((_, index) =>
<div key={`${m.id}-${index}`} className="hover:cursor-no-drop" onClick={(e) => { <div key={`${m.id}-${index}`} className="hover:cursor-no-drop" onClick={(e) => {

View File

@ -252,7 +252,7 @@ export default function HourMeasurementsDialog({
} }
{Object.keys(metricsByType).map(type => ( {Object.keys(metricsByType).map(type => (
<> <div key={`metric-${type}`}>
<div className="font-bold border-b border-white">{titleCase(type)}</div> <div className="font-bold border-b border-white">{titleCase(type)}</div>
<div className="grid" style={{ gridTemplateColumns: "repeat(4, 1fr)", rowGap: "1em" }}> <div className="grid" style={{ gridTemplateColumns: "repeat(4, 1fr)", rowGap: "1em" }}>
{metricsByType[type].map(metric => ( {metricsByType[type].map(metric => (
@ -266,7 +266,8 @@ export default function HourMeasurementsDialog({
<span className="text-sm">{metric.name}</span> <span className="text-sm">{metric.name}</span>
</button> </button>
))} ))}
</div></> </div>
</div>
))} ))}
</DialogContent> </DialogContent>
</Dialog> </Dialog>