Improve mod browser load time

Add pages to mod browser
Still WIP
This commit is contained in:
Thoronium
2023-04-24 20:21:52 -06:00
parent 9d9bc43119
commit 3969c26a58
6 changed files with 132 additions and 24 deletions

View File

@@ -1,21 +1,25 @@
use http::header;
use once_cell::sync::Lazy;
use reqwest::header::{CONTENT_TYPE, USER_AGENT}; use reqwest::header::{CONTENT_TYPE, USER_AGENT};
static CLIENT: Lazy<reqwest::Client> = Lazy::new(|| {
let mut headers = header::HeaderMap::new();
headers.insert(USER_AGENT, header::HeaderValue::from_static("cultivation"));
headers.insert(CONTENT_TYPE, header::HeaderValue::from_static("application/json"));
let client = reqwest::Client::builder()
.default_headers(headers);
client.build().unwrap()
});
pub(crate) async fn query(site: &str) -> String { pub(crate) async fn query(site: &str) -> String {
let client = reqwest::Client::new(); CLIENT
let response = client
.get(site) .get(site)
.header(USER_AGENT, "cultivation")
.header(CONTENT_TYPE, "application/json")
.send() .send()
.await .await
.ok(); .expect("Failed to get web response")
.text()
if response.is_some() { .await
response.unwrap().text().await.unwrap() .unwrap()
} else {
false.to_string()
}
} }
#[tauri::command] #[tauri::command]

View File

@@ -14,6 +14,7 @@ import Back from '../resources/icons/back.svg'
import Menu from './components/menu/Menu' import Menu from './components/menu/Menu'
import BigButton from './components/common/BigButton' import BigButton from './components/common/BigButton'
import Tr from '../utils/language' import Tr from '../utils/language'
import { ModPages } from './components/mods/ModPages'
interface IProps { interface IProps {
downloadHandler: DownloadHandler downloadHandler: DownloadHandler
@@ -23,8 +24,20 @@ interface IState {
isDownloading: boolean isDownloading: boolean
category: string category: string
downloadList: { name: string; url: string; mod: ModData }[] | null downloadList: { name: string; url: string; mod: ModData }[] | null
page: number
} }
const pages = [
{
name: -1,
title: '<',
},
{
name: 1,
title: '>',
}
]
const headers = [ const headers = [
{ {
name: 'ripe', name: 'ripe',
@@ -53,10 +66,12 @@ export class Mods extends React.Component<IProps, IState> {
isDownloading: false, isDownloading: false,
category: '', category: '',
downloadList: null, downloadList: null,
page: 1,
} }
this.setCategory = this.setCategory.bind(this) this.setCategory = this.setCategory.bind(this)
this.addDownload = this.addDownload.bind(this) this.addDownload = this.addDownload.bind(this)
this.setPage = this.setPage.bind(this)
} }
async addDownload(mod: ModData) { async addDownload(mod: ModData) {
@@ -111,6 +126,17 @@ export class Mods extends React.Component<IProps, IState> {
) )
} }
async setPage(value: number) {
const current = this.state.page;
if (current + value == 0) return;
this.setState(
{
page: current + value,
},
this.forceUpdate
)
}
render() { render() {
return ( return (
<div className="Mods"> <div className="Mods">
@@ -162,7 +188,9 @@ export class Mods extends React.Component<IProps, IState> {
<ModHeader onChange={this.setCategory} headers={headers} defaultHeader={'ripe'} /> <ModHeader onChange={this.setCategory} headers={headers} defaultHeader={'ripe'} />
<ModList key={this.state.category} mode={this.state.category} addDownload={this.addDownload} /> <ModPages onClick={this.setPage} headers={pages} defaultHeader={1} />
<ModList key={`${this.state.category}_${this.state.page}`} mode={this.state.category} addDownload={this.addDownload} page={this.state.page} />
</div> </div>
) )
} }

View File

@@ -8,6 +8,7 @@ import { ModTile } from './ModTile'
interface IProps { interface IProps {
mode: string mode: string
page: number
addDownload: (mod: ModData) => void addDownload: (mod: ModData) => void
} }
@@ -62,7 +63,7 @@ export class ModList extends React.Component<IProps, IState> {
return return
} }
const mods = await getMods(this.props.mode) const mods = await getMods(this.props.mode, this.props.page)
const horny = await getConfigOption('horny_mode') const horny = await getConfigOption('horny_mode')
this.setState({ this.setState({

View File

@@ -0,0 +1,30 @@
.ModPages {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-around;
width: 100%;
padding: 10px;
font-size: 20px;
font-weight: bold;
color: #fff;
background: rgba(77, 77, 77, 0.6);
}
.ModPagesTitle {
display: flex;
justify-content: center;
width: 100%;
max-width: 20%;
}
.ModPagesTitle:hover {
cursor: pointer;
}
.ModPagesTitle.selected {
border-bottom: 0px solid #fff;
}

View File

@@ -0,0 +1,54 @@
import React from 'react'
import './ModPages.css'
interface IProps {
headers: {
title: string
name: number
}[]
onClick: (value: number) => void
defaultHeader: number
}
interface IState {
selected: number
}
export class ModPages extends React.Component<IProps, IState> {
constructor(props: IProps) {
super(props)
this.state = {
selected: this.props.defaultHeader,
}
}
setSelected(value: number) {
const current = this.state.selected;
if (current + value == 0) return;
this.setState({
selected: current + value,
})
this.props.onClick(value)
}
render() {
return (
<div className="ModPages">
{this.props.headers.map((header, index) => {
return (
<div
key={index}
className={`ModPagesTitle ${this.state.selected === header.name ? 'selected' : ''}`}
onClick={() => this.setSelected(header.name)}
>
{header.title}
</div>
)
})}
</div>
)
}
}

View File

@@ -117,12 +117,10 @@ interface ModDownload {
containsExe: boolean containsExe: boolean
} }
export async function getMods(mode: string) { export async function getMods(mode: string, page: number) {
let modList: GamebananaResponse[] = [] let modList: GamebananaResponse[] = []
let hadMods = true let hadMods = true
let page = 1
while (hadMods) {
const resp = JSON.parse( const resp = JSON.parse(
await invoke('list_submissions', { await invoke('list_submissions', {
mode, mode,
@@ -133,13 +131,6 @@ export async function getMods(mode: string) {
if (resp.length === 0) hadMods = false if (resp.length === 0) hadMods = false
modList = [...modList, ...resp] modList = [...modList, ...resp]
page++
console.log(page)
console.log(resp)
}
console.log(modList)
return formatGamebananaData(modList) return formatGamebananaData(modList)
} }