tauri-notice-window 1.0.9 → 1.0.11

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,117 +712,129 @@ 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
714
-
715
- For advanced use cases, direct database access is available:
716
-
717
- #### saveMessage()
715
+ #### deleteMessageById()
718
716
 
719
- Save a message to the database.
717
+ Delete a message by ID. Removes the message from both the runtime queue (Zustand) and persistent storage (IndexedDB).
720
718
 
721
719
  ```typescript
722
- import { saveMessage } from 'tauri-notice-window'
720
+ import { deleteMessageById } from 'tauri-notice-window'
723
721
 
724
- await saveMessage({
725
- id: '123',
726
- title: 'Notice',
727
- type: 'announcement',
728
- data: { content: 'Message content' }
729
- })
722
+ await deleteMessageById('message-123')
730
723
  ```
731
724
 
732
- #### getMessage()
725
+ **Behavior:**
726
+ - Removes message from queue and database
727
+ - If message is currently displayed, window closes automatically
728
+ - Next message in queue shows immediately
733
729
 
734
- Retrieve a message by ID.
730
+ #### hideMessageById()
731
+
732
+ Hide a message by ID. Marks the message as hidden in the database and removes it from the queue.
735
733
 
736
734
  ```typescript
737
- import { getMessage } from 'tauri-notice-window'
735
+ import { hideMessageById } from 'tauri-notice-window'
738
736
 
739
- const message = await getMessage('123')
737
+ // Typically used for server-triggered hide events
738
+ await hideMessageById('message-123')
740
739
  ```
741
740
 
742
- #### deleteMessageById()
741
+ **Behavior:**
742
+ - Marks message as hidden in database
743
+ - Removes from queue
744
+ - Closes window if currently displayed
745
+
746
+ #### markMessageAsShown()
743
747
 
744
- Delete a message by ID. This will remove the message from both the database and the queue, preventing it from being displayed.
748
+ Mark a message as shown to prevent it from being displayed again.
745
749
 
746
750
  ```typescript
747
- import { deleteMessageById } from 'tauri-notice-window'
751
+ import { markMessageAsShown } from 'tauri-notice-window'
748
752
 
749
- await deleteMessageById('123')
753
+ // Manually mark without displaying
754
+ await markMessageAsShown('message-123')
750
755
  ```
751
756
 
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.
757
+ **Use Case:** When you need to acknowledge a message without showing its window (e.g., user already saw it elsewhere).
758
+
759
+ ### Store Methods (Recommended)
753
760
 
754
- #### hasMessage()
761
+ All operations should go through the Zustand store for consistency:
755
762
 
756
- Check if a message exists in the database.
763
+ #### store.deleteMessage()
764
+
765
+ Delete a message completely (from both memory and database).
757
766
 
758
767
  ```typescript
759
- import { hasMessage } from 'tauri-notice-window'
768
+ import { useMessageQueueStore } from 'tauri-notice-window'
760
769
 
761
- const exists = await hasMessage('123')
770
+ const store = useMessageQueueStore.getState()
771
+ await store.deleteMessage('123') // Removes from store AND database
762
772
  ```
763
773
 
764
- #### isMessageShown()
774
+ #### store.hideMessage()
765
775
 
766
- Check if a message was already shown.
776
+ Hide a message (marks as hidden and removes from queue).
767
777
 
768
778
  ```typescript
769
- import { isMessageShown } from 'tauri-notice-window'
770
-
771
- const shown = await isMessageShown('123')
779
+ const store = useMessageQueueStore.getState()
780
+ await store.hideMessage('123') // Marks hidden in DB, removes from queue
772
781
  ```
773
782
 
774
- #### getPendingMessages()
783
+ #### store.removeFromQueue()
775
784
 
776
- Get all pending messages.
785
+ Remove a message from queue (memory only, persists position changes).
777
786
 
778
787
  ```typescript
779
- import { getPendingMessages } from 'tauri-notice-window'
780
-
781
- const pending = await getPendingMessages()
788
+ const store = useMessageQueueStore.getState()
789
+ await store.removeFromQueue('123') // Updates queue positions in DB
782
790
  ```
783
791
 
784
- #### updateQueueStatus()
792
+ #### store.markMessageAsShown()
785
793
 
786
- Update the queue status of a message.
794
+ Mark a message as shown in database.
787
795
 
788
796
  ```typescript
789
- import { updateQueueStatus } from 'tauri-notice-window'
790
-
791
- await updateQueueStatus('123', 'shown')
797
+ const store = useMessageQueueStore.getState()
798
+ await store.markMessageAsShown('123') // Prevents re-showing
792
799
  ```
793
800
 
794
- #### markAsShown()
801
+ ### Database Utilities (Low-Level)
802
+
803
+ ⚠️ **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.
795
804
 
796
- Mark a message as shown.
805
+ #### initializeDatabase()
806
+
807
+ Initialize the database (called automatically by `initializeNoticeSystem()`).
797
808
 
798
809
  ```typescript
799
- import { markAsShown } from 'tauri-notice-window'
810
+ import { initializeDatabase } from 'tauri-notice-window'
800
811
 
801
- await markAsShown('123')
812
+ const db = initializeDatabase()
802
813
  ```
803
814
 
804
- #### markAsHidden()
815
+ #### getMessage()
805
816
 
806
- Mark a message as hidden.
817
+ Retrieve a message by ID.
807
818
 
808
819
  ```typescript
809
- import { markAsHidden } from 'tauri-notice-window'
820
+ import { getMessage } from 'tauri-notice-window'
810
821
 
811
- await markAsHidden('123')
822
+ const message = await getMessage('123')
812
823
  ```
813
824
 
814
- #### clearPendingMessages()
815
825
 
816
- Clear all pending and showing messages.
826
+
827
+ #### getPendingMessages()
828
+
829
+ Get all pending messages.
817
830
 
818
831
  ```typescript
819
- import { clearPendingMessages } from 'tauri-notice-window'
832
+ import { getPendingMessages } from 'tauri-notice-window'
820
833
 
821
- await clearPendingMessages()
834
+ const pending = await getPendingMessages()
822
835
  ```
823
836
 
837
+
824
838
  ## Routing Setup
825
839
 
826
840
  The library expects routes to match the pattern: `{routePrefix}/{message.type}`
@@ -850,43 +864,83 @@ app/
850
864
 
851
865
  ## Advanced Usage
852
866
 
853
- ### Message Queue Validation
867
+ ### Message Deletion and Queue Management
854
868
 
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.
869
+ All message operations go through clean public APIs that internally use the Zustand store.
856
870
 
857
871
  ```typescript
858
- import { showNotice, deleteMessageById } from 'tauri-notice-window'
872
+ import {
873
+ useNoticeWindow,
874
+ deleteMessageById,
875
+ hideMessageById,
876
+ markMessageAsShown
877
+ } from 'tauri-notice-window'
878
+
879
+ function NoticeManager() {
880
+ const { showNotice } = useNoticeWindow()
859
881
 
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: {} })
882
+ // Example 1: Delete a message from the queue
883
+ const handleDeleteMessage = async () => {
884
+ await showNotice({ id: '1', title: 'First', type: 'announcement', data: {} })
885
+ await showNotice({ id: '2', title: 'Second', type: 'announcement', data: {} })
886
+ await showNotice({ id: '3', title: 'Third', type: 'announcement', data: {} })
864
887
 
865
- // If message '2' is deleted while in queue
866
- await deleteMessageById('2')
888
+ // Delete message '2' from queue
889
+ await deleteMessageById('2')
890
+ // Result: Message removed from queue and database
891
+ // Console output: "Message 2 was deleted, skipping to next"
892
+ }
867
893
 
868
- // The queue will automatically skip message '2' and show message '3' next
869
- // Console output: "Message 2 was deleted, skipping to next"
894
+ // Example 2: Delete the currently displayed message
895
+ const handleDeleteCurrent = async () => {
896
+ await showNotice({ id: '4', title: 'Current', type: 'announcement', data: {} })
897
+ // Window for message '4' is now open
870
898
 
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
899
+ // Delete current message
900
+ await deleteMessageById('4')
901
+ // Result: Window closes, next message shows automatically
902
+ }
903
+
904
+ // Example 3: Hide a message (server-triggered)
905
+ const handleHideMessage = async (messageId: string) => {
906
+ await hideMessageById(messageId)
907
+ // Marks as hidden in DB + removes from queue + closes window
908
+ }
874
909
 
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
910
+ // Example 4: Mark as shown without displaying
911
+ const handleMarkAsShown = async (messageId: string) => {
912
+ await markMessageAsShown(messageId)
913
+ // Prevents message from being shown in the future
914
+ }
915
+ }
879
916
  ```
880
917
 
881
918
  **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
888
-
889
- This ensures that windows are never opened for deleted messages, and any open window for a deleted message is immediately closed.
919
+ 1. All operations update both the store (Zustand) and database (IndexedDB)
920
+ 2. `deleteMessageById()` removes from both queue and database
921
+ 3. If deleted message is currently shown, window closes automatically
922
+ 4. Queue position changes are persisted to database
923
+ 5. Before showing any message, system verifies it exists in database
924
+ 6. **Safety Layer:** `NoticeLayout` component auto-closes if message is missing
925
+
926
+ **API Methods:**
927
+ ```typescript
928
+ // Delete message completely
929
+ await deleteMessageById('123')
930
+ // → Removes from queue AND database
931
+ // → If currently showing, window closes
932
+
933
+ // Hide message (server-triggered)
934
+ await hideMessageById('123')
935
+ // → Marks as hidden in database
936
+ // → Removes from queue
937
+ // → Closes window if open
938
+
939
+ // Mark as shown
940
+ await markMessageAsShown('123')
941
+ // → Updates database
942
+ // → Prevents future display
943
+ ```
890
944
 
891
945
  ### Server-Triggered Hide
892
946
 
@@ -1008,6 +1062,45 @@ function QueueIndicator() {
1008
1062
 
1009
1063
  ## How It Works
1010
1064
 
1065
+ ### Architecture: Zustand-First Design
1066
+
1067
+ This library follows a **clean, one-way data flow** architecture:
1068
+
1069
+ ```
1070
+ ┌─────────────────────────────────────────────────────┐
1071
+ │ Runtime (While App is Running) │
1072
+ │ │
1073
+ │ ┌──────────────────────────────────────┐ │
1074
+ │ │ Zustand Store (Source of Truth) │ │
1075
+ │ │ - Queue state │ │
1076
+ │ │ - Current message │ │
1077
+ │ │ - Processing status │ │
1078
+ │ └──────────────┬───────────────────────┘ │
1079
+ │ │ │
1080
+ │ │ Persists to ↓ │
1081
+ │ │ │
1082
+ │ ┌──────────────▼───────────────────────┐ │
1083
+ │ │ IndexedDB (Dexie) │ │
1084
+ │ │ - Dumb storage layer │ │
1085
+ │ │ - No business logic │ │
1086
+ │ │ - Only for cold starts │ │
1087
+ │ └──────────────────────────────────────┘ │
1088
+ └─────────────────────────────────────────────────────┘
1089
+
1090
+ ┌─────────────────────────────────────────────────────┐
1091
+ │ Cold Start (App Restart) │
1092
+ │ │
1093
+ │ IndexedDB ────loads───► Zustand Store │
1094
+ │ (Back to runtime mode) │
1095
+ └─────────────────────────────────────────────────────┘
1096
+ ```
1097
+
1098
+ **Key Principles:**
1099
+ 1. **Zustand is the boss** - All operations go through the store
1100
+ 2. **Database is dumb** - Pure storage functions, no knowledge of store
1101
+ 3. **One-way flow** - Store writes to DB, DB never touches store
1102
+ 4. **No circular dependencies** - Clean module boundaries
1103
+
1011
1104
  ### Cross-Window Synchronization
1012
1105
 
1013
1106
  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 +1115,9 @@ Zustand Store ◄─────────► localStorage ◄─────
1022
1115
  | | |
1023
1116
  ▼ ▼ ▼
1024
1117
  State Updated State Updated State Updated
1118
+ │ │
1119
+ └─────── Persists to IndexedDB ────────────────────┘
1120
+ (for cold starts only)
1025
1121
  ```
1026
1122
 
1027
1123
  ### Message Lifecycle
@@ -1031,12 +1127,24 @@ State Updated State Updated State Updated
1031
1127
  3. **shown**: User has acknowledged the message
1032
1128
  4. **hidden**: Server requested to hide the message
1033
1129
 
1034
- ### Persistence
1130
+ ### Persistence Strategy
1131
+
1132
+ **At Runtime:**
1133
+ - All state lives in Zustand store (in-memory)
1134
+ - Store automatically persists changes to IndexedDB
1135
+ - Database is just a backup, not actively queried
1035
1136
 
1036
- Messages are persisted to IndexedDB via Dexie. On app restart:
1137
+ **On App Restart:**
1037
1138
  1. Database is initialized
1038
- 2. Pending messages are loaded
1139
+ 2. Pending messages are loaded into Zustand store
1039
1140
  3. First message is shown automatically
1141
+ 4. Back to runtime mode (Zustand is now the truth)
1142
+
1143
+ **Why This Design?**
1144
+ - **Performance**: No database queries during normal operation
1145
+ - **Simplicity**: Single source of truth eliminates sync bugs
1146
+ - **Clean Code**: No circular dependencies, predictable data flow
1147
+ - **Reliability**: Database only used for cold storage
1040
1148
 
1041
1149
  ## Requirements
1042
1150
 
@@ -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 we=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 D=null;const B=()=>{if(!D){const t=F();D=new pe(t.databaseName)}return D},h=()=>D||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})},Se=async t=>{await h().messages.update(t,{queueStatus:"shown",isShown:!0})},We=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)},Ae=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)},ze=(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(c=>c.id===i.id)){const c=[...n.queue,i];t({queue:c}),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 De(n)},clearOnLogout:async()=>{t({queue:[],currentMessage:null,isProcessing:!1,activeWindowIds:[],initialized:!1}),await Ae()},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 We(i),await e().removeFromQueue(i)},markMessageAsShown:async i=>{await Se(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)}}),u=we.create()(he.syncTabs(ze,{name:"tauri-notice-queue"})),A={queueLength:t=>t.queue.length,currentMessage:t=>t.currentMessage,isProcessing:t=>t.isProcessing,queue:t=>t.queue},Me=()=>{const t=u(i=>i.enqueue);return{showNotice:g.useCallback(async i=>{await t(i)},[t])}};function xe(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 Oe(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 x;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 Pe{get rid(){return xe(this,x,"f")}constructor(e){x.set(this,void 0),Oe(this,x,e)}async close(){return s("plugin:resources|close",{rid:this.rid})}}x=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)}[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 ie(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 ie?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 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 d(this.x*e,this.y*e)}[w](){return{x:this.x,y:this.y}}toJSON(){return this[w]()}}class d{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)}[w](){return{x:this.x,y:this.y}}toJSON(){return this[w]()}}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 d?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 se(t,e){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(t,e),await s("plugin:event|unlisten",{event:t,eventId:e})}async function P(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(r=>async()=>se(t,r))}async function Q(t,e,i){return P(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 z extends Pe{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 z(a))}static async fromBytes(e){return s("plugin:image|from_bytes",{bytes:k(e)}).then(i=>new z(i))}static async fromPath(e){return s("plugin:image|from_path",{path:e}).then(i=>new z(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 z?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 j;(function(t){t.None="none",t.Normal="normal",t.Indeterminate="indeterminate",t.Paused="paused",t.Error="error"})(j||(j={}));function re(){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 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)}:P(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 d(e))}async outerPosition(){return s("plugin:window|outer_position",{label:this.label}).then(e=>new d(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: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 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?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 d(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,l=>{e({...l,payload:{type:"enter",paths:l.payload.paths,position:new d(l.payload.position)}})}),n=await this.listen(o.DRAG_OVER,l=>{e({...l,payload:{type:"over",position:new d(l.payload.position)}})}),a=await this.listen(o.DRAG_DROP,l=>{e({...l,payload:{type:"drop",paths:l.payload.paths,position:new d(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 Ce(t){return t===null?null:{name:t.name,scaleFactor:t.scaleFactor,position:new d(t.position),size:new b(t.size),workArea:{position:new d(t.workArea.position),size:new b(t.workArea.size)}}}async function Le(){return s("plugin:window|primary_monitor").then(Ce)}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 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 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)}:P(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 d(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 d(l.payload.position)}})}),n=await this.listen(o.DRAG_OVER,l=>{e({...l,payload:{type:"over",position:new d(l.payload.position)}})}),a=await this.listen(o.DRAG_DROP,l=>{e({...l,payload:{type:"drop",paths:l.payload.paths,position:new d(l.payload.position)}})}),r=await this.listen(o.DRAG_LEAVE,l=>{e({...l,payload:{type:"leave"}})});return()=>{i(),a(),n(),r()}}}function O(){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 O()}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)}:P(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,[I,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 M=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 c=await Le();c?.size&&(a=c.size.width,r=c.size.height)}catch(c){console.warn("Failed to get monitor info, using defaults:",c)}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=u.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,c=t.min_height||n.defaultHeight,{x:v,y:S}=await Te(l,c,t.windowPosition);try{const p=new m(a,{url:r,title:t.title,width:l,height:c,x:v,y:S,resizable:!0,decorations:!0,skipTaskbar:!1,alwaysOnTop:!0});M.set(e,p),i.addActiveWindow(e),p.once("tauri://destroyed",async()=>{M.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()}},C=async t=>{const e=String(t),i=M.get(e),n=u.getState();if(i)try{await i.close(),M.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(M.keys()).map(e=>C(e));await Promise.all(t)},de=()=>{let t=null;u.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=u(i=>i.currentMessage);return{closeNotice:g.useCallback(async()=>{t&&await C(t.id)},[t])}},Fe=()=>{const t=u(i=>i.hideMessage);return{hideNotice:g.useCallback(async i=>{await t(i),await C(i)},[t])}},Be=()=>{const t=u(i=>i.clearOnLogout);return{hideAllNotices:g.useCallback(async()=>{await ce(),await t()},[t])}},Ue=()=>{const t=u(A.queueLength),e=u(A.currentMessage),i=u(A.isProcessing),n=u(A.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),[c,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 O().close()}catch(W){console.error("Failed to close window:",W)}},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 O().close()}catch(W){console.error("Failed to close window:",W)}},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 O().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]),r?N.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",fontFamily:"system-ui, -apple-system, sans-serif"},children:"Loading..."}):c?N.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",fontFamily:"system-ui, -apple-system, sans-serif",color:"#ef4444"},children:c}):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(),de();const{initializeFromDatabase:t}=u.getState();await t(),console.log("Tauri Notice System initialized")},He=async t=>{await u.getState().deleteMessage(t)},je=async t=>{await u.getState().hideMessage(t)},Ve=async t=>{await u.getState().markMessageAsShown(t)};exports.NoticeLayout=Qe;exports.closeAllNoticeWindows=ce;exports.closeNoticeWindow=C;exports.createNoticeWindow=ue;exports.deleteMessageById=He;exports.getMessage=U;exports.getNoticeConfig=F;exports.getPendingMessages=te;exports.hideMessageById=je;exports.initializeDatabase=B;exports.initializeNoticeSystem=Ge;exports.initializeNoticeWindowSystem=de;exports.markMessageAsShown=Ve;exports.messageQueueSelectors=A;exports.setNoticeConfig=be;exports.useCloseNotice=qe;exports.useHideAllNotices=Be;exports.useHideNotice=Fe;exports.useMessageQueue=Ue;exports.useMessageQueueStore=u;exports.useNoticeWindow=Me;
2
2
  //# sourceMappingURL=index.cjs.map