Files
InvoiceShelf/resources/scripts-v2/stores/notification.store.ts
Darko Gjorgjijoski 2b996d30bf Phase 2: Typed global Pinia stores in scripts-v2/
Rewrite all 7 global stores from JS options API to TypeScript
composition API. 8 files, 1005 lines, zero any types.

- auth.store.ts: login/logout with authService
- global.store.ts: bootstrap, menus, sidebar, config fetching
- company.store.ts: company selection, admin mode, settings
- user.store.ts: current user, abilities, settings
- notification.store.ts: typed toast notifications
- dialog.store.ts: confirm dialog returning Promise<boolean>
- modal.store.ts: modal state with isEdit getter

All use async/await, typed API services, localStore utility,
and explicit ref<T> generics.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 05:15:00 +02:00

45 lines
1.0 KiB
TypeScript

import { defineStore } from 'pinia'
import { ref } from 'vue'
export type NotificationType = 'success' | 'error' | 'warning' | 'info'
export interface Notification {
id: string
type: NotificationType
message: string
}
export interface ShowNotificationPayload {
type: NotificationType
message: string
}
export const useNotificationStore = defineStore('notification', () => {
// State
const active = ref<boolean>(false)
const autoHide = ref<boolean>(true)
const notifications = ref<Notification[]>([])
// Actions
function showNotification(notification: ShowNotificationPayload): void {
notifications.value.push({
...notification,
id: (Math.random().toString(36) + Date.now().toString(36)).substring(2),
})
}
function hideNotification(data: { id: string }): void {
notifications.value = notifications.value.filter(
(notification) => notification.id !== data.id
)
}
return {
active,
autoHide,
notifications,
showNotification,
hideNotification,
}
})