‹ Prev
diff --git a/src/app/feeds/feed/feed.component.ts b/src/app/feeds/feed/feed.component.ts
index 7550a0bb7..ccb8aa814 100644
--- a/src/app/feeds/feed/feed.component.ts
+++ b/src/app/feeds/feed/feed.component.ts
@@ -22,7 +22,7 @@ export class FeedComponent implements OnInit {
errorMessage = '';
constructor(
- private _hackerNewsAPIService: HackerNewsAPIService,
+ private hackerNewsAPIService: HackerNewsAPIService,
private route: ActivatedRoute
) { }
@@ -34,16 +34,18 @@ export class FeedComponent implements OnInit {
});
this.pageSub = this.route.params.subscribe(params => {
- this.pageNum = params['page'] ? +params['page'] : 1;
- this._hackerNewsAPIService.fetchFeed(this.feedType, this.pageNum)
- .subscribe(
- items => this.items = items,
- error => this.errorMessage = 'Could not load ' + this.feedType + ' stories.',
- () => {
- this.listStart = ((this.pageNum - 1) * 30) + 1;
- window.scrollTo(0, 0);
- }
- );
+ this.pageNum = params.page ? +params.page : 1;
+ const feed$ = this.feedType === 'weekly'
+ ? this.hackerNewsAPIService.fetchWeeklyTop()
+ : this.hackerNewsAPIService.fetchFeed(this.feedType, this.pageNum);
+ feed$.subscribe(
+ items => this.items = items,
+ error => this.errorMessage = 'Could not load ' + this.feedType + ' stories.',
+ () => {
+ this.listStart = ((this.pageNum - 1) * 30) + 1;
+ window.scrollTo(0, 0);
+ }
+ );
});
}
}
diff --git a/src/app/shared/services/hackernews-api.service.ts b/src/app/shared/services/hackernews-api.service.ts
index e5c565364..b9ed8883b 100644
--- a/src/app/shared/services/hackernews-api.service.ts
+++ b/src/app/shared/services/hackernews-api.service.ts
@@ -1,5 +1,6 @@
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
+import { forkJoin } from 'rxjs';
import fetch from 'unfetch';
import {map } from 'rxjs/operators';
@@ -20,10 +21,20 @@ export class HackerNewsAPIService {
return lazyFetch(`${this.baseUrl}/${feedType}?page=${page}`);
}
+ fetchWeeklyTop(): Observable
{
+ const pages = [1, 2, 3, 4, 5].map(page => lazyFetch(`${this.baseUrl}/news?page=${page}`));
+ const weekAgo = Date.now() / 1000 - 7 * 24 * 3600;
+ return forkJoin(pages).pipe(
+ map(results => ([] as Story[]).concat(...results)
+ .filter(story => story.time >= weekAgo)
+ .sort((a, b) => b.points - a.points))
+ );
+ }
+
fetchItemContent(id: number): Observable {
return lazyFetch(`${this.baseUrl}/item/${id}`).pipe(map((story: Story) => {
if (story.type === 'poll') {
- let numberOfPollOptions = story.poll.length;
+ const numberOfPollOptions = story.poll.length;
story.poll_votes_count = 0;
for (let i = 1; i <= numberOfPollOptions; i++) {
this.fetchPollContent(story.id + i).subscribe(pollResults => {
@@ -63,4 +74,3 @@ function lazyFetch(url, options?) {
};
});
}
-