import { FormEvent, useEffect, useRef, useState } from 'react' import { type ProjectWithEntryPointMetadata } from 'lib/types' import { paths } from 'lib/paths' import { Link } from 'react-router-dom' import { ActionButton } from './ActionButton' import { faCheck, faPenAlt, faTrashAlt, faX, } from '@fortawesome/free-solid-svg-icons' import { FILE_EXT, getPartsCount, readProject } from '../lib/tauriFS' import { Dialog } from '@headlessui/react' import { useHotkeys } from 'react-hotkeys-hook' function ProjectCard({ project, handleRenameProject, handleDeleteProject, ...props }: { project: ProjectWithEntryPointMetadata handleRenameProject: ( e: FormEvent, f: ProjectWithEntryPointMetadata ) => Promise handleDeleteProject: (f: ProjectWithEntryPointMetadata) => Promise }) { useHotkeys('esc', () => setIsEditing(false)) const [isEditing, setIsEditing] = useState(false) const [isConfirmingDelete, setIsConfirmingDelete] = useState(false) const [numberOfParts, setNumberOfParts] = useState(1) const [numberOfFolders, setNumberOfFolders] = useState(0) let inputRef = useRef(null) function handleSave(e: FormEvent) { e.preventDefault() void handleRenameProject(e, project).then(() => setIsEditing(false)) } function getDisplayedTime(date: Date) { const startOfToday = new Date() startOfToday.setHours(0, 0, 0, 0) return date.getTime() < startOfToday.getTime() ? date.toLocaleDateString() : date.toLocaleTimeString() } useEffect(() => { async function getNumberOfParts() { const { kclFileCount, kclDirCount } = getPartsCount( await readProject(project.path) ) setNumberOfParts(kclFileCount) setNumberOfFolders(kclDirCount) } void getNumberOfParts() }, [project.path]) useEffect(() => { if (inputRef.current) { inputRef.current.focus() inputRef.current.select() } }, [inputRef]) return (
  • {isEditing ? (
    setIsEditing(false)} />
    ) : ( <>
    {project.name?.replace(FILE_EXT, '')} {numberOfParts} part{numberOfParts === 1 ? '' : 's'}{' '} {numberOfFolders > 0 && `/ ${numberOfFolders} folder${ numberOfFolders === 1 ? '' : 's' }`} Edited{' '} {project.entrypointMetadata.mtime ? getDisplayedTime(project.entrypointMetadata.mtime) : 'never'}
    { e.stopPropagation() e.nativeEvent.stopPropagation() setIsEditing(true) }} className="!p-0" /> { e.stopPropagation() e.nativeEvent.stopPropagation() setIsConfirmingDelete(true) }} />
    setIsConfirmingDelete(false)} className="relative z-50" >
    Delete File This will permanently delete "{project.name || 'this file'}".

    Are you sure you want to delete "{project.name || 'this file'} "? This action cannot be undone.

    { await handleDeleteProject(project) setIsConfirmingDelete(false) }} icon={{ icon: faTrashAlt, bgClassName: 'bg-destroy-80', className: 'p-1', size: 'sm', iconClassName: '!text-destroy-70 dark:!text-destroy-40', }} className="hover:border-destroy-40 dark:hover:border-destroy-40" > Delete setIsConfirmingDelete(false)} > Cancel
    )}
  • ) } export default ProjectCard