diff --git a/src/app/components/floating-column/floating-column.component.html b/src/app/components/floating-column/floating-column.component.html index bc8106b4..8ca112ed 100644 --- a/src/app/components/floating-column/floating-column.component.html +++ b/src/app/components/floating-column/floating-column.component.html @@ -1,5 +1,7 @@
- +
x @@ -8,6 +10,8 @@ - +
\ No newline at end of file diff --git a/src/app/components/floating-column/search/search.component.html b/src/app/components/floating-column/search/search.component.html index 619fbd67..1e2089e8 100644 --- a/src/app/components/floating-column/search/search.component.html +++ b/src/app/components/floating-column/search/search.component.html @@ -12,7 +12,7 @@

Accounts

@@ -30,7 +30,9 @@

Statuses

- +
\ No newline at end of file diff --git a/src/app/components/floating-column/search/search.component.ts b/src/app/components/floating-column/search/search.component.ts index 1ec03ecf..dea93cbe 100644 --- a/src/app/components/floating-column/search/search.component.ts +++ b/src/app/components/floating-column/search/search.component.ts @@ -23,12 +23,11 @@ export class SearchComponent implements OnInit { isLoading: boolean; - @Output() browseAccount = new EventEmitter(); - @Output() browseHashtag = new EventEmitter(); - @Output() browseThread = new EventEmitter(); + @Output() browseAccountEvent = new EventEmitter(); + @Output() browseHashtagEvent = new EventEmitter(); + @Output() browseThreadEvent = new EventEmitter(); constructor( - private readonly store: Store, private readonly toolsService: ToolsService, private readonly mastodonService: MastodonService) { } @@ -41,9 +40,9 @@ export class SearchComponent implements OnInit { return false; } - selectHashtag(hashtag: string): boolean { + browseHashtag(hashtag: string): boolean { if (hashtag) { - this.browseHashtag.next(hashtag); + this.browseHashtagEvent.next(hashtag); } return false; } @@ -57,10 +56,10 @@ export class SearchComponent implements OnInit { // return false; // } - selectAccount(accountName: string): boolean { + browseAccount(accountName: string): boolean { console.warn(accountName); if (accountName) { - this.browseAccount.next(accountName); + this.browseAccountEvent.next(accountName); } return false; } @@ -97,9 +96,4 @@ export class SearchComponent implements OnInit { .then(() => { this.isLoading = false; }); } } - - private getRegisteredAccounts(): AccountInfo[] { - var regAccounts = this.store.snapshot().registeredaccounts.accounts; - return regAccounts; - } } diff --git a/src/app/components/stream/hashtag/hashtag.component.html b/src/app/components/stream/hashtag/hashtag.component.html index 5945cffd..7f13a754 100644 --- a/src/app/components/stream/hashtag/hashtag.component.html +++ b/src/app/components/stream/hashtag/hashtag.component.html @@ -6,6 +6,10 @@ - + \ No newline at end of file diff --git a/src/app/components/stream/hashtag/hashtag.component.ts b/src/app/components/stream/hashtag/hashtag.component.ts index f1f4835e..d6273593 100644 --- a/src/app/components/stream/hashtag/hashtag.component.ts +++ b/src/app/components/stream/hashtag/hashtag.component.ts @@ -10,8 +10,9 @@ import { StreamElement, StreamTypeEnum, AddStream } from '../../../states/stream styleUrls: ['./hashtag.component.scss'] }) export class HashtagComponent implements OnInit { - @Output() browseAccount = new EventEmitter(); - @Output() browseHashtag = new EventEmitter(); + @Output() browseAccountEvent = new EventEmitter(); + @Output() browseHashtagEvent = new EventEmitter(); + @Output() browseThreadEvent = new EventEmitter(); @Input() hashtagElement: StreamElement; @@ -38,11 +39,15 @@ export class HashtagComponent implements OnInit { return false; } - selectAccount(account: string) { - this.browseAccount.next(account); + browseAccount(account: string) { + this.browseAccountEvent.next(account); } - selectHashtag(hashtag: string) { - this.browseHashtag.next(hashtag); + browseHashtag(hashtag: string) { + this.browseHashtagEvent.next(hashtag); + } + + browseThread(statusUri: string): void { + this.browseThreadEvent.next(statusUri); } } diff --git a/src/app/components/stream/status/status.component.ts b/src/app/components/stream/status/status.component.ts index 47c99fc2..15a50e53 100644 --- a/src/app/components/stream/status/status.component.ts +++ b/src/app/components/stream/status/status.component.ts @@ -1,11 +1,7 @@ -import { Component, OnInit, Input, Output, Inject, LOCALE_ID, ElementRef, EventEmitter, Pipe, PipeTransform, ViewChild, Renderer2 } from "@angular/core"; +import { Component, OnInit, Input, Output, EventEmitter } from "@angular/core"; import { Status, Account } from "../../../services/models/mastodon.interfaces"; -import { formatDate } from '@angular/common'; -import { stateNameErrorMessage } from "@ngxs/store/src/decorators/state"; import { StatusWrapper } from "../stream.component"; -import { DomSanitizer } from '@angular/platform-browser' - @Component({ selector: "app-status", templateUrl: "./status.component.html", @@ -17,9 +13,9 @@ export class StatusComponent implements OnInit { hasAttachments: boolean; replyingToStatus: boolean; - @Output() browseAccount = new EventEmitter(); - @Output() browseHashtag = new EventEmitter(); - @Output() browseThread = new EventEmitter(); + @Output() browseAccountEvent = new EventEmitter(); + @Output() browseHashtagEvent = new EventEmitter(); + @Output() browseThreadEvent = new EventEmitter(); private _statusWrapper: StatusWrapper; status: Status; @@ -28,10 +24,6 @@ export class StatusComponent implements OnInit { this._statusWrapper = value; this.status = value.status; - //TEST - //this.status.content += '

TEST'; - - if (this.status.reblog) { this.reblog = true; this.displayedStatus = this.status.reblog; @@ -46,58 +38,25 @@ export class StatusComponent implements OnInit { if (this.displayedStatus.media_attachments && this.displayedStatus.media_attachments.length > 0) { this.hasAttachments = true; } - - } get statusWrapper(): StatusWrapper { return this._statusWrapper; } - - constructor(@Inject(LOCALE_ID) private locale: string) { } + constructor() { } ngOnInit() { } - // ngAfterViewInit() { - // let el = this.contentElement.nativeElement.querySelector('.test'); - // console.log(this.contentElement.nativeElement); - // console.log(el); - // if (el) - // this.renderer.listen(el, 'click', (el2) => { - // console.log(el2); - // console.warn('YOOOOO'); - // return false; - // }); - // } - openAccount(account: Account): boolean { - let accountName = account.acct; - if(!accountName.includes('@')) - accountName += `@${account.url.replace('https://', '').split('/')[0]}`; + let accountName = account.acct; + if (!accountName.includes('@')) + accountName += `@${account.url.replace('https://', '').split('/')[0]}`; - this.browseAccount.next(accountName); + this.browseAccountEvent.next(accountName); return false; } - // getCompactRelativeTime(d: string): string { - // const date = (new Date(d)).getTime(); - // const now = Date.now(); - // const timeDelta = (now - date) / (1000); - - // if (timeDelta < 60) { - // return `${timeDelta | 0}s`; - // } else if (timeDelta < 60 * 60) { - // return `${timeDelta / 60 | 0}m`; - // } else if (timeDelta < 60 * 60 * 24) { - // return `${timeDelta / (60 * 60) | 0}h`; - // } else if (timeDelta < 60 * 60 * 24 * 31) { - // return `${timeDelta / (60 * 60 * 24) | 0}d`; - // } - - // return formatDate(date, 'MM/dd', this.locale); - // } - openReply(): boolean { this.replyingToStatus = !this.replyingToStatus; @@ -109,22 +68,21 @@ export class StatusComponent implements OnInit { return false; } - // test(): boolean { - // console.warn('heeeeyaaa!'); - // return false; - // } - accountSelected(accountName: string): void { - console.warn(`status comp: accountSelected ${accountName}`); - this.browseAccount.next(accountName); + this.browseAccountEvent.next(accountName); } hashtagSelected(hashtag: string): void { - console.warn(`status comp: hashtagSelected ${hashtag}`); - this.browseHashtag.next(hashtag); + this.browseHashtagEvent.next(hashtag); } textSelected(): void { - console.warn(`status comp: textSelected`); + const status = this._statusWrapper.status; + + if (status.reblog) { + this.browseThreadEvent.next(status.reblog.uri); + } else { + this.browseThreadEvent.next(this._statusWrapper.status.uri); + } } } diff --git a/src/app/components/stream/stream-overlay/stream-overlay.component.html b/src/app/components/stream/stream-overlay/stream-overlay.component.html index 77f68df8..9d06ac34 100644 --- a/src/app/components/stream/stream-overlay/stream-overlay.component.html +++ b/src/app/components/stream/stream-overlay/stream-overlay.component.html @@ -5,11 +5,17 @@ REFRESH NEXT - - - - + + + \ No newline at end of file diff --git a/src/app/components/stream/stream-overlay/stream-overlay.component.ts b/src/app/components/stream/stream-overlay/stream-overlay.component.ts index f43bfbbe..f7eeafcc 100644 --- a/src/app/components/stream/stream-overlay/stream-overlay.component.ts +++ b/src/app/components/stream/stream-overlay/stream-overlay.component.ts @@ -10,6 +10,7 @@ import { StreamElement, StreamTypeEnum } from '../../../states/streams.state'; styleUrls: ['./stream-overlay.component.scss'] }) export class StreamOverlayComponent implements OnInit { + private previousElements: OverlayBrowsing[] = []; private nextElements: OverlayBrowsing[] = []; private currentElement: OverlayBrowsing; @@ -24,21 +25,20 @@ export class StreamOverlayComponent implements OnInit { @Output() closeOverlay = new EventEmitter(); - @Input('browseAccount') - set browseAccount(accountName: string) { - this.accountSelected(accountName); + @Input('browseAccountData') + set browseAccountData(accountName: string) { + this.browseAccount(accountName); // this.accountName = accountName; } - @Input('browseThread') - set browseThread(thread: string) { - // this.thread = thread; + @Input('browseThreadData') + set browseThreadData(statusUri: string) { + this.browseThread(statusUri); } - @Input('browseHashtag') - set browseHashtag(hashtag: string) { - this.hashtagSelected(hashtag); - // this.hashtag = hashtag; + @Input('browseHashtagData') + set browseHashtagData(hashtag: string) { + this.browseHashtag(hashtag); } constructor(private toolsService: ToolsService) { } @@ -93,7 +93,7 @@ export class StreamOverlayComponent implements OnInit { return false; } - accountSelected(accountName: string): void { + browseAccount(accountName: string): void { if(!accountName) return; console.log('accountSelected'); @@ -106,7 +106,7 @@ export class StreamOverlayComponent implements OnInit { this.canGoForward = false; } - hashtagSelected(hashtag: string): void { + browseHashtag(hashtag: string): void { if(!hashtag) return; console.log('hashtagSelected'); @@ -122,6 +122,20 @@ export class StreamOverlayComponent implements OnInit { this.canGoForward = false; } + browseThread(statusUri: string): any { + if(!statusUri) return; + + console.log('thread selected') + this.nextElements.length = 0; + if (this.currentElement) { + this.previousElements.push(this.currentElement); + } + + const newElement = new OverlayBrowsing(null, null, statusUri); + this.loadElement(newElement); + this.canGoForward = false; + } + private loadElement(element: OverlayBrowsing) { this.currentElement = element; diff --git a/src/app/components/stream/stream-statuses/stream-statuses.component.html b/src/app/components/stream/stream-statuses/stream-statuses.component.html index 43918a72..e9f6dec7 100644 --- a/src/app/components/stream/stream-statuses/stream-statuses.component.html +++ b/src/app/components/stream/stream-statuses/stream-statuses.component.html @@ -1,6 +1,9 @@
+ +
- +
-
\ No newline at end of file + \ No newline at end of file diff --git a/src/app/components/stream/stream-statuses/stream-statuses.component.ts b/src/app/components/stream/stream-statuses/stream-statuses.component.ts index edb1dc5b..9c486025 100644 --- a/src/app/components/stream/stream-statuses/stream-statuses.component.ts +++ b/src/app/components/stream/stream-statuses/stream-statuses.component.ts @@ -16,6 +16,7 @@ import { StatusWrapper } from '../stream.component'; styleUrls: ['./stream-statuses.component.scss'] }) export class StreamStatusesComponent implements OnInit, OnDestroy { + isLoading = false; //TODO private _streamElement: StreamElement; private account: AccountInfo; @@ -25,9 +26,9 @@ export class StreamStatusesComponent implements OnInit, OnDestroy { private bufferStream: Status[] = []; private bufferWasCleared: boolean; - @Output() browseAccount = new EventEmitter(); - @Output() browseHashtag = new EventEmitter(); - @Output() browseThread = new EventEmitter(); + @Output() browseAccountEvent = new EventEmitter(); + @Output() browseHashtagEvent = new EventEmitter(); + @Output() browseThreadEvent = new EventEmitter(); @Input() set streamElement(streamElement: StreamElement) { @@ -125,14 +126,16 @@ export class StreamStatusesComponent implements OnInit, OnDestroy { } } - accountSelected(accountName: string): void { - console.warn(`status comp: accountSelected ${accountName}`); - this.browseAccount.next(accountName); + browseAccount(accountName: string): void { + this.browseAccountEvent.next(accountName); } - hashtagSelected(hashtag: string): void { - console.warn(`status comp: hashtagSelected ${hashtag}`); - this.browseHashtag.next(hashtag); + browseHashtag(hashtag: string): void { + this.browseHashtagEvent.next(hashtag); + } + + browseThread(statusUri: string): void { + this.browseThreadEvent.next(statusUri); } textSelected(): void { diff --git a/src/app/components/stream/stream.component.html b/src/app/components/stream/stream.component.html index cd7b94dd..c47d64f2 100644 --- a/src/app/components/stream/stream.component.html +++ b/src/app/components/stream/stream.component.html @@ -2,15 +2,16 @@ + [browseAccountData]="overlayAccountToBrowse" + [browseHashtagData]="overlayHashtagToBrowse" + [browseThreadData]="overlayThreadToBrowse"> - +
@@ -24,7 +25,10 @@
- +
diff --git a/src/app/components/stream/user-profile/user-profile.component.ts b/src/app/components/stream/user-profile/user-profile.component.ts index 47debcb4..ec82cee9 100644 --- a/src/app/components/stream/user-profile/user-profile.component.ts +++ b/src/app/components/stream/user-profile/user-profile.component.ts @@ -21,8 +21,9 @@ export class UserProfileComponent implements OnInit { private accountName: string; - @Output() browseAccount = new EventEmitter(); - @Output() browseHashtag = new EventEmitter(); + @Output() browseAccountEvent = new EventEmitter(); + @Output() browseHashtagEvent = new EventEmitter(); + @Output() browseThreadEvent = new EventEmitter(); @Input('currentAccount') //set currentAccount(account: Account) { @@ -51,12 +52,16 @@ export class UserProfileComponent implements OnInit { ngOnInit() { } - accountSelected(accountName: string): void { - this.browseAccount.next(accountName); + browseAccount(accountName: string): void { + this.browseAccountEvent.next(accountName); } - hashtagSelected(hashtag: string): void { - this.browseHashtag.next(hashtag); + browseHashtag(hashtag: string): void { + this.browseHashtagEvent.next(hashtag); + } + + browseThread(statusUri: string): void { + this.browseThreadEvent.next(statusUri); } private loadAccount(accountName: string): Promise { diff --git a/src/app/services/mastodon.service.ts b/src/app/services/mastodon.service.ts index aa798712..ab81b988 100644 --- a/src/app/services/mastodon.service.ts +++ b/src/app/services/mastodon.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { HttpHeaders, HttpClient } from '@angular/common/http'; import { ApiRoutes } from './models/api.settings'; -import { Account, Status, Results } from "./models/mastodon.interfaces"; +import { Account, Status, Results, Context } from "./models/mastodon.interfaces"; import { AccountInfo } from '../states/accounts.state'; import { StreamTypeEnum } from '../states/streams.state'; import { stat } from 'fs'; @@ -129,6 +129,14 @@ export class MastodonService { return this.httpClient.get(route+params, { headers: headers }).toPromise(); } + getStatusContext(account: AccountInfo, targetStatusId: string): Promise{ + const params = this.apiRoutes.getStatusContext.replace('{0}', targetStatusId); + const route = `https://${account.instance}${params}`; + + const headers = new HttpHeaders({ 'Authorization': `Bearer ${account.token.access_token}` }); + return this.httpClient.get(route, { headers: headers }).toPromise(); + } + searchAccount(account: AccountInfo, query: string, limit: number = 40, following: boolean = false): Promise{ const route = `https://${account.instance}${this.apiRoutes.searchForAccounts}?q=${query}&limit=${limit}&following=${following}`; const headers = new HttpHeaders({ 'Authorization': `Bearer ${account.token.access_token}` });