guesstimate/src/routes/project/index.tsx

80 lines
2.8 KiB
TypeScript
Raw Normal View History

2020-04-20 11:14:46 +02:00
import { FunctionalComponent, h } from "preact";
2020-04-20 14:07:26 +02:00
import { useEffect } from "preact/hooks";
2020-04-20 11:14:46 +02:00
import * as style from "./style.css";
import { newProject } from "../../models/project";
import TaskTable from "./tasks-table";
import TimePreview from "./time-preview";
import FinancialPreview from "./financial-preview";
2020-04-20 14:07:26 +02:00
import { useProjectReducer, addTask, updateTaskEstimation, removeTask } from "../../hooks/use-project-reducer";
2020-04-20 11:14:46 +02:00
import { Task, TaskID, EstimationConfidence } from "../../models/task";
2020-04-20 14:07:26 +02:00
import { getProjectStorageKey } from "../../util/storage";
import { useLocalStorage } from "../../hooks/use-local-storage";
2020-04-20 11:14:46 +02:00
2020-04-20 14:07:26 +02:00
export interface ProjectProps {
projectId: string
}
const Project: FunctionalComponent<ProjectProps> = ({ projectId }) => {
const projectStorageKey = getProjectStorageKey(projectId);
const [ storedProject, storeProject ] = useLocalStorage(projectStorageKey, newProject(projectId));
const [ project, dispatch ] = useProjectReducer(storedProject);
2020-04-20 11:14:46 +02:00
const onTaskAdd = (task: Task) => {
dispatch(addTask(task));
};
const onTaskRemove = (taskId: TaskID) => {
dispatch(removeTask(taskId));
}
const onEstimationChange = (taskId: TaskID, confidence: EstimationConfidence, value: number) => {
dispatch(updateTaskEstimation(taskId, confidence, value));
};
2020-04-20 14:07:26 +02:00
// Save project in local storage on change
useEffect(()=> {
storeProject(project);
}, [project]);
2020-04-20 11:14:46 +02:00
return (
<div class={`container ${style.estimation}`}>
2020-04-20 14:07:26 +02:00
<h3 class="is-size-3">
{project.label ? project.label : "Projet sans nom"}
&nbsp;
<i class="icon is-size-4">🖋</i>
</h3>
2020-04-20 11:14:46 +02:00
<div class="tabs">
<ul>
<li class="is-active">
<a>
<span class="icon is-small">📋</span>
Estimation
</a>
</li>
{/* <li>
<a disabled>
<span class="icon is-small"></span>
Paramètres
</a>
</li> */}
</ul>
</div>
<div class="columns">
<div class="column is-9">
<TaskTable
project={project}
onTaskAdd={onTaskAdd}
onTaskRemove={onTaskRemove}
onEstimationChange={onEstimationChange} />
</div>
<div class="column is-3">
<TimePreview project={project} />
<FinancialPreview project={project} />
</div>
</div>
</div>
);
};
export default Project;