0.8.0 beta fixes (#2154)

* initial fixes

* 0.8.0 beta fixes

* run actions

* run fmt

* Fix windows build

* Add purge cache opt

* add must revalidate to project req

* lint + clippy

* fix processes, open folder

* Update migrator to use old launcher cache for perf

* fix empty dirs not moving

* fix lint + create natives dir if not exist

* fix large request batches

* finish

* Fix deep linking on mac

* fix comp err

* fix comp err (2)

---------

Signed-off-by: Geometrically <18202329+Geometrically@users.noreply.github.com>
This commit is contained in:
Geometrically
2024-08-16 23:20:11 -07:00
committed by GitHub
parent 3a4843fb46
commit 910e219c0e
66 changed files with 1961 additions and 1896 deletions

View File

@@ -1,5 +1,5 @@
<script setup>
import { computed, nextTick, ref, readonly, shallowRef, watch, onUnmounted } from 'vue'
import { computed, nextTick, ref, readonly, shallowRef, watch } from 'vue'
import { ClearIcon, SearchIcon, ClientIcon, ServerIcon, XIcon } from '@modrinth/assets'
import {
Pagination,
@@ -19,7 +19,6 @@ import { useBreadcrumbs } from '@/store/breadcrumbs'
import { get_categories, get_loaders, get_game_versions } from '@/helpers/tags'
import { useRoute, useRouter } from 'vue-router'
import SearchCard from '@/components/ui/SearchCard.vue'
import SplashScreen from '@/components/ui/SplashScreen.vue'
import { get as getInstance, get_projects as getInstanceProjects } from '@/helpers/profile.js'
import { convertFileSrc } from '@tauri-apps/api/tauri'
import { get_search_results } from '@/helpers/cache.js'
@@ -233,14 +232,14 @@ async function refreshSearch() {
if (currentPage.value !== 1) {
params.push(`offset=${offset}`)
}
let url = 'search'
let url = ''
if (params.length > 0) {
for (let i = 0; i < params.length; i++) {
url += i === 0 ? `?${params[i]}` : `&${params[i]}`
}
}
let rawResults = await get_search_results(`?${url}`)
let rawResults = await get_search_results(`${url}`)
if (!rawResults) {
rawResults = {
result: {
@@ -585,7 +584,10 @@ const isModProject = computed(() => ['modpack', 'mod'].includes(projectType.valu
<ClearIcon /> Clear filters
</Button>
<div
v-if="(isModProject && ignoreInstanceLoaders) || projectType === 'shader'"
v-if="
(isModProject && (ignoreInstanceLoaders || !instanceContext)) ||
projectType === 'shader'
"
class="loaders"
>
<h2>Loaders</h2>
@@ -721,7 +723,7 @@ const isModProject = computed(() => ['modpack', 'mod'].includes(projectType.valu
class="pagination-before"
@switch-page="onSearchChange"
/>
<SplashScreen v-if="loading" />
<section v-if="loading" class="offline">Loading...</section>
<section v-else-if="offline && results.total_hits === 0" class="offline">
You are currently offline. Connect to the internet to browse Modrinth!
</section>

View File

@@ -1,9 +1,9 @@
<script setup>
import { ref, watch } from 'vue'
import { LogOutIcon, LogInIcon, BoxIcon, FolderSearchIcon, UpdatedIcon } from '@modrinth/assets'
import { Card, Slider, DropdownSelect, Toggle, Modal, Button } from '@modrinth/ui'
import { LogOutIcon, LogInIcon, BoxIcon, FolderSearchIcon, TrashIcon } from '@modrinth/assets'
import { Card, Slider, DropdownSelect, Toggle, ConfirmModal, Button } from '@modrinth/ui'
import { handleError, useTheming } from '@/store/state'
import { is_dir_writeable, change_config_dir, get, set } from '@/helpers/settings'
import { get, set } from '@/helpers/settings'
import { get_java_versions, get_max_memory, set_java_version } from '@/helpers/jre'
import { get as getCreds, logout } from '@/helpers/mr_auth.js'
import JavaSelector from '@/components/ui/JavaSelector.vue'
@@ -12,7 +12,7 @@ import { mixpanel_opt_out_tracking, mixpanel_opt_in_tracking } from '@/helpers/m
import { open } from '@tauri-apps/api/dialog'
import { getOS } from '@/helpers/utils.js'
import { getVersion } from '@tauri-apps/api/app'
import { get_user } from '@/helpers/cache.js'
import { get_user, purge_cache_types } from '@/helpers/cache.js'
const pageOptions = ['Home', 'Library']
@@ -32,7 +32,6 @@ const accessSettings = async () => {
const fetchSettings = await accessSettings().catch(handleError)
const settings = ref(fetchSettings)
// const settingsDir = ref(settings.value.loaded_config_dir)
const maxMemory = ref(Math.floor((await get_max_memory().catch(handleError)) / 1024))
@@ -124,6 +123,25 @@ async function findLauncherDir() {
settings.value.custom_dir = newDir
}
}
async function purgeCache() {
await purge_cache_types([
'project',
'version',
'user',
'team',
'organization',
'loader_manifest',
'minecraft_manifest',
'categories',
'report_types',
'loaders',
'game_versions',
'donation_platforms',
'file_update',
'search_results',
]).catch(handleError)
}
</script>
<template>
@@ -136,26 +154,50 @@ async function findLauncherDir() {
</div>
<ModrinthLoginScreen ref="loginScreenModal" :callback="signInAfter" />
<div class="adjacent-input">
<label for="theme">
<label for="sign-in">
<span class="label__title">Manage account</span>
<span v-if="credentials" class="label__description">
You are currently logged in as {{ credentials.user.username }}.
</span>
<span v-else> Sign in to your Modrinth account. </span>
</label>
<button v-if="credentials" class="btn" @click="logOut">
<button v-if="credentials" id="sign-in" class="btn" @click="logOut">
<LogOutIcon />
Sign out
</button>
<button v-else class="btn" @click="$refs.loginScreenModal.show()">
<button v-else id="sign-in" class="btn" @click="$refs.loginScreenModal.show()">
<LogInIcon />
Sign in
</button>
</div>
<label for="theme">
<ConfirmModal
ref="purgeCacheConfirmModal"
title="Are you sure you want to purge the cache?"
description="If you proceed, your entire cache will be purged. This may slow down the app temporarily."
:has-to-type="false"
proceed-label="Purge cache"
:noblur="!themeStore.advancedRendering"
@proceed="purgeCache"
/>
<div class="adjacent-input">
<label for="purge-cache">
<span class="label__title">App cache</span>
<span class="label__description">
The Modrinth app stores a cache of data to speed up loading. This can be purged to force
the app to reload data. <br />
This may slow down the app temporarily.
</span>
</label>
<button id="purge-cache" class="btn" @click="$refs.purgeCacheConfirmModal.show()">
<TrashIcon />
Purge cache
</button>
</div>
<label for="appDir">
<span class="label__title">App directory</span>
<span class="label__description">
The directory where the launcher stores all of its files.
The directory where the launcher stores all of its files. Changes will be applied after
restarting the launcher.
</span>
</label>
<div class="app-directory">

View File

@@ -174,9 +174,13 @@ const options = ref(null)
const startInstance = async (context) => {
loading.value = true
run(route.params.id).catch(handleSevereError)
try {
await run(route.params.id)
playing.value = true
} catch (err) {
handleSevereError(err)
}
loading.value = false
playing.value = true
mixpanel_track('InstanceStart', {
loader: instance.value.loader,
@@ -194,13 +198,19 @@ const checkProcess = async () => {
// Get information on associated modrinth versions, if any
const modrinthVersions = ref([])
if (!offline.value && instance.value.linked_data && instance.value.linked_data.project_id) {
const project = await get_project(instance.value.linked_data.project_id).catch(handleError)
if (project && project.versions) {
modrinthVersions.value = (await get_version_many(project.versions).catch(handleError)).sort(
(a, b) => dayjs(b.date_published) - dayjs(a.date_published),
)
}
get_project(instance.value.linked_data.project_id, 'must_revalidate')
.catch(handleError)
.then((project) => {
if (project && project.versions) {
get_version_many(project.versions, 'must_revalidate')
.catch(handleError)
.then((versions) => {
modrinthVersions.value = versions.sort(
(a, b) => dayjs(b.date_published) - dayjs(a.date_published),
)
})
}
})
}
await checkProcess()

View File

@@ -25,13 +25,21 @@
</Button>
</div>
</div>
<Button
v-tooltip="'Refresh projects'"
icon-only
:disabled="refreshingProjects"
@click="refreshProjects"
>
<UpdatedIcon />
</Button>
<Button
v-if="canUpdatePack"
:disabled="installing"
color="secondary"
@click="modpackVersionModal.show()"
>
<UpdatedIcon />
<DownloadIcon />
{{ installing ? 'Updating' : 'Update modpack' }}
</Button>
<Button v-else-if="!isPackLocked" @click="exportModal.show()">
@@ -39,7 +47,7 @@
Export modpack
</Button>
<Button v-if="!isPackLocked && projects.some((m) => m.outdated)" @click="updateAll">
<UpdatedIcon />
<DownloadIcon />
Update all
</Button>
<AddContentButton v-if="!isPackLocked" :instance="instance" />
@@ -347,6 +355,7 @@ import {
EyeIcon,
EyeOffIcon,
CodeIcon,
DownloadIcon,
} from '@modrinth/assets'
import {
Pagination,
@@ -438,10 +447,10 @@ const exportModal = ref(null)
const projects = ref([])
const selectionMap = ref(new Map())
const initProjects = async () => {
const initProjects = async (cacheBehaviour) => {
const newProjects = []
const profileProjects = await get_projects(props.instance.path)
const profileProjects = await get_projects(props.instance.path, cacheBehaviour)
const fetchProjects = []
const fetchVersions = []
@@ -536,7 +545,7 @@ const ascending = ref(true)
const sortColumn = ref('Name')
const currentPage = ref(1)
watch(searchFilter, () => (currentPage.value = 1))
watch([searchFilter, selectedProjectType], () => (currentPage.value = 1))
const selected = computed(() =>
Array.from(selectionMap.value)
@@ -846,18 +855,25 @@ watch(selectAll, () => {
}
})
const switchPage = (page) => {
currentPage.value = page
}
const refreshingProjects = ref(false)
async function refreshProjects() {
refreshingProjects.value = true
await initProjects('bypass')
refreshingProjects.value = false
}
const unlisten = await listen('tauri://file-drop', async (event) => {
for (const file of event.payload) {
if (file.endsWith('.mrpack')) continue
await add_project_from_path(props.instance.path, file).catch(handleError)
}
initProjects(await get(props.instance.path).catch(handleError))
await initProjects()
})
const switchPage = (page) => {
currentPage.value = page
}
onUnmounted(() => {
unlisten()
})

View File

@@ -280,12 +280,12 @@ const installed = ref(false)
const installedVersion = ref(null)
async function fetchProjectData() {
const project = await get_project(route.params.id).catch(handleError)
const project = await get_project(route.params.id, 'must_revalidate').catch(handleError)
data.value = project
;[versions.value, members.value, categories.value, instance.value, instanceProjects.value] =
await Promise.all([
get_version_many(project.versions).catch(handleError),
get_version_many(project.versions, 'must_revalidate').catch(handleError),
get_team(project.team).catch(handleError),
get_categories().catch(handleError),
route.query.i ? getInstance(route.query.i).catch(handleError) : Promise.resolve(),