You've already forked AstralRinth
forked from didirus/AstralRinth
Fix serverless crash + Version Filters on reload (#1050)
This commit is contained in:
@@ -18,7 +18,7 @@
|
|||||||
:show-labels="false"
|
:show-labels="false"
|
||||||
:allow-empty="true"
|
:allow-empty="true"
|
||||||
placeholder="Filter loader..."
|
placeholder="Filter loader..."
|
||||||
@update:model-value="updateVersionFilters()"
|
@update:model-value="updateQuery"
|
||||||
/>
|
/>
|
||||||
<Multiselect
|
<Multiselect
|
||||||
v-if="gameVersionFilters.length > 1"
|
v-if="gameVersionFilters.length > 1"
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
:hide-selected="true"
|
:hide-selected="true"
|
||||||
:selectable="() => selectedGameVersions.length <= 6"
|
:selectable="() => selectedGameVersions.length <= 6"
|
||||||
placeholder="Filter versions..."
|
placeholder="Filter versions..."
|
||||||
@update:model-value="updateVersionFilters()"
|
@update:model-value="updateQuery"
|
||||||
/>
|
/>
|
||||||
<Multiselect
|
<Multiselect
|
||||||
v-if="versionTypeFilters.length > 1"
|
v-if="versionTypeFilters.length > 1"
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
:show-labels="false"
|
:show-labels="false"
|
||||||
:allow-empty="true"
|
:allow-empty="true"
|
||||||
placeholder="Filter channels..."
|
placeholder="Filter channels..."
|
||||||
@update:model-value="updateVersionFilters()"
|
@update:model-value="updateQuery"
|
||||||
/>
|
/>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
v-if="
|
v-if="
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
selectedLoaders = []
|
selectedLoaders = []
|
||||||
selectedGameVersions = []
|
selectedGameVersions = []
|
||||||
selectedVersionTypes = []
|
selectedVersionTypes = []
|
||||||
updateVersionFilters()
|
updateQuery()
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
@@ -88,7 +88,6 @@ import Multiselect from 'vue-multiselect'
|
|||||||
import Checkbox from '~/components/ui/Checkbox'
|
import Checkbox from '~/components/ui/Checkbox'
|
||||||
import ClearIcon from '~/assets/images/utils/clear.svg'
|
import ClearIcon from '~/assets/images/utils/clear.svg'
|
||||||
|
|
||||||
const emit = defineEmits(['updateVersions'])
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
versions: {
|
versions: {
|
||||||
type: Array,
|
type: Array,
|
||||||
@@ -124,26 +123,9 @@ const gameVersionFilters = shallowRef(
|
|||||||
const versionTypeFilters = shallowRef(Array.from(tempReleaseChannels))
|
const versionTypeFilters = shallowRef(Array.from(tempReleaseChannels))
|
||||||
const includeSnapshots = ref(route.query.s === 'true')
|
const includeSnapshots = ref(route.query.s === 'true')
|
||||||
|
|
||||||
const selectedGameVersions = shallowRef(route.query.g ?? [])
|
const selectedGameVersions = shallowRef(getArrayOrString(route.query.g) ?? [])
|
||||||
const selectedLoaders = shallowRef(route.query.l ?? [])
|
const selectedLoaders = shallowRef(getArrayOrString(route.query.l) ?? [])
|
||||||
const selectedVersionTypes = shallowRef(route.query.c ?? [])
|
const selectedVersionTypes = shallowRef(getArrayOrString(route.query.c) ?? [])
|
||||||
|
|
||||||
async function updateVersionFilters() {
|
|
||||||
const temp = props.versions.filter(
|
|
||||||
(projectVersion) =>
|
|
||||||
(selectedGameVersions.value.length === 0 ||
|
|
||||||
selectedGameVersions.value.some((gameVersion) =>
|
|
||||||
projectVersion.game_versions.includes(gameVersion)
|
|
||||||
)) &&
|
|
||||||
(selectedLoaders.value.length === 0 ||
|
|
||||||
selectedLoaders.value.some((loader) => projectVersion.loaders.includes(loader))) &&
|
|
||||||
(selectedVersionTypes.value.length === 0 ||
|
|
||||||
selectedVersionTypes.value.includes(projectVersion.version_type))
|
|
||||||
)
|
|
||||||
|
|
||||||
await updateQuery()
|
|
||||||
emit('updateVersions', temp)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function updateQuery() {
|
async function updateQuery() {
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
|||||||
7
composables/query.js
Normal file
7
composables/query.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
export const getArrayOrString = (x) => {
|
||||||
|
if (typeof x === 'string' || x instanceof String) {
|
||||||
|
return [x]
|
||||||
|
} else {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,15 +7,7 @@
|
|||||||
<Meta name="apple-mobile-web-app-title" :content="`${props.project.title} - Changelog`" />
|
<Meta name="apple-mobile-web-app-title" :content="`${props.project.title} - Changelog`" />
|
||||||
<Meta name="og:description" :content="metaDescription" />
|
<Meta name="og:description" :content="metaDescription" />
|
||||||
</Head>
|
</Head>
|
||||||
<VersionFilterControl
|
<VersionFilterControl :versions="props.versions" />
|
||||||
:versions="props.versions"
|
|
||||||
@update-versions="
|
|
||||||
(v) => {
|
|
||||||
filteredVersions = v
|
|
||||||
switchPage(1)
|
|
||||||
}
|
|
||||||
"
|
|
||||||
/>
|
|
||||||
<Pagination
|
<Pagination
|
||||||
:page="currentPage"
|
:page="currentPage"
|
||||||
:count="Math.ceil(filteredVersions.length / 20)"
|
:count="Math.ceil(filteredVersions.length / 20)"
|
||||||
@@ -114,15 +106,32 @@ const metaDescription = computed(
|
|||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const currentPage = ref(Number(route.query.p ?? 1))
|
const currentPage = ref(Number(route.query.p ?? 1))
|
||||||
const filteredVersions = shallowRef(props.versions)
|
const filteredVersions = computed(() => {
|
||||||
|
const selectedGameVersions = getArrayOrString(route.query.g) ?? []
|
||||||
|
const selectedLoaders = getArrayOrString(route.query.l) ?? []
|
||||||
|
const selectedVersionTypes = getArrayOrString(route.query.c) ?? []
|
||||||
|
|
||||||
async function switchPage(page) {
|
currentPage.value = 1
|
||||||
|
return props.versions.filter(
|
||||||
|
(projectVersion) =>
|
||||||
|
(selectedGameVersions.length === 0 ||
|
||||||
|
selectedGameVersions.some((gameVersion) =>
|
||||||
|
projectVersion.game_versions.includes(gameVersion)
|
||||||
|
)) &&
|
||||||
|
(selectedLoaders.length === 0 ||
|
||||||
|
selectedLoaders.some((loader) => projectVersion.loaders.includes(loader))) &&
|
||||||
|
(selectedVersionTypes.length === 0 ||
|
||||||
|
selectedVersionTypes.includes(projectVersion.version_type))
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
function switchPage(page) {
|
||||||
currentPage.value = page
|
currentPage.value = page
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
||||||
await router.replace({
|
router.replace({
|
||||||
query: {
|
query: {
|
||||||
...route.query,
|
...route.query,
|
||||||
p: currentPage.value !== 1 ? currentPage.value : undefined,
|
p: currentPage.value !== 1 ? currentPage.value : undefined,
|
||||||
|
|||||||
@@ -22,15 +22,7 @@
|
|||||||
</span>
|
</span>
|
||||||
<DropArea :accept="acceptFileFromProjectType(project.project_type)" @change="handleFiles" />
|
<DropArea :accept="acceptFileFromProjectType(project.project_type)" @change="handleFiles" />
|
||||||
</div>
|
</div>
|
||||||
<VersionFilterControl
|
<VersionFilterControl :versions="props.versions" />
|
||||||
:versions="props.versions"
|
|
||||||
@update-versions="
|
|
||||||
(v) => {
|
|
||||||
filteredVersions = v
|
|
||||||
switchPage(1)
|
|
||||||
}
|
|
||||||
"
|
|
||||||
/>
|
|
||||||
<Pagination
|
<Pagination
|
||||||
:page="currentPage"
|
:page="currentPage"
|
||||||
:count="Math.ceil(filteredVersions.length / 20)"
|
:count="Math.ceil(filteredVersions.length / 20)"
|
||||||
@@ -161,15 +153,32 @@ const metaDescription = computed(
|
|||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const currentPage = ref(Number(route.query.p ?? 1))
|
const currentPage = ref(Number(route.query.p ?? 1))
|
||||||
const filteredVersions = shallowRef(props.versions)
|
const filteredVersions = computed(() => {
|
||||||
|
const selectedGameVersions = getArrayOrString(route.query.g) ?? []
|
||||||
|
const selectedLoaders = getArrayOrString(route.query.l) ?? []
|
||||||
|
const selectedVersionTypes = getArrayOrString(route.query.c) ?? []
|
||||||
|
|
||||||
async function switchPage(page) {
|
currentPage.value = 1
|
||||||
|
return props.versions.filter(
|
||||||
|
(projectVersion) =>
|
||||||
|
(selectedGameVersions.length === 0 ||
|
||||||
|
selectedGameVersions.some((gameVersion) =>
|
||||||
|
projectVersion.game_versions.includes(gameVersion)
|
||||||
|
)) &&
|
||||||
|
(selectedLoaders.length === 0 ||
|
||||||
|
selectedLoaders.some((loader) => projectVersion.loaders.includes(loader))) &&
|
||||||
|
(selectedVersionTypes.length === 0 ||
|
||||||
|
selectedVersionTypes.includes(projectVersion.version_type))
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
function switchPage(page) {
|
||||||
currentPage.value = page
|
currentPage.value = page
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
||||||
await router.replace({
|
router.replace({
|
||||||
query: {
|
query: {
|
||||||
...route.query,
|
...route.query,
|
||||||
p: currentPage.value !== 1 ? currentPage.value : undefined,
|
p: currentPage.value !== 1 ? currentPage.value : undefined,
|
||||||
|
|||||||
@@ -406,14 +406,6 @@ export default defineNuxtComponent({
|
|||||||
const currentPage = ref(1)
|
const currentPage = ref(1)
|
||||||
const projectType = ref({ id: 'mod', display: 'mod', actual: 'mod' })
|
const projectType = ref({ id: 'mod', display: 'mod', actual: 'mod' })
|
||||||
|
|
||||||
function getArrayOrString(x) {
|
|
||||||
if (typeof x === 'string' || x instanceof String) {
|
|
||||||
return [x]
|
|
||||||
} else {
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (route.query.q) {
|
if (route.query.q) {
|
||||||
query.value = route.query.q
|
query.value = route.query.q
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ export default defineNuxtPlugin(() => {
|
|||||||
const nuxtApp = useNuxtApp()
|
const nuxtApp = useNuxtApp()
|
||||||
|
|
||||||
nuxtApp.hooks.hook('page:transition:finish', () => {
|
nuxtApp.hooks.hook('page:transition:finish', () => {
|
||||||
document.querySelector('[data-scroll]')?.scrollTo({ top: 9 })
|
document.querySelector('[data-scroll]')?.scrollTo({ top: 0 })
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,34 +1,38 @@
|
|||||||
export default defineNitroPlugin((nitroApp) => {
|
export default defineNitroPlugin((nitroApp) => {
|
||||||
nitroApp.hooks.hook('render:html', (html, { event }) => {
|
nitroApp.hooks.hook('render:html', (html, { event }) => {
|
||||||
const cookies = parseCookies(event)
|
try {
|
||||||
|
const cookies = parseCookies(event)
|
||||||
|
|
||||||
if (cookies && cookies['color-mode']) {
|
if (cookies && cookies['color-mode']) {
|
||||||
const theme = JSON.parse(cookies['color-mode'])
|
const theme = JSON.parse(cookies['color-mode'])
|
||||||
|
|
||||||
html.htmlAttrs.push(`class="${theme.value}-mode"`)
|
html.htmlAttrs.push(`class="${theme.value}-mode"`)
|
||||||
} else {
|
} else {
|
||||||
html.htmlAttrs.push(`class="dark-mode"`)
|
html.htmlAttrs.push(`class="dark-mode"`)
|
||||||
}
|
|
||||||
|
|
||||||
// Reset cookie attributes to correct ones
|
|
||||||
if (cookies) {
|
|
||||||
const opts = {
|
|
||||||
maxAge: 60 * 60 * 24 * 365 * 10,
|
|
||||||
sameSite: 'lax',
|
|
||||||
secure: true,
|
|
||||||
httpOnly: false,
|
|
||||||
path: '/',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cookies['auth-token']) {
|
// Reset cookie attributes to correct ones
|
||||||
setCookie(event, 'auth-token', cookies['auth-token'], opts)
|
if (cookies) {
|
||||||
}
|
const opts = {
|
||||||
if (cookies['color-mode']) {
|
maxAge: 60 * 60 * 24 * 365 * 10,
|
||||||
setCookie(event, 'color-mode', cookies['color-mode'], opts)
|
sameSite: 'lax',
|
||||||
}
|
secure: true,
|
||||||
if (cookies.cosmetics) {
|
httpOnly: false,
|
||||||
setCookie(event, 'cosmetics', cookies.cosmetics, opts)
|
path: '/',
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cookies['auth-token']) {
|
||||||
|
setCookie(event, 'auth-token', cookies['auth-token'], opts)
|
||||||
|
}
|
||||||
|
if (cookies['color-mode']) {
|
||||||
|
setCookie(event, 'color-mode', cookies['color-mode'], opts)
|
||||||
|
}
|
||||||
|
if (cookies.cosmetics) {
|
||||||
|
setCookie(event, 'cosmetics', cookies.cosmetics, opts)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user