aboutsummaryrefslogtreecommitdiff
path: root/src/components/add-item.tsx
blob: 9c4a99878888ab494e1b2f1520b003b75ecb1815 (plain) (blame)
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import { ChangeEvent, useMemo, useState } from "react";
import { Button, Form, InputOnChangeData, Segment } from "semantic-ui-react";
import { PantryItem } from "../model";

const defaultPantryItem = () =>
  ({
    name: "",
    description: "",
    quantity: 1,
    quantityUnitType: "oz",
  } as PantryItem);

interface AddItemProps {
  addItem: (item: PantryItem) => Promise<void>;
}

const AddItem = ({ addItem }: AddItemProps) => {
  const [additionItem, setAdditionItem] = useState<PantryItem | undefined>();
  const [additionItemLoading, setAdditionItemLoading] = useState(false);

  const handleItemChange = (
    _: ChangeEvent<HTMLInputElement>,
    { name, value }: InputOnChangeData
  ) =>
    setAdditionItem((item) => ({
      ...(item !== undefined ? item : defaultPantryItem()),
      [name]: value,
    }));

  const newItem = useMemo(
    () => additionItem ?? defaultPantryItem(),
    [additionItem]
  );

  return (
    <>
      <Segment attached="top" hidden={additionItem !== undefined}>
        <Button primary onClick={() => setAdditionItem(defaultPantryItem())}>
          Add Item
        </Button>
      </Segment>
      <Segment attached="top" hidden={additionItem === undefined}>
        <Form
          loading={additionItemLoading}
          onSubmit={() => {
            setAdditionItemLoading(true);
            addItem(newItem).then(() => {
              setAdditionItem(undefined);
              setAdditionItemLoading(false);
            });
          }}
        >
          <Form.Group widths="equal">
            <Form.Input
              name="name"
              label="Item Name"
              placeholder="Item name"
              value={newItem.name}
              onChange={handleItemChange}
            />
            <Form.Input
              fluid
              name="description"
              label="Item Description"
              placeholder="Item description"
              value={newItem.description}
              onChange={handleItemChange}
            />
            <Form.Input
              fluid
              name="quantity"
              label="Item Quantity"
              placeholder="Item quantity"
              value={newItem.quantity}
              onChange={handleItemChange}
            />
            <Form.Input
              name="quantityUnitType"
              label="Quantity Type"
              placeholder="Quantity type"
              value={newItem.quantityUnitType}
              onChange={handleItemChange}
            />
          </Form.Group>
          <Form.Group>
            <Form.Button primary content="Submit Item" type="submit" />
            <Form.Button
              content="Cancel"
              onClick={(e) => {
                e.preventDefault();
                setAdditionItem(undefined);
              }}
            />
          </Form.Group>
        </Form>
      </Segment>
    </>
  );
};

export default AddItem;