Files
api/web/store/trial.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

97 lines
3.0 KiB
TypeScript

import { computed, ref, watch } from 'vue';
import { defineStore } from 'pinia';
import type { ExternalPayload, TrialExtend, TrialStart } from '@unraid/shared-callbacks';
import type { StartTrialResponse } from '~/composables/services/keyServer';
import { addPreventClose, removePreventClose } from '~/composables/preventClose';
import { startTrial } from '~/composables/services/keyServer';
import { useCallbackActionsStore } from '~/store/callbackActions';
import { useDropdownStore } from '~/store/dropdown';
import { useServerStore } from '~/store/server';
/**
* 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 useTrialStore = defineStore('trial', () => {
const callbackActionsStore = useCallbackActionsStore();
const dropdownStore = useDropdownStore();
const serverStore = useServerStore();
type TrialStatus = 'failed' | 'ready' | TrialExtend | TrialStart | 'success';
const trialStatus = ref<TrialStatus>('ready');
const trialModalLoading = computed(
() => trialStatus.value === 'trialExtend' || trialStatus.value === 'trialStart'
);
const trialModalVisible = computed(
() =>
trialStatus.value === 'failed' ||
trialStatus.value === 'trialExtend' ||
trialStatus.value === 'trialStart'
);
const requestTrial = async (type?: TrialExtend | TrialStart) => {
try {
const payload = {
guid: serverStore.guid,
timestamp: Math.floor(Date.now() / 1000),
};
const response: StartTrialResponse = await startTrial(payload);
if (!response.license) {
trialStatus.value = 'failed';
return console.error('[requestTrial]', 'No license returned', response);
}
// manually create a payload to mimic a callback for key installs
const trialStartData: ExternalPayload = {
actions: [
{
keyUrl: response.license,
type: type ?? 'trialStart',
},
],
sender: window.location.href,
type: 'forUpc',
};
trialStatus.value = 'success';
return callbackActionsStore.saveCallbackData(trialStartData);
} catch (error) {
trialStatus.value = 'failed';
console.error('[requestTrial]', error);
}
};
const setTrialStatus = (status: TrialStatus) => {
trialStatus.value = status;
};
watch(trialStatus, (newVal) => {
// opening
if (newVal === 'trialExtend' || newVal === 'trialStart') {
addPreventClose();
dropdownStore.dropdownHide(); // close the dropdown when the trial modal is opened
setTimeout(() => {
requestTrial(newVal);
}, 1500);
}
// allow closure
if (newVal === 'failed' || newVal === 'success') {
removePreventClose();
}
});
return {
// State
trialModalLoading,
trialModalVisible,
trialStatus,
// Actions
requestTrial,
setTrialStatus,
};
});