From 373023092526ac01f53d581acc21ba51999b4d94 Mon Sep 17 00:00:00 2001 From: jenzur Date: Sun, 14 Jul 2019 02:28:16 +0200 Subject: [PATCH] saving udates, not missing much i guess --- .../src/main/java/DTO/BadgesDTO.java | 38 ++++ .../src/main/java/DTO/MapBoardDTO.java | 13 ++ .../src/main/java/facade/Facade.java | 190 +++++++++++------- .../src/main/java/rest/TimerResource.java | 32 ++- .../src/main/java/utils/Initialization.java | 9 +- RaceTimer/racetimer_react/src/App.js | 4 + .../src/Datafacade/datafacade.js | 61 +++++- .../src/Leaderboard/Leaderboard.js | 121 ++++++++--- .../racetimer_react/src/MapBoard/MapBoard.js | 65 +++++- RaceTimer/racetimer_react/src/Maps/Maps.js | 10 +- .../src/MapsSearch/mapsSearch.js | 45 +++++ .../racetimer_react/src/Player/Player.js | 16 +- RaceTimer/racetimer_react/src/css/style.css | 10 +- .../src/playerSearch/playersSearch.js | 57 ++++++ 14 files changed, 537 insertions(+), 134 deletions(-) create mode 100644 RaceTimer/racetimer_endpoints/src/main/java/DTO/BadgesDTO.java create mode 100644 RaceTimer/racetimer_react/src/MapsSearch/mapsSearch.js create mode 100644 RaceTimer/racetimer_react/src/playerSearch/playersSearch.js diff --git a/RaceTimer/racetimer_endpoints/src/main/java/DTO/BadgesDTO.java b/RaceTimer/racetimer_endpoints/src/main/java/DTO/BadgesDTO.java new file mode 100644 index 00000000..6ba2db4c --- /dev/null +++ b/RaceTimer/racetimer_endpoints/src/main/java/DTO/BadgesDTO.java @@ -0,0 +1,38 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package DTO; + +import entity.Player; +import entity.UrlBanners; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author install1 + */ +public class BadgesDTO { + + private List badgesUrls = new ArrayList(); + + public BadgesDTO(Player player) { + List urlBanners = player.getUrlBanners(); + for (UrlBanners urlbanner : urlBanners) { + badgesUrls.add(urlbanner.getBadgeUrl()); + } + } + + public List getBadgesUrls() { + return badgesUrls; + } + + public void setBadgesUrls(List badgesUrls) { + this.badgesUrls = badgesUrls; + } + + public BadgesDTO() { + } +} diff --git a/RaceTimer/racetimer_endpoints/src/main/java/DTO/MapBoardDTO.java b/RaceTimer/racetimer_endpoints/src/main/java/DTO/MapBoardDTO.java index 0eaf59af..81bfe4c5 100644 --- a/RaceTimer/racetimer_endpoints/src/main/java/DTO/MapBoardDTO.java +++ b/RaceTimer/racetimer_endpoints/src/main/java/DTO/MapBoardDTO.java @@ -6,6 +6,10 @@ package DTO; import entity.MapValues; +import entity.Player; +import entity.UrlBanners; +import java.util.ArrayList; +import java.util.List; /** * @@ -20,6 +24,7 @@ public class MapBoardDTO { private int mapTimeMinutes; private float mapTimeSeconds; private int position; + private List badgesUrls = new ArrayList(); public MapBoardDTO() { } @@ -32,6 +37,14 @@ public class MapBoardDTO { this.mapTimeMinutes = (int) Math.floor(mapvalue.getTime()); this.mapTimeSeconds = (float) (mapvalue.getTime() - Math.floor(mapvalue.getTime())) * 100; this.position = mapvalue.getPosition(); + + } + + public void setBadgesUrls(Player player) { + List urlBanners = player.getUrlBanners(); + for (UrlBanners urlbanner : urlBanners) { + badgesUrls.add(urlbanner.getBadgeUrl()); + } } public String getSteamID() { diff --git a/RaceTimer/racetimer_endpoints/src/main/java/facade/Facade.java b/RaceTimer/racetimer_endpoints/src/main/java/facade/Facade.java index 24ba0685..2da269b3 100644 --- a/RaceTimer/racetimer_endpoints/src/main/java/facade/Facade.java +++ b/RaceTimer/racetimer_endpoints/src/main/java/facade/Facade.java @@ -1,5 +1,6 @@ package facade; +import DTO.BadgesDTO; import DTO.MapBoardDTO; import DTO.MapBoardDTO2; import DTO.PlayerMapBoardDTO; @@ -52,6 +53,52 @@ public class Facade { initSetup = 1; } + private boolean getMap(String map, String Identifier) { + boolean identified = Pattern.compile(Pattern.quote(Identifier), Pattern.CASE_INSENSITIVE).matcher(map).find(); + return identified; + } + + private boolean getPlayer(Player player, String Identifier) { + boolean identified = Pattern.compile(Pattern.quote(Identifier), Pattern.CASE_INSENSITIVE).matcher(player.getName()).find(); + if (!identified) { + identified = Pattern.compile(Pattern.quote(Identifier), Pattern.CASE_INSENSITIVE).matcher(player.getSteamID()).find(); + } + return identified; + } + + public List getSearchMapsResults(String identifier) { + List arrnames = new ArrayList(mapBoardCache.keySet()); + Collections.sort(arrnames, String.CASE_INSENSITIVE_ORDER); + List arrMaps = new ArrayList(); + for (String str : arrnames) { + if (getMap(str, identifier)) { + Map.Entry getMapnameAndStage = GetMapnameAndStage(str); + String mapName = getMapnameAndStage.getKey(); + arrMaps.add(new MapBoardDTO2(mapName, getMapnameAndStage.getValue())); + } + } + return arrMaps; + } + + public List getSearchPlayerResults(String Identifier) { + List players = new ArrayList(playerCache.values()); + List playersDTO = new ArrayList(); + Collection playerAvatarsCaching = new ArrayList(); + for (Player player : players) { + if (getPlayer(player, Identifier)) { + playerAvatarsCaching.add(player); + } + } + updateAvatarsToCache(playerAvatarsCaching); + players = new ArrayList(playerCache.values()); + for (Player player : players) { + if (getPlayer(player, Identifier)) { + playersDTO.add(new PlayerDTO(player)); + } + } + return playersDTO; + } + public int getSpecificFetchMap(String mapname, int stage) { MapBoard specificMapBoardCache = mapBoardCache.getOrDefault(mapname + "S" + stage, null); if (specificMapBoardCache == null) { @@ -62,11 +109,11 @@ public class Facade { public List getAllMaps() { List arrnames = new ArrayList(mapBoardCache.keySet()); - Collections.sort(arrnames); + Collections.sort(arrnames, String.CASE_INSENSITIVE_ORDER); List arrMaps = new ArrayList(); - System.out.println("arrnames size: " + arrnames.size() + "\n"); + // System.out.println("arrnames size: " + arrnames.size() + "\n"); for (String str : arrnames) { - System.out.println("getAllMaps str: " + str + "\n"); + //System.out.println("getAllMaps str: " + str + "\n"); Map.Entry getMapnameAndStage = GetMapnameAndStage(str); String mapName = getMapnameAndStage.getKey(); arrMaps.add(new MapBoardDTO2(mapName, getMapnameAndStage.getValue())); @@ -102,17 +149,26 @@ public class Facade { int counter = 0; Collection playerAvatarsCaching = new ArrayList(); for (MapValues mapvalue : mapvalues) { - Player getPlayer = playerCache.get(mapvalue.getPlayerSteamID()); - String avatar = getPlayer.getAvatar(); - if (avatar == null) { - playerAvatarsCaching.add(getPlayer); + if (counter >= iterator && counter <= iterator + mapPlayerAddiditionCap) { + Player getPlayer = playerCache.get(mapvalue.getPlayerSteamID()); + String avatar = getPlayer.getAvatar(); + if (avatar == null) { + playerAvatarsCaching.add(getPlayer); + } } + if (counter > iterator + mapPlayerAddiditionCap) { + break; + } + counter++; } + counter = 0; updateAvatarsToCache(playerAvatarsCaching); for (MapValues mapvalue : mapvalues) { if (counter >= iterator && counter <= iterator + mapPlayerAddiditionCap) { String avatar = playerCache.get(mapvalue.getPlayerSteamID()).getAvatar(); - returnlist.add(new MapBoardDTO(mapvalue, playerCache.get(mapvalue.getPlayerSteamID()).getName(), avatar)); + MapBoardDTO mapBoardDTO = new MapBoardDTO(mapvalue, playerCache.get(mapvalue.getPlayerSteamID()).getName(), avatar); + mapBoardDTO.setBadgesUrls(playerCache.get(mapvalue.getPlayerSteamID())); + returnlist.add(mapBoardDTO); } if (counter > iterator + mapPlayerAddiditionCap) { break; @@ -128,14 +184,16 @@ public class Facade { ConcurrentMap playerMaps = playerRelatedMapValuesCache.get(steamid); List playerMapBoardDtos = new ArrayList(); int counter = 0; - for (Entry entries : playerMaps.entrySet()) { + List arrnames = new ArrayList(playerMaps.keySet()); + Collections.sort(arrnames, String.CASE_INSENSITIVE_ORDER); + for (String mapnames : arrnames) { if (counter >= iterator && counter <= iterator + playerMapsCapAddition) { PlayerMapBoardDTO mapBoardDto = new PlayerMapBoardDTO(steamid); - Map.Entry getMapnameAndStage = GetMapnameAndStage(entries.getKey()); + Map.Entry getMapnameAndStage = GetMapnameAndStage(mapnames); String mapName = getMapnameAndStage.getKey(); int stage = (getMapnameAndStage.getValue()); - //System.out.println("getPlayerMaps: " + mapName + " stage: " + stage + "\n"); - mapBoardDto.addMapValues(entries.getValue(), mapName, stage); + MapValues mapvalues = playerMaps.get(mapnames); + mapBoardDto.addMapValues(mapvalues, mapName, stage); playerMapBoardDtos.add(mapBoardDto); } if (counter > iterator + playerMapsCapAddition) { @@ -145,10 +203,15 @@ public class Facade { } return playerMapBoardDtos; } catch (Exception ex) { + System.out.println("ex: " + ex); return null; } } + public BadgesDTO getPlayerBadges(String steamID) { + return new BadgesDTO(playerCache.get(steamID)); + } + public PlayerDTO getPlayer(String steamid) { if (playerCache.get(steamid).getAvatar() == null) { Collection playerAvatarsCaching = new ArrayList(); @@ -197,62 +260,46 @@ public class Facade { Collection banners = playerUrlBanners.getOrDefault(player.getSteamID(), null); if (banners != null) { List urlBanners = new ArrayList(); - for (Integer bannerID : banners) { + //switch statement did not want to respond + for (int bannerID : banners) { String bannerName = ""; String bannerURL = ""; - switch (bannerID) { - case 2: { - bannerName = "User"; - bannerURL = "https://unloze.com/images/badges/User.png"; - } - case 6: { - bannerName = "Mapper"; - bannerURL = "https://unloze.com/images/badges/Mapper.png"; - } - case 7: { - bannerName = "Admin"; - bannerURL = "https://unloze.com/images/badges/Admin.png"; - } - case 8: { - bannerName = "Technical Staff"; - bannerURL = "https://unloze.com/images/badges/Tech-Staff.png"; - } - case 10: { - bannerName = "Leader"; - bannerURL = "https://unloze.com/images/badges/Leader.png"; - } - case 11: { - bannerName = "Global Admin"; - bannerURL = "https://unloze.com/images/badges/Global-Admin.png"; - } - case 12: { - bannerName = "VIP"; - bannerURL = "https://unloze.com/images/badges/VIP.png"; - } - case 13: { - bannerName = "Trial Admin"; - bannerURL = "https://unloze.com/images/badges/Trial_Admin.png"; - } - case 15: { - bannerName = "Event Winner"; - bannerURL = "https://unloze.com/images/badges/Event-Winner.png"; - } - case 19: { - bannerName = "Discord Manager"; - bannerURL = "https://unloze.com/images/badges/Discord-Manager.png"; - } - case 21: { - bannerName = "Retired Admin"; - bannerURL = "https://unloze.com/images/badges/Retired-Admin.png"; - } - case 25: { - bannerName = "Event Manager"; - bannerURL = "https://unloze.com/images/badges/Event-Manager.png"; - } - default: { - bannerName = ""; - bannerURL = ""; - } + if (bannerID == 2) { + bannerName = "User"; + bannerURL = "https://unloze.com/images/badges/User.png"; + } else if (bannerID == 6) { + bannerName = "Mapper"; + bannerURL = "https://unloze.com/images/badges/Mapper.png"; + } else if (bannerID == 7) { + bannerName = "Admin"; + bannerURL = "https://unloze.com/images/badges/Admin.png"; + } else if (bannerID == 8) { + bannerName = "Technical Staff"; + bannerURL = "https://unloze.com/images/badges/Tech-Staff.png"; + } else if (bannerID == 10) { + bannerName = "Leader"; + bannerURL = "https://unloze.com/images/badges/Leader.png"; + } else if (bannerID == 11) { + bannerName = "Global Admin"; + bannerURL = "https://unloze.com/images/badges/Global-Admin.png"; + } else if (bannerID == 12) { + bannerName = "VIP"; + bannerURL = "https://unloze.com/images/badges/VIP.png"; + } else if (bannerID == 13) { + bannerName = "Trial Admin"; + bannerURL = "https://unloze.com/images/badges/Trial_Admin.png"; + } else if (bannerID == 15) { + bannerName = "Event Winner"; + bannerURL = "https://unloze.com/images/badges/Event-Winner.png"; + } else if (bannerID == 19) { + bannerName = "Discord Manager"; + bannerURL = "https://unloze.com/images/badges/Discord-Manager.png"; + } else if (bannerID == 21) { + bannerName = "Retired Admin"; + bannerURL = "https://unloze.com/images/badges/Retired-Admin.png"; + } else if (bannerID == 25) { + bannerName = "Event Manager"; + bannerURL = "https://unloze.com/images/badges/Event-Manager.png"; } if (!bannerName.isEmpty() && !bannerURL.isEmpty()) { urlBanners.add(new UrlBanners(bannerName, bannerURL)); @@ -260,7 +307,6 @@ public class Facade { } player.setUrlBanners(urlBanners); } - //System.out.println("playername: " + player.getName() + "\n"); playerCache.put(player.getSteamID(), player); } } @@ -285,7 +331,7 @@ public class Facade { String avatar = jsonArray.getJSONObject(incrementer).getString("avatarfull"); String steamID = convertCommunityIdToSteamId(Long.valueOf(steamID64)); playerCache.get(steamID).setAvatar(avatar); - System.out.println("avatar: " + avatar + "\nname: " + playerCache.get(steamID).getName() + "\n"); + //System.out.println("avatar: " + avatar + "\nname: " + playerCache.get(steamID).getName() + "\n"); } catch (NumberFormatException | JSONException ex) { System.out.println("ex: " + ex.getLocalizedMessage() + "\n Nosteamer"); } @@ -351,6 +397,7 @@ public class Facade { private void orderingMapBoardValuesByTime() { Collection mapboards = mapBoardCache.values(); for (MapBoard mapboard : mapboards) { + //System.out.println("mapName: " + mapboard.getMapName()); List mapvalues = new ArrayList(mapboard.getMapvalues()); mapvalues.sort(Comparator.comparing(MapValues::getTime)); mapBoardCache.get(mapboard.getMapName()).setMapvalues(mapvalues); @@ -364,9 +411,8 @@ public class Facade { int position = 1; for (MapValues mapvalue : mapvalues) { mapvalue.setPosition(position); - float percentageSpreader = 0; - percentageSpreader = playerCount - position; - mapvalue.setMapPoints((int) Math.floor((percentageSpreader / playerCount) * 100)); + float percentageSpreader = playerCount - position; + mapvalue.setMapPoints((int) Math.floor((percentageSpreader / playerCount) * playerCount /* 100 */)); position++; } } @@ -446,7 +492,6 @@ public class Facade { Collection players = playerCache.values(); Collection mapBoards = mapBoardCache.values(); for (Player player : players) { - System.out.println("player: " + player.getName()); em.persist(player); List urlBanners = player.getUrlBanners(); for (UrlBanners urlB : urlBanners) { @@ -454,7 +499,6 @@ public class Facade { } } for (MapBoard mapboard : mapBoards) { - System.out.println("mapboard: " + mapboard.getMapName()); em.persist(mapboard); } em.getTransaction().commit(); diff --git a/RaceTimer/racetimer_endpoints/src/main/java/rest/TimerResource.java b/RaceTimer/racetimer_endpoints/src/main/java/rest/TimerResource.java index 70bf0d03..b09de028 100644 --- a/RaceTimer/racetimer_endpoints/src/main/java/rest/TimerResource.java +++ b/RaceTimer/racetimer_endpoints/src/main/java/rest/TimerResource.java @@ -31,7 +31,7 @@ public class TimerResource { facade.checkTimeElapse(); return gson.toJson(facade.getleaderBoard(iterator)); } - + @GET @Produces(MediaType.APPLICATION_JSON) @Path("allmaps") @@ -39,8 +39,8 @@ public class TimerResource { facade.checkTimeElapse(); return gson.toJson(facade.getAllMaps()); } - - @GET + + @GET @Produces(MediaType.APPLICATION_JSON) @Path("mapsizecache/{mapname}/{stage}") public String getSpecifcMapSize(@PathParam("mapname") String mapname, @PathParam("stage") int stage) { @@ -56,6 +56,14 @@ public class TimerResource { return gson.toJson(facade.getPlayer(steamid)); } + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("player/badges/{steamid}") + public String retrievePlayerBadges(@PathParam("steamid") String steamid) { + facade.checkTimeElapse(); + return gson.toJson(facade.getPlayerBadges(steamid)); + } + @GET @Produces(MediaType.APPLICATION_JSON) @Path("player/maps/{steamid}/{iterator}") @@ -67,11 +75,25 @@ public class TimerResource { @GET @Produces(MediaType.APPLICATION_JSON) @Path("map/{mapname}/{number}/{iterator}") - public String retrieveSpecificMapStages(@PathParam("mapname") String mapname, @PathParam("number") int stage, + public String retrieveSpecificMapStages(@PathParam("mapname") String mapname, @PathParam("number") int stage, @PathParam("iterator") int iterator) { facade.checkTimeElapse(); return gson.toJson(facade.getSpecificMap(mapname, stage, iterator)); } + + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("searchplayers/{identifier}") + public String searchPlayers(@PathParam("identifier") String identifier){ + facade.checkTimeElapse(); + return gson.toJson(facade.getSearchPlayerResults(identifier)); + } - + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("searchmaps/{identifier}") + public String searchMaps(@PathParam("identifier") String identifier){ + facade.checkTimeElapse(); + return gson.toJson(facade.getSearchMapsResults(identifier)); + } } diff --git a/RaceTimer/racetimer_endpoints/src/main/java/utils/Initialization.java b/RaceTimer/racetimer_endpoints/src/main/java/utils/Initialization.java index 25b93e8c..a4284c6d 100644 --- a/RaceTimer/racetimer_endpoints/src/main/java/utils/Initialization.java +++ b/RaceTimer/racetimer_endpoints/src/main/java/utils/Initialization.java @@ -26,11 +26,14 @@ public class Initialization { private static void setupDBTablesWithPresentValues() { Facade facade = new Facade(); + + facade.checkTimeElapse(); List getAllPlayers = facade.getAllPlayersFromCache(); + facade.getleaderBoard(0); Collection getAllMapBoards = facade.getAllMapBoardsFromCache(); - //facade.getPlayerMaps("STEAM_0:0:191740833", 0); - // facade.getPlayerMaps("STEAM_0:0:191740833", 25); - facade.getAllMaps(); + + //facade.getPlayerMaps("STEAM_0:0:33155716", 0); + AdminEditor admin = new AdminEditor("jenz", "1234"); EntityManager em = PuSelector.getEntityManagerFactory("pu").createEntityManager(); //simply cant persist collections/list diff --git a/RaceTimer/racetimer_react/src/App.js b/RaceTimer/racetimer_react/src/App.js index bc10738d..c4f56f81 100644 --- a/RaceTimer/racetimer_react/src/App.js +++ b/RaceTimer/racetimer_react/src/App.js @@ -6,6 +6,10 @@ import Player from "./Player/Player"; import Maps from "./Maps/Maps"; import MapBoard from "./MapBoard/MapBoard"; +import './css/custom.css'; +import './css/style.css'; +import './css/vendors.css'; + class App extends Component { constructor(props) { super(props); diff --git a/RaceTimer/racetimer_react/src/Datafacade/datafacade.js b/RaceTimer/racetimer_react/src/Datafacade/datafacade.js index 1899fa8e..0b5fdcdb 100644 --- a/RaceTimer/racetimer_react/src/Datafacade/datafacade.js +++ b/RaceTimer/racetimer_react/src/Datafacade/datafacade.js @@ -6,6 +6,8 @@ const URLPlayerMaps = "http://localhost:8080/racetimer_endpoints-1.0/api/timers/ const URLMaps = "http://localhost:8080/racetimer_endpoints-1.0/api/timers/map/"; const URLAllMaps = "http://localhost:8080/racetimer_endpoints-1.0/api/timers/allmaps"; const URLMapsSize = "http://localhost:8080/racetimer_endpoints-1.0/api/timers/mapsizecache"; +const URLSearchPlayers = "http://localhost:8080/racetimer_endpoints-1.0/api/timers/searchplayers/"; +const URLSearchMaps = "http://localhost:8080/racetimer_endpoints-1.0/api/timers/searchmaps/"; function handleHttpErrors(res) { if (!res.ok) { @@ -75,7 +77,25 @@ class DataFacade extends React.Component { } } - + getPlayerBadgesFromCache = async (steamID) => { + const CachedTime = JSON.parse(localStorage.getItem("initialBadgesCachedplayers" + steamID)); + const timeExpired = CachedTime ? Date.now() - CachedTime : 0; + //30 mins + if (!CachedTime || timeExpired > 30 * 60000) { + localStorage.setItem("initialBadgesCachedplayers" + steamID, JSON.stringify(Date.now())); + localStorage.removeItem("player/badges/" + steamID) + } + var storageString = "player/badges/" + steamID; + const badgesData = localStorage.getItem(storageString); + if (badgesData) { + const badges = JSON.parse(badgesData); + return badges; + } else { + const badges = await trackPromise(fetch(URLPlayer + "badges/" + steamID).then(handleHttpErrors)); + localStorage.setItem(storageString, JSON.stringify(badges)); + return badges; + } + } getPlayerFromCache = async (steamID) => { @@ -173,5 +193,44 @@ class DataFacade extends React.Component { } } } + + getPlayersBySearchCache = async (keyword) => { + const CachedTime = JSON.parse(localStorage.getItem("searchCache/time/" + keyword)); + const timeExpired = CachedTime ? Date.now() - CachedTime : 0; + //30 mins + if (!CachedTime || timeExpired > 30 * 60000) { + localStorage.setItem("searchCache/time/" + keyword, JSON.stringify(Date.now())); + localStorage.removeItem("searchCache/" + keyword) + } + var storageString = "searchCache/" + keyword; + var searchData = localStorage.getItem(storageString); + if (searchData) { + const cachedSearch = JSON.parse(searchData) + return cachedSearch; + } else { + const searchPlayers = await trackPromise(fetch(URLSearchPlayers + keyword).then(handleHttpErrors)); + localStorage.setItem(storageString, JSON.stringify(searchPlayers)); + return searchPlayers; + } + } + getMapsBySearchCache = async(keyword) => { + const CachedTime = JSON.parse(localStorage.getItem("searchCacheMaps/time/" + keyword)); + const timeExpired = CachedTime ? Date.now() - CachedTime : 0; + //30 mins + if (!CachedTime || timeExpired > 30 * 60000) { + localStorage.setItem("searchCacheMaps/time/" + keyword, JSON.stringify(Date.now())); + localStorage.removeItem("searchCacheMaps/" + keyword) + } + var storageString = "searchCache/" + keyword; + var searchData = localStorage.getItem(storageString); + if (searchData) { + const cachedSearch = JSON.parse(searchData) + return cachedSearch; + } else { + const searchMaps = await trackPromise(fetch(URLSearchMaps + keyword).then(handleHttpErrors)); + localStorage.setItem(storageString, JSON.stringify(searchMaps)); + return searchMaps; + } + } }; export default new DataFacade(); \ No newline at end of file diff --git a/RaceTimer/racetimer_react/src/Leaderboard/Leaderboard.js b/RaceTimer/racetimer_react/src/Leaderboard/Leaderboard.js index 4d42b8d0..66fec8be 100644 --- a/RaceTimer/racetimer_react/src/Leaderboard/Leaderboard.js +++ b/RaceTimer/racetimer_react/src/Leaderboard/Leaderboard.js @@ -3,6 +3,8 @@ import Facade from '../Datafacade/datafacade'; import { NavLink } from 'react-router-dom'; import Loader from 'react-loader-spinner'; import { usePromiseTracker } from "react-promise-tracker"; +import { FormControl } from "react-bootstrap"; +import PlayersSearch from "../playerSearch/playersSearch"; const LoadingIndicator = props => { const { promiseInProgress } = usePromiseTracker(); return promiseInProgress && @@ -26,10 +28,23 @@ class Leaderboard extends React.Component { players: [], breakload: true, scrollListener: {}, + keyword: "", + searchBool: true, }; this.scrollListener = this.handleScroll.bind(this); } + handleKeywordInput = e => { + const searchTerm = e.target.value; + this.setState({ keyword: searchTerm }); + this.setState({ searchBool: true }); + }; + + handleSubmit = e => { + e.preventDefault(); + this.setState({ searchBool: false }); + }; + componentWillMount() { window.addEventListener('scroll', this.scrollListener); } @@ -45,18 +60,20 @@ class Leaderboard extends React.Component { this.setState({ players }); }; - findSecondLast(array) { - return array[array.length - 2]; + findLateIndex(array) { + return array[array.length - 5]; } handleScroll = () => { - const player = this.findSecondLast(this.state.players); - var lastLi = document.getElementById('leaderboard/' + player.steamID); - var lastLiOffset = lastLi.offsetTop + lastLi.clientHeight; - var pageOffset = window.pageYOffset + window.innerHeight; - if (pageOffset > lastLiOffset && this.state.breakload) { - this.setState({ breakload: false }) - this.loadPlayers(); + if (this.state.breakload) { + const player = this.findLateIndex(this.state.players); + var lastLi = document.getElementById('leaderboard/' + player.steamID); + var lastLiOffset = lastLi.offsetTop + lastLi.clientHeight; + var pageOffset = window.pageYOffset + window.innerHeight; + if (pageOffset > lastLiOffset) { + this.setState({ breakload: false }) + this.loadPlayers(); + } } }; @@ -69,42 +86,80 @@ class Leaderboard extends React.Component { render() { return ( -
-
-
- -

MapBoard

-
+
+
+
+

UNLOZE Zombie Escape LeaderBoard

+

+ Browse LeaderBoard Players +

+
+
+
+
+ +
+
+
+ +
+
+
+
+
+
+

+ + MapBoard + +

+
-
    -
    -
    -
    -
    - {this.state.players.map(e => ( -
  • + {this.state.searchBool ? ("") : ()} +
    +
    + {this.state.players.map(e => ( +
    +
    {e.steamID}
    {e.name}
    -
    +
    + {e.Avatar}
    +
    + Check Player +
    +
    Rank: {e.Rank}
    Points: {e.PlayerPoints}
    Times: {e.Times}
    +
    + {e.UrlBanners.map(banners => ( + + ))} +


    -
  • - ))} - {!this.state.breakload ?

    - Loading Players


    -

    : ""} -
    -
    -
+ +
+ ))} +
+ {!this.state.breakload ?

+ Loading Players


+

: ""}
); } diff --git a/RaceTimer/racetimer_react/src/MapBoard/MapBoard.js b/RaceTimer/racetimer_react/src/MapBoard/MapBoard.js index ab630da6..71de0ba7 100644 --- a/RaceTimer/racetimer_react/src/MapBoard/MapBoard.js +++ b/RaceTimer/racetimer_react/src/MapBoard/MapBoard.js @@ -3,6 +3,8 @@ import Facade from '../Datafacade/datafacade'; import { NavLink } from 'react-router-dom'; import Loader from 'react-loader-spinner'; import { usePromiseTracker } from "react-promise-tracker"; +import { FormControl } from "react-bootstrap"; +import MapsSearch from "../MapsSearch/mapsSearch"; import '../css/style.css'; const LoadingIndicator = props => { const { promiseInProgress } = usePromiseTracker(); @@ -27,9 +29,21 @@ class MapBoards extends React.Component { this.state = { maps: [], breakload: false, + keyword: "", + searchBool: true, }; } + handleKeywordInput = e => { + const searchTerm = e.target.value; + this.setState({ keyword: searchTerm }); + this.setState({ searchBool: true }); + }; + + handleSubmit = e => { + e.preventDefault(); + this.setState({ searchBool: false }); + }; componentWillMount = async () => { this.setState({ breakload: false }) @@ -41,31 +55,62 @@ class MapBoards extends React.Component { render() { return ( -
-
-
- -

Leaderboard

-
+
+
+
+

UNLOZE Zombie Escape Mapboard

+

+ Browse Maps +

+
+
+
+
+ +
+
+
+ +
+
+
+
+
+
+

+ + Leaderboard + +

+
-
-
+ {this.state.searchBool ? ("") : ()}
{this.state.maps.map(e => (
  • -
    + Map: {e.mapname}
    Stage: {e.mapstage}


    -
    +
  • diff --git a/RaceTimer/racetimer_react/src/Maps/Maps.js b/RaceTimer/racetimer_react/src/Maps/Maps.js index 5ccd15f9..c4e44988 100644 --- a/RaceTimer/racetimer_react/src/Maps/Maps.js +++ b/RaceTimer/racetimer_react/src/Maps/Maps.js @@ -72,7 +72,7 @@ class Maps extends React.Component { loadPlayers = async () => { const mapname = this.props.match.params.mapname; const stage = this.props.match.params.stage; - const mapTimes = await Facade.getMapTimesFromCache(mapname, stage, this.state.mapTimes.length + 1); + const mapTimes = await Facade.getMapTimesFromCache(mapname, stage, this.state.mapTimes.length); this.setState({ mapTimes }); this.setState({ breakload: true }) } @@ -80,7 +80,6 @@ class Maps extends React.Component { render() { return ( -
    @@ -99,8 +98,6 @@ class Maps extends React.Component {
    -
    -

    {this.state.mapName}



    @@ -115,6 +112,11 @@ class Maps extends React.Component { Position: {e.position}
    Mappoints: {e.mapPoint}
    Time: 0{e.mapTimeMinutes}:{e.mapTimeSeconds}
    + {Object.keys(e.badgesUrls).map(badges => ( +
    +
    +
    + ))}

    diff --git a/RaceTimer/racetimer_react/src/MapsSearch/mapsSearch.js b/RaceTimer/racetimer_react/src/MapsSearch/mapsSearch.js new file mode 100644 index 00000000..1de103ab --- /dev/null +++ b/RaceTimer/racetimer_react/src/MapsSearch/mapsSearch.js @@ -0,0 +1,45 @@ +import React, { Component } from "react"; +import Facade from "../Datafacade/datafacade"; +import { NavLink } from 'react-router-dom'; + +class MapsSearch extends Component { + state = { + maps: [] + }; + + componentDidMount = async () => { + const maps = await Facade.getMapsBySearchCache(this.props.keyword); + this.setState({ maps }); + }; + + componentDidUpdate = async prevProps => { + if (this.props.keyword !== prevProps.keyword) { + const maps = await Facade.getMapsBySearchCache(this.props.keyword); + this.setState({ maps }); + } + } + render() { + return ( + +
    +
    + {this.state.maps.map(e => ( +
    +
    + + Map: {e.mapname}
    + Stage: {e.mapstage}
    +
    +
    +
    +
    +
    + ))} +
    +
    +
    + ); + } +} + +export default MapsSearch; \ No newline at end of file diff --git a/RaceTimer/racetimer_react/src/Player/Player.js b/RaceTimer/racetimer_react/src/Player/Player.js index 75a678e4..ac0a5f6c 100644 --- a/RaceTimer/racetimer_react/src/Player/Player.js +++ b/RaceTimer/racetimer_react/src/Player/Player.js @@ -27,6 +27,7 @@ class Player extends React.Component { mapTimes: [], breakload: true, scrollListener: {}, + badgesTransfer: [], }; this.scrollListener = this.handleScroll.bind(this); } @@ -36,8 +37,10 @@ class Player extends React.Component { this.setState({ breakload: false }) const steamid = this.props.match.params.steamid; const player = await Facade.getPlayerFromCache(steamid); + const badgesTransfer = await Facade.getPlayerBadgesFromCache(steamid); const mapTimes = await Facade.getPlayerTimesFromCache(steamid, 0); this.setState({ player }); + this.setState({ badgesTransfer }); this.setState({ mapTimes }); this.setState({ breakload: true }) }; @@ -65,12 +68,20 @@ class Player extends React.Component { loadMaps = async () => { const steamid = this.props.match.params.steamid; - const mapTimes = await Facade.getPlayerTimesFromCache(steamid, this.state.mapTimes.length + 1); + const mapTimes = await Facade.getPlayerTimesFromCache(steamid, this.state.mapTimes.length); this.setState({ mapTimes }); this.setState({ breakload: true }) } + render() { + const badges = Object.keys(this.state.badgesTransfer).map(badges => ( + this.state.badgesTransfer[badges].map((badge) => { + return
    +
    +
    + }) + )); return (
    @@ -87,7 +98,6 @@ class Player extends React.Component {
    -
    Rank: {this.state.player.Rank}
    Points: {this.state.player.PlayerPoints}
    Times: {this.state.player.Times}
    + {badges}

    @@ -119,7 +130,6 @@ class Player extends React.Component { {!this.state.breakload ?

    Loading Stats

    : ""} -
    diff --git a/RaceTimer/racetimer_react/src/css/style.css b/RaceTimer/racetimer_react/src/css/style.css index 6e168fd4..3d1bfe8b 100644 --- a/RaceTimer/racetimer_react/src/css/style.css +++ b/RaceTimer/racetimer_react/src/css/style.css @@ -2825,7 +2825,7 @@ video { .custom-search-input-2 input { border: 0; height: 50px; - padding-left: 15px; + padding-left: 25px; border-right: 1px solid #d2d8dd; font-weight: 500 } @@ -2900,7 +2900,7 @@ video { font-size: 14px; font-size: .875rem; border: 0; - padding: 0 25px; + padding: 0 185px; height: 50px; cursor: pointer; outline: 0; @@ -7636,4 +7636,10 @@ a.social_bt.google:before { max-width: 1000px; display: flex; flex-wrap: wrap; + } + + #test{ + position: static; + + left: 1000.5px; } \ No newline at end of file diff --git a/RaceTimer/racetimer_react/src/playerSearch/playersSearch.js b/RaceTimer/racetimer_react/src/playerSearch/playersSearch.js new file mode 100644 index 00000000..0944ced6 --- /dev/null +++ b/RaceTimer/racetimer_react/src/playerSearch/playersSearch.js @@ -0,0 +1,57 @@ +import React, { Component } from "react"; +import Facade from "../Datafacade/datafacade"; +import { NavLink } from 'react-router-dom'; +class playersSearch extends Component { + state = { + players: [], + searchBool: true, + }; + + componentDidMount = async () => { + const players = await Facade.getPlayersBySearchCache(this.props.keyword); + this.setState({ players }); + }; + + componentDidUpdate = async prevProps => { + if (this.props.keyword !== prevProps.keyword) { + const players = await Facade.getPlayersBySearchCache(this.props.keyword); + this.setState({ players }); + } + } + render() { + return ( + +
    +
    + {this.state.players.map(e => ( +
    +
    + + {e.steamID}
    + {e.name}
    +
    + {e.Avatar}
    +
    + Check Player +
    +
    + Rank: {e.Rank}
    + Points: {e.PlayerPoints}
    + Times: {e.Times}
    +
    + {e.UrlBanners.map(banners => ( + + ))} +
    +
    +
    +
    + ))} +
    +
    +
    + ); + } +} + +export default playersSearch; \ No newline at end of file