import { RestartAlt, Sort } from '@mui/icons-material'; import { Box, Container, Grid, IconButton, Input, Slider, TextField, ToggleButton, ToggleButtonGroup, Tooltip, Typography, } from '@mui/material'; import { useEffect, useRef, useState } from 'react'; import { useLocation } from 'react-router-dom'; import { SearchState, SearchStateDefaults } from '../../data/SearchState'; type SearchServersProps = { showSearchServer: boolean; searchState: SearchState; setSearchState: React.Dispatch>; }; export default function SearchServers({ showSearchServer, searchState, setSearchState, }: SearchServersProps) { const containerRef = useRef(null); const location = useLocation(); const [initialPath] = useState(location.pathname); const [contentHeight, setContentHeight] = useState(0); function parseSearchParams(searchParams: string): SearchState { const params = new URLSearchParams(searchParams); const parsedState = SearchStateDefaults; const keys = Object.keys(SearchStateDefaults) as Array; keys.forEach((key) => { if (params.has(key)) { const value = params.get(key) as string; const decodedValue = decodeURIComponent(value); if (key === 'maxLevel') { const maxLevelArray = decodedValue.split(',').map(Number); parsedState[key] = maxLevelArray.length === 1 ? [1, maxLevelArray[0]] : maxLevelArray; } else if (key === 'expansionsEnabled') { parsedState[key] = decodedValue.split(',') as string[]; } else { parsedState[key] = decodedValue; } } }); return parsedState as SearchState; } useEffect(() => { // Populate search state with URL params only if loading the home page // Home page manages updating URL params if (initialPath === '/') { const params = parseSearchParams(location.search); if (params !== SearchStateDefaults) { setSearchState(params); } } if (showSearchServer && containerRef.current) { setContentHeight(containerRef.current.scrollHeight); } else { setContentHeight(0); } }, [showSearchServer, location.search, setSearchState, initialPath]); const handleChange = ( name: string, value: string | string[] | number | number[], activeThumb?: number ) => { let newValue = value; if (name === 'maxLevel') { if ( !Array.isArray(value) || !value.every((item) => typeof item === 'number') ) { return; } newValue = [ activeThumb === 0 ? Math.min((newValue as number[])[0], searchState.maxLevel[1]) : searchState.maxLevel[0], activeThumb === 0 ? searchState.maxLevel[1] : Math.max((newValue as number[])[1], searchState.maxLevel[0]), ]; } setSearchState({ ...searchState, [name]: newValue }); }; const handleSearchExpansions = ( _event: React.MouseEvent, newSearchExpansions: string[] ) => { if (newSearchExpansions.length === 0) { setSearchState({ ...searchState, expansionsEnabled: null }); } else if ( searchState.expansionsEnabled && searchState.expansionsEnabled.includes('none') && newSearchExpansions.length > 1 ) { setSearchState({ ...searchState, expansionsEnabled: newSearchExpansions.filter( (item) => item !== 'none' ), }); } else if ( searchState.expansionsEnabled && !searchState.expansionsEnabled.includes('none') && newSearchExpansions.includes('none') ) { setSearchState({ ...searchState, expansionsEnabled: ['none'] }); } else { setSearchState({ ...searchState, expansionsEnabled: newSearchExpansions, }); } }; return ( theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, .06)' : 'rgba(0, 0, 0, .06)', boxShadow: 'inset 0em 3em 5em -5em black,inset 0em -3em 5em -6em black', }} > {/* Name */} { handleChange('name', event.target.value); }} variant="standard" autoComplete="false" fullWidth label="Name" size="small" className="pb-2" /> {/* Max Level */} Max Level { let value = parseInt(event.target.value, 10); if (Number.isNaN(value) || value < 1) { value = 1; } else if (value > 99) { value = 99; } handleChange('maxLevel', [value, searchState.maxLevel[1]], 0); }} // onBlur={handleBlur} inputProps={{ name: 'max-level-min', step: 1, min: 1, max: 99, type: 'number', 'aria-labelledby': 'max-level', }} /> { handleChange('maxLevel', value, activeThumb); }} valueLabelDisplay="auto" disableSwap className="mx-4" size="small" min={1} max={99} /> { let value = parseInt(event.target.value, 10); if (Number.isNaN(value) || value < 1) { value = 1; } else if (value > 99) { value = 99; } handleChange('maxLevel', [searchState.maxLevel[0], value], 1); }} // onBlur={handleBlur} inputProps={{ name: 'max-level-max', step: 1, min: 1, max: 99, type: 'number', 'aria-labelledby': 'max-level', }} /> {/* Expansion */} Expansions None RotZ CoP ToAU WotG SoA {/* Multiboxing */} Multiboxing { handleChange('multibox', value); }} size="small" aria-labelledby="multibox-button-group" sx={{ display: 'flex', width: '100%', }} exclusive > None Limited Unlimited {/* Trusts */} Trusts { handleChange('trusts', value); }} size="small" aria-labelledby="trust-button-group" exclusive sx={{ display: 'flex', width: '100%', }} > Disabled Enabled {/* Level Sync */} Level Sync { handleChange('levelSync', value); }} size="small" aria-labelledby="level-sync-button-group" exclusive sx={{ display: 'flex', width: '100%', }} > Disabled Enabled {/* Home Point Teleport */} Home Point Teleport { handleChange('homePoint', value); }} size="small" aria-labelledby="home-point-button-group" exclusive sx={{ display: 'flex', width: '100%', }} > Disabled Enabled {/* Survival Guide Teleport */} Survival Guides { handleChange('survivalGuide', value); }} size="small" aria-labelledby="survival-guide-button-group" exclusive sx={{ display: 'flex', width: '100%', }} > Disabled Enabled {/* Fields of Valor */} Fields of Valor { handleChange('fov', value); }} size="small" aria-labelledby="fields-of-valor-button-group" exclusive sx={{ display: 'flex', width: '100%', }} > Disabled Enabled {/* Grounds of Valor */} Grounds of Valor { handleChange('gov', value); }} size="small" aria-labelledby="grounds-of-valor-button-group" exclusive sx={{ display: 'flex', width: '100%', }} > Disabled Enabled {/* Records of Eminence */} Records of Eminence { handleChange('roe', value); }} size="small" aria-labelledby="records-of-eminence-button-group" exclusive sx={{ display: 'flex', width: '100%', }} > Disabled Enabled { // setSearchState(SearchStateDefaults); // }} > { if (location.pathname === '/') { window.history.replaceState({}, '', '/'); } setSearchState(SearchStateDefaults); }} > ); }