/
records.component.ts
122 lines (108 loc) · 3.7 KB
/
records.component.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Copyright 2020 The Nakama Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import {Component, Injectable, OnInit} from '@angular/core';
import {
ApiLeaderboardRecord, ApiLeaderboardRecordList,
ConsoleService, Leaderboard,
UserRole,
} from '../../console.service';
import {ActivatedRoute, ActivatedRouteSnapshot, Resolve, RouterStateSnapshot} from '@angular/router';
import {AuthenticationService} from '../../authentication.service';
import {Observable} from 'rxjs';
@Component({
templateUrl: './records.component.html',
styleUrls: ['./records.component.scss']
})
export class LeaderboardRecordsComponent implements OnInit {
public error = '';
public leaderboard: Leaderboard;
public records: Array<ApiLeaderboardRecord> = [];
public recordsMetadataOpen: Array<boolean> = [];
public nextCursor = '';
public prevCursor = '';
constructor(
private readonly route: ActivatedRoute,
private readonly consoleService: ConsoleService,
private readonly authService: AuthenticationService,
) {}
ngOnInit(): void {
this.route.data.subscribe(
d => {
this.records.length = 0;
this.records.push(...d[0].records);
this.nextCursor = d[0].next_cursor;
this.prevCursor = d[0].prev_cursor;
this.recordsMetadataOpen.length = this.records.length;
},
err => {
this.error = err;
});
this.route.parent.data.subscribe(
d => {
this.leaderboard = d[0];
},
err => {
this.error = err;
});
}
loadRecords(state: number): void {
let cursor = '';
switch (state) {
case -1:
cursor = this.prevCursor;
break;
case 0:
cursor = '';
break;
case 1:
cursor = this.nextCursor;
break;
}
this.consoleService.listLeaderboardRecords('', this.leaderboard.id, null, 100, cursor, null).subscribe(d => {
this.error = '';
this.nextCursor = d.next_cursor;
this.prevCursor = d.prev_cursor;
this.records.length = 0;
this.records.push(...d.records);
this.recordsMetadataOpen.length = 0; // wipe old records
this.recordsMetadataOpen.length = this.records.length;
}, err => {
this.error = err;
});
}
deleteRecord(event, i: number, r: ApiLeaderboardRecord): void {
event.target.disabled = true;
event.preventDefault();
this.error = '';
this.consoleService.deleteLeaderboardRecord('', r.leaderboard_id, r.owner_id).subscribe(() => {
this.error = '';
this.records.splice(i, 1);
this.recordsMetadataOpen.splice(i, 1);
}, err => {
this.error = err;
});
}
deleteAllowed(): boolean {
// only admin and developers are allowed.
return this.authService.sessionRole <= UserRole.USER_ROLE_MAINTAINER;
}
}
@Injectable({providedIn: 'root'})
export class LeaderboardRecordsResolver implements Resolve<ApiLeaderboardRecordList> {
constructor(private readonly consoleService: ConsoleService) {}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<ApiLeaderboardRecordList> {
const leaderboardId = route.parent.paramMap.get('id');
return this.consoleService.listLeaderboardRecords('', leaderboardId, null, 100, null, null);
}
}