DrawComponent added
This commit is contained in:
1 parent
50a87f47d3
commit
e13a710fa6
9 files changed
+120
-15
No files matched your search
@@ -96,7 +96,10 @@
|
|||||||
"ssl": true,
|
"ssl": true,
|
||||||
"sslCert": ".certs/cert.pem",
|
"sslCert": ".certs/cert.pem",
|
||||||
"sslKey": ".certs/key.pem",
|
"sslKey": ".certs/key.pem",
|
||||||
"proxyConfig": "proxy.conf.json"
|
"proxyConfig": "proxy.conf.json",
|
||||||
|
"prebundle": {
|
||||||
|
"exclude": ["@postnord/web-components/loader"]
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"configurations": {
|
"configurations": {
|
||||||
"production": {
|
"production": {
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 7.2 KiB |
@@ -4,6 +4,6 @@
|
|||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer class="flex items-center justify-center p-4">
|
<footer class="flex items-center justify-center p-4">
|
||||||
<p class="text-sm">Copyright © {{ currentYear }}</p>
|
<p class="text-sm text-pn-blue-700">Copyright © {{ currentYear }}</p>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
@@ -1,21 +1,13 @@
|
|||||||
import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, signal } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { RouterOutlet } from '@angular/router';
|
import { RouterOutlet } from '@angular/router';
|
||||||
import { ConfettiService } from './confetti/confetti.service';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-root',
|
selector: 'app-root',
|
||||||
imports: [RouterOutlet],
|
imports: [RouterOutlet],
|
||||||
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
||||||
templateUrl: './app.component.html',
|
templateUrl: './app.component.html',
|
||||||
styleUrl: './app.component.css'
|
styleUrl: './app.component.css'
|
||||||
})
|
})
|
||||||
export class App {
|
export class App {
|
||||||
private readonly confettiService = inject(ConfettiService);
|
// protected readonly title = 'PostNordLotteriet';
|
||||||
|
|
||||||
protected readonly title = signal('PostNordLotteriet');
|
|
||||||
protected readonly currentYear = new Date().getFullYear();
|
protected readonly currentYear = new Date().getFullYear();
|
||||||
|
|
||||||
protected celebrate(): void {
|
|
||||||
this.confettiService.celebrate();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,10 @@
|
|||||||
import { Routes } from '@angular/router';
|
import { Routes } from '@angular/router';
|
||||||
|
|
||||||
export const routes: Routes = [];
|
import { DrawComponent } from './draw/draw.component';
|
||||||
|
|
||||||
|
export const routes: Routes = [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
component: DrawComponent
|
||||||
|
}
|
||||||
|
];
|
||||||
Whitespace-only changes.
@@ -0,0 +1,23 @@
|
|||||||
|
<div class="relative flex w-[calc(100vw-2rem)] justify-center">
|
||||||
|
<div class="absolute inset-x-0 bottom-full mb-8 flex flex-col gap-4 text-center">
|
||||||
|
<h1 class="text-[2rem] leading-none font-bold text-pn-gray-900">Sveriges största lotteri</h1>
|
||||||
|
<p class="text-lg leading-none text-pn-gray-700">Kanske är det du som får post idag</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<pn-button [loading]="loading()" [disabled]="loading()" (click)="check()">Kolla</pn-button>
|
||||||
|
|
||||||
|
@if (result(); as result) {
|
||||||
|
<div class="absolute inset-x-0 top-full mt-8 flex justify-center">
|
||||||
|
<pn-toast
|
||||||
|
class="max-w-full"
|
||||||
|
[appearance]="result.appearance"
|
||||||
|
[text]="result.message"
|
||||||
|
closable
|
||||||
|
temporary
|
||||||
|
language="sv"
|
||||||
|
(hidden)="dismissResult()"
|
||||||
|
>
|
||||||
|
</pn-toast>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, signal } from '@angular/core';
|
||||||
|
import { HttpErrorResponse } from '@angular/common/http';
|
||||||
|
import { dematerialize, finalize, forkJoin, map, materialize, take, timer } from 'rxjs';
|
||||||
|
|
||||||
|
import { ConfettiService } from '../confetti/confetti.service';
|
||||||
|
import { ShipmentService } from '../shipment/shipment.service';
|
||||||
|
|
||||||
|
type DrawResult =
|
||||||
|
| { appearance: 'success'; message: string }
|
||||||
|
| { appearance: 'warning'; message: string }
|
||||||
|
| { appearance: 'error'; message: string };
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-draw',
|
||||||
|
imports: [],
|
||||||
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
||||||
|
templateUrl: './draw.component.html',
|
||||||
|
styleUrl: './draw.component.css'
|
||||||
|
})
|
||||||
|
export class DrawComponent {
|
||||||
|
private readonly confettiService = inject(ConfettiService);
|
||||||
|
private readonly shipmentService = inject(ShipmentService);
|
||||||
|
|
||||||
|
private readonly minimumLoadingTimeMs = 2000;
|
||||||
|
|
||||||
|
protected readonly loading = signal(false);
|
||||||
|
protected readonly result = signal<DrawResult | null>(null);
|
||||||
|
|
||||||
|
protected check(): void {
|
||||||
|
if (this.loading()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.loading.set(true);
|
||||||
|
this.result.set(null);
|
||||||
|
|
||||||
|
forkJoin([this.shipmentService.trackAndTrace().pipe(materialize(), take(1)), timer(this.minimumLoadingTimeMs)])
|
||||||
|
.pipe(
|
||||||
|
map(([notification]) => notification),
|
||||||
|
dematerialize(),
|
||||||
|
finalize(() => this.loading.set(false))
|
||||||
|
)
|
||||||
|
.subscribe({
|
||||||
|
next: (response) => {
|
||||||
|
this.result.set({
|
||||||
|
appearance: 'success',
|
||||||
|
message: response.message
|
||||||
|
});
|
||||||
|
|
||||||
|
this.confettiService.celebrate();
|
||||||
|
},
|
||||||
|
error: (error: HttpErrorResponse) => {
|
||||||
|
this.handleError(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected dismissResult(): void {
|
||||||
|
this.result.set(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private handleError(error: HttpErrorResponse): void {
|
||||||
|
switch (error.status) {
|
||||||
|
case 400:
|
||||||
|
case 429:
|
||||||
|
case 503:
|
||||||
|
this.result.set({
|
||||||
|
appearance: 'warning',
|
||||||
|
message: error.error?.message ?? 'Försöket kunde inte genomföras.'
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
this.result.set({
|
||||||
|
appearance: 'error',
|
||||||
|
message: 'Något gick fel. Försök igen senare.'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="sv">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<title>PostNordLotteriet</title>
|
<title>PostNordLotteriet</title>
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<link rel="icon" type="image/x-icon" href="favicon.ico" />
|
<link rel="icon" type="image/x-icon" href="favicon.ico" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body class="bg-linear-to-b/srgb from-white from-0% via-[#f2fcff] via-40% to-pn-blue-25 to-100%">
|
||||||
<app-root></app-root>
|
<app-root></app-root>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
Reference in new issue
Block a user