Home / File/ mail-list.tsx — ui Source File

mail-list.tsx — ui Source File

Architecture documentation for mail-list.tsx, a tsx file in the ui codebase. 8 imports, 0 dependents.

File tsx ComponentRegistry UIPrimitives 8 imports 2 functions

Entity Profile

Dependency Diagram

graph LR
  59bf1756_2b53_5adb_7ea0_d474349e159f["mail-list.tsx"]
  1d141819_425e_b5fd_4c8e_32f7c6a42cf2["react"]
  59bf1756_2b53_5adb_7ea0_d474349e159f --> 1d141819_425e_b5fd_4c8e_32f7c6a42cf2
  feba15a1_47a2_74ea_9051_bbe705ec7888["formatDistanceToNow"]
  59bf1756_2b53_5adb_7ea0_d474349e159f --> feba15a1_47a2_74ea_9051_bbe705ec7888
  79081a1f_55a3_945a_fb8c_d53d6d3eab81["utils"]
  59bf1756_2b53_5adb_7ea0_d474349e159f --> 79081a1f_55a3_945a_fb8c_d53d6d3eab81
  d1f6969b_47e1_9226_0001_415be23d60e0["badge"]
  59bf1756_2b53_5adb_7ea0_d474349e159f --> d1f6969b_47e1_9226_0001_415be23d60e0
  87012fb0_00c6_7ce4_2418_e4e3b26e5dac["scroll-area"]
  59bf1756_2b53_5adb_7ea0_d474349e159f --> 87012fb0_00c6_7ce4_2418_e4e3b26e5dac
  0ef877d6_b768_4222_bd20_50d875ac5e58["separator"]
  59bf1756_2b53_5adb_7ea0_d474349e159f --> 0ef877d6_b768_4222_bd20_50d875ac5e58
  40d7e175_623a_b70e_5a2a_487436710ef0["data"]
  59bf1756_2b53_5adb_7ea0_d474349e159f --> 40d7e175_623a_b70e_5a2a_487436710ef0
  80078e26_dd5e_586a_43a8_570e827b31a1["use-mail"]
  59bf1756_2b53_5adb_7ea0_d474349e159f --> 80078e26_dd5e_586a_43a8_570e827b31a1
  style 59bf1756_2b53_5adb_7ea0_d474349e159f fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import { ComponentProps } from "react"
import formatDistanceToNow from "date-fns/formatDistanceToNow"

import { cn } from "@/lib/utils"
import { Badge } from "@/registry/new-york/ui/badge"
import { ScrollArea } from "@/registry/new-york/ui/scroll-area"
import { Separator } from "@/registry/new-york/ui/separator"
import { Mail } from "@/app/(app)/examples/mail/data"
import { useMail } from "@/app/(app)/examples/mail/use-mail"

interface MailListProps {
  items: Mail[]
}

export function MailList({ items }: MailListProps) {
  const [mail, setMail] = useMail()

  return (
    <ScrollArea className="h-screen">
      <div className="flex flex-col gap-2 p-4 pt-0">
        {items.map((item) => (
          <button
            key={item.id}
            className={cn(
              "flex flex-col items-start gap-2 rounded-lg border p-3 text-left text-sm transition-all hover:bg-accent",
              mail.selected === item.id && "bg-muted"
            )}
            onClick={() =>
              setMail({
                ...mail,
                selected: item.id,
              })
            }
          >
            <div className="flex w-full flex-col gap-1">
              <div className="flex items-center">
                <div className="flex items-center gap-2">
                  <div className="font-semibold">{item.name}</div>
                  {!item.read && (
                    <span className="flex h-2 w-2 rounded-full bg-blue-600" />
                  )}
                </div>
                <div
                  className={cn(
                    "ml-auto text-xs",
                    mail.selected === item.id
                      ? "text-foreground"
                      : "text-muted-foreground"
                  )}
                >
                  {formatDistanceToNow(new Date(item.date), {
                    addSuffix: true,
                  })}
                </div>
              </div>
              <div className="text-xs font-medium">{item.subject}</div>
            </div>
            <div className="line-clamp-2 text-xs text-muted-foreground">
              {item.text.substring(0, 300)}
            </div>
            {item.labels.length ? (
              <div className="flex items-center gap-2">
                {item.labels.map((label) => (
                  <Badge key={label} variant={getBadgeVariantFromLabel(label)}>
                    {label}
                  </Badge>
                ))}
              </div>
            ) : null}
          </button>
        ))}
      </div>
    </ScrollArea>
  )
}

function getBadgeVariantFromLabel(
  label: string
): ComponentProps<typeof Badge>["variant"] {
  if (["work"].includes(label.toLowerCase())) {
    return "default"
  }

  if (["personal"].includes(label.toLowerCase())) {
    return "outline"
  }

  return "secondary"
}

Subdomains

Dependencies

  • badge
  • data
  • formatDistanceToNow
  • react
  • scroll-area
  • separator
  • use-mail
  • utils

Frequently Asked Questions

What does mail-list.tsx do?
mail-list.tsx is a source file in the ui codebase, written in tsx. It belongs to the ComponentRegistry domain, UIPrimitives subdomain.
What functions are defined in mail-list.tsx?
mail-list.tsx defines 2 function(s): MailList, getBadgeVariantFromLabel.
What does mail-list.tsx depend on?
mail-list.tsx imports 8 module(s): badge, data, formatDistanceToNow, react, scroll-area, separator, use-mail, utils.
Where is mail-list.tsx in the architecture?
mail-list.tsx is located at deprecated/www/app/(app)/examples/mail/components/mail-list.tsx (domain: ComponentRegistry, subdomain: UIPrimitives, directory: deprecated/www/app/(app)/examples/mail/components).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free