@aigentyc/chat-sdk 0.3.1 → 0.5.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/AGENTS.md +24 -1
- package/claude-skill/aigentyc-chat-sdk/SKILL.md +1 -1
- package/context7.json +1 -1
- package/dist/{ChatInterface-f8ftS56n.d.ts → ChatInterface-2MN5cpYB.d.ts} +1 -1
- package/dist/{ChatInterface-B0zbA3Lm.d.cts → ChatInterface-BnVyOUG5.d.cts} +1 -1
- package/dist/{SlotsContext-BjiX1mRx.d.ts → SlotsContext-BZBi51ZT.d.ts} +89 -4
- package/dist/{SlotsContext-CEOBjzfh.d.cts → SlotsContext-D_C7zlUA.d.cts} +89 -4
- package/dist/ai-elements.cjs +163 -566
- package/dist/ai-elements.cjs.map +1 -1
- package/dist/ai-elements.d.cts +10 -2
- package/dist/ai-elements.d.ts +10 -2
- package/dist/ai-elements.js +16 -461
- package/dist/ai-elements.js.map +1 -1
- package/dist/{chunk-M4YRNNGB.js → chunk-3H4CX3MS.js} +29 -6
- package/dist/chunk-3H4CX3MS.js.map +1 -0
- package/dist/{chunk-BPV66QNM.cjs → chunk-52ZHMTAA.cjs} +30 -8
- package/dist/chunk-52ZHMTAA.cjs.map +1 -0
- package/dist/{chunk-B27JIQ4Z.js → chunk-5XF3NEFB.js} +576 -6
- package/dist/chunk-5XF3NEFB.js.map +1 -0
- package/dist/{chunk-5XF7KH6B.cjs → chunk-7ESWDFF5.cjs} +94 -60
- package/dist/chunk-7ESWDFF5.cjs.map +1 -0
- package/dist/{chunk-YG2COKFR.js → chunk-BWWN5LSE.js} +65 -31
- package/dist/chunk-BWWN5LSE.js.map +1 -0
- package/dist/chunk-BYTPAQ7F.js +70 -0
- package/dist/chunk-BYTPAQ7F.js.map +1 -0
- package/dist/{chunk-FPQ3UCCJ.js → chunk-D75TDRBH.js} +30 -8
- package/dist/chunk-D75TDRBH.js.map +1 -0
- package/dist/chunk-DDATCJ3O.cjs +75 -0
- package/dist/chunk-DDATCJ3O.cjs.map +1 -0
- package/dist/{chunk-NYQSM3EB.cjs → chunk-DVWX2UGY.cjs} +16 -2
- package/dist/chunk-DVWX2UGY.cjs.map +1 -0
- package/dist/{chunk-TZ7EM3EG.cjs → chunk-EMVZ7HWM.cjs} +44 -2
- package/dist/chunk-EMVZ7HWM.cjs.map +1 -0
- package/dist/{chunk-AD6XWKWB.js → chunk-FJZL33KP.js} +3 -3
- package/dist/{chunk-AD6XWKWB.js.map → chunk-FJZL33KP.js.map} +1 -1
- package/dist/{chunk-JHWSG5IB.js → chunk-JAOD6CNW.js} +38 -3
- package/dist/chunk-JAOD6CNW.js.map +1 -0
- package/dist/{chunk-4WOBNRRB.cjs → chunk-KTYYLZN7.cjs} +592 -8
- package/dist/chunk-KTYYLZN7.cjs.map +1 -0
- package/dist/{chunk-3HGOLNGG.cjs → chunk-NBZDBH4M.cjs} +29 -6
- package/dist/chunk-NBZDBH4M.cjs.map +1 -0
- package/dist/{chunk-5F3O3ZJH.js → chunk-P7UR37HP.js} +17 -4
- package/dist/chunk-P7UR37HP.js.map +1 -0
- package/dist/{chunk-7IFBPXT3.cjs → chunk-Q3UJEIBN.cjs} +6 -6
- package/dist/{chunk-7IFBPXT3.cjs.map → chunk-Q3UJEIBN.cjs.map} +1 -1
- package/dist/{chunk-3KSMOHNY.js → chunk-R3TYC66R.js} +46 -81
- package/dist/chunk-R3TYC66R.js.map +1 -0
- package/dist/{chunk-OU5OZKYH.cjs → chunk-Y4B45DW4.cjs} +48 -90
- package/dist/chunk-Y4B45DW4.cjs.map +1 -0
- package/dist/components.cjs +18 -18
- package/dist/components.d.cts +3 -3
- package/dist/components.d.ts +3 -3
- package/dist/components.js +7 -7
- package/dist/core.d.cts +2 -2
- package/dist/core.d.ts +2 -2
- package/dist/hooks.cjs +31 -10
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.cts +2 -2
- package/dist/hooks.d.ts +2 -2
- package/dist/hooks.js +4 -3
- package/dist/hooks.js.map +1 -1
- package/dist/i18n.d.cts +1 -1
- package/dist/i18n.d.ts +1 -1
- package/dist/index.cjs +64 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +23 -11
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +34 -11
- package/dist/styles.css +1 -1
- package/dist/theme.d.cts +1 -1
- package/dist/theme.d.ts +1 -1
- package/dist/tools.cjs +5 -5
- package/dist/tools.d.cts +2 -2
- package/dist/tools.d.ts +2 -2
- package/dist/tools.js +2 -2
- package/dist/{types-DlNwk-bG.d.ts → types-bsR_-fq8.d.cts} +43 -2
- package/dist/{types-DlNwk-bG.d.cts → types-bsR_-fq8.d.ts} +43 -2
- package/dist/ui.cjs +52 -52
- package/dist/ui.js +2 -2
- package/llms.txt +1 -1
- package/package.json +1 -1
- package/dist/chunk-3HGOLNGG.cjs.map +0 -1
- package/dist/chunk-3KSMOHNY.js.map +0 -1
- package/dist/chunk-4WOBNRRB.cjs.map +0 -1
- package/dist/chunk-5F3O3ZJH.js.map +0 -1
- package/dist/chunk-5XF7KH6B.cjs.map +0 -1
- package/dist/chunk-B27JIQ4Z.js.map +0 -1
- package/dist/chunk-BPV66QNM.cjs.map +0 -1
- package/dist/chunk-FPQ3UCCJ.js.map +0 -1
- package/dist/chunk-JHWSG5IB.js.map +0 -1
- package/dist/chunk-M4YRNNGB.js.map +0 -1
- package/dist/chunk-NYQSM3EB.cjs.map +0 -1
- package/dist/chunk-OU5OZKYH.cjs.map +0 -1
- package/dist/chunk-TZ7EM3EG.cjs.map +0 -1
- package/dist/chunk-YG2COKFR.js.map +0 -1
package/dist/components.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { a as ChatInterface } from './ChatInterface-
|
|
1
|
+
export { a as ChatInterface } from './ChatInterface-2MN5cpYB.js';
|
|
2
2
|
import * as React$1 from 'react';
|
|
3
|
+
import { a as ChatAttachmentInput, Q as QuestionConfig } from './types-bsR_-fq8.js';
|
|
3
4
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
5
|
import { FileUIPart } from 'ai';
|
|
5
|
-
import { Q as QuestionConfig } from './types-DlNwk-bG.js';
|
|
6
6
|
|
|
7
7
|
interface ChatHeaderProps {
|
|
8
8
|
isWelcome?: boolean;
|
|
@@ -18,7 +18,7 @@ declare const ChatHeader: React$1.NamedExoticComponent<ChatHeaderProps>;
|
|
|
18
18
|
interface ChatInputProps {
|
|
19
19
|
value: string;
|
|
20
20
|
onChange: (value: string) => void;
|
|
21
|
-
onSubmit: (value: string) => void;
|
|
21
|
+
onSubmit: (value: string, files?: ChatAttachmentInput[]) => void;
|
|
22
22
|
isProcessing?: boolean;
|
|
23
23
|
placeholder?: string;
|
|
24
24
|
}
|
package/dist/components.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { ChatInterface } from './chunk-
|
|
3
|
-
export { CartDrawer, ChatFooter, ChatHeader, ChatInput, ChatInterface, FloatingButton, LiveChatPanel, PreviewEmbedPanel, QuickQuestions, SystemMessage, WelcomePage } from './chunk-
|
|
4
|
-
import './chunk-
|
|
2
|
+
import { ChatInterface } from './chunk-BWWN5LSE.js';
|
|
3
|
+
export { CartDrawer, ChatFooter, ChatHeader, ChatInput, ChatInterface, FloatingButton, LiveChatPanel, PreviewEmbedPanel, QuickQuestions, SystemMessage, WelcomePage } from './chunk-BWWN5LSE.js';
|
|
4
|
+
import './chunk-P7UR37HP.js';
|
|
5
5
|
import './chunk-IU7Q7O5G.js';
|
|
6
|
-
import './chunk-
|
|
6
|
+
import './chunk-5XF3NEFB.js';
|
|
7
7
|
import './chunk-MZQKGNWF.js';
|
|
8
8
|
import { useI18n } from './chunk-QYCEHFAB.js';
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
9
|
+
import './chunk-FJZL33KP.js';
|
|
10
|
+
import './chunk-D75TDRBH.js';
|
|
11
11
|
import './chunk-PS3U7T37.js';
|
|
12
|
-
import './chunk-
|
|
12
|
+
import './chunk-JAOD6CNW.js';
|
|
13
13
|
import './chunk-4QT25AXI.js';
|
|
14
14
|
import './chunk-NPJKLYLV.js';
|
|
15
15
|
import { cn } from './chunk-3RW7O444.js';
|
package/dist/core.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
1
|
+
import { b as ChatConfig } from './types-bsR_-fq8.cjs';
|
|
2
|
+
export { a as ChatAttachmentInput, c as ChatEventCallbacks, d as ChatMessage, C as ChatProviderProps, e as ComponentAction, L as Language, f as LiveChatMessage, g as LiveChatState, Q as QuestionConfig, S as SlotMap, j as SlotProps, T as ThemeConfig, h as ToolRendererProps, i as ToolResult } from './types-bsR_-fq8.cjs';
|
|
3
3
|
import { ClassValue } from 'clsx';
|
|
4
4
|
import * as ai from 'ai';
|
|
5
5
|
export { I as InteractionMetadata, a as InteractionType, T as TrackInteractionParams, U as UseInteractionTrackerOptions, g as generateSessionId, u as useInteractionTracker } from './interaction-tracker-D9P1Oq4j.cjs';
|
package/dist/core.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
1
|
+
import { b as ChatConfig } from './types-bsR_-fq8.js';
|
|
2
|
+
export { a as ChatAttachmentInput, c as ChatEventCallbacks, d as ChatMessage, C as ChatProviderProps, e as ComponentAction, L as Language, f as LiveChatMessage, g as LiveChatState, Q as QuestionConfig, S as SlotMap, j as SlotProps, T as ThemeConfig, h as ToolRendererProps, i as ToolResult } from './types-bsR_-fq8.js';
|
|
3
3
|
import { ClassValue } from 'clsx';
|
|
4
4
|
import * as ai from 'ai';
|
|
5
5
|
export { I as InteractionMetadata, a as InteractionType, T as TrackInteractionParams, U as UseInteractionTrackerOptions, g as generateSessionId, u as useInteractionTracker } from './interaction-tracker-D9P1Oq4j.js';
|
package/dist/hooks.cjs
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkNBZDBH4M_cjs = require('./chunk-NBZDBH4M.cjs');
|
|
5
5
|
var chunkKBGPBUTI_cjs = require('./chunk-KBGPBUTI.cjs');
|
|
6
6
|
require('./chunk-NG7OTWXQ.cjs');
|
|
7
|
-
var
|
|
7
|
+
var chunkDVWX2UGY_cjs = require('./chunk-DVWX2UGY.cjs');
|
|
8
8
|
var chunkP3RPAI4F_cjs = require('./chunk-P3RPAI4F.cjs');
|
|
9
|
+
var chunkDDATCJ3O_cjs = require('./chunk-DDATCJ3O.cjs');
|
|
9
10
|
require('./chunk-X7R334SB.cjs');
|
|
10
11
|
var chunk3MP2EGEJ_cjs = require('./chunk-3MP2EGEJ.cjs');
|
|
11
|
-
var
|
|
12
|
+
var chunk52ZHMTAA_cjs = require('./chunk-52ZHMTAA.cjs');
|
|
12
13
|
var react = require('react');
|
|
13
14
|
|
|
14
15
|
function useImageLoader() {
|
|
@@ -276,43 +277,63 @@ function useMultiOrderTracking() {
|
|
|
276
277
|
|
|
277
278
|
Object.defineProperty(exports, "useAigentycChat", {
|
|
278
279
|
enumerable: true,
|
|
279
|
-
get: function () { return
|
|
280
|
+
get: function () { return chunkNBZDBH4M_cjs.useAigentycChat; }
|
|
280
281
|
});
|
|
281
282
|
Object.defineProperty(exports, "useInteractionTracker", {
|
|
282
283
|
enumerable: true,
|
|
283
284
|
get: function () { return chunkKBGPBUTI_cjs.useInteractionTracker; }
|
|
284
285
|
});
|
|
286
|
+
Object.defineProperty(exports, "useAutoResize", {
|
|
287
|
+
enumerable: true,
|
|
288
|
+
get: function () { return chunkDVWX2UGY_cjs.useAutoResize; }
|
|
289
|
+
});
|
|
285
290
|
Object.defineProperty(exports, "useIsMobile", {
|
|
286
291
|
enumerable: true,
|
|
287
|
-
get: function () { return
|
|
292
|
+
get: function () { return chunkDVWX2UGY_cjs.useIsMobile; }
|
|
288
293
|
});
|
|
289
294
|
Object.defineProperty(exports, "useLiveChat", {
|
|
290
295
|
enumerable: true,
|
|
291
|
-
get: function () { return
|
|
296
|
+
get: function () { return chunkDVWX2UGY_cjs.useLiveChat; }
|
|
292
297
|
});
|
|
293
298
|
Object.defineProperty(exports, "usePreviewEmbed", {
|
|
294
299
|
enumerable: true,
|
|
295
|
-
get: function () { return
|
|
300
|
+
get: function () { return chunkDVWX2UGY_cjs.usePreviewEmbed; }
|
|
296
301
|
});
|
|
297
302
|
Object.defineProperty(exports, "useTheme", {
|
|
298
303
|
enumerable: true,
|
|
299
304
|
get: function () { return chunkP3RPAI4F_cjs.useTheme; }
|
|
300
305
|
});
|
|
306
|
+
Object.defineProperty(exports, "LATIN", {
|
|
307
|
+
enumerable: true,
|
|
308
|
+
get: function () { return chunkDDATCJ3O_cjs.LATIN; }
|
|
309
|
+
});
|
|
310
|
+
Object.defineProperty(exports, "detectLanguage", {
|
|
311
|
+
enumerable: true,
|
|
312
|
+
get: function () { return chunkDDATCJ3O_cjs.detectLanguage; }
|
|
313
|
+
});
|
|
314
|
+
Object.defineProperty(exports, "scriptLanguageOf", {
|
|
315
|
+
enumerable: true,
|
|
316
|
+
get: function () { return chunkDDATCJ3O_cjs.scriptLanguageOf; }
|
|
317
|
+
});
|
|
318
|
+
Object.defineProperty(exports, "useKeyboardLanguage", {
|
|
319
|
+
enumerable: true,
|
|
320
|
+
get: function () { return chunkDDATCJ3O_cjs.useKeyboardLanguage; }
|
|
321
|
+
});
|
|
301
322
|
Object.defineProperty(exports, "useI18n", {
|
|
302
323
|
enumerable: true,
|
|
303
324
|
get: function () { return chunk3MP2EGEJ_cjs.useI18n; }
|
|
304
325
|
});
|
|
305
326
|
Object.defineProperty(exports, "useChatContext", {
|
|
306
327
|
enumerable: true,
|
|
307
|
-
get: function () { return
|
|
328
|
+
get: function () { return chunk52ZHMTAA_cjs.useChatContext; }
|
|
308
329
|
});
|
|
309
330
|
Object.defineProperty(exports, "useSlot", {
|
|
310
331
|
enumerable: true,
|
|
311
|
-
get: function () { return
|
|
332
|
+
get: function () { return chunk52ZHMTAA_cjs.useSlot; }
|
|
312
333
|
});
|
|
313
334
|
Object.defineProperty(exports, "useSlots", {
|
|
314
335
|
enumerable: true,
|
|
315
|
-
get: function () { return
|
|
336
|
+
get: function () { return chunk52ZHMTAA_cjs.useSlots; }
|
|
316
337
|
});
|
|
317
338
|
exports.useImageLoader = useImageLoader;
|
|
318
339
|
exports.useMultiImageLoader = useMultiImageLoader;
|
package/dist/hooks.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-image-loader.ts","../src/hooks/use-pagination.ts","../src/hooks/use-slider-drag.ts","../src/hooks/use-order-tracking.ts"],"names":["useState","useCallback","useMemo","useEffect"],"mappings":"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","file":"hooks.cjs","sourcesContent":["\"use client\";\n\nimport { useState, useCallback } from \"react\";\n\ninterface UseImageLoaderReturn {\n /** Whether the image has finished loading. */\n loaded: boolean;\n /** Callback to set loaded state to true. Pass as `onLoad` to an `<img>`. */\n onLoad: () => void;\n /** Reset loaded state to false. */\n reset: () => void;\n}\n\n/**\n * Tracks load state for a single image element.\n */\nexport function useImageLoader(): UseImageLoaderReturn {\n const [loaded, setLoaded] = useState(false);\n\n const onLoad = useCallback(() => {\n setLoaded(true);\n }, []);\n\n const reset = useCallback(() => {\n setLoaded(false);\n }, []);\n\n return { loaded, onLoad, reset };\n}\n\ninterface UseMultiImageLoaderReturn {\n /** Check if a specific image has loaded. */\n isLoaded: (key: string) => boolean;\n /** Returns a callback for the given key to mark it as loaded. */\n onLoad: (key: string) => () => void;\n /** Reset a specific image's loaded state. */\n reset: (key: string) => void;\n /** Reset all images' loaded states. */\n resetAll: () => void;\n}\n\n/**\n * Tracks load state for multiple images by key.\n */\nexport function useMultiImageLoader(): UseMultiImageLoaderReturn {\n const [loadedMap, setLoadedMap] = useState<Set<string>>(new Set());\n\n const isLoaded = useCallback(\n (key: string) => loadedMap.has(key),\n [loadedMap]\n );\n\n const onLoad = useCallback(\n (key: string) => () => {\n setLoadedMap((prev) => new Set(prev).add(key));\n },\n []\n );\n\n const reset = useCallback((key: string) => {\n setLoadedMap((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }, []);\n\n const resetAll = useCallback(() => {\n setLoadedMap(new Set());\n }, []);\n\n return { isLoaded, onLoad, reset, resetAll };\n}\n","\"use client\";\n\nimport { useState, useMemo, useCallback } from \"react\";\n\ninterface UsePaginationOptions<T> {\n /** The full list of items to paginate. */\n items: T[];\n /** Number of items per page. */\n itemsPerPage: number;\n /** Optional callback when the page changes. */\n onPageChange?: (\n direction: \"next\" | \"prev\",\n newPage: number,\n totalPages: number\n ) => void;\n}\n\ninterface UsePaginationReturn<T> {\n /** Current page index (0-based). */\n page: number;\n /** Total number of pages. */\n totalPages: number;\n /** Items for the current page. */\n currentItems: T[];\n /** Go to the next page. */\n goNext: () => void;\n /** Go to the previous page. */\n goPrev: () => void;\n /** Go to a specific page (0-based). */\n goToPage: (page: number) => void;\n /** Whether the current page is the first page. */\n isFirstPage: boolean;\n /** Whether the current page is the last page. */\n isLastPage: boolean;\n}\n\n/**\n * Generic pagination hook for any list of items.\n */\nexport function usePagination<T>({\n items,\n itemsPerPage,\n onPageChange,\n}: UsePaginationOptions<T>): UsePaginationReturn<T> {\n const [page, setPage] = useState(0);\n\n const totalPages = useMemo(\n () => Math.ceil(items.length / itemsPerPage),\n [items.length, itemsPerPage]\n );\n\n const currentItems = useMemo(\n () => items.slice(page * itemsPerPage, (page + 1) * itemsPerPage),\n [items, page, itemsPerPage]\n );\n\n const goNext = useCallback(() => {\n if (page < totalPages - 1) {\n const newPage = page + 1;\n setPage(newPage);\n onPageChange?.(\"next\", newPage, totalPages);\n }\n }, [page, totalPages, onPageChange]);\n\n const goPrev = useCallback(() => {\n if (page > 0) {\n const newPage = page - 1;\n setPage(newPage);\n onPageChange?.(\"prev\", newPage, totalPages);\n }\n }, [page, totalPages, onPageChange]);\n\n const goToPage = useCallback(\n (newPage: number) => {\n if (newPage >= 0 && newPage < totalPages) {\n const direction = newPage > page ? \"next\" : \"prev\";\n setPage(newPage);\n onPageChange?.(direction, newPage, totalPages);\n }\n },\n [page, totalPages, onPageChange]\n );\n\n const isFirstPage = page === 0;\n const isLastPage = page >= totalPages - 1;\n\n return {\n page,\n totalPages,\n currentItems,\n goNext,\n goPrev,\n goToPage,\n isFirstPage,\n isLastPage,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback, type RefObject } from \"react\";\n\ninterface UseSliderDragOptions {\n /** Ref to the container element. */\n containerRef: RefObject<HTMLDivElement | null>;\n /** Initial slider position as a percentage (0-100). Defaults to 50. */\n initialPosition?: number;\n /** Minimum allowed position. Defaults to 0. */\n minPosition?: number;\n /** Maximum allowed position. Defaults to 100. */\n maxPosition?: number;\n}\n\ninterface UseSliderDragReturn {\n /** Current slider position as a percentage (0-100). */\n sliderPosition: number;\n /** Whether the user is currently dragging. */\n isDragging: boolean;\n /** Call this on mousedown/touchstart to begin dragging. */\n handleMouseDown: () => void;\n /** Programmatically set the slider position. */\n setSliderPosition: (position: number) => void;\n}\n\n/**\n * Handles mouse and touch drag interactions for a horizontal slider.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useSliderDrag({\n containerRef,\n initialPosition = 50,\n minPosition = 0,\n maxPosition = 100,\n}: UseSliderDragOptions): UseSliderDragReturn {\n const [sliderPosition, setSliderPosition] = useState(initialPosition);\n const [isDragging, setIsDragging] = useState(false);\n\n const handleSliderMove = useCallback(\n (clientX: number) => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = clientX - rect.left;\n const percentage = Math.max(\n minPosition,\n Math.min(maxPosition, (x / rect.width) * 100)\n );\n setSliderPosition(percentage);\n },\n [containerRef, minPosition, maxPosition]\n );\n\n const handleMouseDown = useCallback(() => {\n setIsDragging(true);\n }, []);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (isDragging) {\n handleSliderMove(e.clientX);\n }\n },\n [isDragging, handleSliderMove]\n );\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n if (isDragging && e.touches[0]) {\n handleSliderMove(e.touches[0].clientX);\n }\n },\n [isDragging, handleSliderMove]\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n if (isDragging) {\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"touchmove\", handleTouchMove);\n window.addEventListener(\"touchend\", handleMouseUp);\n }\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"touchmove\", handleTouchMove);\n window.removeEventListener(\"touchend\", handleMouseUp);\n };\n }, [isDragging, handleMouseMove, handleMouseUp, handleTouchMove]);\n\n return {\n sliderPosition,\n isDragging,\n handleMouseDown,\n setSliderPosition,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\ntype OrderStatus = \"idle\" | \"pending\" | \"added\" | \"error\";\n\ninterface UseOrderTrackingOptions {\n /** Product ID to track. */\n productId?: string;\n}\n\ninterface UseOrderTrackingReturn {\n /** Current order status. */\n orderStatus: OrderStatus;\n /** Error message if status is \"error\". */\n orderError: string | null;\n /** Mark the order as pending. */\n startOrder: () => void;\n /** Reset to idle state. */\n reset: () => void;\n}\n\n/**\n * Tracks a single product order status via the `caesarstone:order-sample-complete` custom event.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useOrderTracking({\n productId,\n}: UseOrderTrackingOptions): UseOrderTrackingReturn {\n const [orderStatus, setOrderStatus] = useState<OrderStatus>(\"idle\");\n const [orderError, setOrderError] = useState<string | null>(null);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || !productId) return;\n\n const handleOrderComplete = (e: Event) => {\n const customEvent = e as CustomEvent<{\n success: boolean;\n product_id: string;\n error?: string;\n }>;\n const { success, product_id, error } = customEvent.detail || {};\n\n if (product_id === productId) {\n if (success) {\n setOrderStatus(\"added\");\n setOrderError(null);\n } else {\n setOrderStatus(\"error\");\n setOrderError(error || \"Failed to add to cart\");\n }\n }\n };\n\n window.addEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n return () => {\n window.removeEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n };\n }, [productId]);\n\n const startOrder = useCallback(() => {\n setOrderStatus(\"pending\");\n setOrderError(null);\n }, []);\n\n const reset = useCallback(() => {\n setOrderStatus(\"idle\");\n setOrderError(null);\n }, []);\n\n return { orderStatus, orderError, startOrder, reset };\n}\n\ninterface UseMultiOrderTrackingReturn {\n /** Get status for a specific product. */\n getStatus: (productId: string) => OrderStatus;\n /** Get error message for a specific product. */\n getError: (productId: string) => string | undefined;\n /** Mark a product order as pending. */\n startOrder: (productId: string) => void;\n /** Reset a specific product's order status. */\n reset: (productId: string) => void;\n /** Reset all tracked products. */\n resetAll: () => void;\n}\n\n/**\n * Tracks multiple product order statuses via the `caesarstone:order-sample-complete` custom event.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useMultiOrderTracking(): UseMultiOrderTrackingReturn {\n const [statusMap, setStatusMap] = useState<Map<string, OrderStatus>>(\n new Map()\n );\n const [errorMap, setErrorMap] = useState<Map<string, string>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const handleOrderComplete = (e: Event) => {\n const customEvent = e as CustomEvent<{\n success: boolean;\n product_id: string;\n error?: string;\n }>;\n const { success, product_id, error } = customEvent.detail || {};\n\n if (product_id) {\n if (success) {\n setStatusMap((prev) => new Map(prev).set(product_id, \"added\"));\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(product_id);\n return next;\n });\n } else {\n setStatusMap((prev) => new Map(prev).set(product_id, \"error\"));\n setErrorMap((prev) =>\n new Map(prev).set(product_id, error || \"Failed to add to cart\")\n );\n }\n }\n };\n\n window.addEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n return () => {\n window.removeEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n };\n }, []);\n\n const getStatus = useCallback(\n (productId: string) => statusMap.get(productId) || \"idle\",\n [statusMap]\n );\n\n const getError = useCallback(\n (productId: string) => errorMap.get(productId),\n [errorMap]\n );\n\n const startOrder = useCallback((productId: string) => {\n setStatusMap((prev) => new Map(prev).set(productId, \"pending\"));\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n }, []);\n\n const reset = useCallback((productId: string) => {\n setStatusMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n }, []);\n\n const resetAll = useCallback(() => {\n setStatusMap(new Map());\n setErrorMap(new Map());\n }, []);\n\n return { getStatus, getError, startOrder, reset, resetAll };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-image-loader.ts","../src/hooks/use-pagination.ts","../src/hooks/use-slider-drag.ts","../src/hooks/use-order-tracking.ts"],"names":["useState","useCallback","useMemo","useEffect"],"mappings":"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","file":"hooks.cjs","sourcesContent":["\"use client\";\n\nimport { useState, useCallback } from \"react\";\n\ninterface UseImageLoaderReturn {\n /** Whether the image has finished loading. */\n loaded: boolean;\n /** Callback to set loaded state to true. Pass as `onLoad` to an `<img>`. */\n onLoad: () => void;\n /** Reset loaded state to false. */\n reset: () => void;\n}\n\n/**\n * Tracks load state for a single image element.\n */\nexport function useImageLoader(): UseImageLoaderReturn {\n const [loaded, setLoaded] = useState(false);\n\n const onLoad = useCallback(() => {\n setLoaded(true);\n }, []);\n\n const reset = useCallback(() => {\n setLoaded(false);\n }, []);\n\n return { loaded, onLoad, reset };\n}\n\ninterface UseMultiImageLoaderReturn {\n /** Check if a specific image has loaded. */\n isLoaded: (key: string) => boolean;\n /** Returns a callback for the given key to mark it as loaded. */\n onLoad: (key: string) => () => void;\n /** Reset a specific image's loaded state. */\n reset: (key: string) => void;\n /** Reset all images' loaded states. */\n resetAll: () => void;\n}\n\n/**\n * Tracks load state for multiple images by key.\n */\nexport function useMultiImageLoader(): UseMultiImageLoaderReturn {\n const [loadedMap, setLoadedMap] = useState<Set<string>>(new Set());\n\n const isLoaded = useCallback(\n (key: string) => loadedMap.has(key),\n [loadedMap]\n );\n\n const onLoad = useCallback(\n (key: string) => () => {\n setLoadedMap((prev) => new Set(prev).add(key));\n },\n []\n );\n\n const reset = useCallback((key: string) => {\n setLoadedMap((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }, []);\n\n const resetAll = useCallback(() => {\n setLoadedMap(new Set());\n }, []);\n\n return { isLoaded, onLoad, reset, resetAll };\n}\n","\"use client\";\n\nimport { useState, useMemo, useCallback } from \"react\";\n\ninterface UsePaginationOptions<T> {\n /** The full list of items to paginate. */\n items: T[];\n /** Number of items per page. */\n itemsPerPage: number;\n /** Optional callback when the page changes. */\n onPageChange?: (\n direction: \"next\" | \"prev\",\n newPage: number,\n totalPages: number\n ) => void;\n}\n\ninterface UsePaginationReturn<T> {\n /** Current page index (0-based). */\n page: number;\n /** Total number of pages. */\n totalPages: number;\n /** Items for the current page. */\n currentItems: T[];\n /** Go to the next page. */\n goNext: () => void;\n /** Go to the previous page. */\n goPrev: () => void;\n /** Go to a specific page (0-based). */\n goToPage: (page: number) => void;\n /** Whether the current page is the first page. */\n isFirstPage: boolean;\n /** Whether the current page is the last page. */\n isLastPage: boolean;\n}\n\n/**\n * Generic pagination hook for any list of items.\n */\nexport function usePagination<T>({\n items,\n itemsPerPage,\n onPageChange,\n}: UsePaginationOptions<T>): UsePaginationReturn<T> {\n const [page, setPage] = useState(0);\n\n const totalPages = useMemo(\n () => Math.ceil(items.length / itemsPerPage),\n [items.length, itemsPerPage]\n );\n\n const currentItems = useMemo(\n () => items.slice(page * itemsPerPage, (page + 1) * itemsPerPage),\n [items, page, itemsPerPage]\n );\n\n const goNext = useCallback(() => {\n if (page < totalPages - 1) {\n const newPage = page + 1;\n setPage(newPage);\n onPageChange?.(\"next\", newPage, totalPages);\n }\n }, [page, totalPages, onPageChange]);\n\n const goPrev = useCallback(() => {\n if (page > 0) {\n const newPage = page - 1;\n setPage(newPage);\n onPageChange?.(\"prev\", newPage, totalPages);\n }\n }, [page, totalPages, onPageChange]);\n\n const goToPage = useCallback(\n (newPage: number) => {\n if (newPage >= 0 && newPage < totalPages) {\n const direction = newPage > page ? \"next\" : \"prev\";\n setPage(newPage);\n onPageChange?.(direction, newPage, totalPages);\n }\n },\n [page, totalPages, onPageChange]\n );\n\n const isFirstPage = page === 0;\n const isLastPage = page >= totalPages - 1;\n\n return {\n page,\n totalPages,\n currentItems,\n goNext,\n goPrev,\n goToPage,\n isFirstPage,\n isLastPage,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback, type RefObject } from \"react\";\n\ninterface UseSliderDragOptions {\n /** Ref to the container element. */\n containerRef: RefObject<HTMLDivElement | null>;\n /** Initial slider position as a percentage (0-100). Defaults to 50. */\n initialPosition?: number;\n /** Minimum allowed position. Defaults to 0. */\n minPosition?: number;\n /** Maximum allowed position. Defaults to 100. */\n maxPosition?: number;\n}\n\ninterface UseSliderDragReturn {\n /** Current slider position as a percentage (0-100). */\n sliderPosition: number;\n /** Whether the user is currently dragging. */\n isDragging: boolean;\n /** Call this on mousedown/touchstart to begin dragging. */\n handleMouseDown: () => void;\n /** Programmatically set the slider position. */\n setSliderPosition: (position: number) => void;\n}\n\n/**\n * Handles mouse and touch drag interactions for a horizontal slider.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useSliderDrag({\n containerRef,\n initialPosition = 50,\n minPosition = 0,\n maxPosition = 100,\n}: UseSliderDragOptions): UseSliderDragReturn {\n const [sliderPosition, setSliderPosition] = useState(initialPosition);\n const [isDragging, setIsDragging] = useState(false);\n\n const handleSliderMove = useCallback(\n (clientX: number) => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = clientX - rect.left;\n const percentage = Math.max(\n minPosition,\n Math.min(maxPosition, (x / rect.width) * 100)\n );\n setSliderPosition(percentage);\n },\n [containerRef, minPosition, maxPosition]\n );\n\n const handleMouseDown = useCallback(() => {\n setIsDragging(true);\n }, []);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (isDragging) {\n handleSliderMove(e.clientX);\n }\n },\n [isDragging, handleSliderMove]\n );\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n if (isDragging && e.touches[0]) {\n handleSliderMove(e.touches[0].clientX);\n }\n },\n [isDragging, handleSliderMove]\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n if (isDragging) {\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"touchmove\", handleTouchMove);\n window.addEventListener(\"touchend\", handleMouseUp);\n }\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"touchmove\", handleTouchMove);\n window.removeEventListener(\"touchend\", handleMouseUp);\n };\n }, [isDragging, handleMouseMove, handleMouseUp, handleTouchMove]);\n\n return {\n sliderPosition,\n isDragging,\n handleMouseDown,\n setSliderPosition,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\ntype OrderStatus = \"idle\" | \"pending\" | \"added\" | \"error\";\n\ninterface UseOrderTrackingOptions {\n /** Product ID to track. */\n productId?: string;\n}\n\ninterface UseOrderTrackingReturn {\n /** Current order status. */\n orderStatus: OrderStatus;\n /** Error message if status is \"error\". */\n orderError: string | null;\n /** Mark the order as pending. */\n startOrder: () => void;\n /** Reset to idle state. */\n reset: () => void;\n}\n\n/**\n * Tracks a single product order status via the `caesarstone:order-sample-complete` custom event.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useOrderTracking({\n productId,\n}: UseOrderTrackingOptions): UseOrderTrackingReturn {\n const [orderStatus, setOrderStatus] = useState<OrderStatus>(\"idle\");\n const [orderError, setOrderError] = useState<string | null>(null);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || !productId) return;\n\n const handleOrderComplete = (e: Event) => {\n const customEvent = e as CustomEvent<{\n success: boolean;\n product_id: string;\n error?: string;\n }>;\n const { success, product_id, error } = customEvent.detail || {};\n\n if (product_id === productId) {\n if (success) {\n setOrderStatus(\"added\");\n setOrderError(null);\n } else {\n setOrderStatus(\"error\");\n setOrderError(error || \"Failed to add to cart\");\n }\n }\n };\n\n window.addEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n return () => {\n window.removeEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n };\n }, [productId]);\n\n const startOrder = useCallback(() => {\n setOrderStatus(\"pending\");\n setOrderError(null);\n }, []);\n\n const reset = useCallback(() => {\n setOrderStatus(\"idle\");\n setOrderError(null);\n }, []);\n\n return { orderStatus, orderError, startOrder, reset };\n}\n\ninterface UseMultiOrderTrackingReturn {\n /** Get status for a specific product. */\n getStatus: (productId: string) => OrderStatus;\n /** Get error message for a specific product. */\n getError: (productId: string) => string | undefined;\n /** Mark a product order as pending. */\n startOrder: (productId: string) => void;\n /** Reset a specific product's order status. */\n reset: (productId: string) => void;\n /** Reset all tracked products. */\n resetAll: () => void;\n}\n\n/**\n * Tracks multiple product order statuses via the `caesarstone:order-sample-complete` custom event.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useMultiOrderTracking(): UseMultiOrderTrackingReturn {\n const [statusMap, setStatusMap] = useState<Map<string, OrderStatus>>(\n new Map()\n );\n const [errorMap, setErrorMap] = useState<Map<string, string>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const handleOrderComplete = (e: Event) => {\n const customEvent = e as CustomEvent<{\n success: boolean;\n product_id: string;\n error?: string;\n }>;\n const { success, product_id, error } = customEvent.detail || {};\n\n if (product_id) {\n if (success) {\n setStatusMap((prev) => new Map(prev).set(product_id, \"added\"));\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(product_id);\n return next;\n });\n } else {\n setStatusMap((prev) => new Map(prev).set(product_id, \"error\"));\n setErrorMap((prev) =>\n new Map(prev).set(product_id, error || \"Failed to add to cart\")\n );\n }\n }\n };\n\n window.addEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n return () => {\n window.removeEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n };\n }, []);\n\n const getStatus = useCallback(\n (productId: string) => statusMap.get(productId) || \"idle\",\n [statusMap]\n );\n\n const getError = useCallback(\n (productId: string) => errorMap.get(productId),\n [errorMap]\n );\n\n const startOrder = useCallback((productId: string) => {\n setStatusMap((prev) => new Map(prev).set(productId, \"pending\"));\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n }, []);\n\n const reset = useCallback((productId: string) => {\n setStatusMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n }, []);\n\n const resetAll = useCallback(() => {\n setStatusMap(new Map());\n setErrorMap(new Map());\n }, []);\n\n return { getStatus, getError, startOrder, reset, resetAll };\n}\n"]}
|
package/dist/hooks.d.cts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { L as LiveChatReturn, U as UseAigentycChatOptions,
|
|
1
|
+
export { A as AutoResizeOptions, K as KeyboardLanguageOptions, L as LATIN, a as LiveChatReturn, U as UseAigentycChatOptions, c as UseAigentycChatReturn, d as detectLanguage, s as scriptLanguageOf, u as useAigentycChat, e as useAutoResize, f as useChatContext, g as useKeyboardLanguage, h as useLiveChat, i as useSlot, j as useSlots } from './SlotsContext-D_C7zlUA.cjs';
|
|
2
2
|
export { useTheme } from './theme.cjs';
|
|
3
3
|
export { useI18n } from './i18n.cjs';
|
|
4
4
|
import { RefObject } from 'react';
|
|
5
5
|
export { u as useInteractionTracker } from './interaction-tracker-D9P1Oq4j.cjs';
|
|
6
|
-
import './types-
|
|
6
|
+
import './types-bsR_-fq8.cjs';
|
|
7
7
|
import 'react/jsx-runtime';
|
|
8
8
|
|
|
9
9
|
/** Information about a preview to display in an embedded panel. */
|
package/dist/hooks.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { L as LiveChatReturn, U as UseAigentycChatOptions,
|
|
1
|
+
export { A as AutoResizeOptions, K as KeyboardLanguageOptions, L as LATIN, a as LiveChatReturn, U as UseAigentycChatOptions, c as UseAigentycChatReturn, d as detectLanguage, s as scriptLanguageOf, u as useAigentycChat, e as useAutoResize, f as useChatContext, g as useKeyboardLanguage, h as useLiveChat, i as useSlot, j as useSlots } from './SlotsContext-BZBi51ZT.js';
|
|
2
2
|
export { useTheme } from './theme.js';
|
|
3
3
|
export { useI18n } from './i18n.js';
|
|
4
4
|
import { RefObject } from 'react';
|
|
5
5
|
export { u as useInteractionTracker } from './interaction-tracker-D9P1Oq4j.js';
|
|
6
|
-
import './types-
|
|
6
|
+
import './types-bsR_-fq8.js';
|
|
7
7
|
import 'react/jsx-runtime';
|
|
8
8
|
|
|
9
9
|
/** Information about a preview to display in an embedded panel. */
|
package/dist/hooks.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export { useAigentycChat } from './chunk-
|
|
2
|
+
export { useAigentycChat } from './chunk-3H4CX3MS.js';
|
|
3
3
|
export { useInteractionTracker } from './chunk-MT2AMINB.js';
|
|
4
4
|
import './chunk-BKDV2H6Z.js';
|
|
5
|
-
export { useIsMobile, useLiveChat, usePreviewEmbed } from './chunk-
|
|
5
|
+
export { useAutoResize, useIsMobile, useLiveChat, usePreviewEmbed } from './chunk-P7UR37HP.js';
|
|
6
6
|
export { useTheme } from './chunk-IU7Q7O5G.js';
|
|
7
|
+
export { LATIN, detectLanguage, scriptLanguageOf, useKeyboardLanguage } from './chunk-BYTPAQ7F.js';
|
|
7
8
|
import './chunk-MZQKGNWF.js';
|
|
8
9
|
export { useI18n } from './chunk-QYCEHFAB.js';
|
|
9
|
-
export { useChatContext, useSlot, useSlots } from './chunk-
|
|
10
|
+
export { useChatContext, useSlot, useSlots } from './chunk-D75TDRBH.js';
|
|
10
11
|
import { useState, useCallback, useMemo, useEffect } from 'react';
|
|
11
12
|
|
|
12
13
|
function useImageLoader() {
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-image-loader.ts","../src/hooks/use-pagination.ts","../src/hooks/use-slider-drag.ts","../src/hooks/use-order-tracking.ts"],"names":["useState","useCallback","useEffect"],"mappings":"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","file":"hooks.js","sourcesContent":["\"use client\";\n\nimport { useState, useCallback } from \"react\";\n\ninterface UseImageLoaderReturn {\n /** Whether the image has finished loading. */\n loaded: boolean;\n /** Callback to set loaded state to true. Pass as `onLoad` to an `<img>`. */\n onLoad: () => void;\n /** Reset loaded state to false. */\n reset: () => void;\n}\n\n/**\n * Tracks load state for a single image element.\n */\nexport function useImageLoader(): UseImageLoaderReturn {\n const [loaded, setLoaded] = useState(false);\n\n const onLoad = useCallback(() => {\n setLoaded(true);\n }, []);\n\n const reset = useCallback(() => {\n setLoaded(false);\n }, []);\n\n return { loaded, onLoad, reset };\n}\n\ninterface UseMultiImageLoaderReturn {\n /** Check if a specific image has loaded. */\n isLoaded: (key: string) => boolean;\n /** Returns a callback for the given key to mark it as loaded. */\n onLoad: (key: string) => () => void;\n /** Reset a specific image's loaded state. */\n reset: (key: string) => void;\n /** Reset all images' loaded states. */\n resetAll: () => void;\n}\n\n/**\n * Tracks load state for multiple images by key.\n */\nexport function useMultiImageLoader(): UseMultiImageLoaderReturn {\n const [loadedMap, setLoadedMap] = useState<Set<string>>(new Set());\n\n const isLoaded = useCallback(\n (key: string) => loadedMap.has(key),\n [loadedMap]\n );\n\n const onLoad = useCallback(\n (key: string) => () => {\n setLoadedMap((prev) => new Set(prev).add(key));\n },\n []\n );\n\n const reset = useCallback((key: string) => {\n setLoadedMap((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }, []);\n\n const resetAll = useCallback(() => {\n setLoadedMap(new Set());\n }, []);\n\n return { isLoaded, onLoad, reset, resetAll };\n}\n","\"use client\";\n\nimport { useState, useMemo, useCallback } from \"react\";\n\ninterface UsePaginationOptions<T> {\n /** The full list of items to paginate. */\n items: T[];\n /** Number of items per page. */\n itemsPerPage: number;\n /** Optional callback when the page changes. */\n onPageChange?: (\n direction: \"next\" | \"prev\",\n newPage: number,\n totalPages: number\n ) => void;\n}\n\ninterface UsePaginationReturn<T> {\n /** Current page index (0-based). */\n page: number;\n /** Total number of pages. */\n totalPages: number;\n /** Items for the current page. */\n currentItems: T[];\n /** Go to the next page. */\n goNext: () => void;\n /** Go to the previous page. */\n goPrev: () => void;\n /** Go to a specific page (0-based). */\n goToPage: (page: number) => void;\n /** Whether the current page is the first page. */\n isFirstPage: boolean;\n /** Whether the current page is the last page. */\n isLastPage: boolean;\n}\n\n/**\n * Generic pagination hook for any list of items.\n */\nexport function usePagination<T>({\n items,\n itemsPerPage,\n onPageChange,\n}: UsePaginationOptions<T>): UsePaginationReturn<T> {\n const [page, setPage] = useState(0);\n\n const totalPages = useMemo(\n () => Math.ceil(items.length / itemsPerPage),\n [items.length, itemsPerPage]\n );\n\n const currentItems = useMemo(\n () => items.slice(page * itemsPerPage, (page + 1) * itemsPerPage),\n [items, page, itemsPerPage]\n );\n\n const goNext = useCallback(() => {\n if (page < totalPages - 1) {\n const newPage = page + 1;\n setPage(newPage);\n onPageChange?.(\"next\", newPage, totalPages);\n }\n }, [page, totalPages, onPageChange]);\n\n const goPrev = useCallback(() => {\n if (page > 0) {\n const newPage = page - 1;\n setPage(newPage);\n onPageChange?.(\"prev\", newPage, totalPages);\n }\n }, [page, totalPages, onPageChange]);\n\n const goToPage = useCallback(\n (newPage: number) => {\n if (newPage >= 0 && newPage < totalPages) {\n const direction = newPage > page ? \"next\" : \"prev\";\n setPage(newPage);\n onPageChange?.(direction, newPage, totalPages);\n }\n },\n [page, totalPages, onPageChange]\n );\n\n const isFirstPage = page === 0;\n const isLastPage = page >= totalPages - 1;\n\n return {\n page,\n totalPages,\n currentItems,\n goNext,\n goPrev,\n goToPage,\n isFirstPage,\n isLastPage,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback, type RefObject } from \"react\";\n\ninterface UseSliderDragOptions {\n /** Ref to the container element. */\n containerRef: RefObject<HTMLDivElement | null>;\n /** Initial slider position as a percentage (0-100). Defaults to 50. */\n initialPosition?: number;\n /** Minimum allowed position. Defaults to 0. */\n minPosition?: number;\n /** Maximum allowed position. Defaults to 100. */\n maxPosition?: number;\n}\n\ninterface UseSliderDragReturn {\n /** Current slider position as a percentage (0-100). */\n sliderPosition: number;\n /** Whether the user is currently dragging. */\n isDragging: boolean;\n /** Call this on mousedown/touchstart to begin dragging. */\n handleMouseDown: () => void;\n /** Programmatically set the slider position. */\n setSliderPosition: (position: number) => void;\n}\n\n/**\n * Handles mouse and touch drag interactions for a horizontal slider.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useSliderDrag({\n containerRef,\n initialPosition = 50,\n minPosition = 0,\n maxPosition = 100,\n}: UseSliderDragOptions): UseSliderDragReturn {\n const [sliderPosition, setSliderPosition] = useState(initialPosition);\n const [isDragging, setIsDragging] = useState(false);\n\n const handleSliderMove = useCallback(\n (clientX: number) => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = clientX - rect.left;\n const percentage = Math.max(\n minPosition,\n Math.min(maxPosition, (x / rect.width) * 100)\n );\n setSliderPosition(percentage);\n },\n [containerRef, minPosition, maxPosition]\n );\n\n const handleMouseDown = useCallback(() => {\n setIsDragging(true);\n }, []);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (isDragging) {\n handleSliderMove(e.clientX);\n }\n },\n [isDragging, handleSliderMove]\n );\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n if (isDragging && e.touches[0]) {\n handleSliderMove(e.touches[0].clientX);\n }\n },\n [isDragging, handleSliderMove]\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n if (isDragging) {\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"touchmove\", handleTouchMove);\n window.addEventListener(\"touchend\", handleMouseUp);\n }\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"touchmove\", handleTouchMove);\n window.removeEventListener(\"touchend\", handleMouseUp);\n };\n }, [isDragging, handleMouseMove, handleMouseUp, handleTouchMove]);\n\n return {\n sliderPosition,\n isDragging,\n handleMouseDown,\n setSliderPosition,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\ntype OrderStatus = \"idle\" | \"pending\" | \"added\" | \"error\";\n\ninterface UseOrderTrackingOptions {\n /** Product ID to track. */\n productId?: string;\n}\n\ninterface UseOrderTrackingReturn {\n /** Current order status. */\n orderStatus: OrderStatus;\n /** Error message if status is \"error\". */\n orderError: string | null;\n /** Mark the order as pending. */\n startOrder: () => void;\n /** Reset to idle state. */\n reset: () => void;\n}\n\n/**\n * Tracks a single product order status via the `caesarstone:order-sample-complete` custom event.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useOrderTracking({\n productId,\n}: UseOrderTrackingOptions): UseOrderTrackingReturn {\n const [orderStatus, setOrderStatus] = useState<OrderStatus>(\"idle\");\n const [orderError, setOrderError] = useState<string | null>(null);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || !productId) return;\n\n const handleOrderComplete = (e: Event) => {\n const customEvent = e as CustomEvent<{\n success: boolean;\n product_id: string;\n error?: string;\n }>;\n const { success, product_id, error } = customEvent.detail || {};\n\n if (product_id === productId) {\n if (success) {\n setOrderStatus(\"added\");\n setOrderError(null);\n } else {\n setOrderStatus(\"error\");\n setOrderError(error || \"Failed to add to cart\");\n }\n }\n };\n\n window.addEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n return () => {\n window.removeEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n };\n }, [productId]);\n\n const startOrder = useCallback(() => {\n setOrderStatus(\"pending\");\n setOrderError(null);\n }, []);\n\n const reset = useCallback(() => {\n setOrderStatus(\"idle\");\n setOrderError(null);\n }, []);\n\n return { orderStatus, orderError, startOrder, reset };\n}\n\ninterface UseMultiOrderTrackingReturn {\n /** Get status for a specific product. */\n getStatus: (productId: string) => OrderStatus;\n /** Get error message for a specific product. */\n getError: (productId: string) => string | undefined;\n /** Mark a product order as pending. */\n startOrder: (productId: string) => void;\n /** Reset a specific product's order status. */\n reset: (productId: string) => void;\n /** Reset all tracked products. */\n resetAll: () => void;\n}\n\n/**\n * Tracks multiple product order statuses via the `caesarstone:order-sample-complete` custom event.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useMultiOrderTracking(): UseMultiOrderTrackingReturn {\n const [statusMap, setStatusMap] = useState<Map<string, OrderStatus>>(\n new Map()\n );\n const [errorMap, setErrorMap] = useState<Map<string, string>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const handleOrderComplete = (e: Event) => {\n const customEvent = e as CustomEvent<{\n success: boolean;\n product_id: string;\n error?: string;\n }>;\n const { success, product_id, error } = customEvent.detail || {};\n\n if (product_id) {\n if (success) {\n setStatusMap((prev) => new Map(prev).set(product_id, \"added\"));\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(product_id);\n return next;\n });\n } else {\n setStatusMap((prev) => new Map(prev).set(product_id, \"error\"));\n setErrorMap((prev) =>\n new Map(prev).set(product_id, error || \"Failed to add to cart\")\n );\n }\n }\n };\n\n window.addEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n return () => {\n window.removeEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n };\n }, []);\n\n const getStatus = useCallback(\n (productId: string) => statusMap.get(productId) || \"idle\",\n [statusMap]\n );\n\n const getError = useCallback(\n (productId: string) => errorMap.get(productId),\n [errorMap]\n );\n\n const startOrder = useCallback((productId: string) => {\n setStatusMap((prev) => new Map(prev).set(productId, \"pending\"));\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n }, []);\n\n const reset = useCallback((productId: string) => {\n setStatusMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n }, []);\n\n const resetAll = useCallback(() => {\n setStatusMap(new Map());\n setErrorMap(new Map());\n }, []);\n\n return { getStatus, getError, startOrder, reset, resetAll };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-image-loader.ts","../src/hooks/use-pagination.ts","../src/hooks/use-slider-drag.ts","../src/hooks/use-order-tracking.ts"],"names":["useState","useCallback","useEffect"],"mappings":"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","file":"hooks.js","sourcesContent":["\"use client\";\n\nimport { useState, useCallback } from \"react\";\n\ninterface UseImageLoaderReturn {\n /** Whether the image has finished loading. */\n loaded: boolean;\n /** Callback to set loaded state to true. Pass as `onLoad` to an `<img>`. */\n onLoad: () => void;\n /** Reset loaded state to false. */\n reset: () => void;\n}\n\n/**\n * Tracks load state for a single image element.\n */\nexport function useImageLoader(): UseImageLoaderReturn {\n const [loaded, setLoaded] = useState(false);\n\n const onLoad = useCallback(() => {\n setLoaded(true);\n }, []);\n\n const reset = useCallback(() => {\n setLoaded(false);\n }, []);\n\n return { loaded, onLoad, reset };\n}\n\ninterface UseMultiImageLoaderReturn {\n /** Check if a specific image has loaded. */\n isLoaded: (key: string) => boolean;\n /** Returns a callback for the given key to mark it as loaded. */\n onLoad: (key: string) => () => void;\n /** Reset a specific image's loaded state. */\n reset: (key: string) => void;\n /** Reset all images' loaded states. */\n resetAll: () => void;\n}\n\n/**\n * Tracks load state for multiple images by key.\n */\nexport function useMultiImageLoader(): UseMultiImageLoaderReturn {\n const [loadedMap, setLoadedMap] = useState<Set<string>>(new Set());\n\n const isLoaded = useCallback(\n (key: string) => loadedMap.has(key),\n [loadedMap]\n );\n\n const onLoad = useCallback(\n (key: string) => () => {\n setLoadedMap((prev) => new Set(prev).add(key));\n },\n []\n );\n\n const reset = useCallback((key: string) => {\n setLoadedMap((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }, []);\n\n const resetAll = useCallback(() => {\n setLoadedMap(new Set());\n }, []);\n\n return { isLoaded, onLoad, reset, resetAll };\n}\n","\"use client\";\n\nimport { useState, useMemo, useCallback } from \"react\";\n\ninterface UsePaginationOptions<T> {\n /** The full list of items to paginate. */\n items: T[];\n /** Number of items per page. */\n itemsPerPage: number;\n /** Optional callback when the page changes. */\n onPageChange?: (\n direction: \"next\" | \"prev\",\n newPage: number,\n totalPages: number\n ) => void;\n}\n\ninterface UsePaginationReturn<T> {\n /** Current page index (0-based). */\n page: number;\n /** Total number of pages. */\n totalPages: number;\n /** Items for the current page. */\n currentItems: T[];\n /** Go to the next page. */\n goNext: () => void;\n /** Go to the previous page. */\n goPrev: () => void;\n /** Go to a specific page (0-based). */\n goToPage: (page: number) => void;\n /** Whether the current page is the first page. */\n isFirstPage: boolean;\n /** Whether the current page is the last page. */\n isLastPage: boolean;\n}\n\n/**\n * Generic pagination hook for any list of items.\n */\nexport function usePagination<T>({\n items,\n itemsPerPage,\n onPageChange,\n}: UsePaginationOptions<T>): UsePaginationReturn<T> {\n const [page, setPage] = useState(0);\n\n const totalPages = useMemo(\n () => Math.ceil(items.length / itemsPerPage),\n [items.length, itemsPerPage]\n );\n\n const currentItems = useMemo(\n () => items.slice(page * itemsPerPage, (page + 1) * itemsPerPage),\n [items, page, itemsPerPage]\n );\n\n const goNext = useCallback(() => {\n if (page < totalPages - 1) {\n const newPage = page + 1;\n setPage(newPage);\n onPageChange?.(\"next\", newPage, totalPages);\n }\n }, [page, totalPages, onPageChange]);\n\n const goPrev = useCallback(() => {\n if (page > 0) {\n const newPage = page - 1;\n setPage(newPage);\n onPageChange?.(\"prev\", newPage, totalPages);\n }\n }, [page, totalPages, onPageChange]);\n\n const goToPage = useCallback(\n (newPage: number) => {\n if (newPage >= 0 && newPage < totalPages) {\n const direction = newPage > page ? \"next\" : \"prev\";\n setPage(newPage);\n onPageChange?.(direction, newPage, totalPages);\n }\n },\n [page, totalPages, onPageChange]\n );\n\n const isFirstPage = page === 0;\n const isLastPage = page >= totalPages - 1;\n\n return {\n page,\n totalPages,\n currentItems,\n goNext,\n goPrev,\n goToPage,\n isFirstPage,\n isLastPage,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback, type RefObject } from \"react\";\n\ninterface UseSliderDragOptions {\n /** Ref to the container element. */\n containerRef: RefObject<HTMLDivElement | null>;\n /** Initial slider position as a percentage (0-100). Defaults to 50. */\n initialPosition?: number;\n /** Minimum allowed position. Defaults to 0. */\n minPosition?: number;\n /** Maximum allowed position. Defaults to 100. */\n maxPosition?: number;\n}\n\ninterface UseSliderDragReturn {\n /** Current slider position as a percentage (0-100). */\n sliderPosition: number;\n /** Whether the user is currently dragging. */\n isDragging: boolean;\n /** Call this on mousedown/touchstart to begin dragging. */\n handleMouseDown: () => void;\n /** Programmatically set the slider position. */\n setSliderPosition: (position: number) => void;\n}\n\n/**\n * Handles mouse and touch drag interactions for a horizontal slider.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useSliderDrag({\n containerRef,\n initialPosition = 50,\n minPosition = 0,\n maxPosition = 100,\n}: UseSliderDragOptions): UseSliderDragReturn {\n const [sliderPosition, setSliderPosition] = useState(initialPosition);\n const [isDragging, setIsDragging] = useState(false);\n\n const handleSliderMove = useCallback(\n (clientX: number) => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = clientX - rect.left;\n const percentage = Math.max(\n minPosition,\n Math.min(maxPosition, (x / rect.width) * 100)\n );\n setSliderPosition(percentage);\n },\n [containerRef, minPosition, maxPosition]\n );\n\n const handleMouseDown = useCallback(() => {\n setIsDragging(true);\n }, []);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (isDragging) {\n handleSliderMove(e.clientX);\n }\n },\n [isDragging, handleSliderMove]\n );\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n if (isDragging && e.touches[0]) {\n handleSliderMove(e.touches[0].clientX);\n }\n },\n [isDragging, handleSliderMove]\n );\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n if (isDragging) {\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"touchmove\", handleTouchMove);\n window.addEventListener(\"touchend\", handleMouseUp);\n }\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"touchmove\", handleTouchMove);\n window.removeEventListener(\"touchend\", handleMouseUp);\n };\n }, [isDragging, handleMouseMove, handleMouseUp, handleTouchMove]);\n\n return {\n sliderPosition,\n isDragging,\n handleMouseDown,\n setSliderPosition,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\ntype OrderStatus = \"idle\" | \"pending\" | \"added\" | \"error\";\n\ninterface UseOrderTrackingOptions {\n /** Product ID to track. */\n productId?: string;\n}\n\ninterface UseOrderTrackingReturn {\n /** Current order status. */\n orderStatus: OrderStatus;\n /** Error message if status is \"error\". */\n orderError: string | null;\n /** Mark the order as pending. */\n startOrder: () => void;\n /** Reset to idle state. */\n reset: () => void;\n}\n\n/**\n * Tracks a single product order status via the `caesarstone:order-sample-complete` custom event.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useOrderTracking({\n productId,\n}: UseOrderTrackingOptions): UseOrderTrackingReturn {\n const [orderStatus, setOrderStatus] = useState<OrderStatus>(\"idle\");\n const [orderError, setOrderError] = useState<string | null>(null);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || !productId) return;\n\n const handleOrderComplete = (e: Event) => {\n const customEvent = e as CustomEvent<{\n success: boolean;\n product_id: string;\n error?: string;\n }>;\n const { success, product_id, error } = customEvent.detail || {};\n\n if (product_id === productId) {\n if (success) {\n setOrderStatus(\"added\");\n setOrderError(null);\n } else {\n setOrderStatus(\"error\");\n setOrderError(error || \"Failed to add to cart\");\n }\n }\n };\n\n window.addEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n return () => {\n window.removeEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n };\n }, [productId]);\n\n const startOrder = useCallback(() => {\n setOrderStatus(\"pending\");\n setOrderError(null);\n }, []);\n\n const reset = useCallback(() => {\n setOrderStatus(\"idle\");\n setOrderError(null);\n }, []);\n\n return { orderStatus, orderError, startOrder, reset };\n}\n\ninterface UseMultiOrderTrackingReturn {\n /** Get status for a specific product. */\n getStatus: (productId: string) => OrderStatus;\n /** Get error message for a specific product. */\n getError: (productId: string) => string | undefined;\n /** Mark a product order as pending. */\n startOrder: (productId: string) => void;\n /** Reset a specific product's order status. */\n reset: (productId: string) => void;\n /** Reset all tracked products. */\n resetAll: () => void;\n}\n\n/**\n * Tracks multiple product order statuses via the `caesarstone:order-sample-complete` custom event.\n * SSR-safe: event listeners are only attached in the browser.\n */\nexport function useMultiOrderTracking(): UseMultiOrderTrackingReturn {\n const [statusMap, setStatusMap] = useState<Map<string, OrderStatus>>(\n new Map()\n );\n const [errorMap, setErrorMap] = useState<Map<string, string>>(new Map());\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const handleOrderComplete = (e: Event) => {\n const customEvent = e as CustomEvent<{\n success: boolean;\n product_id: string;\n error?: string;\n }>;\n const { success, product_id, error } = customEvent.detail || {};\n\n if (product_id) {\n if (success) {\n setStatusMap((prev) => new Map(prev).set(product_id, \"added\"));\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(product_id);\n return next;\n });\n } else {\n setStatusMap((prev) => new Map(prev).set(product_id, \"error\"));\n setErrorMap((prev) =>\n new Map(prev).set(product_id, error || \"Failed to add to cart\")\n );\n }\n }\n };\n\n window.addEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n return () => {\n window.removeEventListener(\n \"caesarstone:order-sample-complete\",\n handleOrderComplete\n );\n };\n }, []);\n\n const getStatus = useCallback(\n (productId: string) => statusMap.get(productId) || \"idle\",\n [statusMap]\n );\n\n const getError = useCallback(\n (productId: string) => errorMap.get(productId),\n [errorMap]\n );\n\n const startOrder = useCallback((productId: string) => {\n setStatusMap((prev) => new Map(prev).set(productId, \"pending\"));\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n }, []);\n\n const reset = useCallback((productId: string) => {\n setStatusMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n setErrorMap((prev) => {\n const next = new Map(prev);\n next.delete(productId);\n return next;\n });\n }, []);\n\n const resetAll = useCallback(() => {\n setStatusMap(new Map());\n setErrorMap(new Map());\n }, []);\n\n return { getStatus, getError, startOrder, reset, resetAll };\n}\n"]}
|
package/dist/i18n.d.cts
CHANGED
package/dist/i18n.d.ts
CHANGED