|
1 | 1 | import { platforms, PlatformSpec } from "../../../../shared/platforms"; |
2 | 2 | import { ServiceStateCache, ServiceState, ServiceIdentifier } from "../../../../shared/services"; |
| 3 | +import { getTz } from "../../../../shared/users"; |
3 | 4 | import { sites, siteSentryNames, sitesWithState } from "../sites"; |
4 | 5 | import { EMPTY_STATUS, Status } from "../status/status.interface"; |
5 | 6 | import { pullEmoji } from "../utility/pullEmoji"; |
@@ -30,6 +31,7 @@ export class DataModel { |
30 | 31 |
|
31 | 32 | sprintDays = []; |
32 | 33 |
|
| 34 | + contributionUsers = []; |
33 | 35 |
|
34 | 36 | // Phase data, grabbing from github's milestones for the keyman repo |
35 | 37 | milestones = {}; |
@@ -98,6 +100,7 @@ export class DataModel { |
98 | 100 | break; |
99 | 101 | case ServiceIdentifier.GitHubContributions: |
100 | 102 | this.status.contributions = data.contributions; |
| 103 | + this.transformContributionUsers(); |
101 | 104 | break; |
102 | 105 | case ServiceIdentifier.CommunitySite: |
103 | 106 | this.status.communitySite = this.transformCommunitySiteData(data.communitySite.contributions); |
@@ -142,6 +145,34 @@ export class DataModel { |
142 | 145 | } |
143 | 146 | } |
144 | 147 |
|
| 148 | + nullUser = { login:'', avatarUrl: null, contributions: { |
| 149 | + issues: { nodes: [] }, |
| 150 | + pullRequests: { nodes: [] }, |
| 151 | + reviews: { nodes: [] }, |
| 152 | + tests: { nodes: [] }, |
| 153 | + } }; |
| 154 | + |
| 155 | + private getTimezoneOffset(timeZone){ |
| 156 | + if(!timeZone) return undefined; |
| 157 | + const str = new Date().toLocaleString('en', {timeZone, timeZoneName: 'longOffset'}); |
| 158 | + const [_,h,m] = (str.match(/([+-]\d+):(\d+)$/) || [, '+00', '00']).map(t => parseInt(t,10)); |
| 159 | + return h * 60 + (h > 0 ? +m : -m); |
| 160 | + } |
| 161 | + |
| 162 | + transformContributionUsers() { |
| 163 | + let users = []; |
| 164 | + if(this.status?.contributions?.data.repository.contributions.nodes) { |
| 165 | + const usersWithTimeZones = this.status.contributions.data.repository.contributions.nodes.map(u => ({...u, tzOffset: this.getTimezoneOffset(getTz(u.login))})); |
| 166 | + users = [].concat([this.nullUser],usersWithTimeZones.sort( (a:any, b:any) => |
| 167 | + a.tzOffset == b.tzOffset ? a.login.localeCompare(b.login) : |
| 168 | + a.tzOffset == undefined ? 1 : |
| 169 | + b.tzOffset == undefined ? -1 : |
| 170 | + a.tzOffset - b.tzOffset |
| 171 | + )); |
| 172 | + } |
| 173 | + this.contributionUsers = users; |
| 174 | + } |
| 175 | + |
145 | 176 | transformPlatformStatusData() { |
146 | 177 | this.labeledPulls = []; |
147 | 178 |
|
|
0 commit comments