You've already forked AstralRinth
forked from didirus/AstralRinth
99 lines
3.0 KiB
JavaScript
99 lines
3.0 KiB
JavaScript
import { getVersion } from '@tauri-apps/api/app'
|
|
import { ref } from 'vue'
|
|
|
|
import { getOS, initUpdateLauncher } from '@/helpers/utils.js'
|
|
|
|
export const allowState = ref(false)
|
|
export const installState = ref(false)
|
|
export const updateState = ref(false)
|
|
|
|
const currentOS = ref('')
|
|
const api = `https://git.astralium.su/api/v1/repos/didirus/AstralRinth/releases/latest`
|
|
|
|
const systems = ['macos', 'windows', 'linux']
|
|
const macosExtensions = ['.dmg', '.pkg', '.app']
|
|
const windowsExtensions = ['.exe', '.msi']
|
|
|
|
const blacklistBeginPrefixes = [
|
|
`dev`,
|
|
`nightly`,
|
|
`dirty`,
|
|
`dirty-dev`,
|
|
`dirty-nightly`,
|
|
`dirty_dev`,
|
|
`dirty_nightly`,
|
|
] // This is blacklisted builds for download. For example, file.startsWith('dev') is not allowed.
|
|
|
|
export async function getRemote(isDownloadState) {
|
|
var releaseTag = null;
|
|
var releaseTitle = null;
|
|
var result = false;
|
|
currentOS.value = await getOS();
|
|
try {
|
|
const response = await fetch(api);
|
|
if (!response.ok) {
|
|
throw new Error(response.status);
|
|
}
|
|
const remoteData = await response.json();
|
|
releaseTag = document.getElementById('releaseTag');
|
|
releaseTitle = document.getElementById('releaseTitle');
|
|
if (releaseTag && releaseTitle) {
|
|
releaseTag.textContent = remoteData.tag_name;
|
|
releaseTitle.textContent = remoteData.name;
|
|
}
|
|
if (systems.includes(currentOS.value.toLowerCase())) {
|
|
const localVersion = await getVersion();
|
|
const isUpdateAvailable = !remoteData.tag_name.includes(localVersion);
|
|
updateState.value = isUpdateAvailable;
|
|
allowState.value = isUpdateAvailable;
|
|
} else {
|
|
updateState.value = false;
|
|
allowState.value = false;
|
|
}
|
|
if (isDownloadState) {
|
|
try {
|
|
installState.value = true;
|
|
const builds = remoteData.assets;
|
|
const fileName = getInstaller(getExtension(), builds);
|
|
result = fileName ? await initUpdateLauncher(fileName[1], fileName[0], currentOS.value, true) : false;
|
|
installState.value = false;
|
|
} catch (err) {
|
|
installState.value = false;
|
|
}
|
|
}
|
|
console.log('Update available state is', updateState.value);
|
|
console.log('Remote version is', remoteData.tag_name);
|
|
console.log('Remote title is', remoteData.name);
|
|
console.log('Local version is', await getVersion());
|
|
console.log('Operating System is', currentOS.value);
|
|
return result;
|
|
} catch (error) {
|
|
console.error("Failed to fetch remote releases:", error);
|
|
if (!releaseTag) {
|
|
updateState.value = false;
|
|
allowState.value = false;
|
|
installState.value = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
function getInstaller(osExtension, builds) {
|
|
console.log(osExtension, builds)
|
|
for (const build of builds) {
|
|
if (blacklistBeginPrefixes.some(prefix => build.name.startsWith(prefix))) {
|
|
continue;
|
|
}
|
|
if (osExtension.some(ext => build.name.endsWith(ext))) {
|
|
console.log(build.name, build.browser_download_url);
|
|
return [build.name, build.browser_download_url];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function getExtension() {
|
|
return systems.find(osName => osName === currentOS.value.toLowerCase())?.endsWith('macos')
|
|
? macosExtensions
|
|
: windowsExtensions;
|
|
}
|