Skip to content

Commit aac4c16

Browse files
authored
Merge pull request #1485 from ebkr/memory-optimization-pt4-DownloadModModal
Don't depend on ThunderstoreMod containing all ThunderstoreVersions in components
2 parents a543e32 + 5373b5c commit aac4c16

File tree

4 files changed

+61
-21
lines changed

4 files changed

+61
-21
lines changed

src/components/views/DownloadModModal.vue

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ import Game from '../../model/game/Game';
106106
import ConflictManagementProvider from '../../providers/generic/installing/ConflictManagementProvider';
107107
import { MOD_LOADER_VARIANTS } from '../../r2mm/installing/profile_installers/ModLoaderVariantRecord';
108108
import ModalCard from '../ModalCard.vue';
109+
import * as PackageDb from '../../r2mm/manager/PackageDexieStore';
109110
110111
interface DownloadProgress {
111112
assignId: number;
@@ -222,26 +223,26 @@ let assignId = 0;
222223
async getModVersions() {
223224
this.currentVersion = null;
224225
if (this.thunderstoreMod !== null) {
225-
this.selectedVersion = this.thunderstoreMod.getVersions()[0].getVersionNumber().toString();
226-
this.versionNumbers = this.thunderstoreMod.getVersions()
227-
.map(value => value.getVersionNumber().toString());
226+
this.selectedVersion = this.thunderstoreMod.getLatestVersion().getVersionNumber().toString();
227+
this.recommendedVersion = null;
228+
229+
this.versionNumbers = await PackageDb.getPackageVersionNumbers(
230+
this.activeGame.internalFolderName,
231+
this.thunderstoreMod.getFullName()
232+
);
228233
229234
const foundRecommendedVersion = MOD_LOADER_VARIANTS[this.activeGame.internalFolderName]
230235
.find(value => value.packageName === this.thunderstoreMod!.getFullName());
231236
232-
if (foundRecommendedVersion === undefined || foundRecommendedVersion.recommendedVersion === undefined) {
233-
this.recommendedVersion = null;
234-
this.selectedVersion = this.thunderstoreMod.getVersions()[0].getVersionNumber().toString();
235-
} else {
237+
if (foundRecommendedVersion && foundRecommendedVersion.recommendedVersion) {
236238
this.recommendedVersion = foundRecommendedVersion.recommendedVersion.toString();
237239
238-
// Bind to recommended version or fall back to latest
239-
const thunderstoreRecommendedVersion = this.thunderstoreMod.getVersions()
240-
.find(value => value.getVersionNumber().isEqualTo(foundRecommendedVersion.recommendedVersion!));
241-
if (thunderstoreRecommendedVersion !== undefined) {
242-
this.selectedVersion = thunderstoreRecommendedVersion.getVersionNumber().toString();
243-
} else {
244-
this.selectedVersion = this.thunderstoreMod.getVersions()[0].getVersionNumber().toString()
240+
// Auto-select recommended version if it's found.
241+
const recommendedVersion = this.versionNumbers.find(
242+
(ver) => ver === foundRecommendedVersion.recommendedVersion!.toString()
243+
);
244+
if (recommendedVersion) {
245+
this.selectedVersion = recommendedVersion;
245246
}
246247
}
247248
@@ -259,18 +260,26 @@ let assignId = 0;
259260
this.$store.commit("closeDownloadModModal");
260261
}
261262
262-
downloadThunderstoreMod() {
263+
async downloadThunderstoreMod() {
263264
const refSelectedThunderstoreMod: ThunderstoreMod | null = this.thunderstoreMod;
264265
const refSelectedVersion: string | null = this.selectedVersion;
265266
if (refSelectedThunderstoreMod === null || refSelectedVersion === null) {
266267
// Shouldn't happen, but shouldn't throw an error.
267268
return;
268269
}
269-
const version = refSelectedThunderstoreMod.getVersions()
270-
.find((modVersion: ThunderstoreVersion) => modVersion.getVersionNumber().toString() === refSelectedVersion);
271-
if (version === undefined) {
270+
271+
let version: ThunderstoreVersion;
272+
273+
try {
274+
version = await PackageDb.getVersionAsThunderstoreVersion(
275+
this.activeGame.internalFolderName,
276+
refSelectedThunderstoreMod.getFullName(),
277+
refSelectedVersion
278+
);
279+
} catch {
272280
return;
273281
}
282+
274283
this.downloadHandler(refSelectedThunderstoreMod, version);
275284
}
276285

src/components/views/OnlineModList.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
v-for='(key, index) in pagedModList' :key="`online-${key.getFullName()}-${index}-${settings.getContext().global.expandedCards}`"
55
:image="getImageUrl(key)"
66
:id="index"
7-
:description="key.getVersions()[0].getDescription()">
7+
:description="key.getLatestVersion().getDescription()">
88
<template v-slot:title>
99
<span v-if="key.isPinned()">
1010
<span class="tag is-info margin-right margin-right--half-width"
@@ -126,7 +126,7 @@ export default class OnlineModList extends Vue {
126126
127127
getImageUrl(tsMod: ThunderstoreMod): string {
128128
return CdnProvider.replaceCdnHost(
129-
tsMod.getVersions()[0].getIcon()
129+
tsMod.getLatestVersion().getIcon()
130130
);
131131
}
132132

src/components/views/OnlineModView.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export default class OnlineModView extends Vue {
147147
const searchKeys = SearchUtils.makeKeys(this.thunderstoreSearchFilter);
148148
if (searchKeys.length > 0) {
149149
searchableList = this.sortedThunderstoreModList.filter((x: ThunderstoreMod) => {
150-
return SearchUtils.isSearched(searchKeys, x.getFullName(), x.getVersions()[0].getDescription())
150+
return SearchUtils.isSearched(searchKeys, x.getFullName(), x.getLatestVersion().getDescription())
151151
});
152152
}
153153
if (!allowNsfw) {

src/r2mm/manager/PackageDexieStore.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,11 @@ export async function getPackagesByNames(community: string, packageNames: string
127127
return packages.map(ThunderstoreMod.parseFromThunderstoreData);
128128
}
129129

130+
export async function getPackageVersionNumbers(community: string, packageName: string) {
131+
const pkg = await getPackageFromDatabase(community, packageName);
132+
return pkg.versions.map((v) => v.version_number);
133+
}
134+
130135
/**
131136
* @param game Game (community) which package listings should be used in the lookup.
132137
* @param dependencies Lookup targets as Thunderstore dependency strings.
@@ -167,6 +172,11 @@ export async function getLastPackageListUpdateTime(community: string) {
167172
return hash ? hash.date_updated : undefined;
168173
}
169174

175+
export async function getVersionAsThunderstoreVersion(community: string, packageName: string, versionNumber: string) {
176+
const version = await getPackgeVersionFromDatabase(community, packageName, versionNumber);
177+
return ThunderstoreVersion.parseFromThunderstoreData(version);
178+
}
179+
170180
export async function isLatestPackageListIndex(community: string, hash: string) {
171181
return Boolean(
172182
await db.indexHashes.where({community, hash}).count()
@@ -176,3 +186,24 @@ export async function isLatestPackageListIndex(community: string, hash: string)
176186
export async function setLatestPackageListIndex(community: string, hash: string) {
177187
await db.indexHashes.put({community, hash, date_updated: new Date()});
178188
}
189+
190+
async function getPackageFromDatabase(community: string, packageName: string) {
191+
const pkg = await db.packages.where({community, full_name: packageName}).first();
192+
193+
if (!pkg) {
194+
throw new Error(`Couldn't find package "${packageName}" in ${community} packages`);
195+
}
196+
197+
return pkg;
198+
}
199+
200+
async function getPackgeVersionFromDatabase(community: string, packageName: string, versionNumber: string) {
201+
const pkg = await getPackageFromDatabase(community, packageName);
202+
const ver = pkg.versions.find((v) => v.version_number === versionNumber);
203+
204+
if (!ver) {
205+
throw new Error(`Couldn't find version "${versionNumber}" of package "${packageName}" in ${community} packages`);
206+
}
207+
208+
return ver;
209+
}

0 commit comments

Comments
 (0)