fix: update button enabling its package

This commit is contained in:
2025-05-01 16:32:10 +00:00
parent 2e17e0ae75
commit 9b86af282e
11 changed files with 81 additions and 33 deletions

View File

@ -1,3 +1,11 @@
## 0.19.1
- Fixed the update button enabling the package
## 0.19.0
- Added diagnostic exports
## 0.18.3 ## 0.18.3
- Updated Rainycolor's domain・真 - Updated Rainycolor's domain・真

View File

@ -125,12 +125,13 @@ pub async fn kill() -> Result<(), String> {
pub async fn install_package( pub async fn install_package(
state: State<'_, tokio::sync::Mutex<AppData>>, state: State<'_, tokio::sync::Mutex<AppData>>,
key: PkgKey, key: PkgKey,
force: bool force: bool,
enable: bool
) -> Result<InstallResult, String> { ) -> Result<InstallResult, String> {
log::debug!("invoke: install_package({})", key); log::debug!("invoke: install_package({})", key);
let mut appd = state.lock().await; let mut appd = state.lock().await;
appd.pkgs.install_package(&key, force, true) appd.pkgs.install_package(&key, force, true, enable)
.await .await
.map_err(|e| e.to_string()) .map_err(|e| e.to_string())
} }

View File

@ -17,6 +17,12 @@ pub struct DownloadTick {
ratio: f32, ratio: f32,
} }
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct DownloadEndPayload {
pub key: PkgKey,
pub enable: bool
}
impl DownloadHandler { impl DownloadHandler {
pub fn new(app: AppHandle) -> DownloadHandler { pub fn new(app: AppHandle) -> DownloadHandler {
DownloadHandler { DownloadHandler {
@ -25,7 +31,7 @@ impl DownloadHandler {
} }
} }
pub fn download_zip(&mut self, zip_path: &PathBuf, pkg: &Package) -> Result<()> { pub fn download_zip(&mut self, zip_path: &PathBuf, pkg: &Package, enable: bool) -> Result<()> {
let rmt = pkg.rmt.as_ref() let rmt = pkg.rmt.as_ref()
.ok_or_else(|| anyhow!("Attempted to download a package without remote data"))? .ok_or_else(|| anyhow!("Attempted to download a package without remote data"))?
.clone(); .clone();
@ -34,12 +40,18 @@ impl DownloadHandler {
} else { } else {
// TODO clear cache button should clear this // TODO clear cache button should clear this
self.paths.insert(zip_path.clone()); self.paths.insert(zip_path.clone());
tauri::async_runtime::spawn(Self::download_zip_proc(self.app.clone(), zip_path.clone(), pkg.key(), rmt)); tauri::async_runtime::spawn(Self::download_zip_proc(self.app.clone(), zip_path.clone(), pkg.key(), rmt, enable));
Ok(()) Ok(())
} }
} }
async fn download_zip_proc(app: AppHandle, zip_path: PathBuf, pkg_key: PkgKey, rmt: Remote) -> Result<()> { async fn download_zip_proc(
app: AppHandle,
zip_path: PathBuf,
pkg_key: PkgKey,
rmt: Remote,
enable: bool
) -> Result<()> {
use futures::StreamExt; use futures::StreamExt;
use tokio::io::AsyncWriteExt; use tokio::io::AsyncWriteExt;
@ -66,7 +78,10 @@ impl DownloadHandler {
log::debug!("downloaded to {:?}", zip_path); log::debug!("downloaded to {:?}", zip_path);
app.emit("download-end", pkg_key)?; app.emit("download-end", DownloadEndPayload {
key: pkg_key,
enable
})?;
Ok(()) Ok(())
} }

View File

@ -102,16 +102,23 @@ pub async fn run(_args: Vec<String>) {
}); });
app.listen("download-end", closure!(clone apph, |ev| { app.listen("download-end", closure!(clone apph, |ev| {
let raw = ev.payload(); let payload = serde_json::from_str::<download_handler::DownloadEndPayload>(ev.payload());
log::debug!("download-end triggered: {}", raw); match payload {
let key = PkgKey(raw[1..raw.len()-1].to_owned()); Ok(payload) => {
log::debug!("download-end triggered: {:?}", payload);
let key = payload.key;
let apph = apph.clone(); let apph = apph.clone();
tauri::async_runtime::spawn(async move { tauri::async_runtime::spawn(async move {
let mutex = apph.state::<Mutex<AppData>>(); let mutex = apph.state::<Mutex<AppData>>();
let mut appd = mutex.lock().await; let mut appd = mutex.lock().await;
let res = appd.pkgs.install_package(&key, true, false).await; let res = appd.pkgs.install_package(&key, true, false, payload.enable).await;
log::debug!("download-end install {:?}", res); log::debug!("download-end install {:?}", res);
}); });
},
Err(err) => {
log::error!("invalid download payload: {err}");
}
}
})); }));
app.listen("launch-end", closure!(clone apph, |_| { app.listen("launch-end", closure!(clone apph, |_| {
@ -134,11 +141,13 @@ pub async fn run(_args: Vec<String>) {
tauri::async_runtime::spawn(async move { tauri::async_runtime::spawn(async move {
let mutex = apph.state::<Mutex<AppData>>(); let mutex = apph.state::<Mutex<AppData>>();
let mut appd = mutex.lock().await; let mut appd = mutex.lock().await;
if payload.enable == true {
let res = appd.toggle_package(payload.pkg.clone(), ToggleAction::EnableSelf); let res = appd.toggle_package(payload.pkg.clone(), ToggleAction::EnableSelf);
log::debug!( log::debug!(
"install-end-prelude toggle {:?}", "install-end-prelude toggle {:?}",
res res
); );
}
use tauri::Emitter; use tauri::Emitter;
let res = apph.emit("install-end", payload); let res = apph.emit("install-end", payload);
log::debug!("install-end {:?}", res); log::debug!("install-end {:?}", res);
@ -273,7 +282,7 @@ fn deep_link(app: AppHandle, args: Vec<String>) {
let mut appd = mutex.lock().await; let mut appd = mutex.lock().await;
if appd.pkgs.is_offline() { if appd.pkgs.is_offline() {
log::warn!("Deep link installation failed: offline"); log::warn!("Deep link installation failed: offline");
} else if let Err(e) = appd.pkgs.install_package(&key, true, true).await { } else if let Err(e) = appd.pkgs.install_package(&key, true, true, true).await {
log::warn!("Deep link installation failed: {}", e.to_string()); log::warn!("Deep link installation failed: {}", e.to_string());
} }
}); });

View File

@ -23,7 +23,8 @@ pub struct PackageStore {
#[derive(Clone, Serialize, Deserialize, Debug)] #[derive(Clone, Serialize, Deserialize, Debug)]
pub struct Payload { pub struct Payload {
pub pkg: PkgKey pub pkg: PkgKey,
pub enable: bool,
} }
#[derive(Clone, Copy, Serialize, Deserialize, Debug)] #[derive(Clone, Copy, Serialize, Deserialize, Debug)]
@ -180,7 +181,13 @@ impl PackageStore {
self.offline = false; self.offline = false;
} }
pub async fn install_package(&mut self, key: &PkgKey, force: bool, install_deps: bool) -> Result<InstallResult> { pub async fn install_package(
&mut self,
key: &PkgKey,
force: bool,
install_deps: bool,
enable: bool
) -> Result<InstallResult> {
log::info!("installation request: {}/{}/{}", key, force, install_deps); log::info!("installation request: {}/{}/{}", key, force, install_deps);
let pkg = self.store.get(key) let pkg = self.store.get(key)
@ -193,7 +200,8 @@ impl PackageStore {
} }
self.app.emit("install-start", Payload { self.app.emit("install-start", Payload {
pkg: key.to_owned() pkg: key.to_owned(),
enable
})?; })?;
let rmt = pkg.rmt.as_ref() let rmt = pkg.rmt.as_ref()
@ -203,7 +211,7 @@ impl PackageStore {
let mut set = HashSet::new(); let mut set = HashSet::new();
self.resolve_deps(rmt.clone(), &mut set)?; self.resolve_deps(rmt.clone(), &mut set)?;
for dep in set { for dep in set {
Box::pin(self.install_package(&dep, false, false)).await?; Box::pin(self.install_package(&dep, false, false, enable)).await?;
} }
} }
@ -214,7 +222,7 @@ impl PackageStore {
let part_path = zip_path.join(".part"); let part_path = zip_path.join(".part");
if !zip_path.exists() && !part_path.exists() { if !zip_path.exists() && !part_path.exists() {
self.dlh.download_zip(&zip_path, &pkg)?; self.dlh.download_zip(&zip_path, &pkg, enable)?;
log::debug!("deferring {}", key); log::debug!("deferring {}", key);
return Ok(InstallResult::Deferred); return Ok(InstallResult::Deferred);
} }
@ -230,7 +238,8 @@ impl PackageStore {
self.reload_package(key.to_owned()).await; self.reload_package(key.to_owned()).await;
self.app.emit("install-end-prelude", Payload { self.app.emit("install-end-prelude", Payload {
pkg: key.to_owned() pkg: key.to_owned(),
enable
})?; })?;
log::info!("installed {}", key); log::info!("installed {}", key);
@ -252,7 +261,8 @@ impl PackageStore {
if rv.is_ok() { if rv.is_ok() {
self.app.emit("install-end-prelude", Payload { self.app.emit("install-end-prelude", Payload {
pkg: key.to_owned() pkg: key.to_owned(),
enable: false
})?; })?;
log::info!("deleted {}", key); log::info!("deleted {}", key);
} }

View File

@ -295,7 +295,7 @@ listen<DownloadingStatus>('download-progress', (event) => {
pkg.hasAvailableUpdates pkg.hasAvailableUpdates
" "
icon="pi pi-download" icon="pi pi-download"
label="UPDATE ALL" :label="t('updateAll')"
size="small" size="small"
class="mr-4 m-2.5" class="mr-4 m-2.5"
@click="pkg.updateAll()" @click="pkg.updateAll()"

View File

@ -53,6 +53,6 @@ const remove = async () => {
class="self-center ml-4" class="self-center ml-4"
style="width: 2rem; height: 2rem" style="width: 2rem; height: 2rem"
:loading="pkg?.js.downloading" :loading="pkg?.js.downloading"
v-on:click="async () => await pkgs.install(pkg)" v-on:click="async () => await pkgs.install(pkg, true)"
/> />
</template> </template>

View File

@ -17,6 +17,7 @@ const install = async () => {
await invoke('install_package', { await invoke('install_package', {
key: pkgKey(props.pkg), key: pkgKey(props.pkg),
force: true, force: true,
enable: false,
}); });
} catch (err) { } catch (err) {
if (props.pkg !== undefined) { if (props.pkg !== undefined) {

View File

@ -9,6 +9,7 @@ export default {
skip: 'Skip', skip: 'Skip',
close: 'Close', close: 'Close',
by: 'by {namespace}', by: 'by {namespace}',
updateAll: 'UPDATE ALL',
start: { start: {
failed: 'Start check failed', failed: 'Start check failed',
accept: 'Run anyway', accept: 'Run anyway',

View File

@ -9,6 +9,7 @@ export default {
skip: 'Pomiń', skip: 'Pomiń',
close: 'Zamknij', close: 'Zamknij',
by: 'od {namespace}', by: 'od {namespace}',
updateAll: 'ZAKTUALIZUJ WSZYSTKO',
start: { start: {
failed: 'Uruchomienie nie powiodło się', failed: 'Uruchomienie nie powiodło się',
accept: 'Uruchom mimo to', accept: 'Uruchom mimo to',

View File

@ -189,7 +189,7 @@ export const usePkgStore = defineStore('pkg', {
await this.reloadAll(); await this.reloadAll();
}, },
async install(pkg: Package | undefined) { async install(pkg: Package | undefined, enable: boolean) {
if (pkg === undefined) { if (pkg === undefined) {
return; return;
} }
@ -198,6 +198,7 @@ export const usePkgStore = defineStore('pkg', {
await invoke('install_package', { await invoke('install_package', {
key: pkgKey(pkg), key: pkgKey(pkg),
force: true, force: true,
enable,
}); });
} catch (err) { } catch (err) {
if (pkg !== undefined) { if (pkg !== undefined) {
@ -211,6 +212,7 @@ export const usePkgStore = defineStore('pkg', {
await invoke('install_package', { await invoke('install_package', {
key, key,
force: true, force: true,
enable: false,
}); });
} catch (err) { } catch (err) {
console.error(err); console.error(err);
@ -221,7 +223,7 @@ export const usePkgStore = defineStore('pkg', {
const list = []; const list = [];
for (const pkg of this.allLocal) { for (const pkg of this.allLocal) {
if (pkg.rmt && pkg.rmt.version > pkg.loc!.version) { if (pkg.rmt && pkg.rmt.version > pkg.loc!.version) {
list.push(this.install(pkg)); list.push(this.install(pkg, false));
} }
} }
await Promise.all(list); await Promise.all(list);