55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import { defineStore } from "pinia";
|
|
|
|
type ApplicationStoreEventKeyUpCallback = (event: KeyboardEvent) => boolean;
|
|
|
|
export interface ApplicationStore {
|
|
dynamicTitle: string;
|
|
eventKeyUpStack: ApplicationStoreEventKeyUpCallback[];
|
|
_addedListener: boolean;
|
|
}
|
|
|
|
export const useApplicationStore = defineStore({
|
|
id: "application",
|
|
state: (): ApplicationStore => ({
|
|
dynamicTitle: "",
|
|
eventKeyUpStack: [],
|
|
_addedListener: false,
|
|
}),
|
|
|
|
actions: {
|
|
async setDynamicTitle(title: string) {
|
|
this.$state.dynamicTitle = title;
|
|
document.title = `STEMMechanics | ${title}`;
|
|
},
|
|
|
|
clearDynamicTitle() {
|
|
this.$state.dynamicTitle = "";
|
|
},
|
|
|
|
addKeyUpListener(callback: ApplicationStoreEventKeyUpCallback) {
|
|
this.eventKeyUpStack.push(callback);
|
|
|
|
if (!this._addedListener) {
|
|
document.addEventListener("keyup", (event: KeyboardEvent) => {
|
|
this.eventKeyUpStack.every(
|
|
(item: ApplicationStoreEventKeyUpCallback) => {
|
|
const result = item(event);
|
|
if (result) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
);
|
|
});
|
|
}
|
|
},
|
|
|
|
removeKeyUpListener(callback: ApplicationStoreEventKeyUpCallback) {
|
|
this.eventKeyUpStack = this.eventKeyUpStack.filter(
|
|
(item: ApplicationStoreEventKeyUpCallback) => item !== callback
|
|
);
|
|
},
|
|
},
|
|
});
|