remix-demo

react router (remix) demo

git clone https://9o.is/git/remix-demo.git

FoodEntries.tsx

(2054B)


      1 import { Role } from "@prisma/client";
      2 import { Form, Link } from "@remix-run/react";
      3 import { useUser } from "~/utils/hooks";
      4 import { formatReadableDateTime } from "~/utils/date";
      5 import Timeline from "./layouts/Timeline";
      6 
      7 interface FoodEntry {
      8   id: string;
      9   name: string;
     10   consumed: string;
     11   calories: number;
     12   user?: {
     13     name: string;
     14   };
     15 }
     16 
     17 interface FoodEntriesProps {
     18   foodEntries: FoodEntry[];
     19 }
     20 
     21 export default function FoodEntries({ foodEntries }: FoodEntriesProps) {
     22   const user = useUser();
     23   const timelineValues = foodEntries.map((entry) => ({
     24     id: entry.id,
     25     date: formatReadableDateTime(new Date(entry.consumed)) || entry.consumed,
     26     node: (
     27       <div key={entry.id} data-cy={entry.name}>
     28         <div className="my-2 flex flex-row-reverse justify-end gap-2">
     29           <div className="text-gray-900">{entry.name}</div>
     30           <div className="min-w-max font-light">
     31             {entry.calories}{" "}
     32             <abbr title="calories" className="no-underline">
     33               cals
     34             </abbr>
     35           </div>
     36         </div>
     37         {user.role === Role.ADMIN && (
     38           <div className="flex justify-end space-x-3 text-sm">
     39             <span className="font-light">
     40               by {entry.user?.name || "unknown"}
     41             </span>
     42             <div className="space-x-2">
     43               <Link
     44                 to={entry.id}
     45                 aria-label={`Edit ${entry.name}`}
     46                 className="text-blue-600 hover:underline"
     47               >
     48                 Edit
     49               </Link>
     50               <Form replace method="post" className="inline">
     51                 <input type="hidden" name="id" value={entry.id} />
     52                 <button
     53                   type="submit"
     54                   aria-label={`Remove ${entry.name}`}
     55                   className="text-red-600 hover:underline"
     56                 >
     57                   Remove
     58                 </button>
     59               </Form>
     60             </div>
     61           </div>
     62         )}
     63       </div>
     64     ),
     65   }));
     66 
     67   return <Timeline values={timelineValues} />;
     68 }