All files / components Dock.tsx

0% Statements 0/60
0% Branches 0/1
0% Functions 0/1
0% Lines 0/60

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85                                                                                                                                                                         
"use client"
 
import { motion } from "framer-motion"
import { useState, useEffect } from "react"
import styles from "./Dock.module.css"
import { desktopApps } from "@/data/apps" // Updated import path
 
interface DockProps {
  openWindows: any[]
  openWindow: (app: any) => void
  focusWindow: (id: string) => void
  minimizedWindows: string[]
}
 
export default function Dock({ openWindows, openWindow, focusWindow, minimizedWindows }: DockProps) {
  const [time, setTime] = useState(new Date())
 
  useEffect(() => {
    const timer = setInterval(() => {
      setTime(new Date())
    }, 1000)
    return () => clearInterval(timer)
  }, [])
 
  const formatTime = (date: Date) => {
    const hours = date.getHours()
    const minutes = date.getMinutes()
    const ampm = hours >= 12 ? "PM" : "AM"
    const formattedHours = hours % 12 === 0 ? 12 : hours % 12
    const formattedMinutes = minutes < 10 ? "0" + minutes : minutes
    return `${formattedHours}:${formattedMinutes} ${ampm}`
  }
 
  const dockItemVariants = {
    hidden: { opacity: 0, y: 20 },
    visible: { opacity: 1, y: 0 },
    hover: { scale: 1.1, y: -10, transition: { type: "spring", stiffness: 300 } },
    tap: { scale: 0.9 },
  }
 
  const dockVariants = {
    hidden: { opacity: 0, y: 50 },
    visible: { opacity: 1, y: 0, transition: { delay: 0.5, duration: 0.5 } },
  }
 
  const runningApps = openWindows.filter((app) => !minimizedWindows.includes(app.id))
 
  return (
    <motion.div
      className={styles.dock}
      initial="hidden"
      animate="visible"
      variants={dockVariants}
      aria-label="Application Dock"
    >
      <div className={styles.dockContainer}>
        {desktopApps.map((app) => {
          const isRunning = runningApps.some((runningApp) => runningApp.id === app.id)
          const isMinimized = minimizedWindows.includes(app.id)
 
          return (
            <motion.div
              key={app.id}
              className={`${styles.dockItem} ${isRunning ? styles.running : ""} ${isMinimized ? styles.minimized : ""}`}
              variants={dockItemVariants}
              whileHover="hover"
              whileTap="tap"
              onClick={() => (isRunning ? focusWindow(app.id) : openWindow(app))}
              aria-label={app.name}
              role="button"
              tabIndex={0}
            >
              <span className={styles.appIcon}>{app.icon}</span>
              {isRunning && <div className={styles.runningDot} />}
            </motion.div>
          )
        })}
      </div>
      <div className={styles.timeDisplay} aria-live="polite">
        {formatTime(time)}
      </div>
    </motion.div>
  )
}