@fivem-nui/svelte 0.0.0-stage → 1.0.0
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 +284 -2
- package/dist/actions/clickOutside/clickOutside.d.ts +24 -0
- package/dist/actions/clickOutside/clickOutside.d.ts.map +1 -0
- package/dist/actions/clickOutside/clickOutside.js +62 -0
- package/dist/actions/clickOutside/clickOutside.js.map +1 -0
- package/dist/actions/clickOutside/handler.d.ts +11 -0
- package/dist/actions/clickOutside/handler.d.ts.map +1 -0
- package/dist/actions/clickOutside/handler.js +45 -0
- package/dist/actions/clickOutside/handler.js.map +1 -0
- package/dist/actions/clickOutside/index.d.ts +4 -0
- package/dist/actions/clickOutside/index.d.ts.map +1 -0
- package/dist/actions/clickOutside/index.js +4 -0
- package/dist/actions/clickOutside/index.js.map +1 -0
- package/dist/actions/clickOutside/types.d.ts +36 -0
- package/dist/actions/clickOutside/types.d.ts.map +1 -0
- package/dist/actions/clickOutside/types.js +6 -0
- package/dist/actions/clickOutside/types.js.map +1 -0
- package/dist/actions/clickOutside.d.ts +63 -0
- package/dist/actions/clickOutside.d.ts.map +1 -0
- package/dist/actions/clickOutside.js +106 -0
- package/dist/actions/clickOutside.js.map +1 -0
- package/dist/actions/escape/escape.d.ts +26 -0
- package/dist/actions/escape/escape.d.ts.map +1 -0
- package/dist/actions/escape/escape.js +74 -0
- package/dist/actions/escape/escape.js.map +1 -0
- package/dist/actions/escape/handler.d.ts +11 -0
- package/dist/actions/escape/handler.d.ts.map +1 -0
- package/dist/actions/escape/handler.js +50 -0
- package/dist/actions/escape/handler.js.map +1 -0
- package/dist/actions/escape/index.d.ts +4 -0
- package/dist/actions/escape/index.d.ts.map +1 -0
- package/dist/actions/escape/index.js +4 -0
- package/dist/actions/escape/index.js.map +1 -0
- package/dist/actions/escape/types.d.ts +70 -0
- package/dist/actions/escape/types.d.ts.map +1 -0
- package/dist/actions/escape/types.js +12 -0
- package/dist/actions/escape/types.js.map +1 -0
- package/dist/actions/escape.d.ts +99 -0
- package/dist/actions/escape.d.ts.map +1 -0
- package/dist/actions/escape.js +128 -0
- package/dist/actions/escape.js.map +1 -0
- package/dist/actions/focusTrap/focusTrap.d.ts +19 -0
- package/dist/actions/focusTrap/focusTrap.d.ts.map +1 -0
- package/dist/actions/focusTrap/focusTrap.js +198 -0
- package/dist/actions/focusTrap/focusTrap.js.map +1 -0
- package/dist/actions/focusTrap/focusables.d.ts +39 -0
- package/dist/actions/focusTrap/focusables.d.ts.map +1 -0
- package/dist/actions/focusTrap/focusables.js +142 -0
- package/dist/actions/focusTrap/focusables.js.map +1 -0
- package/dist/actions/focusTrap/index.d.ts +5 -0
- package/dist/actions/focusTrap/index.d.ts.map +1 -0
- package/dist/actions/focusTrap/index.js +5 -0
- package/dist/actions/focusTrap/index.js.map +1 -0
- package/dist/actions/focusTrap/trapStack.d.ts +33 -0
- package/dist/actions/focusTrap/trapStack.d.ts.map +1 -0
- package/dist/actions/focusTrap/trapStack.js +84 -0
- package/dist/actions/focusTrap/trapStack.js.map +1 -0
- package/dist/actions/focusTrap/types.d.ts +50 -0
- package/dist/actions/focusTrap/types.d.ts.map +1 -0
- package/dist/actions/focusTrap/types.js +10 -0
- package/dist/actions/focusTrap/types.js.map +1 -0
- package/dist/actions/focusTrap.d.ts +24 -0
- package/dist/actions/focusTrap.d.ts.map +1 -0
- package/dist/actions/focusTrap.js +201 -0
- package/dist/actions/focusTrap.js.map +1 -0
- package/dist/actions/focusTrap.types.d.ts +50 -0
- package/dist/actions/focusTrap.types.d.ts.map +1 -0
- package/dist/actions/focusTrap.types.js +10 -0
- package/dist/actions/focusTrap.types.js.map +1 -0
- package/dist/actions/focusables.d.ts +39 -0
- package/dist/actions/focusables.d.ts.map +1 -0
- package/dist/actions/focusables.js +142 -0
- package/dist/actions/focusables.js.map +1 -0
- package/dist/actions/index.d.ts +5 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +5 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/layer/index.d.ts +4 -0
- package/dist/actions/layer/index.d.ts.map +1 -0
- package/dist/actions/layer/index.js +4 -0
- package/dist/actions/layer/index.js.map +1 -0
- package/dist/actions/layer/layer.d.ts +28 -0
- package/dist/actions/layer/layer.d.ts.map +1 -0
- package/dist/actions/layer/layer.js +118 -0
- package/dist/actions/layer/layer.js.map +1 -0
- package/dist/actions/layer/layerStack.d.ts +10 -0
- package/dist/actions/layer/layerStack.d.ts.map +1 -0
- package/dist/actions/layer/layerStack.js +153 -0
- package/dist/actions/layer/layerStack.js.map +1 -0
- package/dist/actions/layer/types.d.ts +105 -0
- package/dist/actions/layer/types.d.ts.map +1 -0
- package/dist/actions/layer/types.js +14 -0
- package/dist/actions/layer/types.js.map +1 -0
- package/dist/actions/layer.d.ts +133 -0
- package/dist/actions/layer.d.ts.map +1 -0
- package/dist/actions/layer.js +269 -0
- package/dist/actions/layer.js.map +1 -0
- package/dist/actions/trapStack.d.ts +33 -0
- package/dist/actions/trapStack.d.ts.map +1 -0
- package/dist/actions/trapStack.js +84 -0
- package/dist/actions/trapStack.js.map +1 -0
- package/dist/client.d.ts +179 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +176 -0
- package/dist/client.js.map +1 -0
- package/dist/context/index.d.ts +68 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +112 -0
- package/dist/context/index.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/mock/index.d.ts +27 -0
- package/dist/mock/index.d.ts.map +1 -0
- package/dist/mock/index.js +137 -0
- package/dist/mock/index.js.map +1 -0
- package/dist/mock/interceptor.d.ts +19 -0
- package/dist/mock/interceptor.d.ts.map +1 -0
- package/dist/mock/interceptor.js +128 -0
- package/dist/mock/interceptor.js.map +1 -0
- package/dist/mock/types.d.ts +100 -0
- package/dist/mock/types.d.ts.map +1 -0
- package/dist/mock/types.js +27 -0
- package/dist/mock/types.js.map +1 -0
- package/dist/mock/url.d.ts +14 -0
- package/dist/mock/url.d.ts.map +1 -0
- package/dist/mock/url.js +38 -0
- package/dist/mock/url.js.map +1 -0
- package/dist/runes/clickOutside.svelte.d.ts +29 -0
- package/dist/runes/clickOutside.svelte.d.ts.map +1 -0
- package/dist/runes/clickOutside.svelte.js +42 -0
- package/dist/runes/clickOutside.svelte.js.map +1 -0
- package/dist/runes/escape.svelte.d.ts +34 -0
- package/dist/runes/escape.svelte.d.ts.map +1 -0
- package/dist/runes/escape.svelte.js +44 -0
- package/dist/runes/escape.svelte.js.map +1 -0
- package/dist/runes/focusTrap.svelte.d.ts +21 -0
- package/dist/runes/focusTrap.svelte.d.ts.map +1 -0
- package/dist/runes/focusTrap.svelte.js +37 -0
- package/dist/runes/focusTrap.svelte.js.map +1 -0
- package/dist/runes/index.svelte.d.ts +8 -0
- package/dist/runes/index.svelte.d.ts.map +1 -0
- package/dist/runes/index.svelte.js +8 -0
- package/dist/runes/index.svelte.js.map +1 -0
- package/dist/runes/layer.svelte.d.ts +36 -0
- package/dist/runes/layer.svelte.d.ts.map +1 -0
- package/dist/runes/layer.svelte.js +48 -0
- package/dist/runes/layer.svelte.js.map +1 -0
- package/dist/runes/query.svelte.d.ts +104 -0
- package/dist/runes/query.svelte.d.ts.map +1 -0
- package/dist/runes/query.svelte.js +179 -0
- package/dist/runes/query.svelte.js.map +1 -0
- package/dist/runes/state.svelte.d.ts +72 -0
- package/dist/runes/state.svelte.d.ts.map +1 -0
- package/dist/runes/state.svelte.js +98 -0
- package/dist/runes/state.svelte.js.map +1 -0
- package/dist/runes/window.svelte.d.ts +120 -0
- package/dist/runes/window.svelte.d.ts.map +1 -0
- package/dist/runes/window.svelte.js +196 -0
- package/dist/runes/window.svelte.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/nui.d.ts +34 -0
- package/dist/types/nui.d.ts.map +1 -0
- package/dist/types/nui.js +17 -0
- package/dist/types/nui.js.map +1 -0
- package/dist/utils/env.d.ts +21 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +36 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/error.d.ts +11 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +30 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/keyboard.d.ts +127 -0
- package/dist/utils/keyboard.d.ts.map +1 -0
- package/dist/utils/keyboard.js +152 -0
- package/dist/utils/keyboard.js.map +1 -0
- package/package.json +76 -4
- package/src/actions/clickOutside/clickOutside.ts +78 -0
- package/src/actions/clickOutside/handler.ts +49 -0
- package/src/actions/clickOutside/index.ts +11 -0
- package/src/actions/clickOutside/types.ts +54 -0
- package/src/actions/escape/escape.ts +90 -0
- package/src/actions/escape/handler.ts +52 -0
- package/src/actions/escape/index.ts +11 -0
- package/src/actions/escape/types.ts +88 -0
- package/src/actions/focusTrap/focusTrap.ts +228 -0
- package/src/actions/focusTrap/focusables.ts +155 -0
- package/src/actions/focusTrap/index.ts +22 -0
- package/src/actions/focusTrap/trapStack.ts +109 -0
- package/src/actions/focusTrap/types.ts +64 -0
- package/src/actions/index.ts +35 -0
- package/src/actions/layer/index.ts +13 -0
- package/src/actions/layer/layer.ts +140 -0
- package/src/actions/layer/layerStack.ts +169 -0
- package/src/actions/layer/types.ts +132 -0
- package/src/client.ts +323 -0
- package/src/context/index.ts +127 -0
- package/src/index.ts +53 -0
- package/src/mock/index.ts +176 -0
- package/src/mock/interceptor.ts +177 -0
- package/src/mock/types.ts +125 -0
- package/src/mock/url.ts +37 -0
- package/src/runes/clickOutside.svelte.ts +53 -0
- package/src/runes/escape.svelte.ts +71 -0
- package/src/runes/focusTrap.svelte.ts +56 -0
- package/src/runes/index.svelte.ts +38 -0
- package/src/runes/layer.svelte.ts +74 -0
- package/src/runes/query.svelte.ts +313 -0
- package/src/runes/state.svelte.ts +175 -0
- package/src/runes/window.svelte.ts +308 -0
- package/src/utils/env.ts +36 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/keyboard.ts +244 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { untrack } from 'svelte';
|
|
2
|
+
import { nuiLayer, NuiLayerDismissReason } from '../actions/layer';
|
|
3
|
+
export { NuiLayerDismissReason };
|
|
4
|
+
/**
|
|
5
|
+
* Manages an overlay layer (modal, dialog, drawer) in FiveM NUI.
|
|
6
|
+
* Coordinates Escape key, outside click, and focus trapping through a central layer stack.
|
|
7
|
+
*
|
|
8
|
+
* @param target - Getter returning the container element.
|
|
9
|
+
* @param getOptions - Optional getter returning layer options.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```svelte
|
|
13
|
+
* <script>
|
|
14
|
+
* let modalEl = $state<HTMLElement>();
|
|
15
|
+
* let isOpen = $state(false);
|
|
16
|
+
*
|
|
17
|
+
* useLayer(
|
|
18
|
+
* () => modalEl,
|
|
19
|
+
* () => ({ onDismiss: () => { isOpen = false; }, enabled: isOpen })
|
|
20
|
+
* );
|
|
21
|
+
* </script>
|
|
22
|
+
*
|
|
23
|
+
* {#if isOpen}
|
|
24
|
+
* <div bind:this={modalEl} class="modal">
|
|
25
|
+
* <h2>Modal</h2>
|
|
26
|
+
* <button onclick={() => { isOpen = false; }}>Close</button>
|
|
27
|
+
* </div>
|
|
28
|
+
* {/if}
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function useLayer(target, getOptions) {
|
|
32
|
+
let action;
|
|
33
|
+
$effect(() => {
|
|
34
|
+
const node = target();
|
|
35
|
+
if (!node)
|
|
36
|
+
return;
|
|
37
|
+
action = nuiLayer(node, untrack(() => getOptions?.()));
|
|
38
|
+
return () => {
|
|
39
|
+
action?.destroy?.();
|
|
40
|
+
action = undefined;
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
$effect(() => {
|
|
44
|
+
const opts = getOptions?.();
|
|
45
|
+
action?.update?.(opts);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=layer.svelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer.svelte.js","sourceRoot":"","sources":["../../src/runes/layer.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EACL,QAAQ,EACR,qBAAqB,EAItB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,qBAAqB,EACtB,CAAC;AAaF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,QAAQ,CACtB,MAA4C,EAC5C,UAAkC;IAElC,IAAI,MAA+C,CAAC;IAEpD,OAAO,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvD,OAAO,GAAG,EAAE;YACV,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;YACpB,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,GAAG,UAAU,EAAE,EAAE,CAAC;QAC5B,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { NuiEventKey, NuiEventRequest, NuiEventResponse } from '@fivem-nui/core';
|
|
2
|
+
import { type RetryOptions } from '@fivem-nui/error';
|
|
3
|
+
import type { SvelteNuiClient } from '../client';
|
|
4
|
+
export { type RetryOptions };
|
|
5
|
+
export declare enum NuiQueryStatus {
|
|
6
|
+
Idle = "idle",
|
|
7
|
+
Loading = "loading",
|
|
8
|
+
Success = "success",
|
|
9
|
+
Error = "error"
|
|
10
|
+
}
|
|
11
|
+
export interface NuiQueryOptions<TRequest = unknown, TResponse = unknown> {
|
|
12
|
+
/** Optional client override (defaults to context or global client). */
|
|
13
|
+
client?: SvelteNuiClient;
|
|
14
|
+
/** Request timeout in ms (0 for no timeout). */
|
|
15
|
+
timeout?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Automatic retry configuration using exponential backoff.
|
|
18
|
+
* - `true`: enables default retry (3 attempts for timeout and network errors).
|
|
19
|
+
* - `RetryOptions`: custom retry configuration (maxRetries, delays, filter).
|
|
20
|
+
*/
|
|
21
|
+
retry?: boolean | RetryOptions;
|
|
22
|
+
/** Execute automatically on mount. */
|
|
23
|
+
immediate?: boolean;
|
|
24
|
+
/** Initial payload used for immediate fetch or fallback refetch. */
|
|
25
|
+
initialRequest?: TRequest;
|
|
26
|
+
/** Called on successful response. */
|
|
27
|
+
onSuccess?: (data: TResponse) => void;
|
|
28
|
+
/** Called on request failure (except when aborted). */
|
|
29
|
+
onError?: (error: Error) => void;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Controller for an asynchronous NUI query.
|
|
33
|
+
*/
|
|
34
|
+
export interface NuiQuery<TRequest, TResponse> {
|
|
35
|
+
readonly status: NuiQueryStatus;
|
|
36
|
+
readonly data: TResponse | null;
|
|
37
|
+
readonly loading: boolean;
|
|
38
|
+
readonly error: Error | null;
|
|
39
|
+
readonly called: boolean;
|
|
40
|
+
readonly lastUpdated: number | null;
|
|
41
|
+
/** Sends the request to C#. Cancels any pending request for this query. */
|
|
42
|
+
execute(request?: TRequest, overrideTimeout?: number): Promise<TResponse>;
|
|
43
|
+
/** Retries the last request using the same payload. */
|
|
44
|
+
refetch(overrideTimeout?: number): Promise<TResponse>;
|
|
45
|
+
/** Cancels the active request and stops loading. */
|
|
46
|
+
abort(): void;
|
|
47
|
+
/** Aborts any pending request and resets data, error, and status to idle. */
|
|
48
|
+
reset(): void;
|
|
49
|
+
/** Cleans up the query and aborts pending requests. */
|
|
50
|
+
destroy(): void;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Reusable controller managing reactive state and network requests for a NUI query.
|
|
54
|
+
*/
|
|
55
|
+
export declare class NuiQueryController<TRequest = unknown, TResponse = unknown> implements NuiQuery<TRequest, TResponse> {
|
|
56
|
+
private readonly eventName;
|
|
57
|
+
private readonly options;
|
|
58
|
+
private readonly client;
|
|
59
|
+
data: TResponse | null;
|
|
60
|
+
loading: boolean;
|
|
61
|
+
error: Error | null;
|
|
62
|
+
called: boolean;
|
|
63
|
+
lastUpdated: number | null;
|
|
64
|
+
private isSuccess;
|
|
65
|
+
private lastRequest?;
|
|
66
|
+
private hasLastRequest;
|
|
67
|
+
private activeRequestId;
|
|
68
|
+
private abortController;
|
|
69
|
+
private isDisposed;
|
|
70
|
+
constructor(eventName: string, options: NuiQueryOptions<TRequest, TResponse> | undefined, client: SvelteNuiClient);
|
|
71
|
+
get status(): NuiQueryStatus;
|
|
72
|
+
private sendRequest;
|
|
73
|
+
execute: (...args: [request?: TRequest, overrideTimeout?: number]) => Promise<TResponse>;
|
|
74
|
+
refetch: (overrideTimeout?: number) => Promise<TResponse>;
|
|
75
|
+
abort: () => void;
|
|
76
|
+
reset: () => void;
|
|
77
|
+
destroy: () => void;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Reactive query for communicating with C# (`nui.request`).
|
|
81
|
+
* Manages reactive `data`, `loading`, `error`, and `status`.
|
|
82
|
+
*
|
|
83
|
+
* Note: Access properties directly (e.g. `query.data`). Do not destructure, or you'll lose reactivity.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```svelte
|
|
87
|
+
* <script>
|
|
88
|
+
* import { useNuiQuery } from '@fivem-nui/svelte';
|
|
89
|
+
*
|
|
90
|
+
* const buy = useNuiQuery('shop:buy');
|
|
91
|
+
* </script>
|
|
92
|
+
*
|
|
93
|
+
* <button onclick={() => buy.execute({ id: 'bread', qty: 1 })} disabled={buy.loading}>
|
|
94
|
+
* {buy.loading ? 'Buying...' : 'Buy'}
|
|
95
|
+
* </button>
|
|
96
|
+
*
|
|
97
|
+
* {#if buy.error}
|
|
98
|
+
* <p class="error">{buy.error.message}</p>
|
|
99
|
+
* {/if}
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export declare function useNuiQuery<K extends NuiEventKey>(eventName: K, options?: NuiQueryOptions<NuiEventRequest<K>, NuiEventResponse<K>>): NuiQuery<NuiEventRequest<K>, NuiEventResponse<K>>;
|
|
103
|
+
export declare function useNuiQuery<TRequest = unknown, TResponse = unknown>(eventName: string, options?: NuiQueryOptions<TRequest, TResponse>): NuiQuery<TRequest, TResponse>;
|
|
104
|
+
//# sourceMappingURL=query.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.svelte.d.ts","sourceRoot":"","sources":["../../src/runes/query.svelte.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { untrack } from 'svelte';
|
|
2
|
+
import { globalErrorHandler, NuiErrorCategory, isAbortError, createAbortError } from '@fivem-nui/error';
|
|
3
|
+
import { useNuiClient } from '../context';
|
|
4
|
+
export {};
|
|
5
|
+
export var NuiQueryStatus;
|
|
6
|
+
(function (NuiQueryStatus) {
|
|
7
|
+
NuiQueryStatus["Idle"] = "idle";
|
|
8
|
+
NuiQueryStatus["Loading"] = "loading";
|
|
9
|
+
NuiQueryStatus["Success"] = "success";
|
|
10
|
+
NuiQueryStatus["Error"] = "error";
|
|
11
|
+
})(NuiQueryStatus || (NuiQueryStatus = {}));
|
|
12
|
+
/**
|
|
13
|
+
* Reusable controller managing reactive state and network requests for a NUI query.
|
|
14
|
+
*/
|
|
15
|
+
export class NuiQueryController {
|
|
16
|
+
eventName;
|
|
17
|
+
options;
|
|
18
|
+
client;
|
|
19
|
+
data = $state(null);
|
|
20
|
+
loading = $state(false);
|
|
21
|
+
error = $state(null);
|
|
22
|
+
called = $state(false);
|
|
23
|
+
lastUpdated = $state(null);
|
|
24
|
+
isSuccess = $state(false);
|
|
25
|
+
lastRequest;
|
|
26
|
+
hasLastRequest = false;
|
|
27
|
+
activeRequestId = 0;
|
|
28
|
+
abortController = null;
|
|
29
|
+
isDisposed = false;
|
|
30
|
+
constructor(eventName, options = {}, client) {
|
|
31
|
+
this.eventName = eventName;
|
|
32
|
+
this.options = options;
|
|
33
|
+
this.client = client;
|
|
34
|
+
this.lastRequest = options.initialRequest;
|
|
35
|
+
this.hasLastRequest = 'initialRequest' in options;
|
|
36
|
+
}
|
|
37
|
+
get status() {
|
|
38
|
+
if (this.loading)
|
|
39
|
+
return NuiQueryStatus.Loading;
|
|
40
|
+
if (this.error !== null)
|
|
41
|
+
return NuiQueryStatus.Error;
|
|
42
|
+
if (this.isSuccess)
|
|
43
|
+
return NuiQueryStatus.Success;
|
|
44
|
+
return NuiQueryStatus.Idle;
|
|
45
|
+
}
|
|
46
|
+
async sendRequest(payload, overrideTimeout) {
|
|
47
|
+
if (this.isDisposed) {
|
|
48
|
+
throw new Error('[useNuiQuery] Cannot execute request on a destroyed query controller.');
|
|
49
|
+
}
|
|
50
|
+
if (this.abortController) {
|
|
51
|
+
this.abortController.abort();
|
|
52
|
+
}
|
|
53
|
+
const currentController = new AbortController();
|
|
54
|
+
this.abortController = currentController;
|
|
55
|
+
const currentRequestId = ++this.activeRequestId;
|
|
56
|
+
this.loading = true;
|
|
57
|
+
this.error = null;
|
|
58
|
+
this.called = true;
|
|
59
|
+
const requestFn = () => this.client.request(this.eventName, payload, overrideTimeout ?? this.options.timeout, currentController.signal);
|
|
60
|
+
try {
|
|
61
|
+
let result;
|
|
62
|
+
if (this.options.retry) {
|
|
63
|
+
const retryConfig = typeof this.options.retry === 'object' ? { ...this.options.retry } : {};
|
|
64
|
+
const userShouldRetry = retryConfig.shouldRetry;
|
|
65
|
+
retryConfig.shouldRetry = (errorInfo) => {
|
|
66
|
+
if (currentRequestId !== this.activeRequestId ||
|
|
67
|
+
currentController.signal.aborted ||
|
|
68
|
+
isAbortError(errorInfo.error)) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
if (userShouldRetry) {
|
|
72
|
+
return userShouldRetry(errorInfo);
|
|
73
|
+
}
|
|
74
|
+
return ((retryConfig.retryOnTimeout !== false && errorInfo.category === NuiErrorCategory.TIMEOUT) ||
|
|
75
|
+
(retryConfig.retryOnNetworkError !== false && errorInfo.category === NuiErrorCategory.NETWORK));
|
|
76
|
+
};
|
|
77
|
+
result = await globalErrorHandler.retry(requestFn, retryConfig);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
result = await requestFn();
|
|
81
|
+
}
|
|
82
|
+
if (currentRequestId !== this.activeRequestId || currentController.signal.aborted) {
|
|
83
|
+
throw createAbortError();
|
|
84
|
+
}
|
|
85
|
+
this.data = result;
|
|
86
|
+
this.isSuccess = true;
|
|
87
|
+
this.lastUpdated = Date.now();
|
|
88
|
+
try {
|
|
89
|
+
this.options.onSuccess?.(result);
|
|
90
|
+
}
|
|
91
|
+
catch (callbackErr) {
|
|
92
|
+
void globalErrorHandler
|
|
93
|
+
.handle(callbackErr instanceof Error ? callbackErr : new Error(String(callbackErr)), { event: this.eventName }, 'useNuiQuery:onSuccess')
|
|
94
|
+
.catch(() => { });
|
|
95
|
+
console.error(callbackErr);
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
if (currentRequestId !== this.activeRequestId || currentController.signal.aborted) {
|
|
101
|
+
throw isAbortError(err) ? err : createAbortError();
|
|
102
|
+
}
|
|
103
|
+
if (isAbortError(err)) {
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
107
|
+
this.error = e;
|
|
108
|
+
this.isSuccess = false;
|
|
109
|
+
void globalErrorHandler
|
|
110
|
+
.handle(e, { event: this.eventName, payload }, 'useNuiQuery:request')
|
|
111
|
+
.catch(() => { });
|
|
112
|
+
try {
|
|
113
|
+
this.options.onError?.(e);
|
|
114
|
+
}
|
|
115
|
+
catch (callbackErr) {
|
|
116
|
+
void globalErrorHandler
|
|
117
|
+
.handle(callbackErr instanceof Error ? callbackErr : new Error(String(callbackErr)), { event: this.eventName }, 'useNuiQuery:onError')
|
|
118
|
+
.catch(() => { });
|
|
119
|
+
console.error(callbackErr);
|
|
120
|
+
}
|
|
121
|
+
throw e;
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
if (currentRequestId === this.activeRequestId) {
|
|
125
|
+
this.loading = false;
|
|
126
|
+
this.abortController = null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
execute = async (...args) => {
|
|
131
|
+
const hasExplicitRequest = args.length > 0;
|
|
132
|
+
if (hasExplicitRequest) {
|
|
133
|
+
this.lastRequest = args[0];
|
|
134
|
+
this.hasLastRequest = true;
|
|
135
|
+
}
|
|
136
|
+
return this.sendRequest(this.lastRequest, args[1]);
|
|
137
|
+
};
|
|
138
|
+
refetch = (overrideTimeout) => {
|
|
139
|
+
return this.sendRequest(this.lastRequest, overrideTimeout);
|
|
140
|
+
};
|
|
141
|
+
abort = () => {
|
|
142
|
+
if (this.abortController) {
|
|
143
|
+
this.abortController.abort();
|
|
144
|
+
this.abortController = null;
|
|
145
|
+
}
|
|
146
|
+
this.activeRequestId++;
|
|
147
|
+
this.loading = false;
|
|
148
|
+
};
|
|
149
|
+
reset = () => {
|
|
150
|
+
this.abort();
|
|
151
|
+
this.data = null;
|
|
152
|
+
this.error = null;
|
|
153
|
+
this.isSuccess = false;
|
|
154
|
+
this.called = false;
|
|
155
|
+
this.lastUpdated = null;
|
|
156
|
+
this.lastRequest = this.options.initialRequest;
|
|
157
|
+
this.hasLastRequest = 'initialRequest' in this.options;
|
|
158
|
+
};
|
|
159
|
+
destroy = () => {
|
|
160
|
+
if (this.isDisposed)
|
|
161
|
+
return;
|
|
162
|
+
this.isDisposed = true;
|
|
163
|
+
this.abort();
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function useNuiQuery(eventName, options = {}) {
|
|
167
|
+
const client = options.client ?? useNuiClient();
|
|
168
|
+
const query = new NuiQueryController(eventName, options, client);
|
|
169
|
+
$effect(() => () => query.destroy());
|
|
170
|
+
$effect(() => {
|
|
171
|
+
untrack(() => {
|
|
172
|
+
if (options.immediate) {
|
|
173
|
+
void query.execute(options.initialRequest).catch(() => { });
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
return query;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=query.svelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.svelte.js","sourceRoot":"","sources":["../../src/runes/query.svelte.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { NuiEventKey, NuiEventPayload } from '@fivem-nui/core';
|
|
2
|
+
import type { SvelteNuiClient } from '../client';
|
|
3
|
+
export interface NuiStateOptions<T> {
|
|
4
|
+
/** Optional client override (defaults to context or global client). */
|
|
5
|
+
client?: SvelteNuiClient;
|
|
6
|
+
/** Transform or validate raw incoming payload before updating state. */
|
|
7
|
+
transform?: (raw: unknown) => T;
|
|
8
|
+
/** Called when payload handling or transform fails. */
|
|
9
|
+
onError?: (error: Error) => void;
|
|
10
|
+
/**
|
|
11
|
+
* Automatic cleanup on component unmount.
|
|
12
|
+
* - `false`: disables lifecycle hook (useful for global stores / singletons).
|
|
13
|
+
* - `true`: strictly requires component context (throws if called outside).
|
|
14
|
+
* - `undefined`: automatically hooks into component lifecycle if available.
|
|
15
|
+
*/
|
|
16
|
+
autoDestroy?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Controller for reactive state synchronized with a NUI event.
|
|
20
|
+
*/
|
|
21
|
+
export interface NuiState<T> {
|
|
22
|
+
/** Current value. */
|
|
23
|
+
value: T;
|
|
24
|
+
/** Timestamp (epoch ms) of the last received event, or null. */
|
|
25
|
+
readonly updatedAt: number | null;
|
|
26
|
+
/** Number of received events. */
|
|
27
|
+
readonly count: number;
|
|
28
|
+
/** Last processing or transform error, or null. */
|
|
29
|
+
readonly error: Error | null;
|
|
30
|
+
/** Sets the value manually without incrementing count or updatedAt. */
|
|
31
|
+
set(value: T): void;
|
|
32
|
+
/** Updates the value using an updater function. */
|
|
33
|
+
update(fn: (prev: T) => T): void;
|
|
34
|
+
/** Resets state back to the initial value and clears errors. */
|
|
35
|
+
reset(): void;
|
|
36
|
+
/** Unsubscribes from the event. */
|
|
37
|
+
destroy(): void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Binds a FiveM NUI event to reactive state.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```svelte
|
|
44
|
+
* <script>
|
|
45
|
+
* import { useNuiState } from '@fivem-nui/svelte';
|
|
46
|
+
*
|
|
47
|
+
* const player = useNuiState('player:update', { health: 100, armor: 0 });
|
|
48
|
+
* </script>
|
|
49
|
+
*
|
|
50
|
+
* <div>Health: {player.value.health}</div>
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
/**
|
|
54
|
+
* Controller managing reactive state synchronized with a NUI event.
|
|
55
|
+
*/
|
|
56
|
+
export declare class NuiStateController<T> implements NuiState<T> {
|
|
57
|
+
value: T;
|
|
58
|
+
updatedAt: number | null;
|
|
59
|
+
count: number;
|
|
60
|
+
error: Error | null;
|
|
61
|
+
private readonly initialValue;
|
|
62
|
+
private isDestroyed;
|
|
63
|
+
private readonly unsubscribe;
|
|
64
|
+
constructor(eventName: string, initialValue: T, options: NuiStateOptions<T> | undefined, client: SvelteNuiClient);
|
|
65
|
+
set: (v: T) => void;
|
|
66
|
+
update: (fn: (prev: T) => T) => void;
|
|
67
|
+
reset: () => void;
|
|
68
|
+
destroy: () => void;
|
|
69
|
+
}
|
|
70
|
+
export declare function useNuiState<K extends NuiEventKey>(eventName: K, initialValue: NuiEventPayload<K>, options?: NuiStateOptions<NuiEventPayload<K>>): NuiState<NuiEventPayload<K>>;
|
|
71
|
+
export declare function useNuiState<T>(eventName: string, initialValue: T, options?: NuiStateOptions<T>): NuiState<T>;
|
|
72
|
+
//# sourceMappingURL=state.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.svelte.d.ts","sourceRoot":"","sources":["../../src/runes/state.svelte.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGjD,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,uEAAuE;IACvE,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB,wEAAwE;IACxE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC;IAEhC,uDAAuD;IACvD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,qBAAqB;IACrB,KAAK,EAAE,CAAC,CAAC;IAET,gEAAgE;IAChE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAE7B,uEAAuE;IACvE,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAEpB,mDAAmD;IACnD,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAEjC,gEAAgE;IAChE,KAAK,IAAI,IAAI,CAAC;IAEd,mCAAmC;IACnC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH;;GAEG;AACH,qBAAa,kBAAkB,CAAC,CAAC,CAAE,YAAW,QAAQ,CAAC,CAAC,CAAC;IACvD,KAAK,IAAwC;IAC7C,SAAS,gBAA+B;IACxC,KAAK,SAAa;IAClB,KAAK,eAA8B;IAEnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAI;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,YACE,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,CAAC,EACf,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,YAAK,EAChC,MAAM,EAAE,eAAe,EA+BxB;IAED,GAAG,MAAO,CAAC,KAAG,IAAI,CAEhB;IAEF,MAAM,OAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAG,IAAI,CAEjC;IAEF,KAAK,QAAO,IAAI,CAKd;IAEF,OAAO,QAAO,IAAI,CAIhB;CACH;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAC/C,SAAS,EAAE,CAAC,EACZ,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,EAChC,OAAO,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAC5C,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,wBAAgB,WAAW,CAAC,CAAC,EAC3B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,CAAC,EACf,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAC3B,QAAQ,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { onDestroy } from 'svelte';
|
|
2
|
+
import { globalErrorHandler } from '@fivem-nui/error';
|
|
3
|
+
import { useNuiClient } from '../context';
|
|
4
|
+
/**
|
|
5
|
+
* Binds a FiveM NUI event to reactive state.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```svelte
|
|
9
|
+
* <script>
|
|
10
|
+
* import { useNuiState } from '@fivem-nui/svelte';
|
|
11
|
+
*
|
|
12
|
+
* const player = useNuiState('player:update', { health: 100, armor: 0 });
|
|
13
|
+
* </script>
|
|
14
|
+
*
|
|
15
|
+
* <div>Health: {player.value.health}</div>
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Controller managing reactive state synchronized with a NUI event.
|
|
20
|
+
*/
|
|
21
|
+
export class NuiStateController {
|
|
22
|
+
value = $state(undefined);
|
|
23
|
+
updatedAt = $state(null);
|
|
24
|
+
count = $state(0);
|
|
25
|
+
error = $state(null);
|
|
26
|
+
initialValue;
|
|
27
|
+
isDestroyed = false;
|
|
28
|
+
unsubscribe;
|
|
29
|
+
constructor(eventName, initialValue, options = {}, client) {
|
|
30
|
+
this.initialValue = initialValue;
|
|
31
|
+
this.value = initialValue;
|
|
32
|
+
this.unsubscribe = client.on(eventName, (data) => {
|
|
33
|
+
try {
|
|
34
|
+
this.value = options.transform ? options.transform(data) : data;
|
|
35
|
+
this.updatedAt = Date.now();
|
|
36
|
+
this.count += 1;
|
|
37
|
+
this.error = null;
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
41
|
+
this.error = e;
|
|
42
|
+
void globalErrorHandler
|
|
43
|
+
.handle(e, { event: eventName, payload: data }, 'useNuiState:transform')
|
|
44
|
+
.catch(() => { });
|
|
45
|
+
try {
|
|
46
|
+
options.onError?.(e);
|
|
47
|
+
}
|
|
48
|
+
catch (callbackErr) {
|
|
49
|
+
void globalErrorHandler
|
|
50
|
+
.handle(callbackErr instanceof Error ? callbackErr : new Error(String(callbackErr)), { event: eventName }, 'useNuiState:onError')
|
|
51
|
+
.catch(() => { });
|
|
52
|
+
console.error(callbackErr);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
set = (v) => {
|
|
58
|
+
this.value = v;
|
|
59
|
+
};
|
|
60
|
+
update = (fn) => {
|
|
61
|
+
this.value = fn(this.value);
|
|
62
|
+
};
|
|
63
|
+
reset = () => {
|
|
64
|
+
this.value = this.initialValue;
|
|
65
|
+
this.updatedAt = null;
|
|
66
|
+
this.count = 0;
|
|
67
|
+
this.error = null;
|
|
68
|
+
};
|
|
69
|
+
destroy = () => {
|
|
70
|
+
if (this.isDestroyed)
|
|
71
|
+
return;
|
|
72
|
+
this.isDestroyed = true;
|
|
73
|
+
this.unsubscribe();
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export function useNuiState(eventName, initialValue, options = {}) {
|
|
77
|
+
const client = options.client ?? useNuiClient();
|
|
78
|
+
const state = new NuiStateController(eventName, initialValue, options, client);
|
|
79
|
+
if (options.autoDestroy === true) {
|
|
80
|
+
try {
|
|
81
|
+
onDestroy(state.destroy);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
state.destroy();
|
|
85
|
+
throw err;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else if (options.autoDestroy !== false) {
|
|
89
|
+
try {
|
|
90
|
+
onDestroy(state.destroy);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Called outside a component lifecycle; cleanup must be managed manually via destroy().
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return state;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=state.svelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.svelte.js","sourceRoot":"","sources":["../../src/runes/state.svelte.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { SvelteNuiClient } from '../client';
|
|
2
|
+
/**
|
|
3
|
+
* Window lifecycle actions dispatched from C# backend to NUI UI.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum NuiWindowActionType {
|
|
6
|
+
Open = "open",
|
|
7
|
+
Close = "close",
|
|
8
|
+
Focus = "focus",
|
|
9
|
+
Unfocus = "unfocus"
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Window lifecycle notifications dispatched from UI to C# backend.
|
|
13
|
+
*/
|
|
14
|
+
export declare enum NuiWindowNotification {
|
|
15
|
+
Ready = "ready",
|
|
16
|
+
Close = "close"
|
|
17
|
+
}
|
|
18
|
+
export interface NuiWindowOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Explicit client instance override.
|
|
21
|
+
* Defaults to the client provided via context (`useNuiClient()`) or global client.
|
|
22
|
+
*/
|
|
23
|
+
client?: SvelteNuiClient;
|
|
24
|
+
/**
|
|
25
|
+
* Initial visibility without focus or backend notification.
|
|
26
|
+
* @defaultValue false
|
|
27
|
+
*/
|
|
28
|
+
initialVisible?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Automatically closes the window when Escape is pressed.
|
|
31
|
+
* @defaultValue true
|
|
32
|
+
*/
|
|
33
|
+
closeOnEscape?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Callback invoked when window visibility changes from hidden to visible.
|
|
36
|
+
*/
|
|
37
|
+
onOpen?: () => void;
|
|
38
|
+
/**
|
|
39
|
+
* Callback invoked when window visibility changes from visible to hidden.
|
|
40
|
+
*/
|
|
41
|
+
onClose?: () => void;
|
|
42
|
+
/**
|
|
43
|
+
* Callback invoked when window focus state changes.
|
|
44
|
+
*/
|
|
45
|
+
onFocusChange?: (focused: boolean) => void;
|
|
46
|
+
/**
|
|
47
|
+
* Controls automatic cleanup through Svelte's component lifecycle.
|
|
48
|
+
*
|
|
49
|
+
* - `true`: Strictly requires component initialization lifecycle; throws if called outside.
|
|
50
|
+
* - `false`: Disables automatic lifecycle cleanup; call `destroy()` manually.
|
|
51
|
+
* - `undefined`: Attempts automatic cleanup, falling back to manual cleanup outside components.
|
|
52
|
+
*
|
|
53
|
+
* @defaultValue undefined
|
|
54
|
+
*/
|
|
55
|
+
autoDestroy?: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Controller interface representing a reactive NUI window.
|
|
59
|
+
*/
|
|
60
|
+
export interface NuiWindow {
|
|
61
|
+
/** Whether the window is currently visible. */
|
|
62
|
+
readonly visible: boolean;
|
|
63
|
+
/** Whether the window currently has input focus. */
|
|
64
|
+
readonly focused: boolean;
|
|
65
|
+
/** Opens the window, sets focused to true, and sends a 'ready' notification to C#. */
|
|
66
|
+
open(): void;
|
|
67
|
+
/** Closes the window, clears focus, and sends a 'close' notification to C#. */
|
|
68
|
+
close(): void;
|
|
69
|
+
/** Toggles window visibility between open and closed. */
|
|
70
|
+
toggle(): void;
|
|
71
|
+
/** Destroys the window controller, unsubscribing from C# window events and key listeners. */
|
|
72
|
+
destroy(): void;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Controller managing reactive visibility, focus, and backend events for a named NUI window.
|
|
76
|
+
*/
|
|
77
|
+
export declare class NuiWindowController implements NuiWindow {
|
|
78
|
+
private readonly windowName;
|
|
79
|
+
private readonly options;
|
|
80
|
+
private readonly client;
|
|
81
|
+
visible: boolean;
|
|
82
|
+
focused: boolean;
|
|
83
|
+
private destroyed;
|
|
84
|
+
private listeningForEscape;
|
|
85
|
+
private readonly unsubscribe;
|
|
86
|
+
constructor(windowName: string, options: NuiWindowOptions | undefined, client: SvelteNuiClient);
|
|
87
|
+
private syncEscapeListener;
|
|
88
|
+
private handleEscape;
|
|
89
|
+
private transition;
|
|
90
|
+
private notifyAndDispatch;
|
|
91
|
+
open: () => void;
|
|
92
|
+
close: () => void;
|
|
93
|
+
toggle: () => void;
|
|
94
|
+
private handleWindowAction;
|
|
95
|
+
destroy: () => void;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Reactive controller for a named NUI window.
|
|
99
|
+
* Synchronizes visibility and focus states with the FiveM C# backend.
|
|
100
|
+
*
|
|
101
|
+
* @param windowName - Window identifier matching backend events.
|
|
102
|
+
* @param options - Optional configuration (callbacks, Escape handling).
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```svelte
|
|
106
|
+
* <script>
|
|
107
|
+
* import { useNuiWindow } from '@fivem-nui/svelte';
|
|
108
|
+
*
|
|
109
|
+
* const win = useNuiWindow('inventory', { closeOnEscape: true });
|
|
110
|
+
* </script>
|
|
111
|
+
*
|
|
112
|
+
* {#if win.visible}
|
|
113
|
+
* <div class="panel">
|
|
114
|
+
* <button onclick={() => win.close()}>Close</button>
|
|
115
|
+
* </div>
|
|
116
|
+
* {/if}
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
export declare function useNuiWindow(windowName: string, options?: NuiWindowOptions): NuiWindow;
|
|
120
|
+
//# sourceMappingURL=window.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window.svelte.d.ts","sourceRoot":"","sources":["../../src/runes/window.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGjD;;GAEG;AACH,oBAAY,mBAAmB;IAC7B,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,oBAAY,qBAAqB;IAC/B,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAE3C;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,sFAAsF;IACtF,IAAI,IAAI,IAAI,CAAC;IAEb,+EAA+E;IAC/E,KAAK,IAAI,IAAI,CAAC;IAEd,yDAAyD;IACzD,MAAM,IAAI,IAAI,CAAC;IAEf,6FAA6F;IAC7F,OAAO,IAAI,IAAI,CAAC;CACjB;AAuBD;;GAEG;AACH,qBAAa,mBAAoB,YAAW,SAAS;IASjD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,UAAiB;IACxB,OAAO,UAAiB;IAExB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,YACmB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,gBAAgB,YAAK,EAC9B,MAAM,EAAE,eAAe,EAQzC;IAED,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,YAAY,CAKlB;IAEF,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,iBAAiB;IA4BzB,IAAI,QAAO,IAAI,CAKb;IAEF,KAAK,QAAO,IAAI,CAKd;IAEF,MAAM,QAAO,IAAI,CAKf;IAEF,OAAO,CAAC,kBAAkB,CA2BxB;IAEF,OAAO,QAAO,IAAI,CAMhB;CACH;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,gBAAqB,GAC7B,SAAS,CAgBX"}
|