-
Notifications
You must be signed in to change notification settings - Fork 0
/
Datastore.js
146 lines (139 loc) · 4.7 KB
/
Datastore.js
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import AsyncStorage from '@react-native-async-storage/async-storage';
import uuid from 'react-native-uuid';
// i try catch fermano gli errori per poi debuggare in console
const getContactData = async (key) => {
try {
// fai una query al datastore per la chiave dell'elemento ricercato
const jsonValue = await AsyncStorage.getItem(key)
return jsonValue != null ? JSON.parse(jsonValue) : null;
} catch (error) {
console.error("GET: ",error);
}
}
/*
a partire dagli elementi JSON nel datastore genera un array del tipo
[
{
title: "INIZIALE"
data: [
{key: UUID, value: NOMECOGNOME},
....
]
},
....
]
*/
const getContactsList = async () => {
// prendi tutte le chiavi del datastore di RN
const keyList = await AsyncStorage.getAllKeys()
let finalArray = []; // crea un array vuoto
// per tutte le chiavi in lista
for (const key of keyList){
try {
// controlla che la entry sia stata prodotta dalla nostra app
if (key.startsWith("@cac_uuid:")) {
// fetch di quella key
const value = await AsyncStorage.getItem(key);
if (value){
// trasforma il valore di quella key da stringa JSON a un oggetto
const actualValue = JSON.parse(value);
let found = false;
// prima di aggiungere all'arra
finalArray.forEach((element) => {
// controlla se esiste gia lettera dell'alfabeto
if (element.title == actualValue.name.toUpperCase()[0] && !found) {
// se si registra in quel posto
element.data.push({key: key, value: actualValue.name})
found = true;
}
});
// non ho trovato lettera dell'alfabeto presente, creo e registro
if (!found){
finalArray.push(
{
title: actualValue.name[0].toUpperCase(),
data: [{key: key, value: actualValue.name}]
}
)
}
}
}
} catch (error) {
console.error("GETALL: ",error);
}
}
//ottieni array finale ordinando alfabeticamente per 'title' (vedi struttura di sopra)
return finalArray.sort((a, b) => a.title.localeCompare(b.title));;
}
// aggiunta del contatto
const addContactToList = async (name, birthday, address, phone) => {
// prepara la struttura dati
const data = {
name: name,
birthday: birthday,
address: address,
phone: phone
}
try {
// genera uuid random e memorizza nel datastore
await AsyncStorage.setItem(
"@cac_uuid:" + uuid.v4(), // un uuid random evita ogni collisione
JSON.stringify(data)
)
return true;
} catch (error) {
console.log("ADD: ",error)
return false;
}
}
// funziona tale e quale all'add ma chiede la chiave di chi esiste già
const editContact = async (key, name, birthday, address, phone) => {
const data = {
name: name,
birthday: birthday,
address: address,
phone: phone
}
try {
const existing = await AsyncStorage.getItem(key);
if(existing != null){
await AsyncStorage.setItem(
key,
JSON.stringify(data)
)
return true;
}else{
return false;
}
} catch (error) {
console.log("EDIT: ", error)
return false;
}
}
// data una chiave cancella il contatto, controlla prima se esiste
const deleteContact = async (key) => {
try {
const existing = await AsyncStorage.getItem(key);
if(existing != null){
await AsyncStorage.removeItem(key)
return true;
}else{
return false;
}
} catch (error) {
console.log("DELETE:", error)
return false;
}
}
// cancella tutti i contatti (utilizzata solo in fase di debug)
const clearAllData = async () => {
const keyList = await AsyncStorage.getAllKeys()
// per tutte le chiavi in lista
keyList.forEach((key) => {
// prendi solo le chiavi della nostra app
if (key.startsWith("@cac_uuid:")) {
AsyncStorage.getItem(key).then(() => AsyncStorage.removeItem(key));
}
})
}
export { getContactData, clearAllData, getContactsList, addContactToList, editContact, deleteContact }