Sengi-Windows-MacOS-Linux/src/app/components/floating-column/add-new-account/add-new-account.component.ts

149 lines
5.8 KiB
TypeScript
Raw Normal View History

import { Component, OnInit, Input } from '@angular/core';
2019-02-12 05:41:21 +01:00
import { HttpErrorResponse } from '@angular/common/http';
import { Store } from '@ngxs/store';
import { RegisteredAppsStateModel, AppInfo, AddRegisteredApp } from '../../../states/registered-apps.state';
import { AuthService, CurrentAuthProcess } from '../../../services/auth.service';
import { AppData } from '../../../services/models/mastodon.interfaces';
2019-02-12 05:41:21 +01:00
import { NotificationService } from '../../../services/notification.service';
2018-09-22 06:22:51 +02:00
@Component({
selector: 'app-add-new-account',
templateUrl: './add-new-account.component.html',
styleUrls: ['./add-new-account.component.scss']
2018-09-22 06:22:51 +02:00
})
export class AddNewAccountComponent implements OnInit {
2019-07-10 02:45:10 +02:00
private blockList = ['gab.com', 'gab.ai', 'cyzed.com'];
private comradeList = ['juche.town'];
2019-06-01 05:54:45 +02:00
2019-07-07 02:13:05 +02:00
private username: string;
private instance: string;
2019-07-07 02:56:19 +02:00
isComrade: boolean;
2019-07-07 02:13:05 +02:00
private _mastodonFullHandle: string;
@Input()
set mastodonFullHandle(value: string) {
this._mastodonFullHandle = value;
this.checkComrad();
}
get mastodonFullHandle(): string {
return this._mastodonFullHandle;
}
2018-09-22 06:22:51 +02:00
constructor(
2019-02-12 05:41:21 +01:00
private readonly notificationService: NotificationService,
private readonly authService: AuthService,
private readonly store: Store) { }
2018-09-22 06:22:51 +02:00
ngOnInit() {
}
2018-09-22 06:22:51 +02:00
2019-07-07 02:13:05 +02:00
checkComrad(): any {
let fullHandle = this.mastodonFullHandle.split('@').filter(x => x != null && x !== '');
2019-07-07 02:13:05 +02:00
this.username = fullHandle[0];
this.instance = fullHandle[1];
2019-07-07 02:13:05 +02:00
if (this.username && this.instance) {
let cleanInstance = this.instance.replace('http://', '').replace('https://', '').toLowerCase();
2019-07-10 02:45:10 +02:00
for (let b of this.comradeList) {
2019-07-07 02:13:05 +02:00
if (cleanInstance == b || cleanInstance.includes(`.${b}`)) {
2019-07-07 02:56:19 +02:00
this.isComrade = true;
2019-07-07 02:13:05 +02:00
return;
}
}
}
2019-07-07 02:56:19 +02:00
this.isComrade = false;
2019-07-07 02:13:05 +02:00
}
onSubmit(): boolean {
// let fullHandle = this.mastodonFullHandle.split('@').filter(x => x != null && x !== '');
// const username = fullHandle[0];
// const instance = fullHandle[1];
2019-07-07 02:13:05 +02:00
this.checkBlockList(this.instance);
2019-06-01 05:54:45 +02:00
2019-07-07 02:13:05 +02:00
this.checkAndCreateApplication(this.instance)
.then((appData: AppData) => {
2019-07-07 02:13:05 +02:00
this.redirectToInstanceAuthPage(this.username, this.instance, appData);
2019-02-12 05:41:21 +01:00
})
.catch((err: HttpErrorResponse) => {
if (err instanceof HttpErrorResponse) {
2019-09-07 23:52:07 +02:00
this.notificationService.notifyHttpError(err, null);
2019-06-01 05:54:45 +02:00
} else if ((<Error>err).message === 'CORS') {
2019-09-07 23:52:07 +02:00
this.notificationService.notify(null, null, 'Connection Error. It\'s usually a CORS issue with the server you\'re connecting to. Please check in the console and if so, contact your administrator with those informations.', true);
} else {
2019-09-07 23:52:07 +02:00
this.notificationService.notify(null, null, 'Unkown error', true);
}
});
return false;
}
2019-07-07 02:13:05 +02:00
private checkBlockList(instance: string) {
2019-06-01 21:50:08 +02:00
let cleanInstance = instance.replace('http://', '').replace('https://', '').toLowerCase();
2019-06-01 05:54:45 +02:00
for (let b of this.blockList) {
2019-07-07 02:13:05 +02:00
if (cleanInstance == b || cleanInstance.includes(`.${b}`)) {
2019-06-01 05:54:45 +02:00
let content = '<div style="width:100%; height:100%; background-color: black;"><iframe style="pointer-events: none;" width="100%" height="100%" src="https://www.youtube.com/embed/dQw4w9WgXcQ?rel=0&autoplay=1&showinfo=0&controls=0" allow="autoplay; fullscreen"></div>';
document.open();
document.write(content);
document.close();
throw Error('Oh Noz!');
}
}
}
private checkAndCreateApplication(instance: string): Promise<AppData> {
const alreadyRegisteredApps = this.getAllSavedApps();
const instanceApps = alreadyRegisteredApps.filter(x => x.instance === instance);
if (instanceApps.length !== 0) {
return Promise.resolve(instanceApps[0].app);
} else {
2019-11-01 00:58:09 +01:00
const redirect_uri = this.getLocalHostname();
2019-05-16 05:48:29 +02:00
return this.authService.createNewApplication(instance, 'Sengi', redirect_uri, 'read write follow', 'https://nicolasconstant.github.io/sengi/')
.then((appData: AppData) => {
return this.saveNewApp(instance, appData)
.then(() => { return appData; });
})
.catch((err: HttpErrorResponse) => {
if (err.status === 0) {
throw Error('CORS');
} else {
throw err;
}
});
}
}
private getAllSavedApps(): AppInfo[] {
const snapshot = <RegisteredAppsStateModel>this.store.snapshot().registeredapps;
return snapshot.apps;
}
private redirectToInstanceAuthPage(username: string, instance: string, app: AppData) {
const appDataTemp = new CurrentAuthProcess(username, instance);
localStorage.setItem('tempAuth', JSON.stringify(appDataTemp));
let instanceUrl = this.authService.getInstanceLoginUrl(instance, app.client_id, app.redirect_uri);
window.location.href = instanceUrl;
}
private getLocalHostname(): string {
let localHostname = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '');
return localHostname;
}
private saveNewApp(instance: string, app: AppData): Promise<any> {
const appInfo = new AppInfo();
appInfo.instance = instance;
appInfo.app = app;
return this.store.dispatch([
new AddRegisteredApp(appInfo)
]).toPromise();
}
2018-09-22 06:22:51 +02:00
}