/
index.js
executable file
·117 lines (94 loc) · 2.93 KB
/
index.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
import React, { useState, useEffect } from 'react';
import { Keyboard } from 'react-native';
import Icon from 'react-native-vector-icons/MaterialIcons';
import Realm from 'realm';
import api from '~/services/api';
import getRealm from '~/services/realm';
import Repository from '~/components/Repository';
import { Container, Title, Form, Input, Submit, List } from './styles';
export default function Main() {
const [input, setInput] = useState('');
const [error, setError] = useState(false);
const [repositories, setRepositories] = useState([]);
useEffect(() => {
async function loadRepositories() {
const realm = await getRealm();
console.tron.log(realm.path);
const data = realm.objects('Repository').sorted('stars', true);
setRepositories(data);
}
loadRepositories();
}, []);
async function saveRepository(repository) {
const data = {
id: repository.id,
login: repository.owner.login,
name: repository.name,
fullName: repository.full_name,
avatarUrl: repository.owner.avatar_url,
description: repository.description,
stars: repository.stargazers_count,
forks: repository.forks_count,
watchersCount: repository.watchers_count,
};
const realm = await getRealm();
realm.write(() => {
realm.create('Repository', data, 'modified');
});
return data;
}
async function handleAddRepository(repository) {
try {
const response = await api.get(`/repos/${input}`);
await saveRepository(response.data);
setInput('');
setError(false);
Keyboard.dismiss();
} catch (err) {
setError(true);
}
}
async function handleRefreshRepository(repository) {
const response = await api.get(`/repos/${repository.fullName}`);
const data = await saveRepository(response.data);
setRepositories(
repositories.map((repo) => (repo.id === data.id ? data : repo)),
);
}
async function handleDeleteRepository(repository) {
const realm = await getRealm();
realm.write(() => {
realm.delete(realm.objectForPrimaryKey('Repository', repository.id));
});
}
return (
<Container>
<Title>Agenda de repositórios</Title>
<Form>
<Input
value={input}
error={error}
onChangeText={setInput}
autoCapitalize="none"
autoCorrect={false}
placeholder="Insira o autor/repo..."
/>
<Submit onPress={handleAddRepository}>
<Icon name="add" size={22} color="#FFF" />
</Submit>
</Form>
<List
keyboardShouldPersistTaps="handled"
data={repositories}
keyExtractor={(item) => String(item.id)}
renderItem={({ item }) => (
<Repository
data={item}
onRefresh={() => handleRefreshRepository(item)}
onDelete={() => handleDeleteRepository(item)}
/>
)}
/>
</Container>
);
}