@@ -3,6 +3,8 @@ import '/src/nav-bar.css'
33import { FillList } from "./listBuilder.ts" ;
44import { cleanAllyCode , wakeServer } from "./requestMaker.ts"
55import { Chart } from "chart.js"
6+ import { getRecentSearches } from "./recentSearches.ts" ;
7+ import { populateTermsModal } from "./terms.ts"
68
79wakeServer ( ) ;
810
@@ -11,12 +13,31 @@ const submitBtn = document.getElementById("submitAllyCode") as HTMLButtonElement
1113const inputError = document . getElementById ( "inputError" ) as HTMLParagraphElement ;
1214const loadingScreen = document . getElementById ( "loadingScreen" ) as HTMLElement ;
1315const backBtn = document . getElementById ( "backToInput" ) as HTMLButtonElement ;
16+ const recentSearchList = document . getElementById ( "recentSearchList" ) as HTMLUListElement ;
17+ const noRecent = document . getElementById ( "noRecent" ) as HTMLParagraphElement ;
18+ const termsModal = document . getElementById ( "termsModal" ) as HTMLElement ;
19+ const acceptBtn = document . getElementById ( "acceptTerms" ) as HTMLButtonElement ;
20+ const closeBtn = document . getElementById ( "closeTerms" ) as HTMLButtonElement ;
21+ const openTerms = document . getElementById ( "openTerms" ) as HTMLAnchorElement ;
1422
1523const dashboardSections = document . querySelectorAll < HTMLElement > (
1624 ".player-info, .stats-grid, .charts-grid, .stats-grid-2, .back" //, .gac-info
1725) ;
1826
27+ const urlParams = new URLSearchParams ( window . location . search ) ;
28+
29+ const TERMS_VERSION = "v0"
30+
1931submitBtn . addEventListener ( "click" , async ( ) => {
32+ const termsVersion = localStorage . getItem ( "acceptedTerms" ) ;
33+ if ( termsVersion !== TERMS_VERSION ) {
34+ const agreed = await showTermsModal ( ) ;
35+ if ( ! agreed ) {
36+ alert ( "You must agree to the terms to use this site." ) ;
37+ return ;
38+ }
39+ }
40+
2041 const rawInput = allyInput . value . trim ( ) ;
2142 const allyCode = cleanAllyCode ( rawInput ) ;
2243
@@ -28,11 +49,16 @@ submitBtn.addEventListener("click", async () => {
2849 inputError . style . display = "none" ;
2950
3051 ( document . querySelector ( ".allycode-input" ) as HTMLElement ) . classList . add ( "hidden" ) ;
52+ ( document . querySelector ( ".recent-searches" ) as HTMLElement ) . classList . add ( "hidden" ) ;
3153
3254 loadingScreen . classList . remove ( "hidden" ) ;
3355
3456 await FillList ( allyCode ) ;
3557
58+ const url = new URL ( window . location . href ) ;
59+ url . searchParams . set ( "p" , allyCode ) ;
60+ window . history . replaceState ( { } , "" , url . toString ( ) ) ;
61+
3662 loadingScreen . classList . add ( "hidden" ) ;
3763 dashboardSections . forEach ( section => section . classList . remove ( "hidden" ) ) ;
3864} ) ;
@@ -73,6 +99,7 @@ export function backButton() {
7399 Object . values ( Chart . instances ) . forEach ( ( chart : any ) => chart . destroy ( ) ) ;
74100
75101 ( document . querySelector ( ".allycode-input" ) as HTMLElement ) . classList . remove ( "hidden" ) ;
102+ ( document . querySelector ( ".recent-searches" ) as HTMLElement ) . classList . remove ( "hidden" ) ;
76103
77104 allyInput . value = "" ;
78105
@@ -82,15 +109,89 @@ export function backButton() {
82109 "pipList" ,
83110 "modsList" ,
84111 "offenseModsList" ,
85- "profileStatList"
112+ "profileStatList" ,
113+ "recentSearchList"
86114 ] ;
87115
88116 listsToClear . forEach ( id => {
89117 const ul = document . getElementById ( id ) ;
90118 if ( ul ) ul . innerHTML = "" ;
91119 } ) ;
120+
121+ const url = new URL ( window . location . href ) ;
122+ url . searchParams . delete ( "p" ) ;
123+ window . history . replaceState ( { } , "" , url . toString ( ) ) ;
124+
125+ populateRecentSeen ( ) ;
92126}
93127
94128backBtn . addEventListener ( "click" , ( ) => {
95129 backButton ( ) ;
130+ } ) ;
131+
132+ function populateRecentSeen ( ) : void {
133+ let recentSearch = getRecentSearches ( ) ;
134+ recentSearch . forEach ( search => {
135+ let newButton = document . createElement ( "button" ) ;
136+ newButton . classList . add ( "recent-item" ) ;
137+ newButton . textContent = `${ search . playerName } : ${ search . allyCode } ` ;
138+ newButton . addEventListener ( "click" , ( ) => {
139+ allyInput . value = search . allyCode ;
140+ submitBtn . click ( ) ;
141+ } ) ;
142+
143+ let newEntry = document . createElement ( "li" ) ;
144+ newEntry . appendChild ( newButton ) ;
145+ recentSearchList . append ( newEntry ) ;
146+ } ) ;
147+
148+ if ( recentSearch . length > 0 ) {
149+ noRecent . classList . add ( "hidden" )
150+ }
151+ }
152+
153+ openTerms . addEventListener ( "click" , async e => {
154+ e . preventDefault ( ) ;
155+ await showTermsModal ( ) ;
156+ } ) ;
157+
158+ function showTermsModal ( ) : Promise < boolean > {
159+ return new Promise ( resolve => {
160+ termsModal . classList . remove ( "hidden" ) ;
161+
162+ const onAccept = ( ) => {
163+ localStorage . setItem ( "acceptedTerms" , TERMS_VERSION ) ;
164+ termsModal . classList . add ( "hidden" ) ;
165+ cleanup ( ) ;
166+ resolve ( true ) ;
167+ } ;
168+
169+ const onReject = ( ) => {
170+ localStorage . setItem ( "acceptedTerms" , "OPTED_OUT" ) ;
171+ termsModal . classList . add ( "hidden" ) ;
172+ cleanup ( ) ;
173+ resolve ( false ) ;
174+ } ;
175+
176+ const cleanup = ( ) => {
177+ acceptBtn . removeEventListener ( "click" , onAccept ) ;
178+ closeBtn . removeEventListener ( "click" , onReject ) ;
179+ } ;
180+
181+ acceptBtn . addEventListener ( "click" , onAccept ) ;
182+ closeBtn . addEventListener ( "click" , onReject ) ;
183+ } ) ;
184+ }
185+
186+ window . addEventListener ( "DOMContentLoaded" , ( ) => {
187+ setTimeout ( ( ) => { } , 1 )
188+
189+ const allyCodeUrlQuery = urlParams . get ( "p" ) ;
190+ if ( allyCodeUrlQuery ) {
191+ allyInput . value = allyCodeUrlQuery ;
192+ submitBtn . click ( ) ;
193+ }
194+
195+ populateRecentSeen ( ) ;
196+ populateTermsModal ( ) ;
96197} ) ;
0 commit comments