You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
3.1 KiB

2 years ago
2 years ago
  1. import React, {useCallback, useContext, useEffect, useMemo} from "react";
  2. import ProgramContext from "../contexts/ProgramContext";
  3. import {useNavigate, useParams} from "react-router";
  4. import LoadingPage from "./LoadingPage";
  5. import Header, {HeaderButton, HeaderTitle} from "../primitives/header/Header";
  6. import {Icon} from "../primitives/Shared";
  7. import {
  8. faArrowUpRightDots,
  9. faChevronLeft,
  10. faPencilAlt, faStopwatch,
  11. faTag,
  12. faTrashCan
  13. } from "@fortawesome/free-solid-svg-icons";
  14. import Page, {PageBody, PageFlexColumn, PageFlexRow} from "../primitives/page/Page";
  15. import {Size, valuesToString} from "../models/Shared";
  16. import {TitleLine} from "../primitives/misc/Misc";
  17. import Blob, {BlobText} from "../primitives/blob/Blob";
  18. import programRepo from "../actions/programs";
  19. export default function ProgramPage() {
  20. const {programs, refreshPrograms} = useContext(ProgramContext);
  21. const navigate = useNavigate();
  22. const {id} = useParams();
  23. const program = useMemo(() => programs?.find(p => p.id === id), [programs, id]);
  24. useEffect(() => {
  25. if (programs && !program) {
  26. navigate("/");
  27. }
  28. }, [programs, program]);
  29. const onDelete = useCallback(() => {
  30. if (!program || !window.confirm("Vil du fjerne denne enheten?")) return;
  31. programRepo().delete(program).then(() => {
  32. refreshPrograms();
  33. navigate("/");
  34. })
  35. }, [program, navigate, refreshPrograms]);
  36. if (!program) {
  37. return <LoadingPage text="Henter programmer"/>;
  38. }
  39. return (
  40. <Page title={program.name}>
  41. <Header>
  42. <HeaderButton onClick={() => navigate("/")}>
  43. <Icon value={faChevronLeft}/>
  44. </HeaderButton>
  45. <HeaderTitle>{program.name}</HeaderTitle>
  46. </Header>
  47. <PageBody>
  48. <PageFlexRow collapseOn={Size.Mobile}>
  49. <PageFlexColumn flex={1}>
  50. <TitleLine>Programm</TitleLine>
  51. <Blob>
  52. <BlobText>
  53. <Icon value={faTag}/> {program.name}
  54. </BlobText>
  55. </Blob>
  56. <Blob color="indigo" onClick={() => navigate(`/programs/${program.id}/edit`)}>
  57. <BlobText>
  58. <Icon value={faPencilAlt}/>
  59. </BlobText>
  60. </Blob>
  61. <Blob color="red" onClick={onDelete}>
  62. <BlobText>
  63. <Icon value={faTrashCan}/>
  64. </BlobText>
  65. </Blob>
  66. </PageFlexColumn>
  67. <PageFlexColumn flex={1}>
  68. <TitleLine>Steg</TitleLine>
  69. {program.steps.map((s, i) => (
  70. <PageFlexRow key={i}>
  71. <Blob>
  72. <BlobText>
  73. <Icon value={faArrowUpRightDots}/> {s.values.level}
  74. </BlobText>
  75. </Blob>
  76. <Blob>
  77. <BlobText>
  78. <Icon value={faStopwatch}/> {valuesToString(s.duration || {}) || "Manuell"}
  79. </BlobText>
  80. </Blob>
  81. </PageFlexRow>
  82. ))}
  83. </PageFlexColumn>
  84. </PageFlexRow>
  85. </PageBody>
  86. </Page>
  87. );
  88. }