diff --git a/packages/types/lib/scanner.d.ts b/packages/types/lib/scanner.d.ts index e6db2b943..1c1f4c36f 100644 --- a/packages/types/lib/scanner.d.ts +++ b/packages/types/lib/scanner.d.ts @@ -53,6 +53,12 @@ export interface Defender extends PokemonDisplay { cp_now: number } +export interface Rsvp { + timeslot: number + going_count: number + maybe_count: number +} + export interface Gym { id: string lat: number @@ -68,6 +74,7 @@ export interface Gym { guarding_pokemon_id: number guarding_pokemon_display: PokemonDisplay defenders: Defender[] + rsvps: Rsvp[] available_slots: number team_id: number raid_level: number diff --git a/server/src/graphql/typeDefs/scanner.graphql b/server/src/graphql/typeDefs/scanner.graphql index 3210e55ce..d2a591283 100644 --- a/server/src/graphql/typeDefs/scanner.graphql +++ b/server/src/graphql/typeDefs/scanner.graphql @@ -25,6 +25,7 @@ type Gym { guarding_pokemon_id: Int guarding_pokemon_display: JSON defenders: JSON + rsvps: JSON available_slots: Int team_id: Int raid_level: Int diff --git a/server/src/models/Gym.js b/server/src/models/Gym.js index ffb49a834..120dfde4f 100644 --- a/server/src/models/Gym.js +++ b/server/src/models/Gym.js @@ -28,6 +28,7 @@ const gymFields = [ 'guarding_pokemon_id', 'guarding_pokemon_display', 'defenders', + 'rsvps', 'total_cp', 'power_up_points', 'power_up_level', @@ -383,6 +384,9 @@ class Gym extends Model { if (typeof gym.defenders === 'string' && gym.defenders) { newGym.defenders = JSON.parse(gym.defenders) } + if (typeof gym.rsvps === 'string' && gym.rsvps) { + newGym.rsvps = JSON.parse(gym.rsvps) + } } if ( onlyRaids && diff --git a/src/features/gym/GymPopup.jsx b/src/features/gym/GymPopup.jsx index 8c11dc92e..653a182ee 100644 --- a/src/features/gym/GymPopup.jsx +++ b/src/features/gym/GymPopup.jsx @@ -92,6 +92,24 @@ export function GymPopup({ hasRaid, hasHatched, raidIconUrl, ...gym }) { ) } + const formatTime = (timestamp) => { + const locale = localStorage.getItem('i18nextLng') || 'en' + return new Date(timestamp).toLocaleTimeString(locale, { + hour: '2-digit', + minute: '2-digit', + }) + } + + const nowSec = Math.floor(Date.now() / 1000) + const raidStart = Number(gym.raid_spawn_timestamp ?? 0) + const raidEnd = Number(gym.raid_end_timestamp ?? 0) + + const filteredRsvps = + gym.rsvps?.filter((entry) => { + const etsSec = entry.timeslot / 1000 + return etsSec >= nowSec && etsSec >= raidStart && etsSec <= raidEnd + }) || [] + return ( = ts, ) && } + {filteredRsvps.length > 0 && ( + + + + RSVP + + + {filteredRsvps.slice(0, 3).map((entry) => ( + +
{formatTime(entry.timeslot)}
+
+ {entry.going_count} / {entry.maybe_count} +
+
+ ))} +
+
+
+ )}
diff --git a/src/services/queries/gym.js b/src/services/queries/gym.js index 34835458a..be0c451df 100644 --- a/src/services/queries/gym.js +++ b/src/services/queries/gym.js @@ -24,6 +24,7 @@ const gym = gql` guarding_pokemon_id guarding_pokemon_display defenders + rsvps total_cp badge power_up_level