Skip to content

Commit 1976fa5

Browse files
Add showCurrentCdn to R2Error and use it when network errors occur
* Remove the closeModal boolean flag, as it wasn't really needed * Make CdnProvider more reactive, to update the value in the errormodal
1 parent 4d71c8b commit 1976fa5

File tree

6 files changed

+32
-27
lines changed

6 files changed

+32
-27
lines changed

src/components/modals/ErrorModal.vue

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
<script lang="ts" setup>
2-
import R2Error from '../../model/errors/R2Error';
2+
import CdnProvider from '../../providers/generic/connection/CdnProvider';
33
import { getStore } from '../../providers/generic/store/StoreProvider';
44
import { State } from '../../store';
5-
import { computed, ComputedRef } from 'vue';
5+
import { computed } from 'vue';
66
77
const store = getStore<State>();
88
9-
const error: ComputedRef<R2Error | null> = computed(() => store.state.error.error);
9+
const error = computed(() => store.state.error.error);
10+
const currentCdnName = computed(() => CdnProvider.current.label);
11+
1012
const name = computed(() => error.value ? error.value.name : '');
1113
const message = computed(() => error.value ? error.value.message : '');
1214
const solution = computed(() => error.value ? error.value.solution : '');
15+
const showCurrentCdn = computed(() => error.value ? error.value.showCurrentCdn : false);
1316
1417
function close() {
1518
store.commit('error/discardError');
@@ -26,7 +29,7 @@ function close() {
2629
<p>{{message}}</p>
2730
<div v-if="solution">
2831
<h5 class="title is-5">Suggestion</h5>
29-
<p>{{solution}}</p>
32+
<p>{{solution + (showCurrentCdn ? ` Current CDN: ${currentCdnName}` : '')}}</p>
3033
</div>
3134
<div class="mt-3 text-right" v-if="error.actions">
3235
<button

src/components/profiles-modals/ImportProfileModal.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import ThunderstoreCombo from "../../model/ThunderstoreCombo";
88
import InteractionProvider from "../../providers/ror2/system/InteractionProvider";
99
import { ProfileImportExport } from "../../r2mm/mods/ProfileImportExport";
1010
import { sleep } from "../../utils/Common";
11+
import { addSolutionsToError } from "../../utils/DownloadUtils";
1112
import * as ProfileUtils from "../../utils/ProfileUtils";
1213
import { ModalCard } from "../all";
1314
import OnlineModList from "../views/OnlineModList.vue";
@@ -106,6 +107,7 @@ async function onProfileCodeEntered() {
106107
await validateProfileFile([filepath]);
107108
} catch (e: any) {
108109
const err = R2Error.fromThrownValue(e, 'Failed to import profile');
110+
addSolutionsToError(err);
109111
store.commit('error/handleError', err);
110112
} finally {
111113
importViaCodeInProgress.value = false;
@@ -242,7 +244,9 @@ async function importProfile(targetProfileName: string, mods: ExportMod[], zipPa
242244
} catch (e) {
243245
await store.dispatch('profiles/ensureProfileExists');
244246
closeModal();
245-
store.commit('error/handleError', R2Error.fromThrownValue(e));
247+
const r2Error = R2Error.fromThrownValue(e);
248+
addSolutionsToError(r2Error);
249+
store.commit('error/handleError', r2Error);
246250
return;
247251
}
248252

src/model/errors/R2Error.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
interface Action {
22
function: () => Promise<void>;
33
label: string;
4-
closeModal?: boolean;
54
}
65

76
export default class R2Error extends Error {
@@ -11,6 +10,7 @@ export default class R2Error extends Error {
1110
public solution: string;
1211
public errorReferenceString: string | undefined;
1312
public actions: Action[] = [];
13+
public showCurrentCdn: boolean = false;
1414

1515
public constructor(name: string, message: string, solution: string | null = null) {
1616
super(message);

src/providers/generic/connection/CdnProvider.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { ref } from 'vue';
2+
13
import R2Error from '../../../model/errors/R2Error';
24
import { getAxiosWithTimeouts } from '../../../utils/HttpUtils';
35
import { addOrReplaceSearchParams, replaceHost } from '../../../utils/UrlUtils';
@@ -20,13 +22,13 @@ const CONNECTION_ERROR = new R2Error(
2022

2123
export default class CdnProvider {
2224
private static axios = getAxiosWithTimeouts(5000, 5000);
23-
private static preferredCdn = "";
25+
private static preferredCdn = ref("");
2426

2527
public static get current() {
26-
const i = CDNS.findIndex((cdn) => cdn === CdnProvider.preferredCdn);
28+
const i = CDNS.findIndex((cdn) => cdn === CdnProvider.preferredCdn.value);
2729
return {
2830
label: [-1, 0].includes(i) ? "Main CDN" : `Mirror #${i}`,
29-
url: CdnProvider.preferredCdn
31+
url: CdnProvider.preferredCdn.value
3032
};
3133
}
3234

@@ -49,7 +51,7 @@ export default class CdnProvider {
4951
}
5052

5153
if (res.status === 200) {
52-
CdnProvider.preferredCdn = cdn;
54+
CdnProvider.preferredCdn.value = cdn;
5355
return;
5456
}
5557
};
@@ -58,24 +60,24 @@ export default class CdnProvider {
5860
}
5961

6062
public static replaceCdnHost(url: string) {
61-
return CdnProvider.preferredCdn
62-
? replaceHost(url, CdnProvider.preferredCdn)
63+
return CdnProvider.preferredCdn.value
64+
? replaceHost(url, CdnProvider.preferredCdn.value)
6365
: url;
6466
}
6567

6668
public static addCdnQueryParameter(url: string) {
67-
return CdnProvider.preferredCdn
68-
? addOrReplaceSearchParams(url, `cdn=${CdnProvider.preferredCdn}`)
69+
return CdnProvider.preferredCdn.value
70+
? addOrReplaceSearchParams(url, `cdn=${CdnProvider.preferredCdn.value}`)
6971
: url;
7072
}
7173

7274
public static togglePreferredCdn() {
73-
let currentIndex = CDNS.findIndex((cdn) => cdn === CdnProvider.preferredCdn);
75+
let currentIndex = CDNS.findIndex((cdn) => cdn === CdnProvider.preferredCdn.value);
7476

7577
if (currentIndex === -1) {
7678
currentIndex = 0;
7779
}
7880

79-
CdnProvider.preferredCdn = CDNS[currentIndex + 1] || CDNS[0];
81+
CdnProvider.preferredCdn.value = CDNS[currentIndex + 1] || CDNS[0];
8082
}
8183
}

src/store/modules/DownloadModule.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,10 @@ export const DownloadModule = {
137137
if (profile.getProfilePath() === rootGetters['profile/activeProfile'].getProfilePath()) {
138138
r2Error.addAction({
139139
label: 'Retry',
140-
function: () => dispatch('retryDownloadById', downloadId),
141-
closeModal: true
140+
function: async () => {
141+
commit('error/discardError', null, { root: true });
142+
await dispatch('retryDownloadById', downloadId);
143+
},
142144
});
143145
}
144146
}
@@ -155,13 +157,7 @@ export const DownloadModule = {
155157
progressCallback: (progress: number, modName: string, status: number, err: R2Error | null) => void
156158
}) {
157159
const { combos, progressCallback } = params;
158-
try {
159-
await ThunderstoreDownloaderProvider.instance.download(combos, state.ignoreCache, progressCallback);
160-
} catch (e) {
161-
const r2Error = R2Error.fromThrownValue(e);
162-
DownloadUtils.addSolutionsToError(r2Error, true);
163-
throw r2Error;
164-
}
160+
await ThunderstoreDownloaderProvider.instance.download(combos, state.ignoreCache, progressCallback);
165161
},
166162

167163
async _download({state, commit, dispatch}, params: {

src/utils/DownloadUtils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import CdnProvider from "../providers/generic/connection/CdnProvider";
22
import R2Error from "../model/errors/R2Error";
33

4-
export function addSolutionsToError(err: R2Error, closeModalOnToggleCDN: boolean = false): void {
4+
export function addSolutionsToError(err: R2Error): void {
55
// Sanity check typing.
66
if (!(err instanceof R2Error)) {
77
return;
@@ -12,10 +12,10 @@ export function addSolutionsToError(err: R2Error, closeModalOnToggleCDN: boolean
1212
err.name.includes("System.Net.WebException")
1313
) {
1414
err.solution = "Try toggling the preferred Thunderstore CDN by clicking the button below (or in the settings).";
15+
err.showCurrentCdn = true;
1516
err.addAction({
1617
label: 'Toggle CDN',
1718
function: async () => CdnProvider.togglePreferredCdn(),
18-
closeModal: closeModalOnToggleCDN
1919
});
2020
}
2121

0 commit comments

Comments
 (0)