Change how search state is saved

This commit is contained in:
Corey 2024-05-01 22:51:08 +00:00
parent 9ff42ce914
commit 08094b8683
7 changed files with 105 additions and 94 deletions

View File

@ -9,6 +9,7 @@ services:
- /var/run/docker.sock:/var/run/docker-host.sock - /var/run/docker.sock:/var/run/docker-host.sock
- ixion-dev-node_modules:/workspace/client/node_modules - ixion-dev-node_modules:/workspace/client/node_modules
- ixion-dev-static:/workspace/api/static - ixion-dev-static:/workspace/api/static
- ixion-dev-database:/workspace/api/db
- ..:/workspace:cached - ..:/workspace:cached
client: client:
image: ixion-dev:latest image: ixion-dev:latest
@ -31,6 +32,7 @@ services:
environment: environment:
- DEBUG=true - DEBUG=true
volumes: volumes:
- ixion-dev-database:/workspace/api/db
- ixion-dev-static:/workspace/api/static - ixion-dev-static:/workspace/api/static
- ../api:/workspace/api:cached - ../api:/workspace/api:cached
- ../client:/workspace/client:cached - ../client:/workspace/client:cached
@ -44,6 +46,7 @@ services:
working_dir: /workspace/api working_dir: /workspace/api
command: celery -A api worker -l info command: celery -A api worker -l info
volumes: volumes:
- ixion-dev-database:/workspace/api/db
- ../api:/workspace/api:cached - ../api:/workspace/api:cached
depends_on: depends_on:
- workspace - workspace
@ -63,3 +66,4 @@ services:
volumes: volumes:
ixion-dev-node_modules: ixion-dev-node_modules:
ixion-dev-static: ixion-dev-static:
ixion-dev-database:

View File

@ -16,6 +16,8 @@ services:
build: . build: .
command: celery -A api worker -l info command: celery -A api worker -l info
restart: always restart: always
volumes:
- database:/app/db
depends_on: depends_on:
- api - api
celery-beat: celery-beat:

View File

@ -4,7 +4,7 @@ import { BrowserRouter, Route, Routes } from 'react-router-dom';
import AlertComponent from './components/Alert'; import AlertComponent from './components/Alert';
import Footer from './components/Footer'; import Footer from './components/Footer';
import Header from './components/Header'; import Header from './components/Header';
import SearchState from './data/SearchState'; import SearchState, { SearchStateDefaults } from './data/SearchState';
import ServerData from './data/ServerData'; import ServerData from './data/ServerData';
import About from './pages/About'; import About from './pages/About';
import Home from './pages/Home'; import Home from './pages/Home';
@ -18,23 +18,8 @@ export function App() {
} | null>(null); } | null>(null);
const [servers, setServers] = useState<ServerData[]>([]); const [servers, setServers] = useState<ServerData[]>([]);
const [searchName, setSearchName] = useState(''); const [searchState, setSearchState] =
const [searchMultibox, setSearchMultibox] = useState<string[] | null>(null); useState<SearchState>(SearchStateDefaults);
const [searchTrusts, setSearchTrusts] = useState<string[] | null>(null);
const [searchLevelSync, setSearchLevelSync] = useState<string[] | null>(null);
const [searchMaxLevel, setSearchMaxLevel] = useState<number[]>([1, 99]);
const [searchExpansions, setSearchExpansions] = useState<string[] | null>(
null
);
const searchState: SearchState = {
name: { value: searchName, setValue: setSearchName },
multibox: { value: searchMultibox, setValue: setSearchMultibox },
trusts: { value: searchTrusts, setValue: setSearchTrusts },
levelSync: { value: searchLevelSync, setValue: setSearchLevelSync },
maxLevel: { value: searchMaxLevel, setValue: setSearchMaxLevel },
expansions: { value: searchExpansions, setValue: setSearchExpansions },
};
return ( return (
<div className="flex min-h-screen flex-col"> <div className="flex min-h-screen flex-col">
@ -43,6 +28,7 @@ export function App() {
servers={servers} servers={servers}
setServers={setServers} setServers={setServers}
searchState={searchState} searchState={searchState}
setSearchState={setSearchState}
/> />
<AlertComponent alertInfo={alertInfo} setAlertInfo={setAlertInfo} /> <AlertComponent alertInfo={alertInfo} setAlertInfo={setAlertInfo} />
<Container className="grow p-0"> <Container className="grow p-0">

View File

@ -22,11 +22,13 @@ export default function Header({
servers, servers,
setServers, setServers,
searchState, searchState,
setSearchState,
}: { }: {
setAlertInfo: React.Dispatch<React.SetStateAction<AlertResponse>>; setAlertInfo: React.Dispatch<React.SetStateAction<AlertResponse>>;
servers: ServerData[]; servers: ServerData[];
setServers: React.Dispatch<React.SetStateAction<ServerData[]>>; setServers: React.Dispatch<React.SetStateAction<ServerData[]>>;
searchState: SearchState; searchState: SearchState;
setSearchState: React.Dispatch<React.SetStateAction<SearchState>>;
}) { }) {
const [fetchLoading, setFetchLoading] = useState(0); const [fetchLoading, setFetchLoading] = useState(0);
const [showSearchServer, setShowSearchServer] = useState(false); const [showSearchServer, setShowSearchServer] = useState(false);
@ -103,6 +105,7 @@ export default function Header({
<SearchServers <SearchServers
showSearchServer={showSearchServer} showSearchServer={showSearchServer}
searchState={searchState} searchState={searchState}
setSearchState={setSearchState}
/> />
</Box> </Box>
); );

View File

@ -15,9 +15,11 @@ import SearchState from '../data/SearchState';
export default function SearchServers({ export default function SearchServers({
showSearchServer, showSearchServer,
searchState, searchState,
setSearchState,
}: { }: {
showSearchServer: boolean; showSearchServer: boolean;
searchState: SearchState; searchState: SearchState;
setSearchState: React.Dispatch<React.SetStateAction<SearchState>>;
}) { }) {
const containerRef = useRef<HTMLDivElement>(null); const containerRef = useRef<HTMLDivElement>(null);
const [contentHeight, setContentHeight] = useState(0); const [contentHeight, setContentHeight] = useState(0);
@ -32,28 +34,28 @@ export default function SearchServers({
}, [showSearchServer]); }, [showSearchServer]);
const handleSearchName = (event: React.ChangeEvent<HTMLInputElement>) => { const handleSearchName = (event: React.ChangeEvent<HTMLInputElement>) => {
searchState.name.setValue(event.target.value); setSearchState({ ...searchState, name: event.target.value });
}; };
const handleSearchMultibox = ( const handleSearchMultibox = (
_event: React.MouseEvent<HTMLElement>, _event: React.MouseEvent<HTMLElement>,
newSearchMultibox: string[] newSearchMultibox: string[]
) => { ) => {
searchState.multibox.setValue(newSearchMultibox); setSearchState({ ...searchState, multibox: newSearchMultibox });
}; };
const handleSearchTrusts = ( const handleSearchTrusts = (
_event: React.MouseEvent<HTMLElement>, _event: React.MouseEvent<HTMLElement>,
newSearchTrusts: string[] newSearchTrusts: string[]
) => { ) => {
searchState.trusts.setValue(newSearchTrusts); setSearchState({ ...searchState, trusts: newSearchTrusts });
}; };
const handleSearchLevelSync = ( const handleSearchLevelSync = (
_event: React.MouseEvent<HTMLElement>, _event: React.MouseEvent<HTMLElement>,
newSearchLevelSync: string[] newSearchLevelSync: string[]
) => { ) => {
searchState.levelSync.setValue(newSearchLevelSync); setSearchState({ ...searchState, levelSync: newSearchLevelSync });
}; };
const handleSearchMaxLevelMin = ( const handleSearchMaxLevelMin = (
@ -65,10 +67,13 @@ export default function SearchServers({
} else if (newValue > 99) { } else if (newValue > 99) {
newValue = 99; newValue = 99;
} }
searchState.maxLevel.setValue([ setSearchState({
Math.min(newValue, searchState.maxLevel.value[1] - minDistance), ...searchState,
searchState.maxLevel.value[1], maxLevel: [
]); Math.min(newValue, searchState.maxLevel[1] - minDistance),
searchState.maxLevel[1],
],
});
}; };
const handleSearchMaxLevelMax = ( const handleSearchMaxLevelMax = (
@ -80,10 +85,13 @@ export default function SearchServers({
} else if (newValue > 99) { } else if (newValue > 99) {
newValue = 99; newValue = 99;
} }
searchState.maxLevel.setValue([ setSearchState({
searchState.maxLevel.value[0], ...searchState,
Math.max(newValue, searchState.maxLevel.value[0] + minDistance), maxLevel: [
]); searchState.maxLevel[0],
Math.max(newValue, searchState.maxLevel[0] + minDistance),
],
});
}; };
const handleSearchMaxLevel = ( const handleSearchMaxLevel = (
@ -95,15 +103,21 @@ export default function SearchServers({
return; return;
} }
if (activeThumb === 0) { if (activeThumb === 0) {
searchState.maxLevel.setValue([ setSearchState({
Math.min(newValue[0], searchState.maxLevel.value[1] - minDistance), ...searchState,
searchState.maxLevel.value[1], maxLevel: [
]); Math.min(newValue[0], searchState.maxLevel[1] - minDistance),
searchState.maxLevel[1],
],
});
} else { } else {
searchState.maxLevel.setValue([ setSearchState({
searchState.maxLevel.value[0], ...searchState,
Math.max(newValue[1], searchState.maxLevel.value[0] + minDistance), maxLevel: [
]); searchState.maxLevel[0],
Math.max(newValue[1], searchState.maxLevel[0] + minDistance),
],
});
} }
}; };
@ -112,23 +126,24 @@ export default function SearchServers({
newSearchExpansions: string[] newSearchExpansions: string[]
) => { ) => {
if (newSearchExpansions.length === 0) { if (newSearchExpansions.length === 0) {
searchState.expansions.setValue(null); setSearchState({ ...searchState, expansions: null });
} else if ( } else if (
searchState.expansions.value && searchState.expansions &&
searchState.expansions.value.includes('none') && searchState.expansions.includes('none') &&
newSearchExpansions.length > 1 newSearchExpansions.length > 1
) { ) {
searchState.expansions.setValue( setSearchState({
newSearchExpansions.filter((item) => item !== 'none') ...searchState,
); expansions: newSearchExpansions.filter((item) => item !== 'none'),
});
} else if ( } else if (
searchState.expansions.value && searchState.expansions &&
!searchState.expansions.value.includes('none') && !searchState.expansions.includes('none') &&
newSearchExpansions.includes('none') newSearchExpansions.includes('none')
) { ) {
searchState.expansions.setValue(['none']); setSearchState({ ...searchState, expansions: ['none'] });
} else { } else {
searchState.expansions.setValue(newSearchExpansions); setSearchState({ ...searchState, expansions: newSearchExpansions });
} }
}; };
@ -149,7 +164,7 @@ export default function SearchServers({
{/* Name */} {/* Name */}
<Grid item xs={12}> <Grid item xs={12}>
<TextField <TextField
value={searchState.name.value} value={searchState.name}
onChange={handleSearchName} onChange={handleSearchName}
variant="standard" variant="standard"
autoComplete="false" autoComplete="false"
@ -174,7 +189,7 @@ export default function SearchServers({
</Grid> </Grid>
<Grid item xs={12} className="flex pt-0"> <Grid item xs={12} className="flex pt-0">
<Input <Input
value={searchState.maxLevel.value[0]} value={searchState.maxLevel[0]}
size="small" size="small"
onChange={handleSearchMaxLevelMin} onChange={handleSearchMaxLevelMin}
// onBlur={handleBlur} // onBlur={handleBlur}
@ -188,7 +203,7 @@ export default function SearchServers({
/> />
<Slider <Slider
aria-labelledby="max-level-slider" aria-labelledby="max-level-slider"
value={searchState.maxLevel.value} value={searchState.maxLevel}
onChange={handleSearchMaxLevel} onChange={handleSearchMaxLevel}
valueLabelDisplay="auto" valueLabelDisplay="auto"
disableSwap disableSwap
@ -198,7 +213,7 @@ export default function SearchServers({
max={99} max={99}
/> />
<Input <Input
value={searchState.maxLevel.value[1]} value={searchState.maxLevel[1]}
size="small" size="small"
onChange={handleSearchMaxLevelMax} onChange={handleSearchMaxLevelMax}
// onBlur={handleBlur} // onBlur={handleBlur}
@ -230,7 +245,7 @@ export default function SearchServers({
</Typography> </Typography>
</Tooltip> </Tooltip>
<ToggleButtonGroup <ToggleButtonGroup
value={searchState.expansions.value} value={searchState.expansions}
onChange={handleSearchExpansions} onChange={handleSearchExpansions}
size="small" size="small"
aria-labelledby="expansions-button-group" aria-labelledby="expansions-button-group"
@ -307,7 +322,7 @@ export default function SearchServers({
Multiboxing Multiboxing
</Typography> </Typography>
<ToggleButtonGroup <ToggleButtonGroup
value={searchState.multibox.value} value={searchState.multibox}
onChange={handleSearchMultibox} onChange={handleSearchMultibox}
size="small" size="small"
aria-labelledby="multibox-button-group" aria-labelledby="multibox-button-group"
@ -355,7 +370,7 @@ export default function SearchServers({
Trusts Trusts
</Typography> </Typography>
<ToggleButtonGroup <ToggleButtonGroup
value={searchState.trusts.value} value={searchState.trusts}
onChange={handleSearchTrusts} onChange={handleSearchTrusts}
size="small" size="small"
aria-labelledby="trust-button-group" aria-labelledby="trust-button-group"
@ -395,7 +410,7 @@ export default function SearchServers({
Level Sync Level Sync
</Typography> </Typography>
<ToggleButtonGroup <ToggleButtonGroup
value={searchState.levelSync.value} value={searchState.levelSync}
onChange={handleSearchLevelSync} onChange={handleSearchLevelSync}
size="small" size="small"
aria-labelledby="level-sync-button-group" aria-labelledby="level-sync-button-group"

View File

@ -1,13 +1,17 @@
interface SearchStateTemplate<T> { export default interface SearchState {
value: T; name: string;
setValue: React.Dispatch<React.SetStateAction<T>>; multibox: string[] | null;
trusts: string[] | null;
levelSync: string[] | null;
maxLevel: number[];
expansions: string[] | null;
} }
export default interface SearchState { export const SearchStateDefaults: SearchState = {
name: SearchStateTemplate<string>; name: '',
multibox: SearchStateTemplate<string[] | null>; multibox: null,
trusts: SearchStateTemplate<string[] | null>; trusts: null,
levelSync: SearchStateTemplate<string[] | null>; levelSync: null,
maxLevel: SearchStateTemplate<number[]>; maxLevel: [1, 99],
expansions: SearchStateTemplate<string[] | null>; expansions: null,
} };

View File

@ -43,28 +43,28 @@ export default function Home({
}, [setAlertInfo, setServers]); }, [setAlertInfo, setServers]);
const filterServers = (server: ServerData): boolean => { const filterServers = (server: ServerData): boolean => {
if (searchState.name.value.length > 0) { if (searchState.name.length > 0) {
const serverName = server.name.toLowerCase(); const serverName = server.name.toLowerCase();
if (!serverName.includes(searchState.name.value.toLowerCase())) { if (!serverName.includes(searchState.name.toLowerCase())) {
return false; return false;
} }
} }
if (server.max_level < searchState.maxLevel.value[0]) { if (server.max_level < searchState.maxLevel[0]) {
return false; return false;
} }
if (server.max_level > searchState.maxLevel.value[1]) { if (server.max_level > searchState.maxLevel[1]) {
return false; return false;
} }
if ( if (
searchState.trusts.value && searchState.trusts &&
typeof server.customizations['MAIN.ENABLE_TRUST_CASTING'] === 'number' typeof server.customizations['MAIN.ENABLE_TRUST_CASTING'] === 'number'
) { ) {
const serverTrusts = const serverTrusts =
server.customizations['MAIN.ENABLE_TRUST_CASTING'] === 1; server.customizations['MAIN.ENABLE_TRUST_CASTING'] === 1;
const searchEnabled = searchState.trusts.value.includes('enabled'); const searchEnabled = searchState.trusts.includes('enabled');
const searchDisabled = searchState.trusts.value.includes('disabled'); const searchDisabled = searchState.trusts.includes('disabled');
if (serverTrusts && searchDisabled && !searchEnabled) { if (serverTrusts && searchDisabled && !searchEnabled) {
return false; return false;
} }
@ -74,12 +74,12 @@ export default function Home({
} }
if ( if (
searchState.levelSync.value && searchState.levelSync &&
typeof server.customizations['MAP.LEVEL_SYNC_ENABLE'] === 'boolean' typeof server.customizations['MAP.LEVEL_SYNC_ENABLE'] === 'boolean'
) { ) {
const serverLevelSync = server.customizations['MAP.LEVEL_SYNC_ENABLE']; const serverLevelSync = server.customizations['MAP.LEVEL_SYNC_ENABLE'];
const searchEnabled = searchState.levelSync.value.includes('enabled'); const searchEnabled = searchState.levelSync.includes('enabled');
const searchDisabled = searchState.levelSync.value.includes('disabled'); const searchDisabled = searchState.levelSync.includes('disabled');
if (serverLevelSync && searchDisabled && !searchEnabled) { if (serverLevelSync && searchDisabled && !searchEnabled) {
return false; return false;
} }
@ -88,21 +88,21 @@ export default function Home({
} }
} }
if (searchState.expansions.value) { if (searchState.expansions) {
const searchNoneEnabled = searchState.expansions.value.includes('none'); const searchNoneEnabled = searchState.expansions.includes('none');
const searchRotzEnabled = searchState.expansions.value.includes('rotz'); const searchRotzEnabled = searchState.expansions.includes('rotz');
const serverRotzEnabled = const serverRotzEnabled =
server.customizations['LOGIN.RISE_OF_ZILART'] === true; server.customizations['LOGIN.RISE_OF_ZILART'] === true;
const searchCopEnabled = searchState.expansions.value.includes('cop'); const searchCopEnabled = searchState.expansions.includes('cop');
const serverCopEnabled = const serverCopEnabled =
server.customizations['LOGIN.CHAINS_OF_PROMATHIA'] === true; server.customizations['LOGIN.CHAINS_OF_PROMATHIA'] === true;
const searchToauEnabled = searchState.expansions.value.includes('toau'); const searchToauEnabled = searchState.expansions.includes('toau');
const serverToauEnabled = const serverToauEnabled =
server.customizations['LOGIN.TREASURES_OF_AHT_URGHAN'] === true; server.customizations['LOGIN.TREASURES_OF_AHT_URGHAN'] === true;
const searchWotgEnabled = searchState.expansions.value.includes('wotg'); const searchWotgEnabled = searchState.expansions.includes('wotg');
const serverWotgEnabled = const serverWotgEnabled =
server.customizations['LOGIN.WINGS_OF_THE_GODDESS'] === true; server.customizations['LOGIN.WINGS_OF_THE_GODDESS'] === true;
const searchSoaEnabled = searchState.expansions.value.includes('soa'); const searchSoaEnabled = searchState.expansions.includes('soa');
const serverSoaEnabled = const serverSoaEnabled =
server.customizations['LOGIN.SEEKERS_OF_ADOULIN'] === true; server.customizations['LOGIN.SEEKERS_OF_ADOULIN'] === true;
if ( if (
@ -132,20 +132,17 @@ export default function Home({
} }
} }
if (searchState.multibox.value) { if (searchState.multibox) {
const serverMultibox = server.login_limit; const serverMultibox = server.login_limit;
if (searchState.multibox.value.includes('none') && serverMultibox !== 1) { if (searchState.multibox.includes('none') && serverMultibox !== 1) {
return false;
}
if (searchState.multibox.includes('unlimited') && serverMultibox !== 0) {
return false; return false;
} }
if ( if (
searchState.multibox.value.includes('unlimited') && searchState.multibox.includes('limited') &&
serverMultibox !== 0 !searchState.multibox.includes('unlimited') &&
) {
return false;
}
if (
searchState.multibox.value.includes('limited') &&
!searchState.multibox.value.includes('unlimited') &&
serverMultibox < 2 serverMultibox < 2
) { ) {
return false; return false;