aboutsummaryrefslogtreecommitdiffstats
path: root/components/List.jsx
blob: b7bdc075ff49ec18a201908efdb90b2ff531879a (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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import { StyleSheet, Text, View, Pressable, Alert } from 'react-native'
import SwipeableFlatList from 'react-native-swipeable-list'
import { useState, useEffect } from 'react'
import Note from './Note'
import Menu from './Menu'

const List = ({ session, setSession, showError, setEdit }) => {
  const [list, setList] = useState()
  const [loading, setLoading] = useState(true)

  const fetchNotes = async () => {
    setLoading(true)
    try {
      const response = await fetch('https://apps.pruss.it/api/notes', { 'Cookie': session.cookies } )
      const data = await response.json()
      setList(data)
    } catch(e) {
      showError('Error while fetching notes')
    }
    setLoading(false)
  }

  useEffect(() => {
    setLoading(true)
    fetchNotes()
  }, [])

  const deleteNote = async (note) => {
    setLoading(true)
    try {
      await fetch(`https://apps.pruss.it/api/notes/${note._id}`, {
        method: 'DELETE', headers: { 'Cookie': session.cookies },
      })
      fetchNotes()
    } catch(e) {
      showError('Error while removing note')
    } finally {
      setLoading(false)
    }
  }

  const deleteItem = note => {
    Alert.alert(
      'Are you sure?',
      `Note "${note.title}" will be permanently removed`,
      [
        {
          text: 'Remove',
          onPress: () => deleteNote(note),
          style: 'destructive',
        },
        {
          text: 'Cancel',
          onPress: () => {},
          style: 'cancel',
        },
      ],
    );
  };

  const removeBtn = (note) => {
    return (
      <View style={styles.buttonsContainer}>
        <View style={styles.button}>
          <Pressable onPress={() => deleteItem(note)}>
            <Text style={styles.buttonText}>Delete</Text>
          </Pressable>
        </View>
      </View>
    );
  };

  return (
    <>
      <Menu
        session={session}
        setSession={setSession}
        showError={showError}
        setEdit={setEdit}
      />
      {
        loading || list === undefined
          ? <Text style={styles.text}>Loading notes...</Text>
          : (
            <SwipeableFlatList
              data={list.sort((a,b) => new Date(b.updated_at) - new Date(a.updated_at))}
              renderItem={({item}) => <Note note={item} setEdit={setEdit} />}
              keyExtractor={item => item._id}
              ListEmptyComponent={<Text style={styles.text}>You don't have any notes</Text>}
              onRefresh={fetchNotes}
              refreshing={loading}
              maxSwipeDistance={80}
              renderQuickActions={({item}) => removeBtn(item)}
              bounceFirstRowOnMount={false}
            />
          )
      }
    </>
  )
}

const styles = StyleSheet.create({
  text: {
    color: 'white',
    padding: 20,
  },
  button: {
    width: 80,
    alignItems: 'center',
    justifyContent: 'center',
    backgroundColor: 'red',
  },
  buttonText: {
    fontWeight: 'bold',
    color: 'white',
  },
  buttonsContainer: {
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'flex-end',
  },
});

export default List;