Implement the Update Now button

This commit is contained in:
Josiah Glosson 2025-07-08 19:44:08 -05:00
parent ae75292fd0
commit 7b73aa2908
2 changed files with 44 additions and 6 deletions

View File

@ -1,5 +1,10 @@
<template> <template>
<ModalWrapper ref="modal" :header="formatMessage(messages.header)" :on-hide="onHide"> <ModalWrapper
ref="modal"
:header="formatMessage(messages.header)"
:on-hide="onHide"
:closable="!updateInProgress"
>
<div>{{ formatMessage(messages.bodyVersion, { version: update!.version }) }}</div> <div>{{ formatMessage(messages.bodyVersion, { version: update!.version }) }}</div>
<div v-if="updateSize"> <div v-if="updateSize">
{{ formatMessage(messages.bodySize, { size: formatBytes(updateSize) }) }} {{ formatMessage(messages.bodySize, { size: formatBytes(updateSize) }) }}
@ -9,20 +14,23 @@
formatMessage(messages.bodyChangelog) formatMessage(messages.bodyChangelog)
}}</a> }}</a>
</div> </div>
<ProgressBar class="mt-4" :progress="downloadProgress" />
<div class="mt-4 flex flex-wrap gap-2"> <div class="mt-4 flex flex-wrap gap-2">
<ButtonStyled color="green"> <ButtonStyled color="green">
<button> <button :disabled="updateInProgress" @click="installUpdateNow">
<RefreshCwIcon /> <RefreshCwIcon />
{{ formatMessage(messages.restartNow) }} {{ formatMessage(messages.restartNow) }}
</button> </button>
</ButtonStyled> </ButtonStyled>
<ButtonStyled> <ButtonStyled>
<button @click="hide"> <button :disabled="updateInProgress">
<RightArrowIcon />
{{ formatMessage(messages.later) }} {{ formatMessage(messages.later) }}
</button> </button>
</ButtonStyled> </ButtonStyled>
<ButtonStyled color="red"> <ButtonStyled color="red">
<button @click="skipUpdate"> <button :disabled="updateInProgress" @click="skipUpdate">
<XIcon />
{{ formatMessage(messages.skip) }} {{ formatMessage(messages.skip) }}
</button> </button>
</ButtonStyled> </ButtonStyled>
@ -35,10 +43,12 @@ import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import { defineMessages, useVIntl } from '@vintl/vintl' import { defineMessages, useVIntl } from '@vintl/vintl'
import { useTemplateRef, ref } from 'vue' import { useTemplateRef, ref } from 'vue'
import { ButtonStyled } from '@modrinth/ui' import { ButtonStyled } from '@modrinth/ui'
import { RefreshCwIcon } from '@modrinth/assets' import { RefreshCwIcon, XIcon, RightArrowIcon } from '@modrinth/assets'
import { getUpdateSize } from '@/helpers/utils' import { getUpdateSize } from '@/helpers/utils'
import { formatBytes } from '@modrinth/utils' import { formatBytes } from '@modrinth/utils'
import { handleError } from '@/store/notifications' import { handleError } from '@/store/notifications'
import ProgressBar from '@/components/ui/ProgressBar.vue'
import { Update } from '@tauri-apps/plugin-updater'
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'updateSkipped', version: string): void (e: 'updateSkipped', version: string): void
@ -79,11 +89,17 @@ const messages = defineMessages({
type UpdateData = { type UpdateData = {
rid: number rid: number
currentVersion: string
version: string version: string
date?: string
body?: string
rawJson: Record<string, unknown>
} }
const update = ref<UpdateData>() const update = ref<UpdateData>()
const updateSize = ref<number>() const updateSize = ref<number>()
const updateInProgress = ref(false)
const downloadProgress = ref(0)
const modal = useTemplateRef('modal') const modal = useTemplateRef('modal')
const isOpen = ref(false) const isOpen = ref(false)
@ -105,6 +121,22 @@ function hide() {
defineExpose({ show, hide, isOpen }) defineExpose({ show, hide, isOpen })
function installUpdateNow() {
updateInProgress.value = true
let totalSize = 0
let totalDownloaded = 0
new Update(update.value!).downloadAndInstall((event) => {
if (event.event === 'Started') {
totalSize = event.data.contentLength!
} else if (event.event === 'Progress') {
totalDownloaded += event.data.chunkLength
} else if (event.event === 'Finished') {
totalDownloaded = totalSize
}
downloadProgress.value = (totalDownloaded / totalSize) * 100
})
}
function skipUpdate() { function skipUpdate() {
hide() hide()
emit('updateSkipped', update.value!.version) emit('updateSkipped', update.value!.version)

View File

@ -48,7 +48,13 @@ function onModalHide() {
</script> </script>
<template> <template>
<Modal ref="modal" :header="header" :noblur="!themeStore.advancedRendering" @hide="onModalHide"> <Modal
ref="modal"
:header="header"
:noblur="!themeStore.advancedRendering"
@hide="onModalHide"
:closable="closable"
>
<template #title> <template #title>
<slot name="title" /> <slot name="title" />
</template> </template>