Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 36 additions & 4 deletions packages/oneclient_app/src/components/package_row.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use freya::prelude::*;
use freya::router::RouterContext;
use oneclient_content::packages::ProviderId;
use oneclient_core::SeenStatus;

use crate::components::{Icon, IconType, toggle_controlled};
use crate::hooks::{ClusterAction, loaded_image, use_cached_image, use_cluster_mutation};
Expand Down Expand Up @@ -44,10 +45,9 @@ pub struct PackageEntry {
pub installed: bool,
pub hash: Option<String>,
pub manifest_default: bool,
/// Private bundle dependency only set for bundle rows
pub hidden: bool,
/// Only set for browser-installed content bundle packages use the bundle update flow
pub update_available: bool,
pub seen_status: SeenStatus,
}

impl PackageEntry {
Expand All @@ -63,6 +63,14 @@ impl PackageEntry {
pub fn is_outdated(&self) -> bool {
self.update_available && self.is_remote() && !self.in_bundle()
}

pub fn recency_badge(&self) -> Option<Element> {
match self.seen_status {
SeenStatus::New => Some(new_badge()),
SeenStatus::Updated => Some(updated_badge()),
SeenStatus::Seen => None,
}
}
}

#[derive(PartialEq)]
Expand Down Expand Up @@ -278,7 +286,8 @@ fn grid_card(
.cross_align(Alignment::Center)
.spacing(6.)
.child(badge)
.maybe_child(item.is_outdated().then(outdated_badge)),
.maybe_child(item.is_outdated().then(outdated_badge))
.maybe_child(item.recency_badge()),
),
)
.into_element();
Expand Down Expand Up @@ -378,7 +387,8 @@ fn package_info(
} else {
local_badge()
})
.maybe_child(item.is_outdated().then(outdated_badge)),
.maybe_child(item.is_outdated().then(outdated_badge))
.maybe_child(item.recency_badge()),
)
.maybe(!item.author.is_empty(), |el| {
el.child(
Expand Down Expand Up @@ -469,6 +479,28 @@ fn outdated_badge() -> Element {
)
}

fn new_badge() -> Element {
accent_badge(
Icon::new(IconType::Plus)
.size(12.)
.color(colors::success())
.into_element(),
"New".to_string(),
colors::success(),
)
}

fn updated_badge() -> Element {
accent_badge(
Icon::new(IconType::RefreshCcw02)
.size(12.)
.color(colors::success())
.into_element(),
"Updated".to_string(),
colors::success(),
)
}

fn local_badge() -> Element {
badge(
Icon::new(IconType::File02)
Expand Down
10 changes: 10 additions & 0 deletions packages/oneclient_app/src/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,16 @@ pub async fn start_launcher(
) -> Result<(), anyhow::Error> {
let state = crate::launcher::install(oneclient_core::LauncherState::new(events).await?);

match oneclient_content::packages::PackageStore::retire_seen_badges(&state.services.content())
.await
{
Ok(cleared) if cleared > 0 => {
tracing::debug!(cleared, "retired package badges from the previous session");
}
Ok(_) => {}
Err(err) => tracing::warn!(%err, "failed to retire package badges"),
}

oneclient_net::status::start(state.services.requester.clone());
oneclient_polyplus::start(std::sync::Arc::clone(&state.auth));
oneclient_core::run_startup_tasks(&state);
Expand Down
17 changes: 16 additions & 1 deletion packages/oneclient_app/src/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,10 @@ pub async fn install_package(
child.finish();

match result {
Ok(_) => installed_dependencies.push(dependency.project.name.clone()),
Ok(artifact) => {
mark_new(cluster_id, &artifact.hash, state).await;
installed_dependencies.push(dependency.project.name.clone());
}
Err(err) => {
tracing::warn!(
dependency = %dependency.project.name,
Expand Down Expand Up @@ -333,10 +336,22 @@ pub async fn install_package(

child.finish();

if let Ok(artifact) = &result {
mark_new(cluster_id, &artifact.hash, state).await;
}

PackageInstall {
session_id: Some(session.detach()),
result: result.map(|_| project.name).map_err(anyhow::Error::from),
dependencies: installed_dependencies,
missing_dependencies,
}
}

async fn mark_new(cluster_id: i64, hash: &str, state: &LauncherState) {
if let Err(err) =
PackageStore::mark_artifact_new(cluster_id, hash, &state.services.content()).await
{
tracing::warn!(cluster_id, hash, %err, "failed to badge package as new");
}
}
1 change: 1 addition & 0 deletions packages/oneclient_app/src/view/app/browser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,7 @@ mod tests {
display_version: None,
provider: Some(ProviderId::Modrinth),
published_at: None,
seen_status: oneclient_core::SeenStatus::Seen,
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,9 @@ fn make_row(
hash: installed_info.map(|i| i.hash.clone()),
update_available,
hidden,
seen_status: installed_info
.map(|i| i.seen_status)
.unwrap_or_default(),
}
}

Expand Down
11 changes: 9 additions & 2 deletions packages/oneclient_content/src/bundles/updates.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ use oneclient_db::dao::artifact as artifact_dao;
use oneclient_db::dao::cluster as cluster_dao;
use oneclient_db::dao::cluster_bundle as bundle_dao;
use oneclient_db::models::ClusterPatch;
use oneclient_db::models::{BundleTrackedArtifactRow, ClusterBundleOverrideRow, OverrideType};
use oneclient_db::models::{
BundleTrackedArtifactRow, ClusterBundleOverrideRow, OverrideType, SeenStatus,
};
use tokio::sync::Mutex as AsyncMutex;

use futures_util::StreamExt;
Expand Down Expand Up @@ -564,6 +566,7 @@ async fn reconcile_update(
let suppression = find_user_suppression(overrides, &file_id);
let enabled = !disable_was_deliberate(update.new_file.hidden, suppression);
set_artifact_enabled_to(update.cluster_id, hash, enabled, ctx).await?;
artifact_dao::set_seen_status(&ctx.db, update.cluster_id, hash, SeenStatus::Updated).await?;

if hash == update.installed_hash {
return Ok(());
Expand All @@ -582,7 +585,11 @@ async fn reconcile_addition(
let file_id = addition.new_file.kind.package_id();
let suppression = find_user_suppression(overrides, &file_id);
let enabled = !disable_was_deliberate(addition.new_file.hidden, suppression);
set_artifact_enabled_to(addition.cluster_id, hash, enabled, ctx).await
set_artifact_enabled_to(addition.cluster_id, hash, enabled, ctx).await?;

artifact_dao::set_seen_status(&ctx.db, addition.cluster_id, hash, SeenStatus::New).await?;

Ok(())
}

#[tracing::instrument(level = "debug", skip(bundles, ctx))]
Expand Down
Loading