![shirito](/assets/img/avatar_default.png)
All checks were successful
continuous-integration/drone/push Build is passing
Fixing 404 error on https://db.sp-tarkov.com/search and subpaths (https://db.sp-tarkov.com/search/5cc9a96cd7f00c011c04e04a for example) ![image](/attachments/45627308-515f-4f49-9932-0e0234c653fe) Reviewed-on: SPT-AKI/Website#33 Co-authored-by: shirito <shirito@noreply.dev.sp-tarkov.com> Co-committed-by: shirito <shirito@noreply.dev.sp-tarkov.com>
1 line
59 KiB
Plaintext
1 line
59 KiB
Plaintext
{"version":3,"sources":["dataaccess/SaveKeys.ts","components/Footer.tsx","dataaccess/ItemBackend.ts","state/ReactJsonViewThemes.ts","state/ThemeMode.ts","state/GlobalState.ts","components/DarkModeToggle.tsx","components/LocaleSelect.tsx","components/JsonTheme.tsx","components/HeaderForm.tsx","components/Header.tsx","pages/mainPageComponents/NavigationBreadcrumb.tsx","pages/mainPageComponents/SearchArea.tsx","pages/InteractiveArea.tsx","pages/PageNotFound.tsx","pages/MainPage.tsx","theme/darkTheme.ts","theme/lightTheme.ts","App.tsx","theme/Theme.ts","reportWebVitals.ts","index.tsx"],"names":["LocalStorageKeys","SessionStorageKeys","useStyles","makeStyles","footerHolder","display","flex","flexDirection","alignItems","justifyContent","padding","Footer","classes","Box","className","Typography","id","handleFetch","url","init","a","fetch","mode","resp","status","json","jsonResponse","undefined","console","warn","searchItem","query","locale","process","method","headers","body","JSON","stringify","items","getItem","requestUrl","getItemHierarchy","itemData","hierarchy","currItemID","_id","currentHierarchy","useGlobalState","getState","itemsHierarchy","gotAllHierarchy","item","_parent","getLocaleList","ThemeMode","ReactJsonViewThemes","preferedLocale","localStorage","PREFERED_LOCALE","storedPreferedJsonTheme","PREFERED_JSON_THEME","preferedColorScheme","PREFERED_COLOR_SCHEME","create","set","sptarkovWebsiteUrl","sptarkovWorkshopUrl","sptarkovDocumentationUrl","setPreferedLocale","newLocale","setItem","_state","localesList","refreshLocalesList","locales","sessionStorage","LOCALES","parse","preferedJsonViewerTheme","includes","setPreferedJsonViewerTheme","newJsonTheme","DARK_MODE","setPreferedColorScheme","newColorScheme","searchInput","setSearchInput","newInput","desiredSearchInput","setDesiredSearchInput","initHierarchy","ITEMS_HIERARCHY","setHierarchy","newHierarchy","state","newStateHierarchy","Object","assign","selectedItem","setSelectedItem","newSelectedItem","theme","modeToggleButtonHolder","color","flexGrow","iconButton","ml","DarkModeToggle","useTheme","useCallback","palette","IconButton","sx","onClick","newTheme","LIGHT_MODE","localeHolder","select","LocaleSelect","useEffect","FormControl","fullWidth","variant","Select","displayEmpty","labelId","value","length","onChange","evt","target","MenuItem","disabled","map","idx","jsonHolder","JsonTheme","label","form","height","HeaderForm","headerContainer","backgroundColor","background","paper","linksContainer","formContainer","link","borderBottom","action","hover","Header","websiteLink","workshopLink","documentationLink","Link","underline","href","breadcrumbHolder","breadcrumb","text","secondary","cursor","currentItem","NavigationBreadcrumb","itemHierachyState","searchInputState","useState","setCurrentHierarchy","push","filter","elt","reverse","Breadcrumbs","Name","_name","formatLink","toString","searchAreaHolder","maxHeight","autocomplete","SearchArea","params","useParams","navigate","useNavigate","selectOptions","setSelecteOptions","isbusy","setIsBusy","handleNameInput","input","searchResults","options","res","name","shortName","ShortName","handleIDInput","itemJson","itemObj","itemHierarchy","match","handleInput","newId","trim","log","Autocomplete","getOptionLabel","option","isOptionEqualToValue","toLocaleLowerCase","findOptionValue","open","inputValue","onInputChange","newValue","selectedOption","find","event","renderInput","TextField","renderOption","props","key","filterOptions","filterSelectedOptions","CircularProgress","size","src","style","marginTop","width","overflowY","searchContainer","InteractiveArea","notFoundAreaHolder","notFoundContainer","paddingTop","PageNotFound","container","maxheight","MainPage","path","element","replace","to","darkPalette","createPalette","default","grey","primary","common","white","lightBlue","yellow","lightPalette","black","blue","App","prefersDarkMode","useMediaQuery","localPreferedTheme","preferedTheme","ThemeProvider","createTheme","components","MuiLink","styleOverrides","root","textDecoration","MuiInput","borderColor","MuiTextField","borderBottomColor","MuiInputBase","MuiFormLabel","CssBaseline","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.f3c30fdb.chunk.js","sourcesContent":["export enum LocalStorageKeys {\r\n PREFERED_COLOR_SCHEME = 'db.sp-tarkov.com-prefered-color-scheme',\r\n PREFERED_JSON_THEME = 'db.sp-tarkov.com-prefered-json-theme',\r\n PREFERED_LOCALE = 'db.sp-tarkov.com-prefered-locale'\r\n}\r\n\r\nexport enum SessionStorageKeys {\r\n LOCALES = 'db.sp-tarkov.com-locales',\r\n ITEMS_HIERARCHY = 'db.sp-tarkov.com-items-hierarchy',\r\n}","import {Box, Typography} from '@mui/material'\r\nimport {makeStyles} from '@mui/styles'\r\n\r\nconst useStyles = makeStyles(() => ({\r\n footerHolder: {\r\n display: 'flex',\r\n flex: '0 1 3vh',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '0 10vw 0 10vw'\r\n }\r\n}))\r\n\r\nexport const Footer = () => {\r\n const classes = useStyles()\r\n\r\n return (\r\n <Box className={classes.footerHolder}>\r\n <Typography id={\"footer\"}>SPT-Aki ©2021 Created by Rev and Shirito</Typography>\r\n </Box>\r\n )\r\n}\r\n","import { ItemWithLocale } from '../dto/ItemWithLocale';\r\nimport { ItemHierarchy } from '../dto/ItemHierarchy';\r\nimport { ItemData } from '../dto/ItemData';\r\nimport { useGlobalState } from '../state/GlobalState';\r\n\r\nconst handleFetch = async (url: string, init?: RequestInit | undefined): Promise<any | null> => {\r\n try {\r\n const resp = await fetch(url, { ...init, mode: 'cors' })\r\n if (resp.status === 200) {\r\n const jsonResponse = await resp.json();\r\n return jsonResponse !== undefined ? jsonResponse : null;\r\n } else if (resp.status >= 400) {\r\n console.warn(resp)\r\n }\r\n }catch (e) {\r\n console.warn(e)\r\n }\r\n return null;\r\n}\r\n\r\nexport const searchItem = async (query: string, locale?: string): Promise<ItemWithLocale[]> =>\r\n (await handleFetch(\r\n `${process.env.REACT_APP_BACKEND_URL}/api/search`,\r\n {\r\n mode: 'cors',\r\n method: 'post',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(locale ? { query, locale } : { query })\r\n },\r\n ))?.items;\r\n\r\nexport const getItem = async (id: string, locale?: string): Promise<ItemWithLocale | undefined> => {\r\n let requestUrl = `${process.env.REACT_APP_BACKEND_URL}/api/item?id=${id}`;\r\n if (locale) requestUrl = `${requestUrl}&locale=${locale}`\r\n return await handleFetch(requestUrl, { mode: 'cors' });\r\n}\r\n\r\nexport const getItemHierarchy = async (itemData: ItemData, locale?: string): Promise<ItemHierarchy | null> => {\r\n // Check if we have all the item hierarchy\r\n const hierarchy: ItemHierarchy = {}\r\n let currItemID: string | undefined = itemData?._id\r\n const currentHierarchy = useGlobalState.getState().itemsHierarchy\r\n let gotAllHierarchy = true\r\n while (currItemID) {\r\n if (!(currItemID in currentHierarchy)) {\r\n gotAllHierarchy = false\r\n break\r\n }\r\n const item: ItemWithLocale = useGlobalState.getState().itemsHierarchy[currItemID]\r\n hierarchy[item.item._id] = item\r\n currItemID = item?.item?._parent\r\n }\r\n if (gotAllHierarchy) return hierarchy;\r\n\r\n // Otherwise get it\r\n let requestUrl = `${process.env.REACT_APP_BACKEND_URL}/api/item/hierarchy?id=${itemData._id}`;\r\n if (locale) requestUrl = `${requestUrl}&locale=${locale}`\r\n return await handleFetch(requestUrl, { mode: 'cors' });\r\n}\r\n\r\nexport const getLocaleList = async (): Promise<string[] | null> =>\r\n await handleFetch(\r\n `${process.env.REACT_APP_BACKEND_URL}/api/locales`,\r\n { mode: 'cors' },\r\n );","// No choice but to hard code since it is only a type in the library\r\nexport const ReactJsonViewThemes = [\r\n 'apathy',\r\n 'apathy:inverted',\r\n 'ashes',\r\n 'bespin',\r\n 'brewer',\r\n 'bright:inverted',\r\n 'bright',\r\n 'chalk',\r\n 'codeschool',\r\n 'colors',\r\n 'eighties',\r\n 'embers',\r\n 'flat',\r\n 'google',\r\n 'grayscale',\r\n 'grayscale:inverted',\r\n 'greenscreen',\r\n 'harmonic',\r\n 'hopscotch',\r\n 'isotope',\r\n 'marrakesh',\r\n 'mocha',\r\n 'monokai',\r\n 'ocean',\r\n 'paraiso',\r\n 'pop',\r\n 'railscasts',\r\n 'rjv-default',\r\n 'shapeshifter',\r\n 'shapeshifter:inverted',\r\n 'solarized',\r\n 'summerfruit',\r\n 'summerfruit:inverted',\r\n 'threezerotwofour',\r\n 'tomorrow',\r\n 'tube',\r\n 'twilight'\r\n]","export enum ThemeMode {\r\n LIGHT_MODE = 'light',\r\n DARK_MODE = 'dark'\r\n}","import { ThemeKeys } from 'react-json-view'\r\nimport create from 'zustand'\r\nimport { getLocaleList } from '../dataaccess/ItemBackend'\r\nimport { LocalStorageKeys, SessionStorageKeys } from '../dataaccess/SaveKeys'\r\nimport { ItemHierarchy } from '../dto/ItemHierarchy'\r\nimport { ReactJsonViewThemes } from './ReactJsonViewThemes'\r\nimport { ThemeMode } from './ThemeMode'\r\nimport { ItemWithLocale } from '../dto/ItemWithLocale';\r\n\r\nexport interface GlobalState {\r\n sptarkovWebsiteUrl: string\r\n sptarkovWorkshopUrl: string\r\n sptarkovDocumentationUrl: string\r\n\r\n preferedLocale: string\r\n setPreferedLocale: (newLocale: string) => void\r\n localesList: string[]\r\n refreshLocalesList: () => void\r\n\r\n preferedJsonViewerTheme: ThemeKeys\r\n setPreferedJsonViewerTheme: (newJsonTheme: string) => void\r\n\r\n preferedColorScheme: string\r\n setPreferedColorScheme: (newColorScheme: ThemeMode) => void\r\n\r\n searchInput: string\r\n setSearchInput: (newInput: string) => void\r\n\r\n desiredSearchInput: string\r\n setDesiredSearchInput: (newInput: string) => void\r\n\r\n itemsHierarchy: ItemHierarchy\r\n initHierarchy: () => void\r\n setHierarchy: (newHierarchy: ItemHierarchy) => void\r\n\r\n selectedItem: ItemWithLocale | undefined\r\n setSelectedItem: (newSelectedItem: ItemWithLocale | undefined) => void\r\n}\r\n\r\nconst preferedLocale = localStorage.getItem(LocalStorageKeys.PREFERED_LOCALE)\r\nconst storedPreferedJsonTheme = localStorage.getItem(\r\n LocalStorageKeys.PREFERED_JSON_THEME,\r\n)\r\nconst preferedColorScheme = localStorage.getItem(LocalStorageKeys.PREFERED_COLOR_SCHEME)\r\n\r\nexport const useGlobalState = create<GlobalState>((set) => ({\r\n sptarkovWebsiteUrl: process.env.REACT_APP_SPTARKOV_HOME ? process.env.REACT_APP_SPTARKOV_HOME : '',\r\n sptarkovWorkshopUrl: process.env.REACT_APP_SPTARKOV_WORKSHOP ? process.env.REACT_APP_SPTARKOV_WORKSHOP : '',\r\n sptarkovDocumentationUrl: process.env.REACT_APP_SPTARKOV_DOCUMENTATION ? process.env.REACT_APP_SPTARKOV_DOCUMENTATION : '',\r\n\r\n // Locale\r\n preferedLocale: preferedLocale ? preferedLocale : 'en',\r\n setPreferedLocale: (newLocale: string) => {\r\n localStorage.setItem(LocalStorageKeys.PREFERED_LOCALE, newLocale)\r\n set((_state) => ({ preferedLocale: newLocale }))\r\n },\r\n localesList: [],\r\n refreshLocalesList: async () => {\r\n const locales = sessionStorage.getItem(SessionStorageKeys.LOCALES);\r\n const localesList = locales !== null && locales !== undefined && locales !== 'undefined' && locales !== 'null' ? JSON.parse(locales) : await getLocaleList()\r\n if (!locales) sessionStorage.setItem(SessionStorageKeys.LOCALES, JSON.stringify(localesList ? localesList : null))\r\n set((_state) => ({ localesList: localesList ? localesList : [] }))\r\n },\r\n\r\n // Json viewer theme\r\n preferedJsonViewerTheme:\r\n storedPreferedJsonTheme &&\r\n ReactJsonViewThemes.includes(storedPreferedJsonTheme)\r\n ? (storedPreferedJsonTheme as ThemeKeys)\r\n : (ReactJsonViewThemes[0] as ThemeKeys),\r\n setPreferedJsonViewerTheme: (newJsonTheme: string) => {\r\n localStorage.setItem(LocalStorageKeys.PREFERED_JSON_THEME, newJsonTheme)\r\n set((_state) => ({ preferedJsonViewerTheme: newJsonTheme as ThemeKeys }))\r\n },\r\n\r\n // Prefered theme\r\n preferedColorScheme: preferedColorScheme\r\n ? preferedColorScheme\r\n : ThemeMode.DARK_MODE,\r\n setPreferedColorScheme: (newColorScheme: ThemeMode) => {\r\n localStorage.setItem(LocalStorageKeys.PREFERED_COLOR_SCHEME, newColorScheme)\r\n set((_state) => ({ preferedColorScheme: newColorScheme }))\r\n },\r\n\r\n // SearchInput\r\n searchInput: '',\r\n setSearchInput: (newInput: string) =>\r\n set((_state) => ({ searchInput: newInput })),\r\n desiredSearchInput: '',\r\n setDesiredSearchInput: (newInput: string) =>\r\n set((_state) => ({ desiredSearchInput: newInput })),\r\n\r\n // Hierarchy\r\n itemsHierarchy: {},\r\n initHierarchy: () => {\r\n const itemsHierarchy = sessionStorage.getItem(SessionStorageKeys.ITEMS_HIERARCHY);\r\n if (itemsHierarchy !== null && itemsHierarchy !== undefined && itemsHierarchy !== 'undefined') {\r\n set((_state) => ({ itemsHierarchy: JSON.parse(itemsHierarchy) }))\r\n }\r\n },\r\n setHierarchy: (newHierarchy: ItemHierarchy) => {\r\n set((state) => {\r\n const newStateHierarchy = Object.assign({}, state.itemsHierarchy, newHierarchy);\r\n sessionStorage.setItem(SessionStorageKeys.ITEMS_HIERARCHY, JSON.stringify(newStateHierarchy ? newStateHierarchy : null))\r\n return ({\r\n itemsHierarchy: newStateHierarchy,\r\n })\r\n });\r\n },\r\n\r\n // Selected item\r\n selectedItem: undefined,\r\n setSelectedItem: (newSelectedItem: ItemWithLocale | undefined) =>\r\n set((_state) => ({ selectedItem: newSelectedItem })),\r\n}))\r\n","import { Box, IconButton, Theme } from '@mui/material'\r\nimport { useTheme } from '@mui/material/styles'\r\nimport Brightness4Icon from '@mui/icons-material/Brightness4'\r\nimport Brightness7Icon from '@mui/icons-material/Brightness7'\r\nimport { ThemeMode } from '../state/ThemeMode'\r\nimport { useGlobalState } from '../state/GlobalState'\r\nimport { useCallback } from 'react'\r\nimport { makeStyles } from '@mui/styles'\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n modeToggleButtonHolder: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n color: 'primary',\r\n flexGrow: 1,\r\n },\r\n iconButton: {\r\n ml: 1,\r\n },\r\n}))\r\n\r\nexport const DarkModeToggle = () => {\r\n const theme = useTheme()\r\n const classes = useStyles()\r\n const [preferedColorScheme, setPreferedColorScheme] = useGlobalState(\r\n useCallback(\r\n (state) => [state.preferedColorScheme, state.setPreferedColorScheme],\r\n [],\r\n ),\r\n )\r\n\r\n const toggleColor = () => {\r\n const newTheme =\r\n preferedColorScheme === ThemeMode.LIGHT_MODE\r\n ? ThemeMode.DARK_MODE\r\n : ThemeMode.LIGHT_MODE\r\n setPreferedColorScheme(newTheme)\r\n }\r\n\r\n return (\r\n <Box className={classes.modeToggleButtonHolder} id=\"modeToggleButtonHolder\">\r\n {theme.palette.mode} mode\r\n <IconButton\r\n className={classes.iconButton}\r\n sx={{ ml: 1 }}\r\n onClick={toggleColor}\r\n color=\"inherit\"\r\n id=\"modeToggleButton\"\r\n >\r\n {theme.palette.mode === 'dark' ? (\r\n <Brightness7Icon />\r\n ) : (\r\n <Brightness4Icon />\r\n )}\r\n </IconButton>\r\n </Box>\r\n )\r\n}\r\n","import { Select, MenuItem, Theme, Box, FormControl } from '@mui/material'\r\nimport {makeStyles} from '@mui/styles'\r\nimport { useCallback, useEffect } from 'react';\r\nimport { useGlobalState } from '../state/GlobalState'\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n localeHolder: {\r\n display: 'flex',\r\n flexGrow: 1,\r\n padding: '0 0.5vw 0 0.5vw'\r\n },\r\n select: {\r\n display: 'flex',\r\n flexGrow: 1\r\n }\r\n}))\r\n\r\n\r\n\r\nexport const LocaleSelect = () => {\r\n const classes = useStyles()\r\n const [preferedLocale, setPreferedLocale] = useGlobalState(useCallback(state => [state.preferedLocale, state.setPreferedLocale],[]))\r\n const [localesList, refreshLocalesList] = useGlobalState(useCallback(state => [state.localesList, state.refreshLocalesList],[]))\r\n\r\n useEffect(()=> refreshLocalesList(), [refreshLocalesList])\r\n\r\n return (\r\n <>\r\n <Box className={classes.localeHolder}>\r\n <FormControl fullWidth variant=\"standard\">\r\n <Select\r\n displayEmpty\r\n className={classes.select}\r\n labelId=\"prefered-locale\"\r\n value={localesList.length > 0 ? preferedLocale : ''}\r\n onChange={(evt) => {\r\n setPreferedLocale(evt.target.value)\r\n }}\r\n id=\"locale-selector\"\r\n >\r\n <MenuItem disabled value=\"\">\r\n <em>Language</em>\r\n </MenuItem>\r\n {localesList.map((locale, idx) => (\r\n <MenuItem key={idx} value={locale}>\r\n {locale}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n </>\r\n )\r\n}\r\n","import {\r\n Box,\r\n FormControl,\r\n MenuItem,\r\n Select,\r\n Theme,\r\n} from '@mui/material'\r\nimport { makeStyles } from '@mui/styles'\r\nimport { ReactJsonViewThemes } from '../state/ReactJsonViewThemes'\r\nimport { LocalStorageKeys } from '../dataaccess/SaveKeys'\r\nimport { useGlobalState } from '../state/GlobalState'\r\nimport { useCallback } from 'react'\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n jsonHolder: {\r\n display: 'flex',\r\n flexGrow: 1,\r\n padding: '0 0.5vw 0 0.5vw'\r\n },\r\n select: {\r\n display: 'flex',\r\n flexGrow: 1\r\n }\r\n}))\r\n\r\nexport const JsonTheme = () => {\r\n const classes = useStyles()\r\n const [preferedJsonViewerTheme, setPreferedJsonViewerTheme] = useGlobalState(\r\n useCallback(\r\n (state) => [\r\n state.preferedJsonViewerTheme,\r\n state.setPreferedJsonViewerTheme,\r\n ],\r\n [],\r\n ),\r\n )\r\n return (\r\n <>\r\n <Box className={classes.jsonHolder}>\r\n <FormControl fullWidth variant=\"standard\">\r\n <Select\r\n displayEmpty\r\n className={classes.select}\r\n labelId=\"react-json-view-theme\"\r\n value={preferedJsonViewerTheme}\r\n label=\"JSON theme\"\r\n onChange={(evt) => {\r\n setPreferedJsonViewerTheme(evt.target.value)\r\n localStorage.setItem(\r\n LocalStorageKeys.PREFERED_JSON_THEME,\r\n evt.target.value,\r\n )\r\n }}\r\n id=\"json-selector\"\r\n >\r\n <MenuItem disabled value=\"\">\r\n <em>JSON theme</em>\r\n </MenuItem>\r\n {ReactJsonViewThemes.map((theme, idx) => (\r\n <MenuItem key={idx} value={theme}>\r\n {theme}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </Box>\r\n </>\r\n )\r\n}\r\n","import { DarkModeToggle } from './DarkModeToggle'\r\nimport { LocaleSelect } from './LocaleSelect'\r\nimport { JsonTheme } from './JsonTheme'\r\nimport { Theme } from '@mui/material'\r\nimport { makeStyles } from '@mui/styles';\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n form: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flexGrow: 1,\r\n justifyContent: 'flex-end',\r\n height: '100%'\r\n },\r\n}));\r\n\r\nexport const HeaderForm = () => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <>\r\n <form className={classes.form}>\r\n <DarkModeToggle />\r\n <LocaleSelect />\r\n <JsonTheme />\r\n </form>\r\n </>\r\n )\r\n}\r\n","import { Box, Link, Theme } from '@mui/material'\r\nimport { makeStyles } from '@mui/styles'\r\nimport { useCallback } from 'react';\r\nimport { useGlobalState } from '../state/GlobalState';\r\nimport { HeaderForm } from './HeaderForm';\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n headerContainer: {\r\n display: 'flex',\r\n flex: '0 1 3vh',\r\n flexDirection: 'row',\r\n backgroundColor: theme.palette.background.paper,\r\n alignItems: 'center',\r\n padding: '0 10vw 0 10vw',\r\n },\r\n linksContainer: {\r\n display: 'flex',\r\n flexGrow: 2,\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n height: '100%',\r\n },\r\n formContainer: {\r\n display: 'flex',\r\n flexGrow: 1,\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n height: '100%',\r\n },\r\n link: {\r\n display: 'flex',\r\n padding: '0 1vw 0 1vw',\r\n height: '100%',\r\n alignItems: 'center',\r\n borderBottom: `1px solid transparent`,\r\n '&:hover': {\r\n borderBottom: `1px solid ${theme.palette.action.hover}`,\r\n },\r\n },\r\n}))\r\n\r\nexport const Header = () => {\r\n const classes = useStyles()\r\n const websiteLink = useGlobalState(useCallback((state) => state.sptarkovWebsiteUrl,[]))\r\n const workshopLink = useGlobalState(useCallback((state) => state.sptarkovWorkshopUrl,[]))\r\n const documentationLink = useGlobalState(useCallback((state) => state.sptarkovDocumentationUrl,[]))\r\n\r\n return (\r\n <>\r\n <Box className={classes.headerContainer}>\r\n <Box className={classes.linksContainer}>\r\n <Link\r\n underline=\"hover\"\r\n color=\"inherit\"\r\n id=\"website-link\"\r\n href={websiteLink}\r\n className={classes.link}\r\n >\r\n Website\r\n </Link>\r\n <Link\r\n underline=\"hover\"\r\n color=\"inherit\"\r\n id=\"workshop-link\"\r\n href={workshopLink}\r\n className={classes.link}\r\n >\r\n Workshop\r\n </Link>\r\n <Link\r\n underline=\"hover\"\r\n color=\"inherit\"\r\n id=\"documentation-link\"\r\n href={documentationLink}\r\n className={classes.link}\r\n >\r\n Documentation\r\n </Link>\r\n </Box>\r\n <Box className={classes.formContainer}>\r\n <HeaderForm/>\r\n </Box>\r\n </Box>\r\n </>\r\n )\r\n}\r\n","import { useState } from 'react'\r\nimport { Box, Breadcrumbs, Link, Theme, Typography } from '@mui/material'\r\nimport { makeStyles } from '@mui/styles'\r\nimport { useEffect } from 'react'\r\nimport { useGlobalState } from '../../state/GlobalState'\r\nimport { ItemWithLocale } from '../../dto/ItemWithLocale'\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n breadcrumbHolder: {\r\n display: 'flex',\r\n flex: '0 1 3vh',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n padding: '0 10vw 0 10vw',\r\n borderBottom: `1px solid ${theme.palette.background.paper}`,\r\n },\r\n breadcrumb: {\r\n display: 'flex',\r\n flex: '0 1 3vh',\r\n flexDirection: 'row',\r\n flexGrow: 1,\r\n },\r\n link: {\r\n color: theme.palette.text.secondary,\r\n display: 'flex',\r\n padding: '0 1vw 0 1vw',\r\n height: '100%',\r\n alignItems: 'center',\r\n borderBottom: `1px solid transparent`,\r\n '&:hover': {\r\n color: theme.palette.action.hover,\r\n cursor: 'pointer',\r\n },\r\n },\r\n currentItem: {\r\n cursor: 'default',\r\n borderBottom: `1px solid ${theme.palette.action.hover}`,\r\n },\r\n}))\r\n\r\nexport const NavigationBreadcrumb = () => {\r\n const classes = useStyles()\r\n const setSelectedItem = useGlobalState((state) => state.setSelectedItem)\r\n const itemHierachyState = useGlobalState((state) => state.itemsHierarchy)\r\n const [searchInputState, setSearchInput] = useGlobalState((state) => [\r\n state.searchInput,\r\n state.setSearchInput,\r\n ])\r\n const selectedItem = useGlobalState((state) => state.selectedItem)\r\n const [currentHierarchy, setCurrentHierarchy] = useState<ItemWithLocale[]>([])\r\n\r\n useEffect(() => {\r\n if (!selectedItem) return;\r\n\r\n const hierarchy: ItemWithLocale[] = [selectedItem]\r\n let currItemID: string | undefined = selectedItem?.item?._parent\r\n while (currItemID) {\r\n const item: ItemWithLocale = itemHierachyState[currItemID]\r\n hierarchy.push(item)\r\n currItemID = item?.item?._parent\r\n }\r\n setCurrentHierarchy(hierarchy.filter(elt => elt !== undefined && elt !== null).reverse())\r\n }, [selectedItem, itemHierachyState])\r\n\r\n const formatLink = (item: ItemWithLocale, idx: string) => {\r\n if (\r\n searchInputState === item.locale.Name ||\r\n searchInputState === item.item._id ||\r\n searchInputState === item.item._name\r\n ) {\r\n return (\r\n <Typography key={item.item._id} variant=\"body2\" className={classes.currentItem}>\r\n {item.locale.Name ? item.locale.Name : item.item._name}\r\n </Typography>\r\n )\r\n } else {\r\n return (\r\n <Link\r\n underline=\"hover\"\r\n color=\"inherit\"\r\n key={idx}\r\n onClick={() => {\r\n setSearchInput(item.item._id)\r\n setSelectedItem(undefined)\r\n }}\r\n className={classes.link}\r\n >\r\n <Typography variant=\"body2\">{item.locale.Name ? item.locale.Name : item.item._name}</Typography>\r\n </Link>\r\n )\r\n }\r\n }\r\n\r\n return (\r\n <Box className={classes.breadcrumbHolder}>\r\n <Breadcrumbs aria-label=\"breadcrumb\" className={classes.breadcrumb} id='navigation-breadcrumb'>\r\n <Link\r\n underline=\"hover\"\r\n color=\"inherit\"\r\n key={'home'}\r\n href=\"/\"\r\n id='home-breadcrumb'\r\n className={classes.link}\r\n >\r\n <Typography variant=\"body2\">Home</Typography>\r\n </Link>\r\n {currentHierarchy.map((item, idx) => formatLink(item, idx.toString()))}\r\n </Breadcrumbs>\r\n </Box>\r\n )\r\n}\r\n","import {SyntheticEvent, useCallback, useEffect, useState} from 'react'\r\nimport {Autocomplete, Box, CircularProgress, Theme, Typography,} from '@mui/material'\r\nimport {makeStyles} from '@mui/styles'\r\nimport TextField from '@mui/material/TextField'\r\nimport ReactJson from 'react-json-view'\r\nimport {getItem, getItemHierarchy, searchItem,} from '../../dataaccess/ItemBackend'\r\nimport {ItemOption} from '../../dto/ItemOption'\r\nimport {useGlobalState} from '../../state/GlobalState'\r\nimport {useNavigate, useParams} from \"react-router-dom\";\r\n\r\ninterface IItemOption {\r\n id?: string\r\n name?: string\r\n shortName?: string\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n searchAreaHolder: {\r\n display: 'flex',\r\n flexGrow: 1,\r\n flexDirection: 'column',\r\n background: theme.palette.background.paper,\r\n padding: '2vh 2vw 2vh 2vw',\r\n },\r\n jsonHolder: {\r\n display: 'flex',\r\n flexGrow: 1,\r\n alignItems: 'center',\r\n flexDirection: 'column',\r\n background: theme.palette.background.paper,\r\n maxHeight: '80vh',\r\n },\r\n autocomplete: {},\r\n}))\r\n\r\nexport const SearchArea = () => {\r\n const classes = useStyles()\r\n const params = useParams();\r\n const navigate = useNavigate();\r\n const preferedLocale = useGlobalState((state) => state.preferedLocale)\r\n const preferedJsonViewerTheme = useGlobalState(\r\n useCallback((state) => state.preferedJsonViewerTheme, []),\r\n )\r\n const [searchInputState, setSearchInput] = useGlobalState((state) => [\r\n state.searchInput,\r\n state.setSearchInput,\r\n ])\r\n const [setHierarchy, initHierarchy] = useGlobalState((state) => [state.setHierarchy, state.initHierarchy])\r\n const [selectedItem, setSelectedItem] = useGlobalState((state) => [\r\n state.selectedItem,\r\n state.setSelectedItem,\r\n ])\r\n const [selectOptions, setSelecteOptions] = useState<ItemOption[]>([])\r\n const [isbusy, setIsBusy] = useState<boolean>(false)\r\n const searchThreshold = 3\r\n\r\n const handleNameInput = useCallback(async (input: string) => {\r\n const searchResults = await searchItem(input, preferedLocale)\r\n const options = searchResults?.map((res) => ({\r\n id: res.item._id,\r\n name: res.locale.Name ? res.locale.Name : res.item._name,\r\n shortName: JSON.stringify(res.locale.ShortName)\r\n }))\r\n setSelecteOptions(options ? options : [])\r\n }, [preferedLocale])\r\n\r\n const handleIDInput = useCallback(async (input: string) => {\r\n const itemJson = await getItem(input, preferedLocale)\r\n if (!itemJson) {\r\n setSelectedItem(undefined)\r\n setSearchInput('')\r\n return;\r\n }\r\n\r\n setSelectedItem(itemJson)\r\n const itemObj = {\r\n id: itemJson.item._id,\r\n name: itemJson.locale.Name ? itemJson.locale.Name : itemJson.item._name,\r\n shortName: itemJson.locale.ShortName\r\n }\r\n setSelecteOptions([itemObj])\r\n setSearchInput(itemObj.name)\r\n\r\n // Update hierachy\r\n const itemHierarchy = await getItemHierarchy(\r\n itemJson.item,\r\n preferedLocale,\r\n )\r\n setHierarchy(itemHierarchy ? itemHierarchy : {})\r\n // eslint-disable-next-line\r\n }, []) // Need to only be created on startup\r\n\r\n useEffect(() => initHierarchy(), [initHierarchy])\r\n\r\n useEffect(()=>{\r\n if (selectedItem){\r\n navigate(`/search/${selectedItem.item._id}`)\r\n }\r\n },[selectedItem, navigate])\r\n\r\n useEffect(() => {\r\n if (searchInputState && searchInputState.match(/([a-z0-9]{24})/)) {\r\n handleIDInput(searchInputState)\r\n }\r\n }, [handleIDInput, searchInputState])\r\n\r\n const handleInput = useCallback(async (input: string) => {\r\n if (!input || input.length < searchThreshold || isbusy) {\r\n setSelectedItem(undefined)\r\n setSelecteOptions([])\r\n setIsBusy(false)\r\n return\r\n }\r\n setIsBusy(true)\r\n\r\n if (input.match(/([a-z0-9]{24})/)) await handleIDInput(input)\r\n else await handleNameInput(input)\r\n\r\n setIsBusy(false)\r\n }, [handleIDInput, handleNameInput, isbusy, setSelectedItem])\r\n\r\n useEffect(() => {\r\n if (!searchInputState && params.id) {\r\n const newId = params.id.trim();\r\n console.log(newId);\r\n setSearchInput(newId);\r\n (async () => await handleInput(newId))();\r\n }\r\n }, [params, searchInputState, setSearchInput, handleInput, navigate])\r\n\r\n const formatDisplayItems = () => {\r\n // If loading\r\n if (isbusy) return <CircularProgress size={100}/>\r\n\r\n // If finished loading\r\n if (selectedItem) {\r\n return (\r\n <ReactJson\r\n src={selectedItem}\r\n theme={preferedJsonViewerTheme}\r\n style={{\r\n marginTop: '2vh',\r\n width: '100%',\r\n overflowY: 'auto',\r\n display: 'flex',\r\n }}\r\n />\r\n )\r\n } else return <Typography id='search-no-data'>No data to display</Typography>\r\n }\r\n\r\n const findOptionValue = (option: ItemOption, value: ItemOption): boolean => {\r\n return option.name?.toLocaleLowerCase() === value.name?.toLocaleLowerCase()\r\n || option.id?.toLocaleLowerCase() === value.id?.toLocaleLowerCase()\r\n || option.shortName?.toLocaleLowerCase() === value.shortName?.toLocaleLowerCase()\r\n }\r\n\r\n return (\r\n <Box className={classes.searchAreaHolder}>\r\n <Autocomplete\r\n id='search-autocomplete'\r\n options={selectOptions.map((elt) => ({name: elt.name, shortName: elt.shortName, id: elt.id}))}\r\n getOptionLabel={(option) => option.name ? option.name : option.id}\r\n isOptionEqualToValue={(option, value) => findOptionValue(option, value)}\r\n open={!isbusy && searchInputState.length >= searchThreshold && (searchInputState !== selectedItem?.locale.Name && searchInputState !== selectedItem?.item._name)}\r\n className={classes.autocomplete}\r\n inputValue={searchInputState ? searchInputState : ''}\r\n onInputChange={async (evt: SyntheticEvent, newValue: string) => {\r\n if (!evt) return\r\n setSelectedItem(undefined)\r\n setSearchInput(newValue)\r\n await handleInput(newValue.trim())\r\n }}\r\n value={(() => {\r\n const selectedOption = selectOptions.find(elt => elt.id === searchInputState || elt.name === searchInputState);\r\n return selectedOption ? selectedOption : null;\r\n })()}\r\n onChange={async (event: SyntheticEvent, newValue: IItemOption | null) => {\r\n if (newValue) {\r\n const selectedOption = selectOptions.find(\r\n (elt) => elt.name === newValue.name,\r\n )\r\n if (selectedOption) await handleIDInput(selectedOption.id)\r\n }\r\n }}\r\n renderInput={(params) => (\r\n <TextField {...params} label=\"Search by name or ID\"/>\r\n )}\r\n renderOption={(props, option ) => (\r\n <li {...props} key={option.id}><Typography>{option.name}</Typography></li>\r\n )}\r\n filterOptions={(options, state) => options.filter(elt => {\r\n return (elt.name?.toLocaleLowerCase().includes(state.inputValue.toLocaleLowerCase())\r\n || elt.id?.toLocaleLowerCase().includes(state.inputValue.toLocaleLowerCase())\r\n || elt.shortName?.toLocaleLowerCase().includes(state.inputValue.toLocaleLowerCase()))\r\n })}\r\n filterSelectedOptions\r\n />\r\n <Box className={classes.jsonHolder}>{formatDisplayItems()}</Box>\r\n </Box>\r\n )\r\n}\r\n","import {Box} from '@mui/material'\r\nimport {NavigationBreadcrumb} from './mainPageComponents/NavigationBreadcrumb'\r\nimport {SearchArea} from './mainPageComponents/SearchArea'\r\nimport {makeStyles} from \"@mui/styles\";\r\nimport React from \"react\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n searchContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flexGrow: 1,\r\n padding: '2vh 2vw 1vh 2vw'\r\n }\r\n}))\r\n\r\nexport const InteractiveArea = () => {\r\n const classes = useStyles();\r\n return (\r\n <>\r\n <NavigationBreadcrumb/>\r\n <Box className={classes.searchContainer}>\r\n <SearchArea/>\r\n </Box>\r\n </>\r\n )\r\n}\r\n","import {Box, Theme, Typography} from '@mui/material'\r\nimport {NavigationBreadcrumb} from './mainPageComponents/NavigationBreadcrumb'\r\nimport {makeStyles} from \"@mui/styles\";\r\nimport React from \"react\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n searchContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flexGrow: 1,\r\n padding: '2vh 2vw 1vh 2vw'\r\n },\r\n notFoundAreaHolder: {\r\n display: 'flex',\r\n flexGrow: 1,\r\n flexDirection: 'column',\r\n background: theme.palette.background.paper,\r\n padding: '2vh 2vw 2vh 2vw',\r\n },\r\n notFoundContainer: {\r\n display: 'flex',\r\n flexGrow: 1,\r\n flexDirection: 'column',\r\n width: \"100%\",\r\n alignItems: \"center\",\r\n paddingTop: \"10vh\"\r\n },\r\n}))\r\n\r\nexport const PageNotFound = () => {\r\n const classes = useStyles();\r\n return (\r\n <>\r\n <NavigationBreadcrumb/>\r\n <Box className={classes.searchContainer}>\r\n <Box className={classes.notFoundAreaHolder}>\r\n <Box className={classes.notFoundContainer}>\r\n <Typography id={'not-found-message'} variant={\"h3\"}>This page does not exist !</Typography>\r\n </Box>\r\n </Box>\r\n </Box>\r\n </>\r\n )\r\n}\r\n","import {Box} from '@mui/material'\r\nimport {Footer} from '../components/Footer'\r\nimport {Header} from '../components/Header'\r\nimport {makeStyles} from \"@mui/styles\";\r\nimport {BrowserRouter, Navigate, Route, Routes} from \"react-router-dom\";\r\nimport React from \"react\";\r\nimport {InteractiveArea} from \"./InteractiveArea\";\r\nimport {PageNotFound} from \"./PageNotFound\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n container: {\r\n background: 'background.default',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n height: '100vh',\r\n maxheight: '100vh',\r\n }\r\n}))\r\n\r\nexport const MainPage = () => {\r\n const classes = useStyles();\r\n return (\r\n <>\r\n <Box className={classes.container}>\r\n <Header/>\r\n <BrowserRouter>\r\n <Routes>\r\n <Route path=\"/search\" element={<InteractiveArea/>}/>\r\n <Route path=\"/search/:id\" element={<InteractiveArea/>}/>\r\n <Route path=\"/404\" element={<PageNotFound />}/>\r\n <Route path=\"/\" element={<Navigate replace to=\"/search\"/>}/>\r\n <Route path=\"*\" element={<Navigate replace to=\"/404\" />} />\r\n </Routes>\r\n </BrowserRouter>\r\n <Footer/>\r\n </Box>\r\n </>\r\n )\r\n}\r\n","import {ThemeMode} from '../state/ThemeMode';\r\nimport {common, grey, lightBlue, yellow} from '@mui/material/colors';\r\nimport createPalette from \"@mui/material/styles/createPalette\";\r\n\r\nexport const darkPalette = createPalette({\r\n mode: ThemeMode.DARK_MODE,\r\n background: {\r\n default: grey[900],\r\n paper: '#121212'\r\n },\r\n text: {\r\n primary: common.white,\r\n secondary: '#8894a2',\r\n disabled: lightBlue[100]\r\n },\r\n action: {\r\n hover: yellow[700]\r\n },\r\n});","import {ThemeMode} from '../state/ThemeMode';\r\nimport {blue, common, grey} from \"@mui/material/colors\";\r\nimport createPalette from \"@mui/material/styles/createPalette\";\r\n\r\nexport const lightPalette = createPalette({\r\n mode: ThemeMode.LIGHT_MODE,\r\n background: {\r\n default: grey[100],\r\n paper: grey[300]\r\n },\r\n text: {\r\n primary: common.black,\r\n secondary: blue[500],\r\n disabled: grey[600]\r\n },\r\n action: {\r\n hover: blue[500],\r\n }\r\n});","import {ThemeProvider} from '@mui/material/styles'\r\nimport {MainPage} from './pages/MainPage'\r\nimport {ThemeMode} from './state/ThemeMode'\r\nimport {CssBaseline, useMediaQuery} from '@mui/material'\r\nimport {useEffect} from \"react\";\r\nimport {darkPalette} from \"./theme/darkTheme\";\r\nimport {lightPalette} from \"./theme/lightTheme\";\r\nimport {getTheme} from \"./theme/Theme\";\r\nimport {LocalStorageKeys} from \"./dataaccess/SaveKeys\";\r\nimport { useGlobalState } from './state/GlobalState'\r\n\r\nconst App = () => {\r\n const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');\r\n const [preferedColorScheme ,setPreferedColorScheme] = useGlobalState(state => [state.preferedColorScheme, state.setPreferedColorScheme])\r\n\r\n useEffect(() => {\r\n const localPreferedTheme = localStorage.getItem(LocalStorageKeys.PREFERED_COLOR_SCHEME);\r\n if (localPreferedTheme) {\r\n setPreferedColorScheme(localPreferedTheme as ThemeMode)\r\n return\r\n }\r\n\r\n const preferedTheme = prefersDarkMode ? ThemeMode.DARK_MODE : ThemeMode.LIGHT_MODE;\r\n setPreferedColorScheme(preferedTheme)\r\n // eslint-disable-next-line\r\n }, [prefersDarkMode]) // Need to be only used on prefersDarkMode change\r\n\r\n return (\r\n <>\r\n <ThemeProvider theme={getTheme(preferedColorScheme === ThemeMode.DARK_MODE ? darkPalette : lightPalette)}>\r\n <CssBaseline/>\r\n <MainPage/>\r\n </ThemeProvider>\r\n </>\r\n )\r\n}\r\n\r\nexport default App\r\n","import {createTheme, Palette} from '@mui/material/styles';\r\n\r\nexport const getTheme = (palette: Palette) => createTheme({\r\n palette: palette,\r\n components: {\r\n MuiLink: {\r\n styleOverrides: {\r\n root: {\r\n '&:hover': {\r\n textDecoration: 'none'\r\n }\r\n }\r\n }\r\n },\r\n MuiInput:{\r\n styleOverrides: {\r\n root: {\r\n '&:before': {\r\n borderColor: 'transparent',\r\n },\r\n '&:after': {\r\n borderColor: 'transparent',\r\n },\r\n '&:hover:not(.Mui-disabled):before': {\r\n borderColor: palette.action.hover,\r\n }\r\n },\r\n input:{\r\n '&:focus': {\r\n backgroundColor: 'transparent',\r\n },\r\n }\r\n }\r\n },\r\n MuiTextField: {\r\n styleOverrides: {\r\n root: {\r\n '& label.Mui-focused': {\r\n color: palette.action.hover,\r\n },\r\n '& .MuiFilledInput-underline:after': {\r\n borderBottomColor: palette.action.hover,\r\n }\r\n }\r\n }\r\n },\r\n MuiInputBase:{\r\n styleOverrides:{\r\n root:{\r\n '&.Mui-focused .MuiOutlinedInput-notchedOutline':{\r\n borderColor: `${palette.action.hover} !important`,\r\n }\r\n }\r\n }\r\n },\r\n MuiFormLabel: {\r\n styleOverrides: {\r\n root:{\r\n '&.Mui-focused .MuiInputLabel': {\r\n color: palette.action.hover\r\n }\r\n }\r\n }\r\n }\r\n }\r\n});","import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\n\r\nReactDOM.render(\r\n <React.StrictMode>\r\n <App/>\r\n </React.StrictMode>,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();"],"sourceRoot":""} |