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 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
- - **Persistent Queue**: Messages survive app restarts with IndexedDB (Dexie)
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
- ### Database Utilities
715
+ ### Store Methods (Recommended)
714
716
 
715
- For advanced use cases, direct database access is available:
717
+ All operations should go through the Zustand store for consistency:
716
718
 
717
- #### saveMessage()
719
+ #### store.deleteMessage()
718
720
 
719
- Save a message to the database.
721
+ Delete a message completely (from both memory and database).
720
722
 
721
723
  ```typescript
722
- import { saveMessage } from 'tauri-notice-window'
724
+ import { useMessageQueueStore } from 'tauri-notice-window'
723
725
 
724
- await saveMessage({
725
- id: '123',
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
- #### getMessage()
730
+ #### store.hideMessage()
733
731
 
734
- Retrieve a message by ID.
732
+ Hide a message (marks as hidden and removes from queue).
735
733
 
736
734
  ```typescript
737
- import { getMessage } from 'tauri-notice-window'
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
- #### deleteMessageById()
739
+ #### store.removeFromQueue()
743
740
 
744
- Delete a message by ID. This will remove the message from both the database and the queue, preventing it from being displayed.
741
+ Remove a message from queue (memory only, persists position changes).
745
742
 
746
743
  ```typescript
747
- import { deleteMessageById } from 'tauri-notice-window'
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
- **Note:** When a message is deleted, it is automatically removed from the zustand queue. If the deleted message was the current message being displayed, the window will be closed and the next message will be shown automatically.
753
-
754
- #### hasMessage()
748
+ #### store.markMessageAsShown()
755
749
 
756
- Check if a message exists in the database.
750
+ Mark a message as shown in database.
757
751
 
758
752
  ```typescript
759
- import { hasMessage } from 'tauri-notice-window'
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
- #### isMessageShown()
757
+ ### Database Utilities (Low-Level)
765
758
 
766
- Check if a message was already shown.
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
- ```typescript
769
- import { isMessageShown } from 'tauri-notice-window'
761
+ #### initializeDatabase()
770
762
 
771
- const shown = await isMessageShown('123')
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 { getPendingMessages } from 'tauri-notice-window'
766
+ import { initializeDatabase } from 'tauri-notice-window'
780
767
 
781
- const pending = await getPendingMessages()
768
+ const db = initializeDatabase()
782
769
  ```
783
770
 
784
- #### updateQueueStatus()
771
+ #### getMessage()
785
772
 
786
- Update the queue status of a message.
773
+ Retrieve a message by ID.
787
774
 
788
775
  ```typescript
789
- import { updateQueueStatus } from 'tauri-notice-window'
776
+ import { getMessage } from 'tauri-notice-window'
790
777
 
791
- await updateQueueStatus('123', 'shown')
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
- #### markAsHidden()
783
+ #### getPendingMessages()
805
784
 
806
- Mark a message as hidden.
785
+ Get all pending messages.
807
786
 
808
787
  ```typescript
809
- import { markAsHidden } from 'tauri-notice-window'
788
+ import { getPendingMessages } from 'tauri-notice-window'
810
789
 
811
- await markAsHidden('123')
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 Validation
823
+ ### Message Deletion and Queue Management
854
824
 
855
- The library automatically validates messages in the queue before displaying them. If a message has been deleted from the database, it will be skipped and the next message will be shown instead.
825
+ All message operations should go through the Zustand store to maintain consistency.
856
826
 
857
827
  ```typescript
858
- import { showNotice, deleteMessageById } from 'tauri-notice-window'
828
+ import { useNoticeWindow, useMessageQueueStore } from 'tauri-notice-window'
859
829
 
860
- // Example 1: Delete a message in the queue
861
- await showNotice({ id: '1', title: 'First', type: 'announcement', data: {} })
862
- await showNotice({ id: '2', title: 'Second', type: 'announcement', data: {} })
863
- await showNotice({ id: '3', title: 'Third', type: 'announcement', data: {} })
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
- // If message '2' is deleted while in queue
866
- await deleteMessageById('2')
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
- // The queue will automatically skip message '2' and show message '3' next
869
- // Console output: "Message 2 was deleted, skipping to next"
851
+ // Delete via store
852
+ await store.deleteMessage('4')
853
+ // Result: Window closes, next message shows automatically
854
+ }
870
855
 
871
- // Example 2: Delete the currently displayed message
872
- await showNotice({ id: '4', title: 'Current', type: 'announcement', data: {} })
873
- // Window for message '4' is now open and displayed
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
- // Delete the currently open message
876
- await deleteMessageById('4')
877
- // Result: The window for message '4' is automatically closed
878
- // The next message in the queue (if any) is shown immediately
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. When `deleteMessageById()` is called, the message is removed from both the database and the zustand queue
883
- 2. If the deleted message has an open window, the window is automatically closed
884
- 3. Before showing any message, the system verifies it still exists in the database
885
- 4. If a message was deleted, it's automatically skipped and the next message is shown
886
- 5. The next message in the queue is displayed automatically after closing the deleted message's window
887
- 6. **Safety Layer:** If a window somehow opens for a deleted message, the `NoticeLayout` component detects this and automatically closes the window
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
- This ensures that windows are never opened for deleted messages, and any open window for a deleted message is immediately closed.
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
- Messages are persisted to IndexedDB via Dexie. On app restart:
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":"AAKA;;;;GAIG;AACH,eAAO,MAAM,aAAa;4BAIJ,MAAM;CAgB3B,CAAA"}
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