tauri-notice-window 1.0.9 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +146 -94
- package/dist/hooks/useHideNotice.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +180 -199
- package/dist/index.js.map +1 -1
- package/dist/stores/messageQueueStore.d.ts +4 -1
- package/dist/stores/messageQueueStore.d.ts.map +1 -1
- package/dist/utils/db.d.ts +2 -1
- package/dist/utils/db.d.ts.map +1 -1
- package/dist/utils/noticeWindow.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,7 +5,9 @@ A reusable React library for cross-window notification management in Tauri v2+ a
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
7
|
- **Cross-Window State Sync**: All Tauri windows (main + notice windows) see the same state via `zustand-sync`
|
|
8
|
-
- **
|
|
8
|
+
- **Zustand-First Architecture**: Zustand store is the single source of truth at runtime
|
|
9
|
+
- **Persistent Queue**: IndexedDB (Dexie) used only for cold storage (app restarts)
|
|
10
|
+
- **Clean Data Flow**: Store → Database (one-way dependency, no circular dependencies)
|
|
9
11
|
- **One-at-a-Time Display**: Only one notice window shown at a time
|
|
10
12
|
- **Customizable Routes**: Configurable router prefix for notice pages
|
|
11
13
|
- **URL Validation & 404 Fallback**: Automatic validation with customizable error pages for invalid routes
|
|
@@ -710,116 +712,84 @@ setNoticeConfig({
|
|
|
710
712
|
|
|
711
713
|
**URL Validation:** Before creating a WebviewWindow, the library validates the window URL. If the URL is invalid (empty, malformed, or doesn't start with `/`, `http://`, `https://`, or `tauri://`), it automatically falls back to the `notFoundUrl` and logs a warning.
|
|
712
714
|
|
|
713
|
-
###
|
|
715
|
+
### Store Methods (Recommended)
|
|
714
716
|
|
|
715
|
-
|
|
717
|
+
All operations should go through the Zustand store for consistency:
|
|
716
718
|
|
|
717
|
-
####
|
|
719
|
+
#### store.deleteMessage()
|
|
718
720
|
|
|
719
|
-
|
|
721
|
+
Delete a message completely (from both memory and database).
|
|
720
722
|
|
|
721
723
|
```typescript
|
|
722
|
-
import {
|
|
724
|
+
import { useMessageQueueStore } from 'tauri-notice-window'
|
|
723
725
|
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
title: 'Notice',
|
|
727
|
-
type: 'announcement',
|
|
728
|
-
data: { content: 'Message content' }
|
|
729
|
-
})
|
|
726
|
+
const store = useMessageQueueStore.getState()
|
|
727
|
+
await store.deleteMessage('123') // Removes from store AND database
|
|
730
728
|
```
|
|
731
729
|
|
|
732
|
-
####
|
|
730
|
+
#### store.hideMessage()
|
|
733
731
|
|
|
734
|
-
|
|
732
|
+
Hide a message (marks as hidden and removes from queue).
|
|
735
733
|
|
|
736
734
|
```typescript
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
const message = await getMessage('123')
|
|
735
|
+
const store = useMessageQueueStore.getState()
|
|
736
|
+
await store.hideMessage('123') // Marks hidden in DB, removes from queue
|
|
740
737
|
```
|
|
741
738
|
|
|
742
|
-
####
|
|
739
|
+
#### store.removeFromQueue()
|
|
743
740
|
|
|
744
|
-
|
|
741
|
+
Remove a message from queue (memory only, persists position changes).
|
|
745
742
|
|
|
746
743
|
```typescript
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
await deleteMessageById('123')
|
|
744
|
+
const store = useMessageQueueStore.getState()
|
|
745
|
+
await store.removeFromQueue('123') // Updates queue positions in DB
|
|
750
746
|
```
|
|
751
747
|
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
#### hasMessage()
|
|
748
|
+
#### store.markMessageAsShown()
|
|
755
749
|
|
|
756
|
-
|
|
750
|
+
Mark a message as shown in database.
|
|
757
751
|
|
|
758
752
|
```typescript
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
const exists = await hasMessage('123')
|
|
753
|
+
const store = useMessageQueueStore.getState()
|
|
754
|
+
await store.markMessageAsShown('123') // Prevents re-showing
|
|
762
755
|
```
|
|
763
756
|
|
|
764
|
-
|
|
757
|
+
### Database Utilities (Low-Level)
|
|
765
758
|
|
|
766
|
-
|
|
759
|
+
⚠️ **Warning:** Direct database access bypasses the store. Only use these for advanced scenarios where you need to query historical data. For all mutations, use store methods above.
|
|
767
760
|
|
|
768
|
-
|
|
769
|
-
import { isMessageShown } from 'tauri-notice-window'
|
|
761
|
+
#### initializeDatabase()
|
|
770
762
|
|
|
771
|
-
|
|
772
|
-
```
|
|
773
|
-
|
|
774
|
-
#### getPendingMessages()
|
|
775
|
-
|
|
776
|
-
Get all pending messages.
|
|
763
|
+
Initialize the database (called automatically by `initializeNoticeSystem()`).
|
|
777
764
|
|
|
778
765
|
```typescript
|
|
779
|
-
import {
|
|
766
|
+
import { initializeDatabase } from 'tauri-notice-window'
|
|
780
767
|
|
|
781
|
-
const
|
|
768
|
+
const db = initializeDatabase()
|
|
782
769
|
```
|
|
783
770
|
|
|
784
|
-
####
|
|
771
|
+
#### getMessage()
|
|
785
772
|
|
|
786
|
-
|
|
773
|
+
Retrieve a message by ID.
|
|
787
774
|
|
|
788
775
|
```typescript
|
|
789
|
-
import {
|
|
776
|
+
import { getMessage } from 'tauri-notice-window'
|
|
790
777
|
|
|
791
|
-
await
|
|
778
|
+
const message = await getMessage('123')
|
|
792
779
|
```
|
|
793
780
|
|
|
794
|
-
#### markAsShown()
|
|
795
|
-
|
|
796
|
-
Mark a message as shown.
|
|
797
|
-
|
|
798
|
-
```typescript
|
|
799
|
-
import { markAsShown } from 'tauri-notice-window'
|
|
800
781
|
|
|
801
|
-
await markAsShown('123')
|
|
802
|
-
```
|
|
803
782
|
|
|
804
|
-
####
|
|
783
|
+
#### getPendingMessages()
|
|
805
784
|
|
|
806
|
-
|
|
785
|
+
Get all pending messages.
|
|
807
786
|
|
|
808
787
|
```typescript
|
|
809
|
-
import {
|
|
788
|
+
import { getPendingMessages } from 'tauri-notice-window'
|
|
810
789
|
|
|
811
|
-
await
|
|
790
|
+
const pending = await getPendingMessages()
|
|
812
791
|
```
|
|
813
792
|
|
|
814
|
-
#### clearPendingMessages()
|
|
815
|
-
|
|
816
|
-
Clear all pending and showing messages.
|
|
817
|
-
|
|
818
|
-
```typescript
|
|
819
|
-
import { clearPendingMessages } from 'tauri-notice-window'
|
|
820
|
-
|
|
821
|
-
await clearPendingMessages()
|
|
822
|
-
```
|
|
823
793
|
|
|
824
794
|
## Routing Setup
|
|
825
795
|
|
|
@@ -850,43 +820,71 @@ app/
|
|
|
850
820
|
|
|
851
821
|
## Advanced Usage
|
|
852
822
|
|
|
853
|
-
### Message Queue
|
|
823
|
+
### Message Deletion and Queue Management
|
|
854
824
|
|
|
855
|
-
|
|
825
|
+
All message operations should go through the Zustand store to maintain consistency.
|
|
856
826
|
|
|
857
827
|
```typescript
|
|
858
|
-
import {
|
|
828
|
+
import { useNoticeWindow, useMessageQueueStore } from 'tauri-notice-window'
|
|
859
829
|
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
830
|
+
function NoticeManager() {
|
|
831
|
+
const { showNotice } = useNoticeWindow()
|
|
832
|
+
const store = useMessageQueueStore.getState()
|
|
833
|
+
|
|
834
|
+
// Example 1: Delete a message from the queue
|
|
835
|
+
const handleDeleteMessage = async () => {
|
|
836
|
+
await showNotice({ id: '1', title: 'First', type: 'announcement', data: {} })
|
|
837
|
+
await showNotice({ id: '2', title: 'Second', type: 'announcement', data: {} })
|
|
838
|
+
await showNotice({ id: '3', title: 'Third', type: 'announcement', data: {} })
|
|
839
|
+
|
|
840
|
+
// Delete message '2' from queue via store
|
|
841
|
+
await store.deleteMessage('2')
|
|
842
|
+
// Result: Message removed from queue and database
|
|
843
|
+
// Console output: "Message 2 was deleted, skipping to next"
|
|
844
|
+
}
|
|
864
845
|
|
|
865
|
-
//
|
|
866
|
-
|
|
846
|
+
// Example 2: Delete the currently displayed message
|
|
847
|
+
const handleDeleteCurrent = async () => {
|
|
848
|
+
await showNotice({ id: '4', title: 'Current', type: 'announcement', data: {} })
|
|
849
|
+
// Window for message '4' is now open
|
|
867
850
|
|
|
868
|
-
//
|
|
869
|
-
|
|
851
|
+
// Delete via store
|
|
852
|
+
await store.deleteMessage('4')
|
|
853
|
+
// Result: Window closes, next message shows automatically
|
|
854
|
+
}
|
|
870
855
|
|
|
871
|
-
// Example
|
|
872
|
-
|
|
873
|
-
|
|
856
|
+
// Example 3: Remove from queue without deleting from DB
|
|
857
|
+
const handleRemoveFromQueue = async () => {
|
|
858
|
+
await store.removeFromQueue('5') // Only removes from runtime queue
|
|
859
|
+
// Message still exists in DB for historical queries
|
|
860
|
+
}
|
|
874
861
|
|
|
875
|
-
//
|
|
876
|
-
|
|
877
|
-
//
|
|
878
|
-
|
|
862
|
+
// Example 4: Hide a message (server-triggered)
|
|
863
|
+
const handleHideMessage = async () => {
|
|
864
|
+
await store.hideMessage('6') // Marks as hidden + removes from queue
|
|
865
|
+
}
|
|
866
|
+
}
|
|
879
867
|
```
|
|
880
868
|
|
|
881
869
|
**How it works:**
|
|
882
|
-
1.
|
|
883
|
-
2.
|
|
884
|
-
3.
|
|
885
|
-
4.
|
|
886
|
-
5.
|
|
887
|
-
6. **Safety Layer:**
|
|
870
|
+
1. **Store methods** handle both memory (Zustand) and persistence (IndexedDB)
|
|
871
|
+
2. `deleteMessage()` removes from both queue and database
|
|
872
|
+
3. If deleted message is currently shown, window closes automatically
|
|
873
|
+
4. Queue position changes are persisted to database
|
|
874
|
+
5. Before showing any message, system verifies it exists in database
|
|
875
|
+
6. **Safety Layer:** `NoticeLayout` component auto-closes if message is missing
|
|
876
|
+
|
|
877
|
+
**Key Difference from Old API:**
|
|
878
|
+
```typescript
|
|
879
|
+
// ❌ OLD: Direct database access (bypassed store, caused circular deps)
|
|
880
|
+
import { deleteMessageById } from 'tauri-notice-window'
|
|
881
|
+
await deleteMessageById('123') // Only deleted from DB, not from queue
|
|
888
882
|
|
|
889
|
-
|
|
883
|
+
// ✅ NEW: Store-first approach (clean, consistent)
|
|
884
|
+
import { useMessageQueueStore } from 'tauri-notice-window'
|
|
885
|
+
const store = useMessageQueueStore.getState()
|
|
886
|
+
await store.deleteMessage('123') // Updates both store and database
|
|
887
|
+
```
|
|
890
888
|
|
|
891
889
|
### Server-Triggered Hide
|
|
892
890
|
|
|
@@ -1008,6 +1006,45 @@ function QueueIndicator() {
|
|
|
1008
1006
|
|
|
1009
1007
|
## How It Works
|
|
1010
1008
|
|
|
1009
|
+
### Architecture: Zustand-First Design
|
|
1010
|
+
|
|
1011
|
+
This library follows a **clean, one-way data flow** architecture:
|
|
1012
|
+
|
|
1013
|
+
```
|
|
1014
|
+
┌─────────────────────────────────────────────────────┐
|
|
1015
|
+
│ Runtime (While App is Running) │
|
|
1016
|
+
│ │
|
|
1017
|
+
│ ┌──────────────────────────────────────┐ │
|
|
1018
|
+
│ │ Zustand Store (Source of Truth) │ │
|
|
1019
|
+
│ │ - Queue state │ │
|
|
1020
|
+
│ │ - Current message │ │
|
|
1021
|
+
│ │ - Processing status │ │
|
|
1022
|
+
│ └──────────────┬───────────────────────┘ │
|
|
1023
|
+
│ │ │
|
|
1024
|
+
│ │ Persists to ↓ │
|
|
1025
|
+
│ │ │
|
|
1026
|
+
│ ┌──────────────▼───────────────────────┐ │
|
|
1027
|
+
│ │ IndexedDB (Dexie) │ │
|
|
1028
|
+
│ │ - Dumb storage layer │ │
|
|
1029
|
+
│ │ - No business logic │ │
|
|
1030
|
+
│ │ - Only for cold starts │ │
|
|
1031
|
+
│ └──────────────────────────────────────┘ │
|
|
1032
|
+
└─────────────────────────────────────────────────────┘
|
|
1033
|
+
|
|
1034
|
+
┌─────────────────────────────────────────────────────┐
|
|
1035
|
+
│ Cold Start (App Restart) │
|
|
1036
|
+
│ │
|
|
1037
|
+
│ IndexedDB ────loads───► Zustand Store │
|
|
1038
|
+
│ (Back to runtime mode) │
|
|
1039
|
+
└─────────────────────────────────────────────────────┘
|
|
1040
|
+
```
|
|
1041
|
+
|
|
1042
|
+
**Key Principles:**
|
|
1043
|
+
1. **Zustand is the boss** - All operations go through the store
|
|
1044
|
+
2. **Database is dumb** - Pure storage functions, no knowledge of store
|
|
1045
|
+
3. **One-way flow** - Store writes to DB, DB never touches store
|
|
1046
|
+
4. **No circular dependencies** - Clean module boundaries
|
|
1047
|
+
|
|
1011
1048
|
### Cross-Window Synchronization
|
|
1012
1049
|
|
|
1013
1050
|
The library uses `zustand-sync` to synchronize state across all Tauri windows via localStorage. When you enqueue a message in the main window, all notice windows see the update in real-time.
|
|
@@ -1022,6 +1059,9 @@ Zustand Store ◄─────────► localStorage ◄─────
|
|
|
1022
1059
|
| | |
|
|
1023
1060
|
▼ ▼ ▼
|
|
1024
1061
|
State Updated State Updated State Updated
|
|
1062
|
+
│ │
|
|
1063
|
+
└─────── Persists to IndexedDB ────────────────────┘
|
|
1064
|
+
(for cold starts only)
|
|
1025
1065
|
```
|
|
1026
1066
|
|
|
1027
1067
|
### Message Lifecycle
|
|
@@ -1031,12 +1071,24 @@ State Updated State Updated State Updated
|
|
|
1031
1071
|
3. **shown**: User has acknowledged the message
|
|
1032
1072
|
4. **hidden**: Server requested to hide the message
|
|
1033
1073
|
|
|
1034
|
-
### Persistence
|
|
1074
|
+
### Persistence Strategy
|
|
1075
|
+
|
|
1076
|
+
**At Runtime:**
|
|
1077
|
+
- All state lives in Zustand store (in-memory)
|
|
1078
|
+
- Store automatically persists changes to IndexedDB
|
|
1079
|
+
- Database is just a backup, not actively queried
|
|
1035
1080
|
|
|
1036
|
-
|
|
1081
|
+
**On App Restart:**
|
|
1037
1082
|
1. Database is initialized
|
|
1038
|
-
2. Pending messages are loaded
|
|
1083
|
+
2. Pending messages are loaded into Zustand store
|
|
1039
1084
|
3. First message is shown automatically
|
|
1085
|
+
4. Back to runtime mode (Zustand is now the truth)
|
|
1086
|
+
|
|
1087
|
+
**Why This Design?**
|
|
1088
|
+
- **Performance**: No database queries during normal operation
|
|
1089
|
+
- **Simplicity**: Single source of truth eliminates sync bugs
|
|
1090
|
+
- **Clean Code**: No circular dependencies, predictable data flow
|
|
1091
|
+
- **Reliability**: Database only used for cold storage
|
|
1040
1092
|
|
|
1041
1093
|
## Requirements
|
|
1042
1094
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHideNotice.d.ts","sourceRoot":"","sources":["../../src/hooks/useHideNotice.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useHideNotice.d.ts","sourceRoot":"","sources":["../../src/hooks/useHideNotice.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,aAAa;4BAIJ,MAAM;CAW3B,CAAA"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const fe=require("zustand"),me=require("zustand-sync"),ve=require("dexie"),g=require("react"),z=require("react/jsx-runtime"),ne="tauri-notice-config",J={routePrefix:"/notice",databaseName:"tauri-notice-db",defaultWidth:400,defaultHeight:300,notFoundUrl:"/404"},se=()=>{try{const t=localStorage.getItem(ne);if(t)return{...J,...JSON.parse(t)}}catch(t){console.warn("Failed to load config from localStorage:",t)}return J},We=t=>{try{localStorage.setItem(ne,JSON.stringify(t))}catch(e){console.warn("Failed to save config to localStorage:",e)}},Se=t=>{const i={...se(),...t};We(i)},F=()=>se();class Ne extends ve{messages;constructor(e){super(e),this.version(1).stores({messages:"id, queueStatus, queuePosition, timestamp"})}}let D=null;const B=()=>{if(!D){const t=F();D=new Ne(t.databaseName)}return D},h=()=>D||B(),ae=async t=>{const e={...t,timestamp:new Date().toISOString(),isRead:!1,isShown:!1,queueStatus:"pending",queuePosition:0};await h().messages.put(e)},re=async t=>!!await h().messages.get(t),le=async t=>{const e=await h().messages.get(t);return e?.isShown===!0||e?.queueStatus==="shown"},oe=async()=>await h().messages.where("queueStatus").equals("pending").sortBy("queuePosition"),ue=async(t,e)=>{await h().messages.update(t,{queueStatus:e})},U=async t=>{await h().messages.update(t,{queueStatus:"shown",isShown:!0})},ce=async t=>{await h().messages.update(t,{queueStatus:"hidden"})},Q=async t=>await h().messages.get(t),ze=async t=>{await h().messages.delete(t);try{const{useMessageQueueStore:e}=await Promise.resolve().then(()=>Oe),{removeFromQueue:i}=e.getState();i(t)}catch(e){console.warn("Failed to remove message from queue store:",e)}},de=async()=>{await h().messages.where("queueStatus").anyOf(["pending","showing"]).delete()},De=async t=>{const e=t.map(i=>h().messages.update(i.id,{queuePosition:i.position}));await Promise.all(e)},Ae=(t,e)=>({queue:[],currentMessage:null,isProcessing:!1,initialized:!1,activeWindowIds:[],enqueue:async i=>{const n=e();if(await le(i.id)){console.log(`Message ${i.id} was already shown, skipping`);return}if(await re(i.id)||await ae(i),!n.queue.some(u=>u.id===i.id)){const u=[...n.queue,i];t({queue:u}),await e().persistQueue()}!n.isProcessing&&!n.currentMessage&&await e().showNext()},dequeue:()=>{const i=e();if(i.queue.length===0)return null;const[n,...a]=i.queue;return t({queue:a}),n},showNext:async()=>{if(e().isProcessing)return;const n=e().dequeue();if(!n){t({isProcessing:!1,currentMessage:null});return}if(!await Q(n.id)){console.log(`Message ${n.id} was deleted, skipping to next`),await e().showNext();return}t({currentMessage:n,isProcessing:!0}),await ue(n.id,"showing"),await e().persistQueue()},clearCurrent:()=>{t({currentMessage:null,isProcessing:!1}),e().queue.length>0&&e().showNext()},setCurrentMessage:i=>{t({currentMessage:i})},setIsProcessing:i=>{t({isProcessing:i})},setQueue:i=>{t({queue:i})},initializeFromDatabase:async()=>{if(e().initialized)return;t({initialized:!0});const n=await oe();n.length>0&&(t({queue:n}),await e().showNext())},persistQueue:async()=>{const n=e().queue.map((a,l)=>({id:a.id,position:l}));await De(n)},clearOnLogout:async()=>{t({queue:[],currentMessage:null,isProcessing:!1,activeWindowIds:[],initialized:!1}),await de()},removeFromQueue:i=>{const n=e(),a=n.queue.filter(l=>l.id!==i);t({queue:a}),n.currentMessage?.id===i&&(async()=>{try{const{closeNoticeWindow:r}=await Promise.resolve().then(()=>Fe);await r(i)}catch(r){console.warn("Failed to close notice window:",r),e().clearCurrent()}})()},addActiveWindow:i=>{const n=e(),a=String(i);n.activeWindowIds.includes(a)||t({activeWindowIds:[...n.activeWindowIds,a]})},removeActiveWindow:i=>{const n=e(),a=String(i);t({activeWindowIds:n.activeWindowIds.filter(l=>l!==a)})},isWindowActive:i=>{const n=e(),a=String(i);return n.activeWindowIds.includes(a)}}),d=fe.create()(me.syncTabs(Ae,{name:"tauri-notice-queue"})),f={queueLength:t=>t.queue.length,currentMessage:t=>t.currentMessage,isProcessing:t=>t.isProcessing,queue:t=>t.queue},Oe=Object.freeze(Object.defineProperty({__proto__:null,messageQueueSelectors:f,useMessageQueueStore:d},Symbol.toStringTag,{value:"Module"})),Pe=()=>{const t=d(i=>i.enqueue);return{showNotice:g.useCallback(async i=>{await t(i)},[t])}};function Me(t,e,i,n){if(typeof e=="function"?t!==e||!n:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?n:i==="a"?n.call(t):n?n.value:e.get(t)}function xe(t,e,i,n,a){if(typeof e=="function"?t!==e||!0:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return e.set(t,i),i}var M;const w="__TAURI_TO_IPC_KEY__";function ke(t,e=!1){return window.__TAURI_INTERNALS__.transformCallback(t,e)}async function s(t,e={},i){return window.__TAURI_INTERNALS__.invoke(t,e,i)}class Ce{get rid(){return Me(this,M,"f")}constructor(e){M.set(this,void 0),xe(this,M,e)}async close(){return s("plugin:resources|close",{rid:this.rid})}}M=new WeakMap;class we{constructor(...e){this.type="Logical",e.length===1?"Logical"in e[0]?(this.width=e[0].Logical.width,this.height=e[0].Logical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toPhysical(e){return new b(this.width*e,this.height*e)}[w](){return{width:this.width,height:this.height}}toJSON(){return this[w]()}}class b{constructor(...e){this.type="Physical",e.length===1?"Physical"in e[0]?(this.width=e[0].Physical.width,this.height=e[0].Physical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toLogical(e){return new we(this.width/e,this.height/e)}[w](){return{width:this.width,height:this.height}}toJSON(){return this[w]()}}class y{constructor(e){this.size=e}toLogical(e){return this.size instanceof we?this.size:this.size.toLogical(e)}toPhysical(e){return this.size instanceof b?this.size:this.size.toPhysical(e)}[w](){return{[`${this.size.type}`]:{width:this.size.width,height:this.size.height}}}toJSON(){return this[w]()}}class he{constructor(...e){this.type="Logical",e.length===1?"Logical"in e[0]?(this.x=e[0].Logical.x,this.y=e[0].Logical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toPhysical(e){return new c(this.x*e,this.y*e)}[w](){return{x:this.x,y:this.y}}toJSON(){return this[w]()}}class c{constructor(...e){this.type="Physical",e.length===1?"Physical"in e[0]?(this.x=e[0].Physical.x,this.y=e[0].Physical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toLogical(e){return new he(this.x/e,this.y/e)}[w](){return{x:this.x,y:this.y}}toJSON(){return this[w]()}}class m{constructor(e){this.position=e}toLogical(e){return this.position instanceof he?this.position:this.position.toLogical(e)}toPhysical(e){return this.position instanceof c?this.position:this.position.toPhysical(e)}[w](){return{[`${this.position.type}`]:{x:this.position.x,y:this.position.y}}}toJSON(){return this[w]()}}var o;(function(t){t.WINDOW_RESIZED="tauri://resize",t.WINDOW_MOVED="tauri://move",t.WINDOW_CLOSE_REQUESTED="tauri://close-requested",t.WINDOW_DESTROYED="tauri://destroyed",t.WINDOW_FOCUS="tauri://focus",t.WINDOW_BLUR="tauri://blur",t.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",t.WINDOW_THEME_CHANGED="tauri://theme-changed",t.WINDOW_CREATED="tauri://window-created",t.WEBVIEW_CREATED="tauri://webview-created",t.DRAG_ENTER="tauri://drag-enter",t.DRAG_OVER="tauri://drag-over",t.DRAG_DROP="tauri://drag-drop",t.DRAG_LEAVE="tauri://drag-leave"})(o||(o={}));async function ge(t,e){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(t,e),await s("plugin:event|unlisten",{event:t,eventId:e})}async function C(t,e,i){var n;const a=typeof i?.target=="string"?{kind:"AnyLabel",label:i.target}:(n=i?.target)!==null&&n!==void 0?n:{kind:"Any"};return s("plugin:event|listen",{event:t,target:a,handler:ke(e)}).then(l=>async()=>ge(t,l))}async function j(t,e,i){return C(t,n=>{ge(t,n.id),e(n)},i)}async function ye(t,e){await s("plugin:event|emit",{event:t,payload:e})}async function be(t,e,i){await s("plugin:event|emit_to",{target:typeof t=="string"?{kind:"AnyLabel",label:t}:t,event:e,payload:i})}class A extends Ce{constructor(e){super(e)}static async new(e,i,n){return s("plugin:image|new",{rgba:k(e),width:i,height:n}).then(a=>new A(a))}static async fromBytes(e){return s("plugin:image|from_bytes",{bytes:k(e)}).then(i=>new A(i))}static async fromPath(e){return s("plugin:image|from_path",{path:e}).then(i=>new A(i))}async rgba(){return s("plugin:image|rgba",{rid:this.rid}).then(e=>new Uint8Array(e))}async size(){return s("plugin:image|size",{rid:this.rid})}}function k(t){return t==null?null:typeof t=="string"?t:t instanceof A?t.rid:t}var q;(function(t){t[t.Critical=1]="Critical",t[t.Informational=2]="Informational"})(q||(q={}));class Ie{constructor(e){this._preventDefault=!1,this.event=e.event,this.id=e.id}preventDefault(){this._preventDefault=!0}isPreventDefault(){return this._preventDefault}}var Z;(function(t){t.None="none",t.Normal="normal",t.Indeterminate="indeterminate",t.Paused="paused",t.Error="error"})(Z||(Z={}));function pe(){return new I(window.__TAURI_INTERNALS__.metadata.currentWindow.label,{skip:!0})}async function E(){return s("plugin:window|get_all_windows").then(t=>t.map(e=>new I(e,{skip:!0})))}const R=["tauri://created","tauri://error"];class I{constructor(e,i={}){var n;this.label=e,this.listeners=Object.create(null),i?.skip||s("plugin:window|create",{options:{...i,parent:typeof i.parent=="string"?i.parent:(n=i.parent)===null||n===void 0?void 0:n.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async a=>this.emit("tauri://error",a))}static async getByLabel(e){var i;return(i=(await E()).find(n=>n.label===e))!==null&&i!==void 0?i:null}static getCurrent(){return pe()}static async getAll(){return E()}static async getFocusedWindow(){for(const e of await E())if(await e.isFocused())return e;return null}async listen(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:C(e,i,{target:{kind:"Window",label:this.label}})}async once(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:j(e,i,{target:{kind:"Window",label:this.label}})}async emit(e,i){if(R.includes(e)){for(const n of this.listeners[e]||[])n({event:e,id:-1,payload:i});return}return ye(e,i)}async emitTo(e,i,n){if(R.includes(i)){for(const a of this.listeners[i]||[])a({event:i,id:-1,payload:n});return}return be(e,i,n)}_handleTauriEvent(e,i){return R.includes(e)?(e in this.listeners?this.listeners[e].push(i):this.listeners[e]=[i],!0):!1}async scaleFactor(){return s("plugin:window|scale_factor",{label:this.label})}async innerPosition(){return s("plugin:window|inner_position",{label:this.label}).then(e=>new c(e))}async outerPosition(){return s("plugin:window|outer_position",{label:this.label}).then(e=>new c(e))}async innerSize(){return s("plugin:window|inner_size",{label:this.label}).then(e=>new b(e))}async outerSize(){return s("plugin:window|outer_size",{label:this.label}).then(e=>new b(e))}async isFullscreen(){return s("plugin:window|is_fullscreen",{label:this.label})}async isMinimized(){return s("plugin:window|is_minimized",{label:this.label})}async isMaximized(){return s("plugin:window|is_maximized",{label:this.label})}async isFocused(){return s("plugin:window|is_focused",{label:this.label})}async isDecorated(){return s("plugin:window|is_decorated",{label:this.label})}async isResizable(){return s("plugin:window|is_resizable",{label:this.label})}async isMaximizable(){return s("plugin:window|is_maximizable",{label:this.label})}async isMinimizable(){return s("plugin:window|is_minimizable",{label:this.label})}async isClosable(){return s("plugin:window|is_closable",{label:this.label})}async isVisible(){return s("plugin:window|is_visible",{label:this.label})}async title(){return s("plugin:window|title",{label:this.label})}async theme(){return s("plugin:window|theme",{label:this.label})}async isAlwaysOnTop(){return s("plugin:window|is_always_on_top",{label:this.label})}async center(){return s("plugin:window|center",{label:this.label})}async requestUserAttention(e){let i=null;return e&&(e===q.Critical?i={type:"Critical"}:i={type:"Informational"}),s("plugin:window|request_user_attention",{label:this.label,value:i})}async setResizable(e){return s("plugin:window|set_resizable",{label:this.label,value:e})}async setEnabled(e){return s("plugin:window|set_enabled",{label:this.label,value:e})}async isEnabled(){return s("plugin:window|is_enabled",{label:this.label})}async setMaximizable(e){return s("plugin:window|set_maximizable",{label:this.label,value:e})}async setMinimizable(e){return s("plugin:window|set_minimizable",{label:this.label,value:e})}async setClosable(e){return s("plugin:window|set_closable",{label:this.label,value:e})}async setTitle(e){return s("plugin:window|set_title",{label:this.label,value:e})}async maximize(){return s("plugin:window|maximize",{label:this.label})}async unmaximize(){return s("plugin:window|unmaximize",{label:this.label})}async toggleMaximize(){return s("plugin:window|toggle_maximize",{label:this.label})}async minimize(){return s("plugin:window|minimize",{label:this.label})}async unminimize(){return s("plugin:window|unminimize",{label:this.label})}async show(){return s("plugin:window|show",{label:this.label})}async hide(){return s("plugin:window|hide",{label:this.label})}async close(){return s("plugin:window|close",{label:this.label})}async destroy(){return s("plugin:window|destroy",{label:this.label})}async setDecorations(e){return s("plugin:window|set_decorations",{label:this.label,value:e})}async setShadow(e){return s("plugin:window|set_shadow",{label:this.label,value:e})}async setEffects(e){return s("plugin:window|set_effects",{label:this.label,value:e})}async clearEffects(){return s("plugin:window|set_effects",{label:this.label,value:null})}async setAlwaysOnTop(e){return s("plugin:window|set_always_on_top",{label:this.label,value:e})}async setAlwaysOnBottom(e){return s("plugin:window|set_always_on_bottom",{label:this.label,value:e})}async setContentProtected(e){return s("plugin:window|set_content_protected",{label:this.label,value:e})}async setSize(e){return s("plugin:window|set_size",{label:this.label,value:e instanceof y?e:new y(e)})}async setMinSize(e){return s("plugin:window|set_min_size",{label:this.label,value:e instanceof y?e:e?new y(e):null})}async setMaxSize(e){return s("plugin:window|set_max_size",{label:this.label,value:e instanceof y?e:e?new y(e):null})}async setSizeConstraints(e){function i(n){return n?{Logical:n}:null}return s("plugin:window|set_size_constraints",{label:this.label,value:{minWidth:i(e?.minWidth),minHeight:i(e?.minHeight),maxWidth:i(e?.maxWidth),maxHeight:i(e?.maxHeight)}})}async setPosition(e){return s("plugin:window|set_position",{label:this.label,value:e instanceof m?e:new m(e)})}async setFullscreen(e){return s("plugin:window|set_fullscreen",{label:this.label,value:e})}async setSimpleFullscreen(e){return s("plugin:window|set_simple_fullscreen",{label:this.label,value:e})}async setFocus(){return s("plugin:window|set_focus",{label:this.label})}async setFocusable(e){return s("plugin:window|set_focusable",{label:this.label,value:e})}async setIcon(e){return s("plugin:window|set_icon",{label:this.label,value:k(e)})}async setSkipTaskbar(e){return s("plugin:window|set_skip_taskbar",{label:this.label,value:e})}async setCursorGrab(e){return s("plugin:window|set_cursor_grab",{label:this.label,value:e})}async setCursorVisible(e){return s("plugin:window|set_cursor_visible",{label:this.label,value:e})}async setCursorIcon(e){return s("plugin:window|set_cursor_icon",{label:this.label,value:e})}async setBackgroundColor(e){return s("plugin:window|set_background_color",{color:e})}async setCursorPosition(e){return s("plugin:window|set_cursor_position",{label:this.label,value:e instanceof m?e:new m(e)})}async setIgnoreCursorEvents(e){return s("plugin:window|set_ignore_cursor_events",{label:this.label,value:e})}async startDragging(){return s("plugin:window|start_dragging",{label:this.label})}async startResizeDragging(e){return s("plugin:window|start_resize_dragging",{label:this.label,value:e})}async setBadgeCount(e){return s("plugin:window|set_badge_count",{label:this.label,value:e})}async setBadgeLabel(e){return s("plugin:window|set_badge_label",{label:this.label,value:e})}async setOverlayIcon(e){return s("plugin:window|set_overlay_icon",{label:this.label,value:e?k(e):void 0})}async setProgressBar(e){return s("plugin:window|set_progress_bar",{label:this.label,value:e})}async setVisibleOnAllWorkspaces(e){return s("plugin:window|set_visible_on_all_workspaces",{label:this.label,value:e})}async setTitleBarStyle(e){return s("plugin:window|set_title_bar_style",{label:this.label,value:e})}async setTheme(e){return s("plugin:window|set_theme",{label:this.label,value:e})}async onResized(e){return this.listen(o.WINDOW_RESIZED,i=>{i.payload=new b(i.payload),e(i)})}async onMoved(e){return this.listen(o.WINDOW_MOVED,i=>{i.payload=new c(i.payload),e(i)})}async onCloseRequested(e){return this.listen(o.WINDOW_CLOSE_REQUESTED,async i=>{const n=new Ie(i);await e(n),n.isPreventDefault()||await this.destroy()})}async onDragDropEvent(e){const i=await this.listen(o.DRAG_ENTER,r=>{e({...r,payload:{type:"enter",paths:r.payload.paths,position:new c(r.payload.position)}})}),n=await this.listen(o.DRAG_OVER,r=>{e({...r,payload:{type:"over",position:new c(r.payload.position)}})}),a=await this.listen(o.DRAG_DROP,r=>{e({...r,payload:{type:"drop",paths:r.payload.paths,position:new c(r.payload.position)}})}),l=await this.listen(o.DRAG_LEAVE,r=>{e({...r,payload:{type:"leave"}})});return()=>{i(),a(),n(),l()}}async onFocusChanged(e){const i=await this.listen(o.WINDOW_FOCUS,a=>{e({...a,payload:!0})}),n=await this.listen(o.WINDOW_BLUR,a=>{e({...a,payload:!1})});return()=>{i(),n()}}async onScaleChanged(e){return this.listen(o.WINDOW_SCALE_FACTOR_CHANGED,e)}async onThemeChanged(e){return this.listen(o.WINDOW_THEME_CHANGED,e)}}var Y;(function(t){t.Disabled="disabled",t.Throttle="throttle",t.Suspend="suspend"})(Y||(Y={}));var K;(function(t){t.Default="default",t.FluentOverlay="fluentOverlay"})(K||(K={}));var X;(function(t){t.AppearanceBased="appearanceBased",t.Light="light",t.Dark="dark",t.MediumLight="mediumLight",t.UltraDark="ultraDark",t.Titlebar="titlebar",t.Selection="selection",t.Menu="menu",t.Popover="popover",t.Sidebar="sidebar",t.HeaderView="headerView",t.Sheet="sheet",t.WindowBackground="windowBackground",t.HudWindow="hudWindow",t.FullScreenUI="fullScreenUI",t.Tooltip="tooltip",t.ContentBackground="contentBackground",t.UnderWindowBackground="underWindowBackground",t.UnderPageBackground="underPageBackground",t.Mica="mica",t.Blur="blur",t.Acrylic="acrylic",t.Tabbed="tabbed",t.TabbedDark="tabbedDark",t.TabbedLight="tabbedLight"})(X||(X={}));var ee;(function(t){t.FollowsWindowActiveState="followsWindowActiveState",t.Active="active",t.Inactive="inactive"})(ee||(ee={}));function Le(t){return t===null?null:{name:t.name,scaleFactor:t.scaleFactor,position:new c(t.position),size:new b(t.size),workArea:{position:new c(t.workArea.position),size:new b(t.workArea.size)}}}async function Ee(){return s("plugin:window|primary_monitor").then(Le)}function _e(){return new G(pe(),window.__TAURI_INTERNALS__.metadata.currentWebview.label,{skip:!0})}async function te(){return s("plugin:webview|get_all_webviews").then(t=>t.map(e=>new G(new I(e.windowLabel,{skip:!0}),e.label,{skip:!0})))}const T=["tauri://created","tauri://error"];class G{constructor(e,i,n){this.window=e,this.label=i,this.listeners=Object.create(null),n?.skip||s("plugin:webview|create_webview",{windowLabel:e.label,options:{...n,label:i}}).then(async()=>this.emit("tauri://created")).catch(async a=>this.emit("tauri://error",a))}static async getByLabel(e){var i;return(i=(await te()).find(n=>n.label===e))!==null&&i!==void 0?i:null}static getCurrent(){return _e()}static async getAll(){return te()}async listen(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:C(e,i,{target:{kind:"Webview",label:this.label}})}async once(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:j(e,i,{target:{kind:"Webview",label:this.label}})}async emit(e,i){if(T.includes(e)){for(const n of this.listeners[e]||[])n({event:e,id:-1,payload:i});return}return ye(e,i)}async emitTo(e,i,n){if(T.includes(i)){for(const a of this.listeners[i]||[])a({event:i,id:-1,payload:n});return}return be(e,i,n)}_handleTauriEvent(e,i){return T.includes(e)?(e in this.listeners?this.listeners[e].push(i):this.listeners[e]=[i],!0):!1}async position(){return s("plugin:webview|webview_position",{label:this.label}).then(e=>new c(e))}async size(){return s("plugin:webview|webview_size",{label:this.label}).then(e=>new b(e))}async close(){return s("plugin:webview|webview_close",{label:this.label})}async setSize(e){return s("plugin:webview|set_webview_size",{label:this.label,value:e instanceof y?e:new y(e)})}async setPosition(e){return s("plugin:webview|set_webview_position",{label:this.label,value:e instanceof m?e:new m(e)})}async setFocus(){return s("plugin:webview|set_webview_focus",{label:this.label})}async setAutoResize(e){return s("plugin:webview|set_webview_auto_resize",{label:this.label,value:e})}async hide(){return s("plugin:webview|webview_hide",{label:this.label})}async show(){return s("plugin:webview|webview_show",{label:this.label})}async setZoom(e){return s("plugin:webview|set_webview_zoom",{label:this.label,value:e})}async reparent(e){return s("plugin:webview|reparent",{label:this.label,window:typeof e=="string"?e:e.label})}async clearAllBrowsingData(){return s("plugin:webview|clear_all_browsing_data")}async setBackgroundColor(e){return s("plugin:webview|set_webview_background_color",{color:e})}async onDragDropEvent(e){const i=await this.listen(o.DRAG_ENTER,r=>{e({...r,payload:{type:"enter",paths:r.payload.paths,position:new c(r.payload.position)}})}),n=await this.listen(o.DRAG_OVER,r=>{e({...r,payload:{type:"over",position:new c(r.payload.position)}})}),a=await this.listen(o.DRAG_DROP,r=>{e({...r,payload:{type:"drop",paths:r.payload.paths,position:new c(r.payload.position)}})}),l=await this.listen(o.DRAG_LEAVE,r=>{e({...r,payload:{type:"leave"}})});return()=>{i(),a(),n(),l()}}}function x(){const t=_e();return new v(t.label,{skip:!0})}async function ie(){return s("plugin:window|get_all_windows").then(t=>t.map(e=>new v(e,{skip:!0})))}class v{constructor(e,i={}){var n;this.label=e,this.listeners=Object.create(null),i?.skip||s("plugin:webview|create_webview_window",{options:{...i,parent:typeof i.parent=="string"?i.parent:(n=i.parent)===null||n===void 0?void 0:n.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async a=>this.emit("tauri://error",a))}static async getByLabel(e){var i;const n=(i=(await ie()).find(a=>a.label===e))!==null&&i!==void 0?i:null;return n?new v(n.label,{skip:!0}):null}static getCurrent(){return x()}static async getAll(){return ie()}async listen(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:C(e,i,{target:{kind:"WebviewWindow",label:this.label}})}async once(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:j(e,i,{target:{kind:"WebviewWindow",label:this.label}})}async setBackgroundColor(e){return s("plugin:window|set_background_color",{color:e}).then(()=>s("plugin:webview|set_webview_background_color",{color:e}))}}Re(v,[I,G]);function Re(t,e){(Array.isArray(e)?e:[e]).forEach(i=>{Object.getOwnPropertyNames(i.prototype).forEach(n=>{var a;typeof t.prototype=="object"&&t.prototype&&n in t.prototype||Object.defineProperty(t.prototype,n,(a=Object.getOwnPropertyDescriptor(i.prototype,n))!==null&&a!==void 0?a:Object.create(null))})})}const O=new Map,Te=t=>{if(!t||t.trim()==="")return!1;try{return!!(t.startsWith("/")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("tauri://"))}catch{return!1}},qe=async(t,e,i)=>{const n=i?.padding??20;if(i?.x!==void 0&&i?.y!==void 0)return{x:i.x,y:i.y};let a=1920,l=1080;try{const u=await Ee();u?.size&&(a=u.size.width,l=u.size.height)}catch(u){console.warn("Failed to get monitor info, using defaults:",u)}switch(i?.position??"right-bottom"){case"right-bottom":return{x:a-t-n,y:l-e-n};case"right-top":return{x:a-t-n,y:n};case"left-bottom":return{x:n,y:l-e-n};case"left-top":return{x:n,y:n};case"center":return{x:(a-t)/2,y:(l-e)/2};default:return{x:a-t-n,y:l-e-n}}},H=async t=>{const e=String(t.id),i=d.getState();if(i.isWindowActive(e)){console.log(`Notice window already open for message: ${e}`);return}const n=F(),a=`notice-${e}`;let l=`${n.routePrefix}/${t.type}?id=${t.id}`;Te(l)||(console.warn(`Invalid window URL: ${l}. Using fallback 404 page.`),l=n.notFoundUrl||"/404");const r=t.min_width||n.defaultWidth,u=t.min_height||n.defaultHeight,{x:W,y:S}=await qe(r,u,t.windowPosition);try{const p=new v(a,{url:l,title:t.title,width:r,height:u,x:W,y:S,resizable:!0,decorations:!0,skipTaskbar:!1,alwaysOnTop:!0});O.set(e,p),i.addActiveWindow(e),p.once("tauri://destroyed",async()=>{O.delete(e),i.removeActiveWindow(e),await U(e),i.clearCurrent()}),console.log(`Created notice window: ${a}`)}catch(p){console.error("Failed to create notice window:",p),i.removeActiveWindow(e),i.clearCurrent()}},P=async t=>{const e=String(t),i=O.get(e),n=d.getState();if(i)try{await i.close(),O.delete(e),n.removeActiveWindow(e),await U(e),n.clearCurrent(),console.log(`Closed notice window: ${e}`)}catch(a){console.error("Failed to close notice window:",a)}},V=async()=>{const t=Array.from(O.keys()).map(e=>P(e));await Promise.all(t)},$=()=>{let t=null;d.subscribe(e=>{const i=e.currentMessage;i&&i!==t?(t=i,H(i)):i||(t=null)}),console.log("Notice window system initialized")},Fe=Object.freeze(Object.defineProperty({__proto__:null,closeAllNoticeWindows:V,closeNoticeWindow:P,createNoticeWindow:H,initializeNoticeWindowSystem:$},Symbol.toStringTag,{value:"Module"})),Be=()=>{const t=d(i=>i.currentMessage);return{closeNotice:g.useCallback(async()=>{t&&await P(t.id)},[t])}},Ue=()=>{const t=d();return{hideNotice:g.useCallback(async i=>{await ce(i),await P(i),t.currentMessage?.id===i&&t.clearCurrent()},[t])}},Qe=()=>{const t=d(i=>i.clearOnLogout);return{hideAllNotices:g.useCallback(async()=>{await V(),await t()},[t])}},je=()=>{const t=d(f.queueLength),e=d(f.currentMessage),i=d(f.isProcessing),n=d(f.queue);return{queueLength:t,currentMessage:e,isProcessing:i,queue:n}},Ge=({children:t,onLoad:e,onClose:i})=>{const[n,a]=g.useState(null),[l,r]=g.useState(!0),[u,W]=g.useState(null);return g.useEffect(()=>{(async()=>{try{const _=new URLSearchParams(window.location.search).get("id");if(!_){W("No message ID provided"),r(!1),setTimeout(async()=>{try{await x().close()}catch(N){console.error("Failed to close window:",N)}},1e3);return}const L=await Q(_);if(!L){console.log(`Message ${_} not found in database, closing window`),W("Message not found"),r(!1),setTimeout(async()=>{try{await x().close()}catch(N){console.error("Failed to close window:",N)}},500);return}a(L),r(!1),e&&e(L)}catch(p){console.error("Failed to load message:",p),W("Failed to load message"),r(!1),setTimeout(async()=>{try{await x().close()}catch(_){console.error("Failed to close window:",_)}},1e3)}})()},[e]),g.useEffect(()=>{if(!n||!i)return;const S=()=>{i(n)};return window.addEventListener("beforeunload",S),()=>{window.removeEventListener("beforeunload",S)}},[n,i]),l?z.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",fontFamily:"system-ui, -apple-system, sans-serif"},children:"Loading..."}):u?z.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",fontFamily:"system-ui, -apple-system, sans-serif",color:"#ef4444"},children:u}):n?z.jsx(z.Fragment,{children:t(n)}):z.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",fontFamily:"system-ui, -apple-system, sans-serif",color:"#ef4444"},children:"Closing window..."})},He=async()=>{B(),$();const{initializeFromDatabase:t}=d.getState();await t(),console.log("Tauri Notice System initialized")};exports.NoticeLayout=Ge;exports.clearPendingMessages=de;exports.closeAllNoticeWindows=V;exports.closeNoticeWindow=P;exports.createNoticeWindow=H;exports.deleteMessageById=ze;exports.getMessage=Q;exports.getNoticeConfig=F;exports.getPendingMessages=oe;exports.hasMessage=re;exports.initializeDatabase=B;exports.initializeNoticeSystem=He;exports.initializeNoticeWindowSystem=$;exports.isMessageShown=le;exports.markAsHidden=ce;exports.markAsShown=U;exports.messageQueueSelectors=f;exports.saveMessage=ae;exports.setNoticeConfig=Se;exports.updateQueueStatus=ue;exports.useCloseNotice=Be;exports.useHideAllNotices=Qe;exports.useHideNotice=Ue;exports.useMessageQueue=je;exports.useMessageQueueStore=d;exports.useNoticeWindow=Pe;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const de=require("zustand"),he=require("zustand-sync"),ge=require("dexie"),g=require("react"),N=require("react/jsx-runtime"),X="tauri-notice-config",H={routePrefix:"/notice",databaseName:"tauri-notice-db",defaultWidth:400,defaultHeight:300,notFoundUrl:"/404"},ee=()=>{try{const t=localStorage.getItem(X);if(t)return{...H,...JSON.parse(t)}}catch(t){console.warn("Failed to load config from localStorage:",t)}return H},ye=t=>{try{localStorage.setItem(X,JSON.stringify(t))}catch(e){console.warn("Failed to save config to localStorage:",e)}},be=t=>{const i={...ee(),...t};ye(i)},F=()=>ee();class pe extends ge{messages;constructor(e){super(e),this.version(1).stores({messages:"id, queueStatus, queuePosition, timestamp"})}}let z=null;const B=()=>{if(!z){const t=F();z=new pe(t.databaseName)}return z},h=()=>z||B(),_e=async t=>{const e={...t,timestamp:new Date().toISOString(),isRead:!1,isShown:!1,queueStatus:"pending",queuePosition:0};await h().messages.put(e)},fe=async t=>!!await h().messages.get(t),me=async t=>{const e=await h().messages.get(t);return e?.isShown===!0||e?.queueStatus==="shown"},te=async()=>await h().messages.where("queueStatus").equals("pending").sortBy("queuePosition"),ve=async(t,e)=>{await h().messages.update(t,{queueStatus:e})},We=async t=>{await h().messages.update(t,{queueStatus:"shown",isShown:!0})},Se=async t=>{await h().messages.update(t,{queueStatus:"hidden"})},U=async t=>await h().messages.get(t),Ne=async t=>{await h().messages.delete(t)},De=async()=>{await h().messages.where("queueStatus").anyOf(["pending","showing"]).delete()},ze=async t=>{const e=t.map(i=>h().messages.update(i.id,{queuePosition:i.position}));await Promise.all(e)},Ae=(t,e)=>({queue:[],currentMessage:null,isProcessing:!1,initialized:!1,activeWindowIds:[],enqueue:async i=>{const n=e();if(await me(i.id)){console.log(`Message ${i.id} was already shown, skipping`);return}if(await fe(i.id)||await _e(i),!n.queue.some(u=>u.id===i.id)){const u=[...n.queue,i];t({queue:u}),await e().persistQueue()}!n.isProcessing&&!n.currentMessage&&await e().showNext()},dequeue:()=>{const i=e();if(i.queue.length===0)return null;const[n,...a]=i.queue;return t({queue:a}),n},showNext:async()=>{if(e().isProcessing)return;const n=e().dequeue();if(!n){t({isProcessing:!1,currentMessage:null});return}if(!await U(n.id)){console.log(`Message ${n.id} was deleted, skipping to next`),await e().showNext();return}t({currentMessage:n,isProcessing:!0}),await ve(n.id,"showing"),await e().persistQueue()},clearCurrent:()=>{t({currentMessage:null,isProcessing:!1}),e().queue.length>0&&e().showNext()},setCurrentMessage:i=>{t({currentMessage:i})},setIsProcessing:i=>{t({isProcessing:i})},setQueue:i=>{t({queue:i})},initializeFromDatabase:async()=>{if(e().initialized)return;t({initialized:!0});const n=await te();n.length>0&&(t({queue:n}),await e().showNext())},persistQueue:async()=>{const n=e().queue.map((a,r)=>({id:a.id,position:r}));await ze(n)},clearOnLogout:async()=>{t({queue:[],currentMessage:null,isProcessing:!1,activeWindowIds:[],initialized:!1}),await De()},removeFromQueue:async i=>{const n=e(),a=n.queue.filter(r=>r.id!==i);t({queue:a}),await e().persistQueue(),n.currentMessage?.id===i&&e().clearCurrent()},deleteMessage:async i=>{await Ne(i),await e().removeFromQueue(i)},hideMessage:async i=>{await Se(i),await e().removeFromQueue(i)},markMessageAsShown:async i=>{await We(i)},addActiveWindow:i=>{const n=e(),a=String(i);n.activeWindowIds.includes(a)||t({activeWindowIds:[...n.activeWindowIds,a]})},removeActiveWindow:i=>{const n=e(),a=String(i);t({activeWindowIds:n.activeWindowIds.filter(r=>r!==a)})},isWindowActive:i=>{const n=e(),a=String(i);return n.activeWindowIds.includes(a)}}),w=de.create()(he.syncTabs(Ae,{name:"tauri-notice-queue"})),D={queueLength:t=>t.queue.length,currentMessage:t=>t.currentMessage,isProcessing:t=>t.isProcessing,queue:t=>t.queue},xe=()=>{const t=w(i=>i.enqueue);return{showNotice:g.useCallback(async i=>{await t(i)},[t])}};function Oe(t,e,i,n){if(typeof e=="function"?t!==e||!n:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?n:i==="a"?n.call(t):n?n.value:e.get(t)}function Me(t,e,i,n,a){if(typeof e=="function"?t!==e||!0:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return e.set(t,i),i}var O;const d="__TAURI_TO_IPC_KEY__";function Pe(t,e=!1){return window.__TAURI_INTERNALS__.transformCallback(t,e)}async function s(t,e={},i){return window.__TAURI_INTERNALS__.invoke(t,e,i)}class ke{get rid(){return Oe(this,O,"f")}constructor(e){O.set(this,void 0),Me(this,O,e)}async close(){return s("plugin:resources|close",{rid:this.rid})}}O=new WeakMap;class ie{constructor(...e){this.type="Logical",e.length===1?"Logical"in e[0]?(this.width=e[0].Logical.width,this.height=e[0].Logical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toPhysical(e){return new b(this.width*e,this.height*e)}[d](){return{width:this.width,height:this.height}}toJSON(){return this[d]()}}class b{constructor(...e){this.type="Physical",e.length===1?"Physical"in e[0]?(this.width=e[0].Physical.width,this.height=e[0].Physical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toLogical(e){return new ie(this.width/e,this.height/e)}[d](){return{width:this.width,height:this.height}}toJSON(){return this[d]()}}class y{constructor(e){this.size=e}toLogical(e){return this.size instanceof ie?this.size:this.size.toLogical(e)}toPhysical(e){return this.size instanceof b?this.size:this.size.toPhysical(e)}[d](){return{[`${this.size.type}`]:{width:this.size.width,height:this.size.height}}}toJSON(){return this[d]()}}class ne{constructor(...e){this.type="Logical",e.length===1?"Logical"in e[0]?(this.x=e[0].Logical.x,this.y=e[0].Logical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toPhysical(e){return new c(this.x*e,this.y*e)}[d](){return{x:this.x,y:this.y}}toJSON(){return this[d]()}}class c{constructor(...e){this.type="Physical",e.length===1?"Physical"in e[0]?(this.x=e[0].Physical.x,this.y=e[0].Physical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toLogical(e){return new ne(this.x/e,this.y/e)}[d](){return{x:this.x,y:this.y}}toJSON(){return this[d]()}}class f{constructor(e){this.position=e}toLogical(e){return this.position instanceof ne?this.position:this.position.toLogical(e)}toPhysical(e){return this.position instanceof c?this.position:this.position.toPhysical(e)}[d](){return{[`${this.position.type}`]:{x:this.position.x,y:this.position.y}}}toJSON(){return this[d]()}}var o;(function(t){t.WINDOW_RESIZED="tauri://resize",t.WINDOW_MOVED="tauri://move",t.WINDOW_CLOSE_REQUESTED="tauri://close-requested",t.WINDOW_DESTROYED="tauri://destroyed",t.WINDOW_FOCUS="tauri://focus",t.WINDOW_BLUR="tauri://blur",t.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",t.WINDOW_THEME_CHANGED="tauri://theme-changed",t.WINDOW_CREATED="tauri://window-created",t.WEBVIEW_CREATED="tauri://webview-created",t.DRAG_ENTER="tauri://drag-enter",t.DRAG_OVER="tauri://drag-over",t.DRAG_DROP="tauri://drag-drop",t.DRAG_LEAVE="tauri://drag-leave"})(o||(o={}));async function se(t,e){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(t,e),await s("plugin:event|unlisten",{event:t,eventId:e})}async function k(t,e,i){var n;const a=typeof i?.target=="string"?{kind:"AnyLabel",label:i.target}:(n=i?.target)!==null&&n!==void 0?n:{kind:"Any"};return s("plugin:event|listen",{event:t,target:a,handler:Pe(e)}).then(r=>async()=>se(t,r))}async function Q(t,e,i){return k(t,n=>{se(t,n.id),e(n)},i)}async function ae(t,e){await s("plugin:event|emit",{event:t,payload:e})}async function le(t,e,i){await s("plugin:event|emit_to",{target:typeof t=="string"?{kind:"AnyLabel",label:t}:t,event:e,payload:i})}class A extends ke{constructor(e){super(e)}static async new(e,i,n){return s("plugin:image|new",{rgba:P(e),width:i,height:n}).then(a=>new A(a))}static async fromBytes(e){return s("plugin:image|from_bytes",{bytes:P(e)}).then(i=>new A(i))}static async fromPath(e){return s("plugin:image|from_path",{path:e}).then(i=>new A(i))}async rgba(){return s("plugin:image|rgba",{rid:this.rid}).then(e=>new Uint8Array(e))}async size(){return s("plugin:image|size",{rid:this.rid})}}function P(t){return t==null?null:typeof t=="string"?t:t instanceof A?t.rid:t}var q;(function(t){t[t.Critical=1]="Critical",t[t.Informational=2]="Informational"})(q||(q={}));class Ce{constructor(e){this._preventDefault=!1,this.event=e.event,this.id=e.id}preventDefault(){this._preventDefault=!0}isPreventDefault(){return this._preventDefault}}var j;(function(t){t.None="none",t.Normal="normal",t.Indeterminate="indeterminate",t.Paused="paused",t.Error="error"})(j||(j={}));function re(){return new C(window.__TAURI_INTERNALS__.metadata.currentWindow.label,{skip:!0})}async function E(){return s("plugin:window|get_all_windows").then(t=>t.map(e=>new C(e,{skip:!0})))}const R=["tauri://created","tauri://error"];class C{constructor(e,i={}){var n;this.label=e,this.listeners=Object.create(null),i?.skip||s("plugin:window|create",{options:{...i,parent:typeof i.parent=="string"?i.parent:(n=i.parent)===null||n===void 0?void 0:n.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async a=>this.emit("tauri://error",a))}static async getByLabel(e){var i;return(i=(await E()).find(n=>n.label===e))!==null&&i!==void 0?i:null}static getCurrent(){return re()}static async getAll(){return E()}static async getFocusedWindow(){for(const e of await E())if(await e.isFocused())return e;return null}async listen(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:k(e,i,{target:{kind:"Window",label:this.label}})}async once(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:Q(e,i,{target:{kind:"Window",label:this.label}})}async emit(e,i){if(R.includes(e)){for(const n of this.listeners[e]||[])n({event:e,id:-1,payload:i});return}return ae(e,i)}async emitTo(e,i,n){if(R.includes(i)){for(const a of this.listeners[i]||[])a({event:i,id:-1,payload:n});return}return le(e,i,n)}_handleTauriEvent(e,i){return R.includes(e)?(e in this.listeners?this.listeners[e].push(i):this.listeners[e]=[i],!0):!1}async scaleFactor(){return s("plugin:window|scale_factor",{label:this.label})}async innerPosition(){return s("plugin:window|inner_position",{label:this.label}).then(e=>new c(e))}async outerPosition(){return s("plugin:window|outer_position",{label:this.label}).then(e=>new c(e))}async innerSize(){return s("plugin:window|inner_size",{label:this.label}).then(e=>new b(e))}async outerSize(){return s("plugin:window|outer_size",{label:this.label}).then(e=>new b(e))}async isFullscreen(){return s("plugin:window|is_fullscreen",{label:this.label})}async isMinimized(){return s("plugin:window|is_minimized",{label:this.label})}async isMaximized(){return s("plugin:window|is_maximized",{label:this.label})}async isFocused(){return s("plugin:window|is_focused",{label:this.label})}async isDecorated(){return s("plugin:window|is_decorated",{label:this.label})}async isResizable(){return s("plugin:window|is_resizable",{label:this.label})}async isMaximizable(){return s("plugin:window|is_maximizable",{label:this.label})}async isMinimizable(){return s("plugin:window|is_minimizable",{label:this.label})}async isClosable(){return s("plugin:window|is_closable",{label:this.label})}async isVisible(){return s("plugin:window|is_visible",{label:this.label})}async title(){return s("plugin:window|title",{label:this.label})}async theme(){return s("plugin:window|theme",{label:this.label})}async isAlwaysOnTop(){return s("plugin:window|is_always_on_top",{label:this.label})}async center(){return s("plugin:window|center",{label:this.label})}async requestUserAttention(e){let i=null;return e&&(e===q.Critical?i={type:"Critical"}:i={type:"Informational"}),s("plugin:window|request_user_attention",{label:this.label,value:i})}async setResizable(e){return s("plugin:window|set_resizable",{label:this.label,value:e})}async setEnabled(e){return s("plugin:window|set_enabled",{label:this.label,value:e})}async isEnabled(){return s("plugin:window|is_enabled",{label:this.label})}async setMaximizable(e){return s("plugin:window|set_maximizable",{label:this.label,value:e})}async setMinimizable(e){return s("plugin:window|set_minimizable",{label:this.label,value:e})}async setClosable(e){return s("plugin:window|set_closable",{label:this.label,value:e})}async setTitle(e){return s("plugin:window|set_title",{label:this.label,value:e})}async maximize(){return s("plugin:window|maximize",{label:this.label})}async unmaximize(){return s("plugin:window|unmaximize",{label:this.label})}async toggleMaximize(){return s("plugin:window|toggle_maximize",{label:this.label})}async minimize(){return s("plugin:window|minimize",{label:this.label})}async unminimize(){return s("plugin:window|unminimize",{label:this.label})}async show(){return s("plugin:window|show",{label:this.label})}async hide(){return s("plugin:window|hide",{label:this.label})}async close(){return s("plugin:window|close",{label:this.label})}async destroy(){return s("plugin:window|destroy",{label:this.label})}async setDecorations(e){return s("plugin:window|set_decorations",{label:this.label,value:e})}async setShadow(e){return s("plugin:window|set_shadow",{label:this.label,value:e})}async setEffects(e){return s("plugin:window|set_effects",{label:this.label,value:e})}async clearEffects(){return s("plugin:window|set_effects",{label:this.label,value:null})}async setAlwaysOnTop(e){return s("plugin:window|set_always_on_top",{label:this.label,value:e})}async setAlwaysOnBottom(e){return s("plugin:window|set_always_on_bottom",{label:this.label,value:e})}async setContentProtected(e){return s("plugin:window|set_content_protected",{label:this.label,value:e})}async setSize(e){return s("plugin:window|set_size",{label:this.label,value:e instanceof y?e:new y(e)})}async setMinSize(e){return s("plugin:window|set_min_size",{label:this.label,value:e instanceof y?e:e?new y(e):null})}async setMaxSize(e){return s("plugin:window|set_max_size",{label:this.label,value:e instanceof y?e:e?new y(e):null})}async setSizeConstraints(e){function i(n){return n?{Logical:n}:null}return s("plugin:window|set_size_constraints",{label:this.label,value:{minWidth:i(e?.minWidth),minHeight:i(e?.minHeight),maxWidth:i(e?.maxWidth),maxHeight:i(e?.maxHeight)}})}async setPosition(e){return s("plugin:window|set_position",{label:this.label,value:e instanceof f?e:new f(e)})}async setFullscreen(e){return s("plugin:window|set_fullscreen",{label:this.label,value:e})}async setSimpleFullscreen(e){return s("plugin:window|set_simple_fullscreen",{label:this.label,value:e})}async setFocus(){return s("plugin:window|set_focus",{label:this.label})}async setFocusable(e){return s("plugin:window|set_focusable",{label:this.label,value:e})}async setIcon(e){return s("plugin:window|set_icon",{label:this.label,value:P(e)})}async setSkipTaskbar(e){return s("plugin:window|set_skip_taskbar",{label:this.label,value:e})}async setCursorGrab(e){return s("plugin:window|set_cursor_grab",{label:this.label,value:e})}async setCursorVisible(e){return s("plugin:window|set_cursor_visible",{label:this.label,value:e})}async setCursorIcon(e){return s("plugin:window|set_cursor_icon",{label:this.label,value:e})}async setBackgroundColor(e){return s("plugin:window|set_background_color",{color:e})}async setCursorPosition(e){return s("plugin:window|set_cursor_position",{label:this.label,value:e instanceof f?e:new f(e)})}async setIgnoreCursorEvents(e){return s("plugin:window|set_ignore_cursor_events",{label:this.label,value:e})}async startDragging(){return s("plugin:window|start_dragging",{label:this.label})}async startResizeDragging(e){return s("plugin:window|start_resize_dragging",{label:this.label,value:e})}async setBadgeCount(e){return s("plugin:window|set_badge_count",{label:this.label,value:e})}async setBadgeLabel(e){return s("plugin:window|set_badge_label",{label:this.label,value:e})}async setOverlayIcon(e){return s("plugin:window|set_overlay_icon",{label:this.label,value:e?P(e):void 0})}async setProgressBar(e){return s("plugin:window|set_progress_bar",{label:this.label,value:e})}async setVisibleOnAllWorkspaces(e){return s("plugin:window|set_visible_on_all_workspaces",{label:this.label,value:e})}async setTitleBarStyle(e){return s("plugin:window|set_title_bar_style",{label:this.label,value:e})}async setTheme(e){return s("plugin:window|set_theme",{label:this.label,value:e})}async onResized(e){return this.listen(o.WINDOW_RESIZED,i=>{i.payload=new b(i.payload),e(i)})}async onMoved(e){return this.listen(o.WINDOW_MOVED,i=>{i.payload=new c(i.payload),e(i)})}async onCloseRequested(e){return this.listen(o.WINDOW_CLOSE_REQUESTED,async i=>{const n=new Ce(i);await e(n),n.isPreventDefault()||await this.destroy()})}async onDragDropEvent(e){const i=await this.listen(o.DRAG_ENTER,l=>{e({...l,payload:{type:"enter",paths:l.payload.paths,position:new c(l.payload.position)}})}),n=await this.listen(o.DRAG_OVER,l=>{e({...l,payload:{type:"over",position:new c(l.payload.position)}})}),a=await this.listen(o.DRAG_DROP,l=>{e({...l,payload:{type:"drop",paths:l.payload.paths,position:new c(l.payload.position)}})}),r=await this.listen(o.DRAG_LEAVE,l=>{e({...l,payload:{type:"leave"}})});return()=>{i(),a(),n(),r()}}async onFocusChanged(e){const i=await this.listen(o.WINDOW_FOCUS,a=>{e({...a,payload:!0})}),n=await this.listen(o.WINDOW_BLUR,a=>{e({...a,payload:!1})});return()=>{i(),n()}}async onScaleChanged(e){return this.listen(o.WINDOW_SCALE_FACTOR_CHANGED,e)}async onThemeChanged(e){return this.listen(o.WINDOW_THEME_CHANGED,e)}}var V;(function(t){t.Disabled="disabled",t.Throttle="throttle",t.Suspend="suspend"})(V||(V={}));var $;(function(t){t.Default="default",t.FluentOverlay="fluentOverlay"})($||($={}));var J;(function(t){t.AppearanceBased="appearanceBased",t.Light="light",t.Dark="dark",t.MediumLight="mediumLight",t.UltraDark="ultraDark",t.Titlebar="titlebar",t.Selection="selection",t.Menu="menu",t.Popover="popover",t.Sidebar="sidebar",t.HeaderView="headerView",t.Sheet="sheet",t.WindowBackground="windowBackground",t.HudWindow="hudWindow",t.FullScreenUI="fullScreenUI",t.Tooltip="tooltip",t.ContentBackground="contentBackground",t.UnderWindowBackground="underWindowBackground",t.UnderPageBackground="underPageBackground",t.Mica="mica",t.Blur="blur",t.Acrylic="acrylic",t.Tabbed="tabbed",t.TabbedDark="tabbedDark",t.TabbedLight="tabbedLight"})(J||(J={}));var Z;(function(t){t.FollowsWindowActiveState="followsWindowActiveState",t.Active="active",t.Inactive="inactive"})(Z||(Z={}));function Ie(t){return t===null?null:{name:t.name,scaleFactor:t.scaleFactor,position:new c(t.position),size:new b(t.size),workArea:{position:new c(t.workArea.position),size:new b(t.workArea.size)}}}async function Le(){return s("plugin:window|primary_monitor").then(Ie)}function oe(){return new G(re(),window.__TAURI_INTERNALS__.metadata.currentWebview.label,{skip:!0})}async function Y(){return s("plugin:webview|get_all_webviews").then(t=>t.map(e=>new G(new C(e.windowLabel,{skip:!0}),e.label,{skip:!0})))}const T=["tauri://created","tauri://error"];class G{constructor(e,i,n){this.window=e,this.label=i,this.listeners=Object.create(null),n?.skip||s("plugin:webview|create_webview",{windowLabel:e.label,options:{...n,label:i}}).then(async()=>this.emit("tauri://created")).catch(async a=>this.emit("tauri://error",a))}static async getByLabel(e){var i;return(i=(await Y()).find(n=>n.label===e))!==null&&i!==void 0?i:null}static getCurrent(){return oe()}static async getAll(){return Y()}async listen(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:k(e,i,{target:{kind:"Webview",label:this.label}})}async once(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:Q(e,i,{target:{kind:"Webview",label:this.label}})}async emit(e,i){if(T.includes(e)){for(const n of this.listeners[e]||[])n({event:e,id:-1,payload:i});return}return ae(e,i)}async emitTo(e,i,n){if(T.includes(i)){for(const a of this.listeners[i]||[])a({event:i,id:-1,payload:n});return}return le(e,i,n)}_handleTauriEvent(e,i){return T.includes(e)?(e in this.listeners?this.listeners[e].push(i):this.listeners[e]=[i],!0):!1}async position(){return s("plugin:webview|webview_position",{label:this.label}).then(e=>new c(e))}async size(){return s("plugin:webview|webview_size",{label:this.label}).then(e=>new b(e))}async close(){return s("plugin:webview|webview_close",{label:this.label})}async setSize(e){return s("plugin:webview|set_webview_size",{label:this.label,value:e instanceof y?e:new y(e)})}async setPosition(e){return s("plugin:webview|set_webview_position",{label:this.label,value:e instanceof f?e:new f(e)})}async setFocus(){return s("plugin:webview|set_webview_focus",{label:this.label})}async setAutoResize(e){return s("plugin:webview|set_webview_auto_resize",{label:this.label,value:e})}async hide(){return s("plugin:webview|webview_hide",{label:this.label})}async show(){return s("plugin:webview|webview_show",{label:this.label})}async setZoom(e){return s("plugin:webview|set_webview_zoom",{label:this.label,value:e})}async reparent(e){return s("plugin:webview|reparent",{label:this.label,window:typeof e=="string"?e:e.label})}async clearAllBrowsingData(){return s("plugin:webview|clear_all_browsing_data")}async setBackgroundColor(e){return s("plugin:webview|set_webview_background_color",{color:e})}async onDragDropEvent(e){const i=await this.listen(o.DRAG_ENTER,l=>{e({...l,payload:{type:"enter",paths:l.payload.paths,position:new c(l.payload.position)}})}),n=await this.listen(o.DRAG_OVER,l=>{e({...l,payload:{type:"over",position:new c(l.payload.position)}})}),a=await this.listen(o.DRAG_DROP,l=>{e({...l,payload:{type:"drop",paths:l.payload.paths,position:new c(l.payload.position)}})}),r=await this.listen(o.DRAG_LEAVE,l=>{e({...l,payload:{type:"leave"}})});return()=>{i(),a(),n(),r()}}}function M(){const t=oe();return new m(t.label,{skip:!0})}async function K(){return s("plugin:window|get_all_windows").then(t=>t.map(e=>new m(e,{skip:!0})))}class m{constructor(e,i={}){var n;this.label=e,this.listeners=Object.create(null),i?.skip||s("plugin:webview|create_webview_window",{options:{...i,parent:typeof i.parent=="string"?i.parent:(n=i.parent)===null||n===void 0?void 0:n.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async a=>this.emit("tauri://error",a))}static async getByLabel(e){var i;const n=(i=(await K()).find(a=>a.label===e))!==null&&i!==void 0?i:null;return n?new m(n.label,{skip:!0}):null}static getCurrent(){return M()}static async getAll(){return K()}async listen(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:k(e,i,{target:{kind:"WebviewWindow",label:this.label}})}async once(e,i){return this._handleTauriEvent(e,i)?()=>{const n=this.listeners[e];n.splice(n.indexOf(i),1)}:Q(e,i,{target:{kind:"WebviewWindow",label:this.label}})}async setBackgroundColor(e){return s("plugin:window|set_background_color",{color:e}).then(()=>s("plugin:webview|set_webview_background_color",{color:e}))}}Ee(m,[C,G]);function Ee(t,e){(Array.isArray(e)?e:[e]).forEach(i=>{Object.getOwnPropertyNames(i.prototype).forEach(n=>{var a;typeof t.prototype=="object"&&t.prototype&&n in t.prototype||Object.defineProperty(t.prototype,n,(a=Object.getOwnPropertyDescriptor(i.prototype,n))!==null&&a!==void 0?a:Object.create(null))})})}const x=new Map,Re=t=>{if(!t||t.trim()==="")return!1;try{return!!(t.startsWith("/")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("tauri://"))}catch{return!1}},Te=async(t,e,i)=>{const n=i?.padding??20;if(i?.x!==void 0&&i?.y!==void 0)return{x:i.x,y:i.y};let a=1920,r=1080;try{const u=await Le();u?.size&&(a=u.size.width,r=u.size.height)}catch(u){console.warn("Failed to get monitor info, using defaults:",u)}switch(i?.position??"right-bottom"){case"right-bottom":return{x:a-t-n,y:r-e-n};case"right-top":return{x:a-t-n,y:n};case"left-bottom":return{x:n,y:r-e-n};case"left-top":return{x:n,y:n};case"center":return{x:(a-t)/2,y:(r-e)/2};default:return{x:a-t-n,y:r-e-n}}},ue=async t=>{const e=String(t.id),i=w.getState();if(i.isWindowActive(e)){console.log(`Notice window already open for message: ${e}`);return}const n=F(),a=`notice-${e}`;let r=`${n.routePrefix}/${t.type}?id=${t.id}`;Re(r)||(console.warn(`Invalid window URL: ${r}. Using fallback 404 page.`),r=n.notFoundUrl||"/404");const l=t.min_width||n.defaultWidth,u=t.min_height||n.defaultHeight,{x:v,y:W}=await Te(l,u,t.windowPosition);try{const p=new m(a,{url:r,title:t.title,width:l,height:u,x:v,y:W,resizable:!0,decorations:!0,skipTaskbar:!1,alwaysOnTop:!0});x.set(e,p),i.addActiveWindow(e),p.once("tauri://destroyed",async()=>{x.delete(e),i.removeActiveWindow(e),await i.markMessageAsShown(e),i.clearCurrent()}),console.log(`Created notice window: ${a}`)}catch(p){console.error("Failed to create notice window:",p),i.removeActiveWindow(e),i.clearCurrent()}},I=async t=>{const e=String(t),i=x.get(e),n=w.getState();if(i)try{await i.close(),x.delete(e),n.removeActiveWindow(e),await n.markMessageAsShown(e),n.clearCurrent(),console.log(`Closed notice window: ${e}`)}catch(a){console.error("Failed to close notice window:",a)}},ce=async()=>{const t=Array.from(x.keys()).map(e=>I(e));await Promise.all(t)},we=()=>{let t=null;w.subscribe(e=>{const i=e.currentMessage;i&&i!==t?(t=i,ue(i)):i||(t=null)}),console.log("Notice window system initialized")},qe=()=>{const t=w(i=>i.currentMessage);return{closeNotice:g.useCallback(async()=>{t&&await I(t.id)},[t])}},Fe=()=>{const t=w(i=>i.hideMessage);return{hideNotice:g.useCallback(async i=>{await t(i),await I(i)},[t])}},Be=()=>{const t=w(i=>i.clearOnLogout);return{hideAllNotices:g.useCallback(async()=>{await ce(),await t()},[t])}},Ue=()=>{const t=w(D.queueLength),e=w(D.currentMessage),i=w(D.isProcessing),n=w(D.queue);return{queueLength:t,currentMessage:e,isProcessing:i,queue:n}},Qe=({children:t,onLoad:e,onClose:i})=>{const[n,a]=g.useState(null),[r,l]=g.useState(!0),[u,v]=g.useState(null);return g.useEffect(()=>{(async()=>{try{const _=new URLSearchParams(window.location.search).get("id");if(!_){v("No message ID provided"),l(!1),setTimeout(async()=>{try{await M().close()}catch(S){console.error("Failed to close window:",S)}},1e3);return}const L=await U(_);if(!L){console.log(`Message ${_} not found in database, closing window`),v("Message not found"),l(!1),setTimeout(async()=>{try{await M().close()}catch(S){console.error("Failed to close window:",S)}},500);return}a(L),l(!1),e&&e(L)}catch(p){console.error("Failed to load message:",p),v("Failed to load message"),l(!1),setTimeout(async()=>{try{await M().close()}catch(_){console.error("Failed to close window:",_)}},1e3)}})()},[e]),g.useEffect(()=>{if(!n||!i)return;const W=()=>{i(n)};return window.addEventListener("beforeunload",W),()=>{window.removeEventListener("beforeunload",W)}},[n,i]),r?N.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",fontFamily:"system-ui, -apple-system, sans-serif"},children:"Loading..."}):u?N.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",fontFamily:"system-ui, -apple-system, sans-serif",color:"#ef4444"},children:u}):n?N.jsx(N.Fragment,{children:t(n)}):N.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",fontFamily:"system-ui, -apple-system, sans-serif",color:"#ef4444"},children:"Closing window..."})},Ge=async()=>{B(),we();const{initializeFromDatabase:t}=w.getState();await t(),console.log("Tauri Notice System initialized")};exports.NoticeLayout=Qe;exports.closeAllNoticeWindows=ce;exports.closeNoticeWindow=I;exports.createNoticeWindow=ue;exports.getMessage=U;exports.getNoticeConfig=F;exports.getPendingMessages=te;exports.initializeDatabase=B;exports.initializeNoticeSystem=Ge;exports.initializeNoticeWindowSystem=we;exports.messageQueueSelectors=D;exports.setNoticeConfig=be;exports.useCloseNotice=qe;exports.useHideAllNotices=Be;exports.useHideNotice=Fe;exports.useMessageQueue=Ue;exports.useMessageQueueStore=w;exports.useNoticeWindow=xe;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|