From bfe84dee2411fd1415d54b541b96dd87598e81e5 Mon Sep 17 00:00:00 2001 From: LynithDev <61880709+LynithDev@users.noreply.github.com> Date: Sun, 26 Jan 2025 11:58:44 +0100 Subject: [PATCH] LAUNCHER-11 fix: Package version sorting for SkyClient --- .../src/ui/pages/browser/BrowserPackage.tsx | 14 ++++- packages/core/src/api/package/content/mod.rs | 2 +- .../core/src/api/package/content/skyclient.rs | 58 ++++++++----------- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/apps/frontend/src/ui/pages/browser/BrowserPackage.tsx b/apps/frontend/src/ui/pages/browser/BrowserPackage.tsx index 6e07fbfe..f5787386 100644 --- a/apps/frontend/src/ui/pages/browser/BrowserPackage.tsx +++ b/apps/frontend/src/ui/pages/browser/BrowserPackage.tsx @@ -400,7 +400,10 @@ function BrowserPackageVersions() { if (context === null) return []; - const newestToOldest = context.pkg().versions.toReversed(); + const newestToOldest = context.pkg().versions; + if (context.pkg().provider !== 'SkyClient') + newestToOldest.reverse(); + const start = (page - 1) * MAX_ITEMS_PER_PAGE; const end = start + MAX_ITEMS_PER_PAGE; @@ -425,7 +428,12 @@ function BrowserPackageVersions() { const list = getVersionsForPage(page()); - return (await tryResult(() => bridge.commands.getProviderPackageVersions(context.pkg().provider, list))).toReversed(); + const versions = (await tryResult(() => bridge.commands.getProviderPackageVersions(context.pkg().provider, list))); + + if (context.pkg().provider !== 'SkyClient') + versions.reverse(); + + return versions; }); let container!: HTMLDivElement; @@ -583,7 +591,7 @@ function VersionRow(props: ManagedVersion) { - {formatAsRelative(new Date(props.published).getTime(), 'en', 'long')} + {props.published ? formatAsRelative(new Date(props.published).getTime(), 'en', 'long') : 'Unknown'} diff --git a/packages/core/src/api/package/content/mod.rs b/packages/core/src/api/package/content/mod.rs index 5276ce61..ede86dbd 100644 --- a/packages/core/src/api/package/content/mod.rs +++ b/packages/core/src/api/package/content/mod.rs @@ -183,7 +183,7 @@ impl Providers { Self::SkyClient => { let data = skyclient::get_all_versions(project_id, game_versions, loaders, page, page_size).await?; - (data.0.into_iter().map(Into::into).collect(), data.1) + (data.0, data.1) }, }) } diff --git a/packages/core/src/api/package/content/skyclient.rs b/packages/core/src/api/package/content/skyclient.rs index f945a5f7..4c8954d2 100644 --- a/packages/core/src/api/package/content/skyclient.rs +++ b/packages/core/src/api/package/content/skyclient.rs @@ -1,5 +1,6 @@ use std::{collections::HashMap, sync::Arc}; +use chrono::{DateTime, Utc}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use tokio::sync::{OnceCell, RwLock}; @@ -96,8 +97,8 @@ impl Into for SkyClientMod { categories: vec![], client: crate::store::PackageSide::Required, server: crate::store::PackageSide::Unknown, - created: None, - updated: None, + created: None, // TODO: Get the oldest date from versions + updated: None, // TODO: Get the newest date from versions description: self.description.unwrap_or_default(), downloads: 0, followers: 0, @@ -140,6 +141,7 @@ pub struct SkyClientModVersion { pub file: String, pub url: String, pub hash: String, + pub date_published: DateTime, pub mod_id: Option, } @@ -168,7 +170,7 @@ fn get_managed_version(m: &SkyClientMod, v: &SkyClientModVersion) -> ManagedVers is_available: true, loaders: v.loaders.iter().map(|l| Loader::from_string(l.to_owned())).collect(), name: format!("{} v{}", m.display, v.version), - published: None, + published: Some(v.date_published), version_display: v.version.clone(), version_type: crate::store::ManagedVersionReleaseType::Release, } @@ -177,9 +179,8 @@ fn get_managed_version(m: &SkyClientMod, v: &SkyClientModVersion) -> ManagedVers pub async fn get(id: &str) -> Result { let store = SkyClientStore::get().await?; - let mods = match &store.mods { - Some(mods) => mods, - None => return Err(anyhow::anyhow!("mod not found").into()) + let Some(mods) = &store.mods else { + return Err(anyhow::anyhow!("mod not found").into()) }; for m in mods { @@ -219,42 +220,33 @@ pub async fn get_all_versions( page: Option, page_size: Option, ) -> Result<(Vec, Pagination)> { - let store = SkyClientStore::get().await?; - - let mods = match &store.mods { - Some(mods) => mods, - None => return Ok((vec![], Pagination::default())) - }; - let mut pagination = Pagination::default(); let mut versions = vec![]; - for m in mods { - if m.id == project_id { - for v in &m.versions { - let mut can_add = true; + if let Ok(m) = &get(project_id).await { + for v in &m.versions { + let mut can_add = true; - if let Some(game_versions) = &game_versions { - if !game_versions.is_empty() { - can_add = v.game_versions.iter().any(|gv| game_versions.contains(gv)) + if let Some(game_versions) = &game_versions { + if !game_versions.is_empty() { + can_add = v.game_versions.iter().any(|gv| game_versions.contains(gv)) + } + } + + if can_add { + if let Some(loaders) = &loaders { + if !loaders.is_empty() { + can_add = v.loaders.iter().any(|l| loaders.contains(&Loader::from_string(l.to_owned()))) } } + } - if can_add { - if let Some(loaders) = &loaders { - if !loaders.is_empty() { - can_add = v.loaders.iter().any(|l| loaders.contains(&Loader::from_string(l.to_owned()))) - } - } + if can_add { + if page_size.map(|ps| versions.len() < ps as usize).unwrap_or(true) && page.map(|p| p <= pagination.index).unwrap_or(true) { + versions.push(get_managed_version(m, v)); } - if can_add { - if page_size.map(|ps| versions.len() < ps as usize).unwrap_or(true) && page.map(|p| p <= pagination.index).unwrap_or(true) { - versions.push(get_managed_version(m, v)); - } - - pagination.total_count += 1; - } + pagination.total_count += 1; } } }