Files
api/web/store/installKey.ts
Eli Bosley 345e83bfb0 feat: upgrade nuxt-custom-elements (#1461)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added new modal dialogs and UI components, including activation steps,
OS update feedback, and expanded notification management.
* Introduced a plugin to configure internationalization, state
management, and Apollo client support in web components.
* Added a new Log Viewer page with a streamlined interface for viewing
logs.

* **Improvements**
* Centralized Pinia state management by consolidating all stores to use
a shared global Pinia instance.
* Simplified component templates by removing redundant
internationalization host wrappers.
* Enhanced ESLint configuration with stricter rules and global variable
declarations.
* Refined custom element build process to prevent jQuery conflicts and
optimize minification.
* Updated component imports and templates for consistent structure and
maintainability.
* Streamlined log viewer dropdowns using simplified select components
with improved formatting.
* Improved notification sidebar with filtering by importance and modular
components.
* Replaced legacy notification popups with new UI components and added
automatic root session creation for localhost requests.
* Updated OS version display and user profile UI with refined styling
and component usage.

* **Bug Fixes**
* Fixed component tag capitalization and improved type annotations
across components.

* **Chores**
* Updated development dependencies including ESLint plugins and build
tools.
* Removed deprecated log viewer patch class and cleaned up related test
fixtures.
  * Removed unused imports and simplified Apollo client setup.
* Cleaned up test mocks and removed obsolete i18n host component tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---
- To see the specific tasks where the Asana app for GitHub is being
used, see below:
  - https://app.asana.com/0/0/1210730229632804

---------

Co-authored-by: Pujit Mehrotra <pujit@lime-technology.com>
Co-authored-by: Zack Spear <zackspear@users.noreply.github.com>
2025-07-08 10:05:39 -04:00

80 lines
2.4 KiB
TypeScript

import { computed, ref } from 'vue';
import { defineStore } from 'pinia';
import type { ExternalKeyActions } from '@unraid/shared-callbacks';
import { WebguiInstallKey } from '~/composables/services/webgui';
import { useErrorsStore } from '~/store/errors';
/**
* Uses the shared global Pinia instance from ~/store/globalPinia.ts
* @see https://stackoverflow.com/questions/73476371/using-pinia-with-vue-js-web-components
* @see https://github.com/vuejs/pinia/discussions/1085
*/
import '~/store/globalPinia';
export const useInstallKeyStore = defineStore('installKey', () => {
const errorsStore = useErrorsStore();
const keyInstallStatus = ref<'failed' | 'installing' | 'ready' | 'success'>('ready');
const keyAction = ref<ExternalKeyActions>();
const keyActionType = computed(() => keyAction.value?.type);
const keyUrl = computed(() => keyAction.value?.keyUrl);
/**
* Extracts key type from key url. Works for both .key and .unkey.
*/
const keyType = computed((): string | undefined => {
if (!keyUrl.value) {
return undefined;
}
const parts = keyUrl.value.split('/');
return parts[parts.length - 1].replace(/\.key|\.unkey/g, '');
});
const install = async (action: ExternalKeyActions) => {
console.log('[installKey.install]', action);
keyInstallStatus.value = 'installing';
keyAction.value = action;
if (!keyUrl.value) {
keyInstallStatus.value = 'failed';
return console.error('[install] no key to install');
}
try {
const installResponse = await WebguiInstallKey.query({ url: keyUrl.value }).get();
console.log('[install] WebguiInstallKey installResponse', installResponse);
keyInstallStatus.value = 'success';
} catch (error) {
console.error('[install] WebguiInstallKey error', error);
let errorMessage = 'Unknown error';
if (typeof error === 'string') {
errorMessage = error.toUpperCase();
} else if (error instanceof Error) {
errorMessage = error.message;
}
keyInstallStatus.value = 'failed';
errorsStore.setError({
heading: 'Failed to install key',
message: errorMessage,
level: 'error',
ref: 'installKey',
type: 'installKey',
});
}
};
return {
// State
keyInstallStatus,
// getters
keyActionType,
keyType,
keyUrl,
// Actions
install,
};
});