diff options
Diffstat (limited to 'overlays/spm/frontend')
-rw-r--r-- | overlays/spm/frontend/src/app/spm/spm.component.html | 4 | ||||
-rw-r--r-- | overlays/spm/frontend/src/app/spm/spm.component.sass | 7 | ||||
-rw-r--r-- | overlays/spm/frontend/src/app/spm/spm.component.ts | 23 |
3 files changed, 32 insertions, 2 deletions
diff --git a/overlays/spm/frontend/src/app/spm/spm.component.html b/overlays/spm/frontend/src/app/spm/spm.component.html index 416da91f..9b4dc2dc 100644 --- a/overlays/spm/frontend/src/app/spm/spm.component.html +++ b/overlays/spm/frontend/src/app/spm/spm.component.html | |||
@@ -31,6 +31,10 @@ | |||
31 | </ng-template> | 31 | </ng-template> |
32 | </div> | 32 | </div> |
33 | 33 | ||
34 | <button id="style-button" mat-fab color="primary" (click)="cycle_style()"> | ||
35 | <span>{{style.value}}</span> | ||
36 | </button> | ||
37 | |||
34 | <button id="add-button" mat-fab color="accent" (click)="add()"> | 38 | <button id="add-button" mat-fab color="accent" (click)="add()"> |
35 | <mat-icon aria-hidden="false" aria-label="Add" svgIcon="add"></mat-icon> | 39 | <mat-icon aria-hidden="false" aria-label="Add" svgIcon="add"></mat-icon> |
36 | </button> | 40 | </button> |
diff --git a/overlays/spm/frontend/src/app/spm/spm.component.sass b/overlays/spm/frontend/src/app/spm/spm.component.sass index 773eb879..b37baf39 100644 --- a/overlays/spm/frontend/src/app/spm/spm.component.sass +++ b/overlays/spm/frontend/src/app/spm/spm.component.sass | |||
@@ -7,6 +7,13 @@ a | |||
7 | bottom: 16px | 7 | bottom: 16px |
8 | right: 16px | 8 | right: 16px |
9 | 9 | ||
10 | #style-button | ||
11 | position: fixed | ||
12 | bottom: 16px | ||
13 | right: 88px | ||
14 | width: 7rem | ||
15 | border-radius: 28px | ||
16 | |||
10 | #mail-panel-container | 17 | #mail-panel-container |
11 | margin-bottom: 88px | 18 | margin-bottom: 88px |
12 | 19 | ||
diff --git a/overlays/spm/frontend/src/app/spm/spm.component.ts b/overlays/spm/frontend/src/app/spm/spm.component.ts index f0655b55..f6892d7c 100644 --- a/overlays/spm/frontend/src/app/spm/spm.component.ts +++ b/overlays/spm/frontend/src/app/spm/spm.component.ts | |||
@@ -2,7 +2,7 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; | |||
2 | import { MatIconRegistry, MatIconModule } from '@angular/material/icon'; | 2 | import { MatIconRegistry, MatIconModule } from '@angular/material/icon'; |
3 | import { DomSanitizer } from "@angular/platform-browser"; | 3 | import { DomSanitizer } from "@angular/platform-browser"; |
4 | import { BehaviorSubject, interval, Subscription, catchError, throwError } from 'rxjs'; | 4 | import { BehaviorSubject, interval, Subscription, catchError, throwError } from 'rxjs'; |
5 | import { HttpClient, HttpHeaders, HttpErrorResponse, HttpResponse } from '@angular/common/http'; | 5 | import { HttpClient, HttpHeaders, HttpErrorResponse, HttpResponse, HttpParams } from '@angular/common/http'; |
6 | 6 | ||
7 | import { v4 as uuidv4 } from 'uuid'; | 7 | import { v4 as uuidv4 } from 'uuid'; |
8 | import jwtDecode, { JwtPayload } from "jwt-decode"; | 8 | import jwtDecode, { JwtPayload } from "jwt-decode"; |
@@ -43,6 +43,8 @@ type SpmJwtPayload = JwtPayload & SpmJwtUnregisteredPayload; | |||
43 | 43 | ||
44 | export type SpmMail = LoadingSpmMail | LoadedSpmMail | ClaimedSpmMail | ExpiredSpmMail; | 44 | export type SpmMail = LoadingSpmMail | LoadedSpmMail | ClaimedSpmMail | ExpiredSpmMail; |
45 | 45 | ||
46 | export type SpmMailStyle = 'words' | 'consonants'; | ||
47 | |||
46 | function percentExpiration(start: Date, exp: Date, now?: Date) { | 48 | function percentExpiration(start: Date, exp: Date, now?: Date) { |
47 | if (!now) { | 49 | if (!now) { |
48 | now = new Date(); | 50 | now = new Date(); |
@@ -80,6 +82,7 @@ function updateSpmExpiration(value: SpmMail): SpmMail { | |||
80 | export class SpmComponent implements OnInit, OnDestroy { | 82 | export class SpmComponent implements OnInit, OnDestroy { |
81 | spmMails$: BehaviorSubject<Map<string, SpmMail>> = new BehaviorSubject(new Map()); | 83 | spmMails$: BehaviorSubject<Map<string, SpmMail>> = new BehaviorSubject(new Map()); |
82 | http: HttpClient; | 84 | http: HttpClient; |
85 | style: BehaviorSubject<SpmMailStyle> = new BehaviorSubject<SpmMailStyle>('words'); | ||
83 | 86 | ||
84 | intervalSubscription?: Subscription; | 87 | intervalSubscription?: Subscription; |
85 | 88 | ||
@@ -101,6 +104,10 @@ export class SpmComponent implements OnInit, OnDestroy { | |||
101 | ); | 104 | ); |
102 | 105 | ||
103 | this.http = http; | 106 | this.http = http; |
107 | |||
108 | if (['words', 'consonants'].includes(localStorage['style'])) { | ||
109 | this.style.next(localStorage['style']); | ||
110 | } | ||
104 | } | 111 | } |
105 | 112 | ||
106 | add() { | 113 | add() { |
@@ -108,7 +115,19 @@ export class SpmComponent implements OnInit, OnDestroy { | |||
108 | const curr: Map<string, SpmMail> = this.spmMails$.getValue(); | 115 | const curr: Map<string, SpmMail> = this.spmMails$.getValue(); |
109 | curr.set(ident, { state: 'loading' }); | 116 | curr.set(ident, { state: 'loading' }); |
110 | this.spmMails$.next(curr); | 117 | this.spmMails$.next(curr); |
111 | this.http.get('/spm/generate', { headers: new HttpHeaders({ 'Accept': 'text/plain' }), observe: 'body' as const, responseType: 'text' as const }).subscribe(payload => this.load(ident, payload)) | 118 | this.http.get('/spm/generate', { headers: new HttpHeaders({ 'Accept': 'text/plain' }), observe: 'body' as const, responseType: 'text' as const, params: new HttpParams().set('style', this.style.value) }).subscribe(payload => this.load(ident, payload)) |
119 | } | ||
120 | |||
121 | cycle_style() { | ||
122 | let newVal: SpmMailStyle; | ||
123 | if (this.style.value === 'words') { | ||
124 | newVal = 'consonants'; | ||
125 | } else { | ||
126 | newVal = 'words'; | ||
127 | } | ||
128 | |||
129 | this.style.next(newVal); | ||
130 | localStorage.setItem('style', newVal); | ||
112 | } | 131 | } |
113 | 132 | ||
114 | load(k: string, encoded: string) { | 133 | load(k: string, encoded: string) { |