-
Notifications
You must be signed in to change notification settings - Fork 102
Expand file tree
/
Copy pathAppDataContext.tsx
More file actions
70 lines (55 loc) · 2.22 KB
/
AppDataContext.tsx
File metadata and controls
70 lines (55 loc) · 2.22 KB
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
import React, { createContext, useState } from "react";
import data from "../generated.json";
import { AppData, CountableTag, Repository, RepositorySortOrder } from "../types";
const DEFAULT_VALUE: AppData = {
languages: [],
repositories: [],
repositorySortOrder: RepositorySortOrder.NONE,
topics: [],
updateRepositorySortOrder: () => {}
};
const AppDataContext = createContext<AppData>(DEFAULT_VALUE);
const AppDataProvider = ({ children }: { children: React.ReactNode }) => {
const {
repositories: allRepositories,
languages,
topics
}: { repositories: Repository[]; languages: CountableTag[]; topics: CountableTag[] } = data;
const [repositories, setRepositories] = useState<Repository[]>(allRepositories);
const [repositorySortOrder, setRepositorySortOrder] = useState<RepositorySortOrder>(
RepositorySortOrder.NONE
);
const updateRepositorySortOrder = (sortOrder: RepositorySortOrder) => {
const isSetToDefaultSort = sortOrder === RepositorySortOrder.NONE;
const shouldDeselect = !isSetToDefaultSort && sortOrder === repositorySortOrder;
const finalSortOrder = shouldDeselect ? RepositorySortOrder.NONE : sortOrder;
setRepositorySortOrder(finalSortOrder);
updateRepositoriesOnSortChange(finalSortOrder);
};
const updateRepositoriesOnSortChange = (sortOrder: RepositorySortOrder) => {
let updatedRepositories: Repository[] = [];
if (sortOrder === RepositorySortOrder.MOST_STARS) {
updatedRepositories = [...allRepositories].sort((currentRepository, nextRepository) => {
return nextRepository.stars - currentRepository.stars;
});
}
if (sortOrder === RepositorySortOrder.LEAST_STARS) {
updatedRepositories = [...allRepositories].sort((currentRepository, nextRepository) => {
return currentRepository.stars - nextRepository.stars;
});
}
if (sortOrder === RepositorySortOrder.NONE) {
updatedRepositories = allRepositories;
}
setRepositories(updatedRepositories);
};
const value = {
languages,
repositories,
repositorySortOrder,
topics,
updateRepositorySortOrder
};
return <AppDataContext.Provider value={value}>{children}</AppDataContext.Provider>;
};
export { AppDataProvider, AppDataContext };