import React, { useState } from 'react'; import { Box, Button, Input, SimpleGrid, Table, TableContainer, Tbody, Td, Th, Thead, Tr, } from '@chakra-ui/react'; import { insertRecord, parseRecords, stopCurrentRecord } from '../note'; import { Duration, Instant, OffsetDateTime, ZoneId } from '@js-joda/core'; import formatSeconds from '../formatSeconds'; import { parseProjects } from '../project'; import { useInterval } from 'usehooks-ts'; export enum HtmlElementId { snComponent = 'sn-component', textarea = 'textarea', } interface Props { note: string; saveNote: (newNote: string) => void; setPreview: (newPreview: string) => void; } export default function Editor({ note, saveNote, setPreview }: Props) { const [nextProject, setNextProject] = useState(''); let [completedRecords, activeRecord] = parseRecords(note); let projects = parseProjects(completedRecords); let sumAllProjects = projects.reduce( (sum, project) => sum.plus(project.totalTime), Duration.ZERO ); setPreview(`Total: ${formatSeconds(sumAllProjects.toMillis() / 1000)}`); return (
{ e.preventDefault(); let newNote = insertRecord( note, nextProject, OffsetDateTime.now(ZoneId.UTC) ); setNextProject(''); saveNote(newNote); }} > setNextProject(event.target.value)} />
{activeRecord && ( )} {projects.map((project) => ( ))}
Project Duration Action
{activeRecord.project}
{project.name}
); } interface FixedDurationProps { duration: Duration; } function FixedDuration({ duration }: FixedDurationProps) { return {formatSeconds(duration.toMillis() / 1000)}; } interface DynamicDurationProps { start: OffsetDateTime; } function DynamicDuration({ start }: DynamicDurationProps) { const duration = useDynamicDuration(start); return ; } function useDynamicDuration(start: OffsetDateTime) { let [end, setEnd] = useState(Instant.now()); useInterval(() => { setEnd(Instant.now()); }, 1000); return Duration.between(start, OffsetDateTime.ofInstant(end, ZoneId.UTC)); }