socialnetworknews-web

A open-source Paper.li clone
git clone git://archive.git.mtrnord.blog/SocialNetworkNews/socialnetworknews-web.git
Log | Files | Refs | README | LICENSE

commit 5e802451ac983c1548cec1925a4dd5bb92ce39cf
parent 4fc152c0f8aa40c946a670457fd7329192a095b3
Author: MTRNord <mtrnord1@gmail.com>
Date:   Tue, 13 Feb 2018 21:40:55 +0100

Prepare for not yet published API Server

Diffstat:
Asrc/app/api.service.spec.ts | 15+++++++++++++++
Asrc/app/api.service.ts | 16++++++++++++++++
Msrc/app/app.module.ts | 8++++++--
Msrc/app/paper/paper.component.html | 2+-
Msrc/app/paper/paper.component.ts | 17++++++-----------
Msrc/app/tweet-list/tweet-list.component.html | 18++++++++++--------
Msrc/app/tweet-list/tweet-list.component.ts | 29++++++++++++++++++++++++++---
Msrc/styles.scss | 2+-
8 files changed, 81 insertions(+), 26 deletions(-)

diff --git a/src/app/api.service.spec.ts b/src/app/api.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { ApiService } from './api.service'; + +describe('ApiService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ApiService] + }); + }); + + it('should be created', inject([ApiService], (service: ApiService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/api.service.ts b/src/app/api.service.ts @@ -0,0 +1,16 @@ +import {Inject, Injectable} from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import {DOCUMENT} from '@angular/common'; + +@Injectable() +export class ApiService { + private url; + constructor(@Inject(DOCUMENT) private document, private http: HttpClient) { + this.url = document.location.protocol + '//' + document.location.hostname + ':8000'; + } + + // Uses http.get() to load data from a single API endpoint + getYesterday(uuid: string) { + return this.http.get(`${this.url}/paper/${uuid}/yesterday`); + } +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts @@ -1,13 +1,13 @@ import { BrowserModule } from '@angular/platform-browser'; import {NgModule} from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { MDBBootstrapModule } from 'angular-bootstrap-md'; import { ScrollbarModule } from './utils/scrollbar'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import {GalleryConfig, GalleryModule} from 'ng-gallery'; import { AvatarModule } from 'ngx-avatar'; - import { AppComponent } from './app.component'; import { MainComponent } from './main/main.component'; import {AppRoutingModule} from './app.routing'; @@ -16,6 +16,8 @@ import { PapersComponent } from './papers/papers.component'; import { TweetListComponent } from './tweet-list/tweet-list.component'; import { PapersListComponent } from './papers-list/papers-list.component'; +import { ApiService } from './api.service'; + export const config: GalleryConfig = { 'gestures': true, @@ -46,8 +48,10 @@ export const config: GalleryConfig = { BrowserAnimationsModule, GalleryModule.forRoot(config), AvatarModule, + HttpClientModule, ], providers: [ + ApiService, ], bootstrap: [AppComponent] }) diff --git a/src/app/paper/paper.component.html b/src/app/paper/paper.component.html @@ -56,7 +56,7 @@ <div class="container-fluid" *ngIf="isBrowser" gallerize> <div class="row"> <div class="col-xl-9"> - <app-tweet-list [data]="chunkedData"></app-tweet-list> + <app-tweet-list [uuid]="uuid"></app-tweet-list> </div> <!--Card--> <div class="col-xl-3"> diff --git a/src/app/paper/paper.component.ts b/src/app/paper/paper.component.ts @@ -1,6 +1,6 @@ import {Component, Inject, PLATFORM_ID, ViewEncapsulation} from '@angular/core'; import {isPlatformBrowser} from '@angular/common'; -import {TweetListComponent} from '../tweet-list/tweet-list.component'; +import {ActivatedRoute} from '@angular/router'; @Component({ selector: 'app-paper', @@ -11,19 +11,14 @@ import {TweetListComponent} from '../tweet-list/tweet-list.component'; export class PaperComponent { paperTitle = 'Test Paper'; paperSubtitle = 'Something to test'; - private testData: Array<object> = [{title: 'Simon Wüllhorst', 'userLink': 'https://twitter.com/des_cilla', text: 'Yaay, neue LTE-Antennen sind da. Es gibt bald endlich wieder schnelles Internet auf dem Dorf. :) #Freifunk', imageURL: 'https://pbs.twimg.com/media/DVmb2UCWsAA8oTD.jpg', createdAt: '09.02.2018', replies: 0, favs: 2, retweets: 1}, {title: 'Jason Scott', retweet: true, 'userLink': 'https://twitter.com/textfiles', imageURL: 'https://pbs.twimg.com/media/DVZ5gw0U0AA_mOu.jpg', createdAt: '07.02.2018', replies: 75, favs: 8003, retweets: 2813}, {title: 'Christian Dresel', 'userLink': 'https://twitter.com/DreselChristian', text: 'Soviel Richtfunk (blaue Linien)... soooo geiiiilllll :) @freifunk @FreifunkFranken #freifunk', imageURL: 'https://pbs.twimg.com/media/DViJcIRX0AAk1TT.jpg:large', createdAt: '08.02.2018', replies: 1, favs: 3, retweets: 0}]; - public chunkedData = this.chunk(this.testData, 3); + private uuid: string; + private testData: Array<object> = [{title: 'Simon Wüllhorst', userLink: 'https://twitter.com/des_cilla', text: 'Yaay, neue LTE-Antennen sind da. Es gibt bald endlich wieder schnelles Internet auf dem Dorf. :) #Freifunk', imageURL: 'https://pbs.twimg.com/media/DVmb2UCWsAA8oTD.jpg', createdAt: '09.02.2018', replies: 0, favs: 2, retweets: 1}, {title: 'Jason Scott', retweet: true, 'userLink': 'https://twitter.com/textfiles', imageURL: 'https://pbs.twimg.com/media/DVZ5gw0U0AA_mOu.jpg', createdAt: '07.02.2018', replies: 75, favs: 8003, retweets: 2813}, {title: 'Christian Dresel', 'userLink': 'https://twitter.com/DreselChristian', text: 'Soviel Richtfunk (blaue Linien)... soooo geiiiilllll :) @freifunk @FreifunkFranken #freifunk', imageURL: 'https://pbs.twimg.com/media/DViJcIRX0AAk1TT.jpg:large', createdAt: '08.02.2018', replies: 1, favs: 3, retweets: 0}]; isBrowser: boolean; - constructor(@Inject(PLATFORM_ID) platformId: Object) { + constructor(@Inject(PLATFORM_ID) platformId: Object, private route: ActivatedRoute) { this.isBrowser = isPlatformBrowser(platformId); + this.uuid = this.route.snapshot.params.paperUUID; } - private chunk(arr, size) { - const newArr = []; - for (let i = 0; i < arr.length; i += size) { - newArr.push(arr.slice(i, i + size)); - } - return newArr; - } + } diff --git a/src/app/tweet-list/tweet-list.component.html b/src/app/tweet-list/tweet-list.component.html @@ -1,4 +1,4 @@ -<div class="row" *ngFor="let rows of data"> +<div class="row mb-5" *ngFor="let rows of data"> <div class="card-deck col-md-4" *ngFor="let item of rows"> <div class="card card-cascade"> <!--Retweet Badge--> @@ -6,27 +6,29 @@ <i class="fa fa-retweet"></i> </div> <!--Card image--> - <div class="overlay hm-white-slight waves-light card-img-top" *ngIf="item.imageURL"> + <!-- Todo Fix for more than one image --> + <!--<div class="overlay hm-white-slight waves-light card-img-top" *ngIf="item.imageURL"> <img [src]="item.imageURL" class="img-fluid" style="z-index: 0"> <a> <div class="mask"></div> </a> - </div> + </div>--> <!--Card content--> <div class="card-body"> <!--Title when Text exists--> - <h4 class="card-title text-left" *ngIf="(item.text && item.imageURL) || (item.text && !item.imageURL)"><a href="{{item.userLink}}">{{item.title}}</a></h4> + <!-- Todo Fix for more than one image --> + <!-- <h4 class="card-title text-left" *ngIf="(item.text && item.imageURL) || (item.text && !item.imageURL)"><a href="{{item.userprofile_link}}">{{item.username}}</a></h4> <!--Title when no Text exists--> - <h4 class="card-title align-middle" *ngIf="!item.text || !item.imageURL"><a href="{{item.userLink}}">{{item.title}}</a></h4> + <!-- Todo Fix for more than one image --> + <h4 class="card-title align-middle" *ngIf="!item.text || !item.imageURL"><a href="{{item.userprofile_link}}">{{item.username}}</a></h4> <!--Text--> <p class="card-text text-justify" *ngIf="item.text">{{item.text}}</p> </div> <!-- Card footer --> <div class="card-data"> <ul> - <li><i class="fa fa-clock-o">&nbsp;</i>{{item.createdAt.toLocaleString()}}</li>&nbsp; - <li><i class="fa fa-comments-o">&nbsp;</i>{{item.replies.toLocaleString()}}</li>&nbsp; - <li><i class="fa fa-heart">&nbsp;</i>{{item.favs.toLocaleString()}}</li>&nbsp; + <li><i class="fa fa-clock-o">&nbsp;</i>{{item.created_at.toLocaleString()}}</li>&nbsp; + <li><i class="fa fa-heart">&nbsp;</i>{{item.favorites.toLocaleString()}}</li>&nbsp; <li><i class="fa fa-retweet">&nbsp;</i>{{item.retweets.toLocaleString()}}</li>&nbsp; </ul> </div> diff --git a/src/app/tweet-list/tweet-list.component.ts b/src/app/tweet-list/tweet-list.component.ts @@ -1,11 +1,34 @@ -import {Component, Input} from '@angular/core'; +import {Component, Input, OnInit} from '@angular/core'; +import {ApiService} from '../api.service'; @Component({ selector: 'app-tweet-list', templateUrl: './tweet-list.component.html', styleUrls: ['./tweet-list.component.scss'] }) -export class TweetListComponent { - @Input() data; +export class TweetListComponent implements OnInit { + @Input() uuid; + data; + + constructor(private apiService: ApiService) {} + + ngOnInit() { this.getYesterday(); } + + getYesterday() { + this.apiService.getYesterday(this.uuid) + .subscribe( + data => { this.data = this.chunk(data['tweets'], 3); }, + err => console.error('API ERR: ', err), + () => console.log('done loading Yesterday') + ); + } + + private chunk(arr, size) { + const newArr = []; + for (let i = 0; i < arr.length; i += size) { + newArr.push(arr.slice(i, i + size)); + } + return newArr; + } } diff --git a/src/styles.scss b/src/styles.scss @@ -1,6 +1,6 @@ /* You can add global styles to this file, and also import other style files */ html { overflow:auto; } -.navbar.navbar-dark .breadcrumb .nav-item.active > .nav-link, .navbar.navbar-dark .navbar-nav .nav-item.active > .nav-link { +.navbar.navbar-dark, .navbar.navbar-light .breadcrumb .nav-item.active > .nav-link, .navbar.navbar-dark .navbar-nav .nav-item.active > .nav-link { border-radius: 5px; }