Skip to content

Commit 11a5403

Browse files
authored
Add recently joined developers list (#44)
1 parent 17a67e4 commit 11a5403

File tree

11 files changed

+124
-23
lines changed

11 files changed

+124
-23
lines changed

.editorconfig

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ indent_style = space
55
indent_size = 2
66
charset = utf-8
77
trim_trailing_whitespace = true
8-
insert_final_newline = true
8+
insert_final_newline = true
9+
end_of_line = lf

.gitattributes

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
ignore all differences in line endings
2+
* -crlf
3+

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"lint": "vue-cli-service lint"
1010
},
1111
"dependencies": {
12+
"@vue/composition-api": "^0.6.1",
1213
"axios": "^0.19.2",
1314
"core-js": "^3.6.5",
1415
"lodash": "^4.17.15",

src/components/DeveloperCard.vue

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@
44
<div class="card-content center-align">
55
<span class="developer__rank"># {{ developer.position }}</span>
66
<a :href="`https://github.com/${developer.login}`" target="_blank">
7-
<img
8-
:src="developer.avatarUrl"
9-
:alt="`${developer.name} profile image`"
10-
class="developer__photo circle responsive-img"
11-
/>
7+
<img :src="developer.avatarUrl" :alt="`${developer.name}`" class="developer__photo circle responsive-img" />
128
<h3 class="card-title developer__name">{{ developer.name || developer.login }}</h3>
139
</a>
1410
<p>Followed by: {{ developer.followers }}</p>

src/composable/useSearchDeveloper.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import sortBy from "lodash/sortBy";
2+
import Searcher from "@/util/Searcher";
3+
import store from "../store/store";
4+
5+
const developerSearcher = new Searcher().setField("name").setField("login");
6+
7+
export function useSearchDeveloper() {
8+
function searchPopular(searchTerm) {
9+
let developers = store.state.Developers.developers;
10+
developerSearcher.setData(developers);
11+
12+
if (searchTerm) {
13+
developers = developerSearcher.findAll(searchTerm);
14+
}
15+
16+
return developers.slice(0, 10);
17+
}
18+
19+
function searchNewDevelopers(searchTerm) {
20+
let developers = store.getters["Developers/newDevelopers"];
21+
developerSearcher.setData(developers);
22+
23+
if (searchTerm) {
24+
developers = sortBy(developerSearcher.findAll(searchTerm), dev => -Number(new Date(dev.createdAt)));
25+
}
26+
27+
return developers.slice(0, 10);
28+
}
29+
30+
return { searchPopular, searchNewDevelopers };
31+
}

src/config/composition-api.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import Vue from "vue";
2+
import VueCompositionApi from "@vue/composition-api";
3+
4+
Vue.use(VueCompositionApi);

src/config/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Vue from "vue";
22
import "@/config/materialize";
3+
import "@/config/composition-api";
34

45
Vue.config.productionTip = false;

src/router/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const routes = [
2525
},
2626
{
2727
path: ":language",
28-
name: "PopularRepositories",
28+
name: "PopularRepositoriesByLanguages",
2929
component: PopularRepositories
3030
},
3131
{

src/store/Developers.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import clone from "lodash/cloneDeep";
2+
import sortBy from "lodash/sortBy";
23
import API from "@/util/api";
34

45
const state = {
@@ -49,7 +50,24 @@ const actions = {
4950
}
5051
};
5152

52-
const getters = {};
53+
const getters = {
54+
newDevelopers(state) {
55+
const lastMonthDate = new Date();
56+
const ONE_MONTH = 30;
57+
lastMonthDate.setDate(lastMonthDate.getDate() - ONE_MONTH);
58+
59+
const newDevs = state.developers.filter(dev => {
60+
return new Date(dev.createdAt) >= lastMonthDate;
61+
});
62+
63+
const sortedDevs = sortBy(newDevs, dev => -Number(new Date(dev.createdAt)));
64+
return clone(sortedDevs).map((dev, index) => {
65+
dev.position = index + 1;
66+
67+
return dev;
68+
});
69+
}
70+
};
5371

5472
export default {
5573
namespaced: true,

src/views/PopularDevelopers.vue

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,9 @@
1515

1616
<script>
1717
import { mapState } from "vuex";
18-
import sortBy from "lodash/sortBy";
1918
import DeveloperCard from "@/components/DeveloperCard";
2019
import InputSearch from "@/components/InputSearch";
21-
import Searcher from "@/util/Searcher";
22-
23-
const developerSearcher = new Searcher().setField("name").setField("login");
20+
import { useSearchDeveloper } from "@/composable/useSearchDeveloper";
2421
2522
export default {
2623
name: "PopularDevelopers",
@@ -30,25 +27,23 @@ export default {
3027
},
3128
data() {
3229
return {
33-
searchTerm: ""
30+
searchTerm: "",
31+
search: () => {}
3432
};
3533
},
3634
computed: {
3735
...mapState({
3836
developers: state => state.Developers.developers
3937
}),
4038
filteredDevelopers() {
41-
if (!this.searchTerm) {
42-
return this.developers.slice(0, 10);
43-
}
44-
45-
return sortBy(developerSearcher.findAll(this.searchTerm), dev => -dev.followers).slice(0, 10);
39+
return this.search(this.searchTerm);
4640
}
4741
},
4842
watch: {
4943
developers: {
5044
handler() {
51-
developerSearcher.setData(this.developers);
45+
const { searchPopular } = useSearchDeveloper();
46+
this.search = searchPopular;
5247
},
5348
immediate: true
5449
}

0 commit comments

Comments
 (0)