@vritti/quantum-ui 0.3.27 → 0.4.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/dist/index8.js
CHANGED
|
@@ -26,6 +26,9 @@ const defaultConfig = {
|
|
|
26
26
|
currency: {
|
|
27
27
|
resolveCurrency: void 0
|
|
28
28
|
},
|
|
29
|
+
sse: {
|
|
30
|
+
onRequest: void 0
|
|
31
|
+
},
|
|
29
32
|
views: {
|
|
30
33
|
viewsEndpoint: "table-views",
|
|
31
34
|
statesEndpoint: "table-states"
|
|
@@ -76,6 +79,10 @@ function configureQuantumUI(userConfig) {
|
|
|
76
79
|
...defaultConfig.currency,
|
|
77
80
|
...userConfig.currency || {}
|
|
78
81
|
},
|
|
82
|
+
sse: {
|
|
83
|
+
...defaultConfig.sse,
|
|
84
|
+
...userConfig.sse || {}
|
|
85
|
+
},
|
|
79
86
|
views: {
|
|
80
87
|
...defaultConfig.views,
|
|
81
88
|
...userConfig.views || {}
|
package/dist/index8.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index8.js","sources":["../lib/config/index.ts"],"sourcesContent":["export interface CsrfConfig {\n endpoint: string;\n\n enabled: boolean;\n\n headerName: string;\n}\n\nexport interface AxiosConfig {\n baseURL: string;\n\n timeout: number;\n\n withCredentials: boolean;\n\n headers?: Record<string, string>;\n\n onRequest?: (config: import('axios').InternalAxiosRequestConfig) => void | Promise<void>;\n}\n\nexport interface AuthConfig {\n tokenHeaderName: string;\n\n tokenPrefix: string;\n\n tokenEndpoint: string;\n\n refreshEndpoint: string;\n\n sessionRecoveryEnabled: boolean;\n}\n\nexport interface ViewsConfig {\n viewsEndpoint: string;\n\n statesEndpoint: string;\n}\n\nexport interface TimeZoneConfig {\n resolveTimeZone?: () => string | null | undefined;\n}\n\nexport interface CurrencyConfig {\n resolveCurrency?: () => string | null | undefined;\n}\n\nexport interface QuantumUIConfig {\n csrf?: Partial<CsrfConfig>;\n\n axios?: Partial<AxiosConfig>;\n\n auth?: Partial<AuthConfig>;\n\n timeZone?: TimeZoneConfig;\n\n currency?: CurrencyConfig;\n\n views: ViewsConfig;\n}\n\nconst defaultConfig: {\n csrf: CsrfConfig;\n axios: AxiosConfig;\n auth: AuthConfig;\n views: Required<ViewsConfig>;\n timeZone: TimeZoneConfig;\n currency: CurrencyConfig;\n} = {\n csrf: {\n endpoint: 'csrf/token',\n enabled: true,\n headerName: 'x-csrf-token',\n },\n axios: {\n baseURL: '/api',\n timeout: 30000,\n withCredentials: true,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n },\n auth: {\n tokenHeaderName: 'Authorization',\n tokenPrefix: 'Bearer',\n tokenEndpoint: 'auth/access-token',\n refreshEndpoint: 'auth/refresh-tokens',\n sessionRecoveryEnabled: true,\n },\n timeZone: {\n resolveTimeZone: undefined,\n },\n currency: {\n resolveCurrency: undefined,\n },\n views: {\n viewsEndpoint: 'table-views',\n statesEndpoint: 'table-states',\n },\n};\n\nconst GLOBAL_CONFIG_KEY = '__QUANTUM_UI_CONFIG__';\n\ntype GlobalWindow = Window & typeof globalThis & { [GLOBAL_CONFIG_KEY]?: typeof defaultConfig };\n\n// Get the current config from global storage or initialize with defaults\nfunction getGlobalConfig(): typeof defaultConfig {\n if (typeof window !== 'undefined') {\n const globalWindow = window as GlobalWindow;\n if (!globalWindow[GLOBAL_CONFIG_KEY]) {\n globalWindow[GLOBAL_CONFIG_KEY] = { ...defaultConfig };\n }\n return globalWindow[GLOBAL_CONFIG_KEY] ?? { ...defaultConfig };\n }\n return { ...defaultConfig };\n}\n\n// Set the global config\nfunction setGlobalConfig(config: typeof defaultConfig): void {\n if (typeof window !== 'undefined') {\n (window as GlobalWindow)[GLOBAL_CONFIG_KEY] = config;\n }\n}\n\n// Helper function to define configuration with type safety.\nexport function defineConfig(config: QuantumUIConfig): QuantumUIConfig {\n return config;\n}\n\n// Configure quantum-ui with user settings; call once in the application entry point.\nexport function configureQuantumUI(userConfig: QuantumUIConfig): void {\n const newConfig = {\n csrf: {\n ...defaultConfig.csrf,\n ...(userConfig.csrf || {}),\n },\n axios: {\n ...defaultConfig.axios,\n ...(userConfig.axios || {}),\n headers: {\n ...defaultConfig.axios.headers,\n ...(userConfig.axios?.headers || {}),\n },\n },\n auth: {\n ...defaultConfig.auth,\n ...(userConfig.auth || {}),\n },\n timeZone: {\n ...defaultConfig.timeZone,\n ...(userConfig.timeZone || {}),\n },\n currency: {\n ...defaultConfig.currency,\n ...(userConfig.currency || {}),\n },\n views: {\n ...defaultConfig.views,\n ...(userConfig.views || {}),\n },\n };\n setGlobalConfig(newConfig);\n}\n\n// Get the current configuration.\nexport function getConfig(): typeof defaultConfig {\n return getGlobalConfig();\n}\n\n// Reset configuration to defaults; mainly useful for testing.\nexport function resetConfig(): void {\n setGlobalConfig({ ...defaultConfig });\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index8.js","sources":["../lib/config/index.ts"],"sourcesContent":["export interface CsrfConfig {\n endpoint: string;\n\n enabled: boolean;\n\n headerName: string;\n}\n\nexport interface AxiosConfig {\n baseURL: string;\n\n timeout: number;\n\n withCredentials: boolean;\n\n headers?: Record<string, string>;\n\n onRequest?: (config: import('axios').InternalAxiosRequestConfig) => void | Promise<void>;\n}\n\nexport interface AuthConfig {\n tokenHeaderName: string;\n\n tokenPrefix: string;\n\n tokenEndpoint: string;\n\n refreshEndpoint: string;\n\n sessionRecoveryEnabled: boolean;\n}\n\nexport interface ViewsConfig {\n viewsEndpoint: string;\n\n statesEndpoint: string;\n}\n\nexport interface TimeZoneConfig {\n resolveTimeZone?: () => string | null | undefined;\n}\n\nexport interface CurrencyConfig {\n resolveCurrency?: () => string | null | undefined;\n}\n\nexport interface SseConfig {\n // Rewrites an SSE URL before the EventSource opens — the counterpart to axios.onRequest. EventSource\n // cannot set request headers, so whatever an HTTP call carries in a header (workspace/tenant context)\n // has to ride the query string here instead. Returns the URL to connect to.\n onRequest?: (url: string) => string;\n}\n\nexport interface QuantumUIConfig {\n csrf?: Partial<CsrfConfig>;\n\n axios?: Partial<AxiosConfig>;\n\n auth?: Partial<AuthConfig>;\n\n timeZone?: TimeZoneConfig;\n\n currency?: CurrencyConfig;\n\n sse?: SseConfig;\n\n views: ViewsConfig;\n}\n\nconst defaultConfig: {\n csrf: CsrfConfig;\n axios: AxiosConfig;\n auth: AuthConfig;\n views: Required<ViewsConfig>;\n timeZone: TimeZoneConfig;\n currency: CurrencyConfig;\n sse: SseConfig;\n} = {\n csrf: {\n endpoint: 'csrf/token',\n enabled: true,\n headerName: 'x-csrf-token',\n },\n axios: {\n baseURL: '/api',\n timeout: 30000,\n withCredentials: true,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n },\n auth: {\n tokenHeaderName: 'Authorization',\n tokenPrefix: 'Bearer',\n tokenEndpoint: 'auth/access-token',\n refreshEndpoint: 'auth/refresh-tokens',\n sessionRecoveryEnabled: true,\n },\n timeZone: {\n resolveTimeZone: undefined,\n },\n currency: {\n resolveCurrency: undefined,\n },\n sse: {\n onRequest: undefined,\n },\n views: {\n viewsEndpoint: 'table-views',\n statesEndpoint: 'table-states',\n },\n};\n\nconst GLOBAL_CONFIG_KEY = '__QUANTUM_UI_CONFIG__';\n\ntype GlobalWindow = Window & typeof globalThis & { [GLOBAL_CONFIG_KEY]?: typeof defaultConfig };\n\n// Get the current config from global storage or initialize with defaults\nfunction getGlobalConfig(): typeof defaultConfig {\n if (typeof window !== 'undefined') {\n const globalWindow = window as GlobalWindow;\n if (!globalWindow[GLOBAL_CONFIG_KEY]) {\n globalWindow[GLOBAL_CONFIG_KEY] = { ...defaultConfig };\n }\n return globalWindow[GLOBAL_CONFIG_KEY] ?? { ...defaultConfig };\n }\n return { ...defaultConfig };\n}\n\n// Set the global config\nfunction setGlobalConfig(config: typeof defaultConfig): void {\n if (typeof window !== 'undefined') {\n (window as GlobalWindow)[GLOBAL_CONFIG_KEY] = config;\n }\n}\n\n// Helper function to define configuration with type safety.\nexport function defineConfig(config: QuantumUIConfig): QuantumUIConfig {\n return config;\n}\n\n// Configure quantum-ui with user settings; call once in the application entry point.\nexport function configureQuantumUI(userConfig: QuantumUIConfig): void {\n const newConfig = {\n csrf: {\n ...defaultConfig.csrf,\n ...(userConfig.csrf || {}),\n },\n axios: {\n ...defaultConfig.axios,\n ...(userConfig.axios || {}),\n headers: {\n ...defaultConfig.axios.headers,\n ...(userConfig.axios?.headers || {}),\n },\n },\n auth: {\n ...defaultConfig.auth,\n ...(userConfig.auth || {}),\n },\n timeZone: {\n ...defaultConfig.timeZone,\n ...(userConfig.timeZone || {}),\n },\n currency: {\n ...defaultConfig.currency,\n ...(userConfig.currency || {}),\n },\n sse: {\n ...defaultConfig.sse,\n ...(userConfig.sse || {}),\n },\n views: {\n ...defaultConfig.views,\n ...(userConfig.views || {}),\n },\n };\n setGlobalConfig(newConfig);\n}\n\n// Get the current configuration.\nexport function getConfig(): typeof defaultConfig {\n return getGlobalConfig();\n}\n\n// Reset configuration to defaults; mainly useful for testing.\nexport function resetConfig(): void {\n setGlobalConfig({ ...defaultConfig });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -27,12 +27,16 @@ export interface TimeZoneConfig {
|
|
|
27
27
|
export interface CurrencyConfig {
|
|
28
28
|
resolveCurrency?: () => string | null | undefined;
|
|
29
29
|
}
|
|
30
|
+
export interface SseConfig {
|
|
31
|
+
onRequest?: (url: string) => string;
|
|
32
|
+
}
|
|
30
33
|
export interface QuantumUIConfig {
|
|
31
34
|
csrf?: Partial<CsrfConfig>;
|
|
32
35
|
axios?: Partial<AxiosConfig>;
|
|
33
36
|
auth?: Partial<AuthConfig>;
|
|
34
37
|
timeZone?: TimeZoneConfig;
|
|
35
38
|
currency?: CurrencyConfig;
|
|
39
|
+
sse?: SseConfig;
|
|
36
40
|
views: ViewsConfig;
|
|
37
41
|
}
|
|
38
42
|
declare const defaultConfig: {
|
|
@@ -42,6 +46,7 @@ declare const defaultConfig: {
|
|
|
42
46
|
views: Required<ViewsConfig>;
|
|
43
47
|
timeZone: TimeZoneConfig;
|
|
44
48
|
currency: CurrencyConfig;
|
|
49
|
+
sse: SseConfig;
|
|
45
50
|
};
|
|
46
51
|
export declare function defineConfig(config: QuantumUIConfig): QuantumUIConfig;
|
|
47
52
|
export declare function configureQuantumUI(userConfig: QuantumUIConfig): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/config/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IAEjB,OAAO,EAAE,OAAO,CAAC;IAEjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,EAAE,MAAM,CAAC;IAEhB,eAAe,EAAE,OAAO,CAAC;IAEzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE,0BAA0B,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,MAAM,CAAC;IAExB,WAAW,EAAE,MAAM,CAAC;IAEpB,aAAa,EAAE,MAAM,CAAC;IAEtB,eAAe,EAAE,MAAM,CAAC;IAExB,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IAEtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3B,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE7B,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAE1B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAE1B,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,QAAA,MAAM,aAAa,EAAE;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/config/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IAEjB,OAAO,EAAE,OAAO,CAAC;IAEjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,EAAE,MAAM,CAAC;IAEhB,eAAe,EAAE,OAAO,CAAC;IAEzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE,0BAA0B,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,MAAM,CAAC;IAExB,WAAW,EAAE,MAAM,CAAC;IAEpB,aAAa,EAAE,MAAM,CAAC;IAEtB,eAAe,EAAE,MAAM,CAAC;IAExB,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IAEtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,SAAS;IAIxB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3B,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE7B,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAE1B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAE1B,GAAG,CAAC,EAAE,SAAS,CAAC;IAEhB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,QAAA,MAAM,aAAa,EAAE;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,SAAS,CAAC;CAoChB,CAAC;AA0BF,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAErE;AAGD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAoCpE;AAGD,wBAAgB,SAAS,IAAI,OAAO,aAAa,CAEhD;AAGD,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSSE.d.ts","sourceRoot":"","sources":["../../../lib/hooks/useSSE.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/F,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,YAAY,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpE,SAAS,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,QAAQ,CAAC,MAAM,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,UAAU,EAAE;SAAG,CAAC,IAAI,MAAM,QAAQ,IAAI,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;KAAE,CAAC;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAGD,wBAAgB,MAAM,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvF,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,GAC/B,YAAY,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"useSSE.d.ts","sourceRoot":"","sources":["../../../lib/hooks/useSSE.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/F,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,YAAY,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpE,SAAS,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,QAAQ,CAAC,MAAM,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,UAAU,EAAE;SAAG,CAAC,IAAI,MAAM,QAAQ,IAAI,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;KAAE,CAAC;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAGD,wBAAgB,MAAM,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvF,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,GAC/B,YAAY,CAAC,QAAQ,CAAC,CAqGxB"}
|
package/dist/useTimer.js
CHANGED
|
@@ -122,7 +122,8 @@ function useSSE(options) {
|
|
|
122
122
|
return;
|
|
123
123
|
}
|
|
124
124
|
const config = getConfig();
|
|
125
|
-
const
|
|
125
|
+
const baseUrl = `${config.axios.baseURL}${path}`;
|
|
126
|
+
const sseUrl = config.sse.onRequest?.(baseUrl) ?? baseUrl;
|
|
126
127
|
const eventSource = new EventSource(sseUrl, { withCredentials });
|
|
127
128
|
eventSourceRef.current = eventSource;
|
|
128
129
|
eventSource.onopen = () => {
|
package/dist/useTimer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTimer.js","sources":["../lib/hooks/useBarcodeScanner.ts","../lib/hooks/useSlugParams.ts","../lib/hooks/useSSE.ts","../lib/hooks/useTimer.ts"],"sourcesContent":["import type { UseMutationResult } from '@tanstack/react-query';\nimport { useEffect, useRef, useState } from 'react';\nimport { useHotkeys } from '../utils/hotkeys';\n\nconst DEFAULT_MIN_LENGTH = 3;\nconst DEFAULT_MAX_INTERVAL_MS = 50;\nconst MAX_SCAN_DURATION_MS = 500;\n\nexport interface UseBarcodeScannerOptions<TData, TError, TVariables> {\n mutation: UseMutationResult<TData, TError, TVariables>;\n toVariables: (code: string) => TVariables;\n enabled?: boolean;\n toggleShortcut?: string;\n exitShortcut?: string;\n minLength?: number;\n maxIntervalMs?: number;\n}\n\nexport interface UseBarcodeScannerResult {\n isActive: boolean;\n isPending: boolean;\n enable: () => void;\n disable: () => void;\n toggle: () => void;\n toggleShortcut: string;\n exitShortcut: string;\n}\n\nexport function useBarcodeScanner<TData, TError, TVariables>({\n mutation,\n toVariables,\n enabled = true,\n toggleShortcut = 'alt+s',\n exitShortcut = 'escape',\n minLength = DEFAULT_MIN_LENGTH,\n maxIntervalMs = DEFAULT_MAX_INTERVAL_MS,\n}: UseBarcodeScannerOptions<TData, TError, TVariables>): UseBarcodeScannerResult {\n const [isActive, setIsActive] = useState(false);\n\n const enable = () => setIsActive(true);\n const disable = () => setIsActive(false);\n const toggle = () => setIsActive((v) => !v);\n\n // Auto-disable when the gating condition turns false\n useEffect(() => {\n if (!enabled) setIsActive(false);\n }, [enabled]);\n\n // Cross-platform toggle shortcut\n useHotkeys(toggleShortcut, toggle, { enabled: enabled });\n // Escape exits only when active\n useHotkeys(exitShortcut, disable, { enabled: isActive });\n\n // Keyboard-wedge burst detector\n const bufferRef = useRef('');\n const lastKeyTimeRef = useRef(0);\n const scanStartTimeRef = useRef(0);\n const mutateRef = useRef(mutation.mutate);\n mutateRef.current = mutation.mutate;\n const toVariablesRef = useRef(toVariables);\n toVariablesRef.current = toVariables;\n\n useEffect(() => {\n if (!isActive || !enabled) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const target = event.target as Element | null;\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target?.hasAttribute('contenteditable')\n )\n return;\n\n const now = Date.now();\n const gap = now - lastKeyTimeRef.current;\n\n if (event.key === 'Enter') {\n const elapsed = now - scanStartTimeRef.current;\n const code = bufferRef.current;\n bufferRef.current = '';\n lastKeyTimeRef.current = 0;\n scanStartTimeRef.current = 0;\n if (code.length >= minLength && elapsed <= MAX_SCAN_DURATION_MS) {\n event.preventDefault();\n mutateRef.current(toVariablesRef.current(code));\n }\n return;\n }\n\n if (event.key.length !== 1) return;\n\n if (gap > maxIntervalMs && bufferRef.current.length > 0) {\n bufferRef.current = '';\n scanStartTimeRef.current = 0;\n }\n\n if (bufferRef.current.length === 0) scanStartTimeRef.current = now;\n\n bufferRef.current += event.key;\n lastKeyTimeRef.current = now;\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n bufferRef.current = '';\n lastKeyTimeRef.current = 0;\n scanStartTimeRef.current = 0;\n };\n }, [isActive, enabled, minLength, maxIntervalMs]);\n\n return {\n isActive,\n isPending: mutation.isPending,\n enable,\n disable,\n toggle,\n toggleShortcut,\n exitShortcut,\n };\n}\n","import { useParams } from 'react-router-dom';\nimport { parseSlug } from '../utils/slug';\n\nexport interface SlugParam {\n slug: string;\n name: string;\n id: string;\n}\n\ntype SlugParamMap<T extends string[]> = { [K in T[number]]: SlugParam };\n\nfunction parseParam(value: string | undefined): SlugParam {\n const v = value ?? '';\n const parsed = parseSlug(v);\n return { slug: v, name: parsed?.slug ?? '', id: parsed?.id ?? v };\n}\n\n// Single param — returns SlugParam directly for clean destructuring\nexport function useSlugParams<T extends string>(param: T): SlugParam;\n// Multiple params — returns { paramA: SlugParam; paramB: SlugParam }\nexport function useSlugParams<T extends string[]>(...params: T): SlugParamMap<T>;\nexport function useSlugParams(...params: string[]): SlugParam | SlugParamMap<string[]> {\n const routeParams = useParams();\n\n if (params.length === 1) {\n return parseParam(routeParams[params[0]]);\n }\n\n const result: Record<string, SlugParam> = {};\n for (const param of params) {\n result[param] = parseParam(routeParams[param]);\n }\n return result;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { getConfig } from '../config';\n\nexport interface UseSSEOptions<EventMap extends Record<string, unknown> = Record<string, unknown>> {\n path: string;\n events: (keyof EventMap & string)[];\n enabled?: boolean;\n autoReconnect?: boolean;\n withCredentials?: boolean;\n onError?: (event: Event) => void;\n onOpen?: () => void;\n}\n\nexport interface UseSSEReturn<EventMap extends Record<string, unknown>> {\n eventType: keyof EventMap | null;\n data: EventMap[keyof EventMap] | null;\n eventTypes: { [K in keyof EventMap as Uppercase<K & string>]: K };\n isConnected: boolean;\n error: string | null;\n disconnect: () => void;\n}\n\n// Generic Server-Sent Events hook that returns the last event as `eventType` + `data`.\nexport function useSSE<EventMap extends Record<string, unknown> = Record<string, unknown>>(\n options: UseSSEOptions<EventMap>,\n): UseSSEReturn<EventMap> {\n const { path, events: eventNames = [], enabled = true, withCredentials = true } = options;\n\n const eventSourceRef = useRef<EventSource | null>(null);\n const [eventType, setEventType] = useState<keyof EventMap | null>(null);\n const [data, setData] = useState<EventMap[keyof EventMap] | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Store options in a ref for stable access inside event handlers\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n // Stable serialized key for the events array\n const eventsKey = eventNames.join(',');\n\n const disconnect = useCallback(() => {\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n eventSourceRef.current = null;\n setIsConnected(false);\n }\n }, []);\n\n useEffect(() => {\n if (!enabled) {\n disconnect();\n setEventType(null);\n setData(null);\n return;\n }\n\n // Build full URL from quantum-ui config\n const config = getConfig();\n const sseUrl = `${config.axios.baseURL}${path}`;\n\n const eventSource = new EventSource(sseUrl, { withCredentials });\n eventSourceRef.current = eventSource;\n\n eventSource.onopen = () => {\n setIsConnected(true);\n setError(null);\n optionsRef.current.onOpen?.();\n };\n\n eventSource.onerror = (event) => {\n setIsConnected(false);\n\n // When autoReconnect is false, close on any error to prevent browser reconnect\n if (!optionsRef.current.autoReconnect && optionsRef.current.autoReconnect !== undefined) {\n eventSource.close();\n eventSourceRef.current = null;\n return;\n }\n\n if (eventSource.readyState === EventSource.CLOSED) {\n setError('Connection lost.');\n optionsRef.current.onError?.(event);\n }\n };\n\n // Register one addEventListener per event name\n const handlers: { name: string; handler: EventListener }[] = [];\n const names = eventsKey.split(',').filter(Boolean);\n\n for (const name of names) {\n const handler = (event: Event) => {\n try {\n const parsed = JSON.parse((event as MessageEvent).data as string);\n setEventType(name as keyof EventMap);\n setData(parsed);\n } catch (e) {\n console.error(`Failed to parse SSE event '${name}':`, e);\n }\n };\n\n eventSource.addEventListener(name, handler);\n handlers.push({ name, handler });\n }\n\n return () => {\n for (const { name, handler } of handlers) {\n eventSource.removeEventListener(name, handler);\n }\n disconnect();\n };\n }, [enabled, path, eventsKey, withCredentials, disconnect]);\n\n // Build UPPER_CASE enum from event names: { INITIATED: 'initiated', VERIFIED: 'verified', ... }\n type EventTypesMap = { [K in keyof EventMap as Uppercase<K & string>]: K };\n const eventTypes = useMemo(() => {\n const map = {} as EventTypesMap;\n for (const name of eventsKey.split(',').filter(Boolean)) {\n (map as Record<string, string>)[name.toUpperCase()] = name;\n }\n return map;\n }, [eventsKey]);\n\n return { eventType, data, eventTypes, isConnected, error, disconnect };\n}\n","import { useEffect, useState } from 'react';\n\nexport interface TimerHandle {\n timer: number;\n startTimer: (seconds?: number) => void;\n}\n\n// Generic countdown timer — decrements every second until 0\nexport function useTimer(initial = 0): TimerHandle {\n const [timer, setTimer] = useState(initial);\n\n useEffect(() => {\n if (timer > 0) {\n const t = setTimeout(() => setTimer(timer - 1), 1000);\n return () => clearTimeout(t);\n }\n }, [timer]);\n\n return { timer, startTimer: (seconds = 45) => setTimer(seconds) };\n}\n"],"names":["useHotkeys"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTimer.js","sources":["../lib/hooks/useBarcodeScanner.ts","../lib/hooks/useSlugParams.ts","../lib/hooks/useSSE.ts","../lib/hooks/useTimer.ts"],"sourcesContent":["import type { UseMutationResult } from '@tanstack/react-query';\nimport { useEffect, useRef, useState } from 'react';\nimport { useHotkeys } from '../utils/hotkeys';\n\nconst DEFAULT_MIN_LENGTH = 3;\nconst DEFAULT_MAX_INTERVAL_MS = 50;\nconst MAX_SCAN_DURATION_MS = 500;\n\nexport interface UseBarcodeScannerOptions<TData, TError, TVariables> {\n mutation: UseMutationResult<TData, TError, TVariables>;\n toVariables: (code: string) => TVariables;\n enabled?: boolean;\n toggleShortcut?: string;\n exitShortcut?: string;\n minLength?: number;\n maxIntervalMs?: number;\n}\n\nexport interface UseBarcodeScannerResult {\n isActive: boolean;\n isPending: boolean;\n enable: () => void;\n disable: () => void;\n toggle: () => void;\n toggleShortcut: string;\n exitShortcut: string;\n}\n\nexport function useBarcodeScanner<TData, TError, TVariables>({\n mutation,\n toVariables,\n enabled = true,\n toggleShortcut = 'alt+s',\n exitShortcut = 'escape',\n minLength = DEFAULT_MIN_LENGTH,\n maxIntervalMs = DEFAULT_MAX_INTERVAL_MS,\n}: UseBarcodeScannerOptions<TData, TError, TVariables>): UseBarcodeScannerResult {\n const [isActive, setIsActive] = useState(false);\n\n const enable = () => setIsActive(true);\n const disable = () => setIsActive(false);\n const toggle = () => setIsActive((v) => !v);\n\n // Auto-disable when the gating condition turns false\n useEffect(() => {\n if (!enabled) setIsActive(false);\n }, [enabled]);\n\n // Cross-platform toggle shortcut\n useHotkeys(toggleShortcut, toggle, { enabled: enabled });\n // Escape exits only when active\n useHotkeys(exitShortcut, disable, { enabled: isActive });\n\n // Keyboard-wedge burst detector\n const bufferRef = useRef('');\n const lastKeyTimeRef = useRef(0);\n const scanStartTimeRef = useRef(0);\n const mutateRef = useRef(mutation.mutate);\n mutateRef.current = mutation.mutate;\n const toVariablesRef = useRef(toVariables);\n toVariablesRef.current = toVariables;\n\n useEffect(() => {\n if (!isActive || !enabled) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const target = event.target as Element | null;\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target?.hasAttribute('contenteditable')\n )\n return;\n\n const now = Date.now();\n const gap = now - lastKeyTimeRef.current;\n\n if (event.key === 'Enter') {\n const elapsed = now - scanStartTimeRef.current;\n const code = bufferRef.current;\n bufferRef.current = '';\n lastKeyTimeRef.current = 0;\n scanStartTimeRef.current = 0;\n if (code.length >= minLength && elapsed <= MAX_SCAN_DURATION_MS) {\n event.preventDefault();\n mutateRef.current(toVariablesRef.current(code));\n }\n return;\n }\n\n if (event.key.length !== 1) return;\n\n if (gap > maxIntervalMs && bufferRef.current.length > 0) {\n bufferRef.current = '';\n scanStartTimeRef.current = 0;\n }\n\n if (bufferRef.current.length === 0) scanStartTimeRef.current = now;\n\n bufferRef.current += event.key;\n lastKeyTimeRef.current = now;\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n bufferRef.current = '';\n lastKeyTimeRef.current = 0;\n scanStartTimeRef.current = 0;\n };\n }, [isActive, enabled, minLength, maxIntervalMs]);\n\n return {\n isActive,\n isPending: mutation.isPending,\n enable,\n disable,\n toggle,\n toggleShortcut,\n exitShortcut,\n };\n}\n","import { useParams } from 'react-router-dom';\nimport { parseSlug } from '../utils/slug';\n\nexport interface SlugParam {\n slug: string;\n name: string;\n id: string;\n}\n\ntype SlugParamMap<T extends string[]> = { [K in T[number]]: SlugParam };\n\nfunction parseParam(value: string | undefined): SlugParam {\n const v = value ?? '';\n const parsed = parseSlug(v);\n return { slug: v, name: parsed?.slug ?? '', id: parsed?.id ?? v };\n}\n\n// Single param — returns SlugParam directly for clean destructuring\nexport function useSlugParams<T extends string>(param: T): SlugParam;\n// Multiple params — returns { paramA: SlugParam; paramB: SlugParam }\nexport function useSlugParams<T extends string[]>(...params: T): SlugParamMap<T>;\nexport function useSlugParams(...params: string[]): SlugParam | SlugParamMap<string[]> {\n const routeParams = useParams();\n\n if (params.length === 1) {\n return parseParam(routeParams[params[0]]);\n }\n\n const result: Record<string, SlugParam> = {};\n for (const param of params) {\n result[param] = parseParam(routeParams[param]);\n }\n return result;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { getConfig } from '../config';\n\nexport interface UseSSEOptions<EventMap extends Record<string, unknown> = Record<string, unknown>> {\n path: string;\n events: (keyof EventMap & string)[];\n enabled?: boolean;\n autoReconnect?: boolean;\n withCredentials?: boolean;\n onError?: (event: Event) => void;\n onOpen?: () => void;\n}\n\nexport interface UseSSEReturn<EventMap extends Record<string, unknown>> {\n eventType: keyof EventMap | null;\n data: EventMap[keyof EventMap] | null;\n eventTypes: { [K in keyof EventMap as Uppercase<K & string>]: K };\n isConnected: boolean;\n error: string | null;\n disconnect: () => void;\n}\n\n// Generic Server-Sent Events hook that returns the last event as `eventType` + `data`.\nexport function useSSE<EventMap extends Record<string, unknown> = Record<string, unknown>>(\n options: UseSSEOptions<EventMap>,\n): UseSSEReturn<EventMap> {\n const { path, events: eventNames = [], enabled = true, withCredentials = true } = options;\n\n const eventSourceRef = useRef<EventSource | null>(null);\n const [eventType, setEventType] = useState<keyof EventMap | null>(null);\n const [data, setData] = useState<EventMap[keyof EventMap] | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Store options in a ref for stable access inside event handlers\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n // Stable serialized key for the events array\n const eventsKey = eventNames.join(',');\n\n const disconnect = useCallback(() => {\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n eventSourceRef.current = null;\n setIsConnected(false);\n }\n }, []);\n\n useEffect(() => {\n if (!enabled) {\n disconnect();\n setEventType(null);\n setData(null);\n return;\n }\n\n // Build full URL from quantum-ui config, letting the app attach whatever an axios request would carry\n // in a header — EventSource cannot set headers, so that context has to ride the query string.\n const config = getConfig();\n const baseUrl = `${config.axios.baseURL}${path}`;\n const sseUrl = config.sse.onRequest?.(baseUrl) ?? baseUrl;\n\n const eventSource = new EventSource(sseUrl, { withCredentials });\n eventSourceRef.current = eventSource;\n\n eventSource.onopen = () => {\n setIsConnected(true);\n setError(null);\n optionsRef.current.onOpen?.();\n };\n\n eventSource.onerror = (event) => {\n setIsConnected(false);\n\n // When autoReconnect is false, close on any error to prevent browser reconnect\n if (!optionsRef.current.autoReconnect && optionsRef.current.autoReconnect !== undefined) {\n eventSource.close();\n eventSourceRef.current = null;\n return;\n }\n\n if (eventSource.readyState === EventSource.CLOSED) {\n setError('Connection lost.');\n optionsRef.current.onError?.(event);\n }\n };\n\n // Register one addEventListener per event name\n const handlers: { name: string; handler: EventListener }[] = [];\n const names = eventsKey.split(',').filter(Boolean);\n\n for (const name of names) {\n const handler = (event: Event) => {\n try {\n const parsed = JSON.parse((event as MessageEvent).data as string);\n setEventType(name as keyof EventMap);\n setData(parsed);\n } catch (e) {\n console.error(`Failed to parse SSE event '${name}':`, e);\n }\n };\n\n eventSource.addEventListener(name, handler);\n handlers.push({ name, handler });\n }\n\n return () => {\n for (const { name, handler } of handlers) {\n eventSource.removeEventListener(name, handler);\n }\n disconnect();\n };\n }, [enabled, path, eventsKey, withCredentials, disconnect]);\n\n // Build UPPER_CASE enum from event names: { INITIATED: 'initiated', VERIFIED: 'verified', ... }\n type EventTypesMap = { [K in keyof EventMap as Uppercase<K & string>]: K };\n const eventTypes = useMemo(() => {\n const map = {} as EventTypesMap;\n for (const name of eventsKey.split(',').filter(Boolean)) {\n (map as Record<string, string>)[name.toUpperCase()] = name;\n }\n return map;\n }, [eventsKey]);\n\n return { eventType, data, eventTypes, isConnected, error, disconnect };\n}\n","import { useEffect, useState } from 'react';\n\nexport interface TimerHandle {\n timer: number;\n startTimer: (seconds?: number) => void;\n}\n\n// Generic countdown timer — decrements every second until 0\nexport function useTimer(initial = 0): TimerHandle {\n const [timer, setTimer] = useState(initial);\n\n useEffect(() => {\n if (timer > 0) {\n const t = setTimeout(() => setTimer(timer - 1), 1000);\n return () => clearTimeout(t);\n }\n }, [timer]);\n\n return { timer, startTimer: (seconds = 45) => setTimer(seconds) };\n}\n"],"names":["useHotkeys"],"mappings":"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"}
|