Projekt

Obecné

Profil

Stáhnout (5.89 KB) Statistiky
| Větev: | Tag: | Revize:
1
import React, { useEffect, useState } from "react"
2
import { log } from "../logging/logger"
3
import { DrawerScreenProps } from "@react-navigation/drawer"
4
import { Box, Button, ChevronDownIcon, ChevronUpIcon, Flex, HStack, MinusIcon, Popover, Switch, Text, VStack } from "native-base"
5
import { SortOptions } from "../types/general"
6
import { Note } from "../types/note"
7
import NotesListView from "../components/notes/NotesListView"
8
import { useDispatch, useSelector } from "react-redux"
9
import { AppDispatch, RootState } from "../stores/store"
10
import LoadingBox from "../components/loading/LoadingBox"
11
import { createNote, getAllNotes } from "../stores/actions/notesThunks"
12
import { RootDrawerParamList } from "./Navigation"
13
const NotesViewPage = ({ navigation }: DrawerScreenProps<RootDrawerParamList, 'Notes'>) => {
14

    
15
  const { notes, notesLoading, requestPending, triggerRefresh } = useSelector((state: RootState) => state.noteViewState)
16

    
17
  const dispatch = useDispatch<AppDispatch>();
18

    
19
  const [isSortOpen, setIsSortOpen] = useState(false);
20

    
21
  const [myCommentsCheck, setMyCommentsCheck] = useState(false);
22
  const [generalCommentsCheck, setGeneralCommentsCheck] = useState(true);
23

    
24
  const [sortSettings, setSortSettings] = useState({
25
    items: SortOptions.None,
26
    date: SortOptions.None
27
  });
28

    
29
  const handleSortChanged = (key: "items" | "date") => {
30
    let currentState = sortSettings[key];
31
    if (currentState == SortOptions.None) {
32
      setSortSettings({
33
        ...sortSettings,
34
        [key]: SortOptions.Asc
35
      })
36
    }
37
    else if (currentState == SortOptions.Asc) {
38
      setSortSettings({
39
        ...sortSettings,
40
        [key]: SortOptions.Desc
41
      })
42
    }
43
    else {
44
      setSortSettings({
45
        ...sortSettings,
46
        [key]: SortOptions.None
47
      })
48
    }
49
  }
50

    
51
  const getSortIcon = (sortOption: SortOptions, size: string) => {
52
    switch (sortOption) {
53
      case SortOptions.Asc:
54
        return <ChevronUpIcon size={size} />;
55
      case SortOptions.Desc:
56
        return <ChevronDownIcon size={size} />;
57
      default:
58
        return <MinusIcon size={size} />;
59
    }
60
  };
61

    
62
  // trigger refresh on triggerRefresh increment
63
  useEffect(() => {
64
    log.debug("NotesViewPage", "useEffect", "getNotes");
65
    getNotes();
66
  }, [triggerRefresh])
67

    
68
  // general comments check changed
69
  useEffect(() => {
70
    if (!notesLoading) {
71
      log.debug("NotesViewPage", "useEffect", "getNotes");
72
      getNotes();
73
    }
74
  }, [generalCommentsCheck, myCommentsCheck])
75

    
76

    
77
  const getNotes = () => {
78
    dispatch(getAllNotes({
79
      myComments: myCommentsCheck,
80
      generalComments: generalCommentsCheck,
81
      sortOptions: sortSettings
82
    }));
83
  }
84

    
85
  const handleCreateComment = (newComment: string, replyingTo: { messageId: string; userName: string } | null) => {
86

    
87
    console.log(newComment, replyingTo)
88

    
89
    if (!requestPending) {
90
      // creating new comment
91
      if (replyingTo != null) {
92
        dispatch(createNote({
93
          newNote: { note: newComment, reply_to: replyingTo.messageId } as Note
94
        }))
95
      }
96
      else {
97
        dispatch(createNote({
98
          newNote: { note: newComment } as Note
99
        }))
100
      }
101
    }
102
  }
103

    
104

    
105
  return (
106
    <Box width="92%" marginLeft="5%">
107
      <VStack>
108
        <HStack marginTop="5%">
109
          <Box width="30%" justifyContent={"center"}>
110
            <Popover // @ts-ignore
111
              trigger={triggerProps => {
112
                return <Button colorScheme="primary" {...triggerProps} onPress={() => setIsSortOpen(true)}>
113
                  Sort Options
114
                </Button>;
115
              }} isOpen={isSortOpen} onClose={() => setIsSortOpen(!isSortOpen)}>
116
              <Popover.Content w="48">
117
                <Popover.Arrow />
118
                <Popover.CloseButton onPress={() => setIsSortOpen(false)} />
119
                <Popover.Header>Sort Options</Popover.Header>
120
                <Popover.Body>
121
                  <VStack>
122
                    <Button size="md" variant="outline" onPress={() => handleSortChanged("items")}
123
                      rightIcon={getSortIcon(sortSettings.items, "sm")}
124
                    >
125
                      Items</Button>
126
                    <Button size="md" variant="outline" marginTop={"5%"} onPress={() => handleSortChanged("date")}
127
                      rightIcon={getSortIcon(sortSettings.date, "sm")}>
128
                      Date</Button>
129
                  </VStack>
130
                </Popover.Body>
131
                <Popover.Footer justifyContent="flex-end">
132
                  <Button.Group space={2}>
133
                    <Button colorScheme="coolGray" variant="ghost" onPress={() => setIsSortOpen(false)}>
134
                      Cancel
135
                    </Button>
136
                    <Button colorScheme="success" onPress={() => { setIsSortOpen(false); getNotes() }}>
137
                      Save
138
                    </Button>
139
                  </Button.Group>
140
                </Popover.Footer>
141
              </Popover.Content>
142
            </Popover>
143
          </Box>
144
          <VStack width="70%" space="0">
145
            <Flex direction="row" alignItems="center" justify="flex-end">
146
              <Text>My comments</Text>
147
              <Switch isChecked={myCommentsCheck} onValueChange={() => { if (!notesLoading) setMyCommentsCheck(!myCommentsCheck) }} size="md" />
148
            </Flex>
149
            <Flex direction="row" alignItems="center" justify="flex-end" marginTop="-7.5%">
150
              <Text>General comments</Text>
151
              <Switch isChecked={generalCommentsCheck} onValueChange={() => { if (!notesLoading) setGeneralCommentsCheck(!generalCommentsCheck) }} size="md" />
152
            </Flex>
153
          </VStack>
154
        </HStack>
155
        <Box>
156
          {
157
            notesLoading ? (
158
              <LoadingBox text="Loading notes" />
159
            )
160
              :
161
              (<NotesListView notes={notes} navigation={navigation} handleCreateComment={handleCreateComment} requestPending={requestPending} />)
162
          }
163
        </Box>
164

    
165

    
166
      </VStack>
167
    </Box>
168
  );
169
}
170

    
171
export default NotesViewPage;
(6-6/7)