From 9199f4f0ceb9b2350f728a8aa3b100eb94d915ca Mon Sep 17 00:00:00 2001 From: Cathy Hu <cathy.hu@fau.de> Date: Thu, 3 Sep 2020 19:52:12 +0200 Subject: [PATCH] [frontend] Add email public component --- .../email-bot-card.component.html | 43 +++++++++++ .../email-bot-card.component.scss | 27 +++++++ .../email-bot-card.component.spec.ts | 24 ++++++ .../email-bot-card.component.ts | 71 ++++++++++++++++++ .../email-bot-info-dialog.component.html | 1 + .../email-bot-info-dialog.component.scss | 0 .../email-bot-info-dialog.component.ts | 12 +++ kibicara-frontend/src/assets/email.png | Bin 0 -> 7518 bytes 8 files changed, 178 insertions(+) create mode 100644 kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.html create mode 100644 kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.scss create mode 100644 kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.spec.ts create mode 100644 kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.ts create mode 100644 kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-info-dialog/email-bot-info-dialog.component.html create mode 100644 kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-info-dialog/email-bot-info-dialog.component.scss create mode 100644 kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-info-dialog/email-bot-info-dialog.component.ts create mode 100644 kibicara-frontend/src/assets/email.png diff --git a/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.html b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.html new file mode 100644 index 0000000..21b7b60 --- /dev/null +++ b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.html @@ -0,0 +1,43 @@ +<div *ngIf="emails$ | async as emails"> + <mat-card *ngIf="emails.length !== 0"> + <mat-card-header> + <div mat-card-avatar class="email"></div> + <mat-card-title class="platform-title"> + E-Mail + <button mat-icon-button aria-label="How to use"> + <mat-icon + matTooltip="How to send and receive hood broadcast messages with email" + class="info-button" + (click)="onInfoClick()" + >info</mat-icon + > + </button> + </mat-card-title> + </mat-card-header> + <mat-card-content> + <h3>Subscribe to E-Mail list:</h3> + <form class="input" [formGroup]="form" (ngSubmit)="onSubmit()"> + <mat-form-field> + <mat-label>Your E-Mail</mat-label> + <input formControlName="email" matInput /> + </mat-form-field> + <button mat-icon-button color="primary" aria-label="Add" class="button"> + <mat-icon>person_add</mat-icon> + </button> + </form> + <mat-divider></mat-divider> + <h3>Send e-mail to hood:</h3> + <mat-selection-list [multiple]="false" class="list"> + <a + *ngFor="let email of emails" + href="mailto:{{ email.name }}@{{ emailDomain }}" + > + <mat-list-option> + {{ email.name }}@{{ emailDomain }} + <mat-divider></mat-divider> + </mat-list-option> + </a> + </mat-selection-list> + </mat-card-content> + </mat-card> +</div> diff --git a/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.scss b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.scss new file mode 100644 index 0000000..6fe0019 --- /dev/null +++ b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.scss @@ -0,0 +1,27 @@ +.email { + background-image: url("../../../../assets/email.png"); + background-size: cover; +} + +.platform-title { + display: grid; + grid-template-columns: 1fr 40px; + width: 100%; + align-items: center; +} + +.input { + display: grid; + grid-template-columns: 4fr 50px; + width: 100%; + margin: 10px; +} + +.button { + align-self: stretch; +} + +h3 { + margin-top: 20px; + margin-bottom: 0px; +} diff --git a/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.spec.ts b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.spec.ts new file mode 100644 index 0000000..8ac68fa --- /dev/null +++ b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EmailBotCardComponent } from './email-bot-card.component'; + +describe('EmailBotCardComponent', () => { + let component: EmailBotCardComponent; + let fixture: ComponentFixture<EmailBotCardComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [EmailBotCardComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EmailBotCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.ts b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.ts new file mode 100644 index 0000000..3801c55 --- /dev/null +++ b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-card.component.ts @@ -0,0 +1,71 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { EmailService } from 'src/app/core/api'; +import { environment } from 'src/environments/environment'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { EmailBotInfoDialogComponent } from './email-bot-info-dialog/email-bot-info-dialog.component'; +import { MatDialog } from '@angular/material/dialog'; +import { first } from 'rxjs/operators'; +import { MatSnackBar } from '@angular/material/snack-bar'; + +@Component({ + selector: 'app-email-bot-card', + templateUrl: './email-bot-card.component.html', + styleUrls: ['./email-bot-card.component.scss'], +}) +export class EmailBotCardComponent implements OnInit { + @Input() hoodId; + emails$; + emailDomain = environment.EMAIL_DOMAIN; + form: FormGroup; + + constructor( + private emailService: EmailService, + private formBuilder: FormBuilder, + private dialog: MatDialog, + private snackBar: MatSnackBar + ) {} + + ngOnInit(): void { + this.emails$ = this.emailService.getEmailsPublic(this.hoodId); + this.form = this.formBuilder.group({ + email: ['', Validators.required], + }); + } + + onInfoClick() { + this.dialog.open(EmailBotInfoDialogComponent); + } + + onSubmit() { + if (this.form.invalid) { + return; + } + + this.emailService + .subscribe(this.hoodId, { + email: this.form.controls.email.value, + }) + .pipe(first()) + .subscribe( + (data) => { + this.form.reset(); + this.snackBar.open( + 'Successful! Check your e-mail inbox to confirm your subscription.', + 'Close', + { + duration: 2000, + } + ); + }, + (error) => { + this.snackBar.open( + 'Could not send e-mail to this address. Try again!', + 'Close', + { + duration: 2000, + } + ); + } + ); + } +} diff --git a/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-info-dialog/email-bot-info-dialog.component.html b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-info-dialog/email-bot-info-dialog.component.html new file mode 100644 index 0000000..75c28c1 --- /dev/null +++ b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-info-dialog/email-bot-info-dialog.component.html @@ -0,0 +1 @@ +<p>email-bot-info-dialog works!</p> diff --git a/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-info-dialog/email-bot-info-dialog.component.scss b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-info-dialog/email-bot-info-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-info-dialog/email-bot-info-dialog.component.ts b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-info-dialog/email-bot-info-dialog.component.ts new file mode 100644 index 0000000..2790404 --- /dev/null +++ b/kibicara-frontend/src/app/platforms/email/email-bot-card/email-bot-info-dialog/email-bot-info-dialog.component.ts @@ -0,0 +1,12 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-email-bot-info-dialog', + templateUrl: './email-bot-info-dialog.component.html', + styleUrls: ['./email-bot-info-dialog.component.scss'], +}) +export class EmailBotInfoDialogComponent implements OnInit { + constructor() {} + + ngOnInit(): void {} +} diff --git a/kibicara-frontend/src/assets/email.png b/kibicara-frontend/src/assets/email.png new file mode 100644 index 0000000000000000000000000000000000000000..9580f5065275ecd31b67ea71b3a7db1301b19e8a GIT binary patch literal 7518 zcmb_gg;x~s*IyK2Ntdprmr$e>q+_Y25s+L!x;v#7rMsj%q#Nl}8WE6g_#z+;O4q_W zzJJ4S_RQ`%b7uCrbMO7ceInkdA_#D)aX}yufr7k@2Jk!d?*wB3-&MNRIUo>jzKyi> z8wF`;hBvNGmNxblAdviERjSt;%>}x_@y^|t6i8&!Pm#%rGwL??S|Vb3sR%}h<iYoX zM;wviVD`Z35A3z%lCy!~rY1yh4%*=4Waq8AwfQGpCt#=T(c6vDj<p}@x9Lt}=$y4q zA*<iM7!2=Ba6)Wqp`hKs7wRp!Y|O8@az1_nf%7mh*fFfgMKpJa$jLF|GurPv#h2wQ znLVcL2k`EkSjH8;n?DAHFlG%6o0l;A5mQy!=d<I1NU<k8T<e2hbfNdb_dsM&2 zT=((W#$3nagc8<`z-v!HYL;~}1|azWCSm5xQCYts>tIeyXcx$YCfIO6l)Rph>Y5;} zxTGd){V|w^^*;0IrBhCXh8lSk$JT<?wfcJ}R54FXBko-{hnR|JbLi`rL!t=*S3i7) zMC{}Zsn{*xrt&+`Q=u<nqdaN{^!$Sd$~9L)ziT@lZ|i1JZ}ASkn7He_dttc=jnWQP zLO-!#gljy&ijzLQ^k@1ln0`ExwIOO`{sU@tS}6Tn@D)FkGb%RqEk#6ckr-Q)U(tA4 zj?fxSCV#g!Irn5hSD3DiL>A16zKkn8ag4&!TTv{;#^e-Ta;<Rw;{d$dsW*g`xk0Ke zIp3j{c7_ItgRx$G9aH?Cy`b~euE;q#e0<A-S2SKTvCkNH{&z7x2cD7$$Z~A?;N4B^ z{l*LUncb<r90e#gBz!1)PFEO|g~A1$_jVMYk}nX7fCNRpl1J5BHKtb)@_YcBV-S>r z2=X4|f268?<oT7V<uN@3Bn5|sKOVuL`6DR|`3SAWvd4Uq2R;C`!&yo(u;Gsdv0{Tf zov{o+soy+!K%w6rGhmqg$C3u3|4NDp7Yu)-&PXOtG8v@Iz%hj38seA7zz&TJB4*%% zedzm1ZT;#kX0lZB8_sDk8aF$XOHwBvzC*|NC`Q^TpPL7lwU<wqb~cQnhp-kK3P$vd z7;|M|Y=67{<Jt14Iw-Ek;m?yRVNrag|5E?JaP#EZg%$BELR}@j^QF}PmYOGl8ws_- zpCe}SGt{$7jiyzSFwb$%sbXX`C-57n7O4*7Vx_)JQ0;i^n7XsHVXTB6!PjKs^4NZ^ z@sdVU4`6Nto0yvN8YmMMgEV7>qJ=_QgQ*6hO~j4sbcJU@c5&x}116fa6?Ogd{`2Ja z6rK=~$n3s#=jVbXS$JHegFP1OxX!*V2$yXa=@#B)Hc_0Kh~}Q#UmJfP-Ld)!-GlF; zDDVTmgls(X4pA03ACu68EI-&e{HH<-oRV3YXe$CshQbua8`6@X3%6%AViJdSF(=3` z!Vr_D#JLS0-@<KK3>jnM#Xpe^4VZJEXw;{5WE-d*F|9Fo7rtS?A@x!eWr?cKo|JEu z_g21!NhkBBntXRQpB;HS+%Swk+>ydEv^VTC#FaYwi8ED<(O3E+846c@H>MQJ(yUso zc+{{=+p6GQ-cjUN>euF1cSm$xaWYQkjC+GCjtdR(3kkxdAd@R&FDIOd`d;i<Ojlr3 z5Ia%J_n7)qiWElyZQ=P8D=8VN18E_d8(9VE_;bY__BQcs1+~J|pK()8Q{C)k9Nz3K z&m1&uwW&33N;@PM422Y0-?Ykl>t09UO7|mJv@A*#+rKkwHI&!wna)6G(B-Lb-*M(~ zIvag8deidXRp6~{ZAP7b%c5;#kgdP%r#<RD)SlFN=N`q(JDZ>U%lsOA-}%ODqU|*J z4f(G#EHbwF-|>)A(M9vgJt++1%`Yn6s$rQepV^zsn0);+c5?OeN	vtaKyqQ>A9{ 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 D7@r%e literal 0 HcmV?d00001