From 00201de46c05a90646b072a7c3dbcf1d4c591ba6 Mon Sep 17 00:00:00 2001 From: GeckoEidechse <40122905+GeckoEidechse@users.noreply.github.com> Date: Thu, 2 Mar 2023 21:28:53 +0100 Subject: feat: Allow installing PRs from DeveloperView (#139) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Initial backend code to get list of PRs Hardcoded for launcher right now * refactor: Autogen TS bindings from Rust code using `ts-rs` as done in #140 * fix: Fix incorrect typing What is returned is actually an array of `PullsApiResponseElement` * feat: Prototyping frontend UI for installing PR * fix: Use right repo Used Mods instead of Launcher * feat: Enable installing launcher pull request * refactor: Rename variables to indicate approp repo NorthstarLauncher vs NorthstarMods * style: Formatting fixes * feat: Initial code for getting mods PRs * feat: Add backend code for installing mods PRs * feat: Add note about launching in notification * fix: Remove commented out code * refactor: Depduplicate code * refactor: Remove unnecessary use of anyhow * refactor: Use already existing function for checking game path * feat: Add comment about profile / batch file * chore: Remove leftover print statements * feat: Add clickable link for each PR * refactor: Reduce duplicate code * refactor: Rename enum * fix: Use proper type * fix: Remove leftover `console.log`s * style: Revert accidental formatting change * refactor: Remove second API call for mods PRs * refactor: Rename variable * refactor: Remove second API call for launcher PRs * refactor: Move API URL string to `constants.rs` So that all constants are in a single place * fix: Restore lines deleted in merge * style: Formatting fixes * fix: Print line when done installing PR * feat: Show notification for install start/done Displays a notification that PR install has started and upon completion replaces it with one saying that install has completed. * fix: Remove left-over console log * feat: "Install PR" UI (#197) * refactor: export pull requests selector to dedicated component * refactor: regroup launcher+mods collapses in one collapse component * refactor: load pull requests when opening selector collapse item * refactor: review progress loaders' style * fix: don't fetch PRs if they've already been loaded * feat: update collapse style * refactor: remove fetch success notification * refactor: both collapses can be opened at the same time * fix: non-accordion collapse sends an object as event parameter * fix: Iterate over multiple pages of GitHub CI API This ensures we can still grab older artifacts. Max page is capped at 10 as going too high will cause us to hit API rate limits. Also refined error message accordingly. * refactor: Move stored PRs to submodule as suggested in review * refactor: Move getPullRequests to store submodule I order to clean up PullRequestSelector.vue Other functions will follow in separate commits. Currently TypeScript compilation fails on undefined type of `state` * fix: Properly define state type * refactor: Move installLauncherPR to store submodule * refactor: Move installModsPR to store submodule --------- Co-authored-by: Rémy Raes --- src-vue/src/components/PullRequestsSelector.vue | 103 ++++++++++++++++++++++ src-vue/src/plugins/modules/pull_requests.ts | 112 ++++++++++++++++++++++++ src-vue/src/plugins/store.ts | 5 +- src-vue/src/views/DeveloperView.vue | 7 ++ 4 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 src-vue/src/components/PullRequestsSelector.vue create mode 100644 src-vue/src/plugins/modules/pull_requests.ts (limited to 'src-vue') diff --git a/src-vue/src/components/PullRequestsSelector.vue b/src-vue/src/components/PullRequestsSelector.vue new file mode 100644 index 00000000..58a355f4 --- /dev/null +++ b/src-vue/src/components/PullRequestsSelector.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src-vue/src/plugins/modules/pull_requests.ts b/src-vue/src/plugins/modules/pull_requests.ts new file mode 100644 index 00000000..e64703d3 --- /dev/null +++ b/src-vue/src/plugins/modules/pull_requests.ts @@ -0,0 +1,112 @@ +import { ElNotification } from "element-plus"; +import { invoke } from "@tauri-apps/api"; +import { PullsApiResponseElement } from "../../../../src-tauri/bindings/PullsApiResponseElement"; +import { PullRequestType } from '../../../../src-tauri/bindings/PullRequestType'; +import { store } from "../store"; + +interface PullRequestStoreState { + searchValue: string, + pull_requests_launcher: PullsApiResponseElement[], + pull_requests_mods: PullsApiResponseElement[], +} + +export const pullRequestModule = { + state: () => ({ + pull_requests_launcher: [], + pull_requests_mods: [], + }), + mutations: { + async getPullRequests(state: PullRequestStoreState, pull_request_type: PullRequestType) { + await invoke("get_pull_requests_wrapper", { installType: pull_request_type }) + .then((message) => { + switch (pull_request_type) { + case "MODS": + state.pull_requests_mods = message; + break; + + case "LAUNCHER": + state.pull_requests_launcher = message; + break; + + default: + console.error("We should never end up here"); + } + }) + .catch((error) => { + ElNotification({ + title: 'Error', + message: error, + type: 'error', + position: 'bottom-right' + }); + }); + }, + async installLauncherPR(state: PullRequestStoreState, pull_request: PullsApiResponseElement) { + // Send notification telling the user to wait for the process to finish + const notification = ElNotification({ + title: `Installing launcher PR ${pull_request.number}`, + message: 'Please wait', + duration: 0, + type: 'info', + position: 'bottom-right' + }); + + await invoke("apply_launcher_pr", { pullRequest: pull_request, gameInstallPath: store.state.game_path }) + .then((message) => { + console.log(message); + // Show user notification if mod install completed. + ElNotification({ + title: `Done`, + message: `Installed ${pull_request.number}: "${pull_request.title}"`, + type: 'success', + position: 'bottom-right' + }); + }) + .catch((error) => { + ElNotification({ + title: 'Error', + message: error, + type: 'error', + position: 'bottom-right' + }); + }) + .finally(() => { + // Clear old notification + notification.close(); + }); + }, + async installModsPR(state: PullRequestStoreState, pull_request: PullsApiResponseElement) { + // Send notification telling the user to wait for the process to finish + const notification = ElNotification({ + title: `Installing mods PR ${pull_request.number}`, + message: 'Please wait', + duration: 0, + type: 'info', + position: 'bottom-right' + }); + + await invoke("apply_mods_pr", { pullRequest: pull_request, gameInstallPath: store.state.game_path }) + .then((message) => { + // Show user notification if mod install completed. + ElNotification({ + title: `Done`, + message: `Installed ${pull_request.number}: "${pull_request.title}"\nMake sure to launch via batch file or by specifying correct profile!`, + type: 'success', + position: 'bottom-right' + }); + }) + .catch((error) => { + ElNotification({ + title: 'Error', + message: error, + type: 'error', + position: 'bottom-right' + }); + }) + .finally(() => { + // Clear old notification + notification.close(); + }); + }, + } +} diff --git a/src-vue/src/plugins/store.ts b/src-vue/src/plugins/store.ts index e44b1c3f..8671d12b 100644 --- a/src-vue/src/plugins/store.ts +++ b/src-vue/src/plugins/store.ts @@ -16,6 +16,8 @@ import { ReleaseInfo } from "../../../src-tauri/bindings/ReleaseInfo"; import { ThunderstoreMod } from "../../../src-tauri/bindings/ThunderstoreMod"; import { NorthstarMod } from "../../../src-tauri/bindings/NorthstarMod"; import { searchModule } from './modules/search'; +import { pullRequestModule } from './modules/pull_requests'; +import { PullsApiResponseElement } from "../../../src-tauri/bindings/PullsApiResponseElement"; const persistentStore = new Store('flight-core-settings.json'); @@ -51,7 +53,8 @@ let notification_handle: NotificationHandle; export const store = createStore({ modules: { - search: searchModule + search: searchModule, + pullrequests: pullRequestModule, }, state(): FlightCoreStore { return { diff --git a/src-vue/src/views/DeveloperView.vue b/src-vue/src/views/DeveloperView.vue index b51e1bf1..11cb4f5d 100644 --- a/src-vue/src/views/DeveloperView.vue +++ b/src-vue/src/views/DeveloperView.vue @@ -55,6 +55,9 @@ Delete FlightCore persistent store + +

Testing

+ @@ -66,10 +69,14 @@ import { ElNotification } from "element-plus"; import { GameInstall } from "../utils/GameInstall"; import { Store } from 'tauri-plugin-store-api'; import { ReleaseCanal } from "../utils/ReleaseCanal"; +import PullRequestsSelector from "../components/PullRequestsSelector.vue"; const persistentStore = new Store('flight-core-settings.json'); export default defineComponent({ name: "DeveloperView", + components: { + PullRequestsSelector + }, data() { return { mod_to_install_field_string : "", -- cgit v1.2.3