2018-09-22 07:16:21 +02:00
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' ;
2018-09-22 07:16:21 +02:00
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 ( {
2018-09-22 07:16:21 +02:00
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
2018-09-22 07:16:21 +02:00
constructor (
2019-02-12 05:41:21 +01:00
private readonly notificationService : NotificationService ,
2018-09-22 07:16:21 +02:00
private readonly authService : AuthService ,
private readonly store : Store ) { }
2018-09-22 06:22:51 +02:00
2018-09-22 07:16:21 +02:00
ngOnInit() {
}
2018-09-22 06:22:51 +02:00
2019-07-07 02:13:05 +02:00
checkComrad ( ) : any {
2018-09-22 07:16:21 +02:00
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 ] ;
2018-09-22 07:16:21 +02:00
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];
2018-09-22 07:16:21 +02:00
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 )
2018-09-22 07:16:21 +02:00
. 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 ) = > {
2019-03-04 00:42:11 +01:00
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 ) ;
2019-03-04 00:42:11 +01:00
} else {
2019-09-07 23:52:07 +02:00
this . notificationService . notify ( null , null , 'Unkown error' , true ) ;
2019-03-04 00:42:11 +01:00
}
2018-09-22 07:16:21 +02:00
} ) ;
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!' ) ;
}
}
}
2018-09-22 07:16:21 +02:00
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/' )
2018-09-22 07:16:21 +02:00
. then ( ( appData : AppData ) = > {
return this . saveNewApp ( instance , appData )
. then ( ( ) = > { return appData ; } ) ;
} )
2019-03-04 00:42:11 +01:00
. catch ( ( err : HttpErrorResponse ) = > {
if ( err . status === 0 ) {
throw Error ( 'CORS' ) ;
} else {
throw err ;
}
} ) ;
2018-09-22 07:16:21 +02:00
}
}
private getAllSavedApps ( ) : AppInfo [ ] {
const snapshot = < RegisteredAppsStateModel > this . store . snapshot ( ) . registeredapps ;
return snapshot . apps ;
}
2019-03-04 00:42:11 +01:00
2018-09-22 07:16:21 +02:00
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 ;
}
2019-03-04 00:42:11 +01:00
2018-09-22 07:16:21 +02:00
private getLocalHostname ( ) : string {
let localHostname = location . protocol + '//' + location . hostname + ( location . port ? ':' + location . port : '' ) ;
return localHostname ;
2019-03-04 00:42:11 +01:00
}
2018-09-22 07:16:21 +02:00
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
}