@khvavuong/ezchat 1.1.15 → 1.1.17

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ezchat.umd.js","sources":["../node_modules/solid-js/dist/solid.js","../node_modules/solid-js/web/dist/web.js","../src/assets/icons/icon-chat-button.svg","../src/assets/icons/icon-more-infor.svg","../src/assets/icons/icon-expand.svg","../src/assets/icons/icon-shrink.svg","../src/assets/icons/icon-minimize.svg","../src/assets/icons/icon-close.svg","../src/assets/icons/icon-add-item.svg","../src/assets/icons/icon-send-message.svg","../src/assets/icons/icon-sidebar-active.svg","../src/assets/icons/icon-user.svg","../src/assets/icons/icon-trending.svg","../src/assets/icons/icon-add-conversation.svg","../src/assets/icons/icon-search.svg","../src/assets/icons/icon-menu-dot.svg","../src/assets/icons/icon-micro.svg","../src/assets/icons/icon-edit.svg","../src/assets/icons/icon-delete.svg","../src/assets/icons/icon-send-active.svg","../src/assets/icons/icon-like.svg","../src/assets/icons/icon-dislike.svg","../src/assets/icons/icon-like-active.svg","../src/assets/icons/icon-dislike-active.svg","../src/assets/icons/icon-check.svg","../src/components/SurveyMessage/SurveyMessage.tsx","../src/modules/ChatMessages/ChatMessages.tsx","../src/modules/ChatInput/ChatInput.tsx","../src/components/Sidebar/Siderbar.tsx","../src/components/ChatActionButton/ChatActionButton.tsx","../src/components/HeaderSteps/HeaderSteps.tsx","../src/data-provider/services/message-service.ts","../src/RemoteRepository.ts","../src/modules/ChatPopup/ChatPopup.tsx","../src/index.tsx"],"sourcesContent":["let taskIdCounter = 1,\n isCallbackScheduled = false,\n isPerformingWork = false,\n taskQueue = [],\n currentTask = null,\n shouldYieldToHost = null,\n yieldInterval = 5,\n deadline = 0,\n maxYieldInterval = 300,\n maxDeadline = 0,\n scheduleCallback = null,\n scheduledCallback = null;\nconst maxSigned31BitInt = 1073741823;\nfunction setupScheduler() {\n const channel = new MessageChannel(),\n port = channel.port2;\n scheduleCallback = () => port.postMessage(null);\n channel.port1.onmessage = () => {\n if (scheduledCallback !== null) {\n const currentTime = performance.now();\n deadline = currentTime + yieldInterval;\n maxDeadline = currentTime + maxYieldInterval;\n try {\n const hasMoreWork = scheduledCallback(currentTime);\n if (!hasMoreWork) {\n scheduledCallback = null;\n } else port.postMessage(null);\n } catch (error) {\n port.postMessage(null);\n throw error;\n }\n }\n };\n if (navigator && navigator.scheduling && navigator.scheduling.isInputPending) {\n const scheduling = navigator.scheduling;\n shouldYieldToHost = () => {\n const currentTime = performance.now();\n if (currentTime >= deadline) {\n if (scheduling.isInputPending()) {\n return true;\n }\n return currentTime >= maxDeadline;\n } else {\n return false;\n }\n };\n } else {\n shouldYieldToHost = () => performance.now() >= deadline;\n }\n}\nfunction enqueue(taskQueue, task) {\n function findIndex() {\n let m = 0;\n let n = taskQueue.length - 1;\n while (m <= n) {\n const k = n + m >> 1;\n const cmp = task.expirationTime - taskQueue[k].expirationTime;\n if (cmp > 0) m = k + 1;else if (cmp < 0) n = k - 1;else return k;\n }\n return m;\n }\n taskQueue.splice(findIndex(), 0, task);\n}\nfunction requestCallback(fn, options) {\n if (!scheduleCallback) setupScheduler();\n let startTime = performance.now(),\n timeout = maxSigned31BitInt;\n if (options && options.timeout) timeout = options.timeout;\n const newTask = {\n id: taskIdCounter++,\n fn,\n startTime,\n expirationTime: startTime + timeout\n };\n enqueue(taskQueue, newTask);\n if (!isCallbackScheduled && !isPerformingWork) {\n isCallbackScheduled = true;\n scheduledCallback = flushWork;\n scheduleCallback();\n }\n return newTask;\n}\nfunction cancelCallback(task) {\n task.fn = null;\n}\nfunction flushWork(initialTime) {\n isCallbackScheduled = false;\n isPerformingWork = true;\n try {\n return workLoop(initialTime);\n } finally {\n currentTask = null;\n isPerformingWork = false;\n }\n}\nfunction workLoop(initialTime) {\n let currentTime = initialTime;\n currentTask = taskQueue[0] || null;\n while (currentTask !== null) {\n if (currentTask.expirationTime > currentTime && shouldYieldToHost()) {\n break;\n }\n const callback = currentTask.fn;\n if (callback !== null) {\n currentTask.fn = null;\n const didUserCallbackTimeout = currentTask.expirationTime <= currentTime;\n callback(didUserCallbackTimeout);\n currentTime = performance.now();\n if (currentTask === taskQueue[0]) {\n taskQueue.shift();\n }\n } else taskQueue.shift();\n currentTask = taskQueue[0] || null;\n }\n return currentTask !== null;\n}\n\nconst sharedConfig = {\n context: undefined,\n registry: undefined,\n effects: undefined,\n done: false,\n getContextId() {\n return getContextId(this.context.count);\n },\n getNextContextId() {\n return getContextId(this.context.count++);\n }\n};\nfunction getContextId(count) {\n const num = String(count),\n len = num.length - 1;\n return sharedConfig.context.id + (len ? String.fromCharCode(96 + len) : \"\") + num;\n}\nfunction setHydrateContext(context) {\n sharedConfig.context = context;\n}\nfunction nextHydrateContext() {\n return {\n ...sharedConfig.context,\n id: sharedConfig.getNextContextId(),\n count: 0\n };\n}\n\nconst IS_DEV = false;\nconst equalFn = (a, b) => a === b;\nconst $PROXY = Symbol(\"solid-proxy\");\nconst SUPPORTS_PROXY = typeof Proxy === \"function\";\nconst $TRACK = Symbol(\"solid-track\");\nconst $DEVCOMP = Symbol(\"solid-dev-component\");\nconst signalOptions = {\n equals: equalFn\n};\nlet ERROR = null;\nlet runEffects = runQueue;\nconst STALE = 1;\nconst PENDING = 2;\nconst UNOWNED = {\n owned: null,\n cleanups: null,\n context: null,\n owner: null\n};\nconst NO_INIT = {};\nvar Owner = null;\nlet Transition = null;\nlet Scheduler = null;\nlet ExternalSourceConfig = null;\nlet Listener = null;\nlet Updates = null;\nlet Effects = null;\nlet ExecCount = 0;\nfunction createRoot(fn, detachedOwner) {\n const listener = Listener,\n owner = Owner,\n unowned = fn.length === 0,\n current = detachedOwner === undefined ? owner : detachedOwner,\n root = unowned ? UNOWNED : {\n owned: null,\n cleanups: null,\n context: current ? current.context : null,\n owner: current\n },\n updateFn = unowned ? fn : () => fn(() => untrack(() => cleanNode(root)));\n Owner = root;\n Listener = null;\n try {\n return runUpdates(updateFn, true);\n } finally {\n Listener = listener;\n Owner = owner;\n }\n}\nfunction createSignal(value, options) {\n options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n const s = {\n value,\n observers: null,\n observerSlots: null,\n comparator: options.equals || undefined\n };\n const setter = value => {\n if (typeof value === \"function\") {\n if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue);else value = value(s.value);\n }\n return writeSignal(s, value);\n };\n return [readSignal.bind(s), setter];\n}\nfunction createComputed(fn, value, options) {\n const c = createComputation(fn, value, true, STALE);\n if (Scheduler && Transition && Transition.running) Updates.push(c);else updateComputation(c);\n}\nfunction createRenderEffect(fn, value, options) {\n const c = createComputation(fn, value, false, STALE);\n if (Scheduler && Transition && Transition.running) Updates.push(c);else updateComputation(c);\n}\nfunction createEffect(fn, value, options) {\n runEffects = runUserEffects;\n const c = createComputation(fn, value, false, STALE),\n s = SuspenseContext && useContext(SuspenseContext);\n if (s) c.suspense = s;\n if (!options || !options.render) c.user = true;\n Effects ? Effects.push(c) : updateComputation(c);\n}\nfunction createReaction(onInvalidate, options) {\n let fn;\n const c = createComputation(() => {\n fn ? fn() : untrack(onInvalidate);\n fn = undefined;\n }, undefined, false, 0),\n s = SuspenseContext && useContext(SuspenseContext);\n if (s) c.suspense = s;\n c.user = true;\n return tracking => {\n fn = tracking;\n updateComputation(c);\n };\n}\nfunction createMemo(fn, value, options) {\n options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n const c = createComputation(fn, value, true, 0);\n c.observers = null;\n c.observerSlots = null;\n c.comparator = options.equals || undefined;\n if (Scheduler && Transition && Transition.running) {\n c.tState = STALE;\n Updates.push(c);\n } else updateComputation(c);\n return readSignal.bind(c);\n}\nfunction isPromise(v) {\n return v && typeof v === \"object\" && \"then\" in v;\n}\nfunction createResource(pSource, pFetcher, pOptions) {\n let source;\n let fetcher;\n let options;\n if (typeof pFetcher === \"function\") {\n source = pSource;\n fetcher = pFetcher;\n options = pOptions || {};\n } else {\n source = true;\n fetcher = pSource;\n options = pFetcher || {};\n }\n let pr = null,\n initP = NO_INIT,\n id = null,\n loadedUnderTransition = false,\n scheduled = false,\n resolved = \"initialValue\" in options,\n dynamic = typeof source === \"function\" && createMemo(source);\n const contexts = new Set(),\n [value, setValue] = (options.storage || createSignal)(options.initialValue),\n [error, setError] = createSignal(undefined),\n [track, trigger] = createSignal(undefined, {\n equals: false\n }),\n [state, setState] = createSignal(resolved ? \"ready\" : \"unresolved\");\n if (sharedConfig.context) {\n id = sharedConfig.getNextContextId();\n if (options.ssrLoadFrom === \"initial\") initP = options.initialValue;else if (sharedConfig.load && sharedConfig.has(id)) initP = sharedConfig.load(id);\n }\n function loadEnd(p, v, error, key) {\n if (pr === p) {\n pr = null;\n key !== undefined && (resolved = true);\n if ((p === initP || v === initP) && options.onHydrated) queueMicrotask(() => options.onHydrated(key, {\n value: v\n }));\n initP = NO_INIT;\n if (Transition && p && loadedUnderTransition) {\n Transition.promises.delete(p);\n loadedUnderTransition = false;\n runUpdates(() => {\n Transition.running = true;\n completeLoad(v, error);\n }, false);\n } else completeLoad(v, error);\n }\n return v;\n }\n function completeLoad(v, err) {\n runUpdates(() => {\n if (err === undefined) setValue(() => v);\n setState(err !== undefined ? \"errored\" : resolved ? \"ready\" : \"unresolved\");\n setError(err);\n for (const c of contexts.keys()) c.decrement();\n contexts.clear();\n }, false);\n }\n function read() {\n const c = SuspenseContext && useContext(SuspenseContext),\n v = value(),\n err = error();\n if (err !== undefined && !pr) throw err;\n if (Listener && !Listener.user && c) {\n createComputed(() => {\n track();\n if (pr) {\n if (c.resolved && Transition && loadedUnderTransition) Transition.promises.add(pr);else if (!contexts.has(c)) {\n c.increment();\n contexts.add(c);\n }\n }\n });\n }\n return v;\n }\n function load(refetching = true) {\n if (refetching !== false && scheduled) return;\n scheduled = false;\n const lookup = dynamic ? dynamic() : source;\n loadedUnderTransition = Transition && Transition.running;\n if (lookup == null || lookup === false) {\n loadEnd(pr, untrack(value));\n return;\n }\n if (Transition && pr) Transition.promises.delete(pr);\n let error;\n const p = initP !== NO_INIT ? initP : untrack(() => {\n try {\n return fetcher(lookup, {\n value: value(),\n refetching\n });\n } catch (fetcherError) {\n error = fetcherError;\n }\n });\n if (error !== undefined) {\n loadEnd(pr, undefined, castError(error), lookup);\n return;\n } else if (!isPromise(p)) {\n loadEnd(pr, p, undefined, lookup);\n return p;\n }\n pr = p;\n if (\"v\" in p) {\n if (p.s === 1) loadEnd(pr, p.v, undefined, lookup);else loadEnd(pr, undefined, castError(p.v), lookup);\n return p;\n }\n scheduled = true;\n queueMicrotask(() => scheduled = false);\n runUpdates(() => {\n setState(resolved ? \"refreshing\" : \"pending\");\n trigger();\n }, false);\n return p.then(v => loadEnd(p, v, undefined, lookup), e => loadEnd(p, undefined, castError(e), lookup));\n }\n Object.defineProperties(read, {\n state: {\n get: () => state()\n },\n error: {\n get: () => error()\n },\n loading: {\n get() {\n const s = state();\n return s === \"pending\" || s === \"refreshing\";\n }\n },\n latest: {\n get() {\n if (!resolved) return read();\n const err = error();\n if (err && !pr) throw err;\n return value();\n }\n }\n });\n let owner = Owner;\n if (dynamic) createComputed(() => (owner = Owner, load(false)));else load(false);\n return [read, {\n refetch: info => runWithOwner(owner, () => load(info)),\n mutate: setValue\n }];\n}\nfunction createDeferred(source, options) {\n let t,\n timeout = options ? options.timeoutMs : undefined;\n const node = createComputation(() => {\n if (!t || !t.fn) t = requestCallback(() => setDeferred(() => node.value), timeout !== undefined ? {\n timeout\n } : undefined);\n return source();\n }, undefined, true);\n const [deferred, setDeferred] = createSignal(Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, options);\n updateComputation(node);\n setDeferred(() => Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value);\n return deferred;\n}\nfunction createSelector(source, fn = equalFn, options) {\n const subs = new Map();\n const node = createComputation(p => {\n const v = source();\n for (const [key, val] of subs.entries()) if (fn(key, v) !== fn(key, p)) {\n for (const c of val.values()) {\n c.state = STALE;\n if (c.pure) Updates.push(c);else Effects.push(c);\n }\n }\n return v;\n }, undefined, true, STALE);\n updateComputation(node);\n return key => {\n const listener = Listener;\n if (listener) {\n let l;\n if (l = subs.get(key)) l.add(listener);else subs.set(key, l = new Set([listener]));\n onCleanup(() => {\n l.delete(listener);\n !l.size && subs.delete(key);\n });\n }\n return fn(key, Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value);\n };\n}\nfunction batch(fn) {\n return runUpdates(fn, false);\n}\nfunction untrack(fn) {\n if (!ExternalSourceConfig && Listener === null) return fn();\n const listener = Listener;\n Listener = null;\n try {\n if (ExternalSourceConfig) return ExternalSourceConfig.untrack(fn);\n return fn();\n } finally {\n Listener = listener;\n }\n}\nfunction on(deps, fn, options) {\n const isArray = Array.isArray(deps);\n let prevInput;\n let defer = options && options.defer;\n return prevValue => {\n let input;\n if (isArray) {\n input = Array(deps.length);\n for (let i = 0; i < deps.length; i++) input[i] = deps[i]();\n } else input = deps();\n if (defer) {\n defer = false;\n return prevValue;\n }\n const result = untrack(() => fn(input, prevInput, prevValue));\n prevInput = input;\n return result;\n };\n}\nfunction onMount(fn) {\n createEffect(() => untrack(fn));\n}\nfunction onCleanup(fn) {\n if (Owner === null) ;else if (Owner.cleanups === null) Owner.cleanups = [fn];else Owner.cleanups.push(fn);\n return fn;\n}\nfunction catchError(fn, handler) {\n ERROR || (ERROR = Symbol(\"error\"));\n Owner = createComputation(undefined, undefined, true);\n Owner.context = {\n ...Owner.context,\n [ERROR]: [handler]\n };\n if (Transition && Transition.running) Transition.sources.add(Owner);\n try {\n return fn();\n } catch (err) {\n handleError(err);\n } finally {\n Owner = Owner.owner;\n }\n}\nfunction getListener() {\n return Listener;\n}\nfunction getOwner() {\n return Owner;\n}\nfunction runWithOwner(o, fn) {\n const prev = Owner;\n const prevListener = Listener;\n Owner = o;\n Listener = null;\n try {\n return runUpdates(fn, true);\n } catch (err) {\n handleError(err);\n } finally {\n Owner = prev;\n Listener = prevListener;\n }\n}\nfunction enableScheduling(scheduler = requestCallback) {\n Scheduler = scheduler;\n}\nfunction startTransition(fn) {\n if (Transition && Transition.running) {\n fn();\n return Transition.done;\n }\n const l = Listener;\n const o = Owner;\n return Promise.resolve().then(() => {\n Listener = l;\n Owner = o;\n let t;\n if (Scheduler || SuspenseContext) {\n t = Transition || (Transition = {\n sources: new Set(),\n effects: [],\n promises: new Set(),\n disposed: new Set(),\n queue: new Set(),\n running: true\n });\n t.done || (t.done = new Promise(res => t.resolve = res));\n t.running = true;\n }\n runUpdates(fn, false);\n Listener = Owner = null;\n return t ? t.done : undefined;\n });\n}\nconst [transPending, setTransPending] = /*@__PURE__*/createSignal(false);\nfunction useTransition() {\n return [transPending, startTransition];\n}\nfunction resumeEffects(e) {\n Effects.push.apply(Effects, e);\n e.length = 0;\n}\nfunction createContext(defaultValue, options) {\n const id = Symbol(\"context\");\n return {\n id,\n Provider: createProvider(id),\n defaultValue\n };\n}\nfunction useContext(context) {\n let value;\n return Owner && Owner.context && (value = Owner.context[context.id]) !== undefined ? value : context.defaultValue;\n}\nfunction children(fn) {\n const children = createMemo(fn);\n const memo = createMemo(() => resolveChildren(children()));\n memo.toArray = () => {\n const c = memo();\n return Array.isArray(c) ? c : c != null ? [c] : [];\n };\n return memo;\n}\nlet SuspenseContext;\nfunction getSuspenseContext() {\n return SuspenseContext || (SuspenseContext = createContext());\n}\nfunction enableExternalSource(factory, untrack = fn => fn()) {\n if (ExternalSourceConfig) {\n const {\n factory: oldFactory,\n untrack: oldUntrack\n } = ExternalSourceConfig;\n ExternalSourceConfig = {\n factory: (fn, trigger) => {\n const oldSource = oldFactory(fn, trigger);\n const source = factory(x => oldSource.track(x), trigger);\n return {\n track: x => source.track(x),\n dispose() {\n source.dispose();\n oldSource.dispose();\n }\n };\n },\n untrack: fn => oldUntrack(() => untrack(fn))\n };\n } else {\n ExternalSourceConfig = {\n factory,\n untrack\n };\n }\n}\nfunction readSignal() {\n const runningTransition = Transition && Transition.running;\n if (this.sources && (runningTransition ? this.tState : this.state)) {\n if ((runningTransition ? this.tState : this.state) === STALE) updateComputation(this);else {\n const updates = Updates;\n Updates = null;\n runUpdates(() => lookUpstream(this), false);\n Updates = updates;\n }\n }\n if (Listener) {\n const sSlot = this.observers ? this.observers.length : 0;\n if (!Listener.sources) {\n Listener.sources = [this];\n Listener.sourceSlots = [sSlot];\n } else {\n Listener.sources.push(this);\n Listener.sourceSlots.push(sSlot);\n }\n if (!this.observers) {\n this.observers = [Listener];\n this.observerSlots = [Listener.sources.length - 1];\n } else {\n this.observers.push(Listener);\n this.observerSlots.push(Listener.sources.length - 1);\n }\n }\n if (runningTransition && Transition.sources.has(this)) return this.tValue;\n return this.value;\n}\nfunction writeSignal(node, value, isComp) {\n let current = Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value;\n if (!node.comparator || !node.comparator(current, value)) {\n if (Transition) {\n const TransitionRunning = Transition.running;\n if (TransitionRunning || !isComp && Transition.sources.has(node)) {\n Transition.sources.add(node);\n node.tValue = value;\n }\n if (!TransitionRunning) node.value = value;\n } else node.value = value;\n if (node.observers && node.observers.length) {\n runUpdates(() => {\n for (let i = 0; i < node.observers.length; i += 1) {\n const o = node.observers[i];\n const TransitionRunning = Transition && Transition.running;\n if (TransitionRunning && Transition.disposed.has(o)) continue;\n if (TransitionRunning ? !o.tState : !o.state) {\n if (o.pure) Updates.push(o);else Effects.push(o);\n if (o.observers) markDownstream(o);\n }\n if (!TransitionRunning) o.state = STALE;else o.tState = STALE;\n }\n if (Updates.length > 10e5) {\n Updates = [];\n if (IS_DEV) ;\n throw new Error();\n }\n }, false);\n }\n }\n return value;\n}\nfunction updateComputation(node) {\n if (!node.fn) return;\n cleanNode(node);\n const time = ExecCount;\n runComputation(node, Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, time);\n if (Transition && !Transition.running && Transition.sources.has(node)) {\n queueMicrotask(() => {\n runUpdates(() => {\n Transition && (Transition.running = true);\n Listener = Owner = node;\n runComputation(node, node.tValue, time);\n Listener = Owner = null;\n }, false);\n });\n }\n}\nfunction runComputation(node, value, time) {\n let nextValue;\n const owner = Owner,\n listener = Listener;\n Listener = Owner = node;\n try {\n nextValue = node.fn(value);\n } catch (err) {\n if (node.pure) {\n if (Transition && Transition.running) {\n node.tState = STALE;\n node.tOwned && node.tOwned.forEach(cleanNode);\n node.tOwned = undefined;\n } else {\n node.state = STALE;\n node.owned && node.owned.forEach(cleanNode);\n node.owned = null;\n }\n }\n node.updatedAt = time + 1;\n return handleError(err);\n } finally {\n Listener = listener;\n Owner = owner;\n }\n if (!node.updatedAt || node.updatedAt <= time) {\n if (node.updatedAt != null && \"observers\" in node) {\n writeSignal(node, nextValue, true);\n } else if (Transition && Transition.running && node.pure) {\n Transition.sources.add(node);\n node.tValue = nextValue;\n } else node.value = nextValue;\n node.updatedAt = time;\n }\n}\nfunction createComputation(fn, init, pure, state = STALE, options) {\n const c = {\n fn,\n state: state,\n updatedAt: null,\n owned: null,\n sources: null,\n sourceSlots: null,\n cleanups: null,\n value: init,\n owner: Owner,\n context: Owner ? Owner.context : null,\n pure\n };\n if (Transition && Transition.running) {\n c.state = 0;\n c.tState = state;\n }\n if (Owner === null) ;else if (Owner !== UNOWNED) {\n if (Transition && Transition.running && Owner.pure) {\n if (!Owner.tOwned) Owner.tOwned = [c];else Owner.tOwned.push(c);\n } else {\n if (!Owner.owned) Owner.owned = [c];else Owner.owned.push(c);\n }\n }\n if (ExternalSourceConfig && c.fn) {\n const [track, trigger] = createSignal(undefined, {\n equals: false\n });\n const ordinary = ExternalSourceConfig.factory(c.fn, trigger);\n onCleanup(() => ordinary.dispose());\n const triggerInTransition = () => startTransition(trigger).then(() => inTransition.dispose());\n const inTransition = ExternalSourceConfig.factory(c.fn, triggerInTransition);\n c.fn = x => {\n track();\n return Transition && Transition.running ? inTransition.track(x) : ordinary.track(x);\n };\n }\n return c;\n}\nfunction runTop(node) {\n const runningTransition = Transition && Transition.running;\n if ((runningTransition ? node.tState : node.state) === 0) return;\n if ((runningTransition ? node.tState : node.state) === PENDING) return lookUpstream(node);\n if (node.suspense && untrack(node.suspense.inFallback)) return node.suspense.effects.push(node);\n const ancestors = [node];\n while ((node = node.owner) && (!node.updatedAt || node.updatedAt < ExecCount)) {\n if (runningTransition && Transition.disposed.has(node)) return;\n if (runningTransition ? node.tState : node.state) ancestors.push(node);\n }\n for (let i = ancestors.length - 1; i >= 0; i--) {\n node = ancestors[i];\n if (runningTransition) {\n let top = node,\n prev = ancestors[i + 1];\n while ((top = top.owner) && top !== prev) {\n if (Transition.disposed.has(top)) return;\n }\n }\n if ((runningTransition ? node.tState : node.state) === STALE) {\n updateComputation(node);\n } else if ((runningTransition ? node.tState : node.state) === PENDING) {\n const updates = Updates;\n Updates = null;\n runUpdates(() => lookUpstream(node, ancestors[0]), false);\n Updates = updates;\n }\n }\n}\nfunction runUpdates(fn, init) {\n if (Updates) return fn();\n let wait = false;\n if (!init) Updates = [];\n if (Effects) wait = true;else Effects = [];\n ExecCount++;\n try {\n const res = fn();\n completeUpdates(wait);\n return res;\n } catch (err) {\n if (!wait) Effects = null;\n Updates = null;\n handleError(err);\n }\n}\nfunction completeUpdates(wait) {\n if (Updates) {\n if (Scheduler && Transition && Transition.running) scheduleQueue(Updates);else runQueue(Updates);\n Updates = null;\n }\n if (wait) return;\n let res;\n if (Transition) {\n if (!Transition.promises.size && !Transition.queue.size) {\n const sources = Transition.sources;\n const disposed = Transition.disposed;\n Effects.push.apply(Effects, Transition.effects);\n res = Transition.resolve;\n for (const e of Effects) {\n \"tState\" in e && (e.state = e.tState);\n delete e.tState;\n }\n Transition = null;\n runUpdates(() => {\n for (const d of disposed) cleanNode(d);\n for (const v of sources) {\n v.value = v.tValue;\n if (v.owned) {\n for (let i = 0, len = v.owned.length; i < len; i++) cleanNode(v.owned[i]);\n }\n if (v.tOwned) v.owned = v.tOwned;\n delete v.tValue;\n delete v.tOwned;\n v.tState = 0;\n }\n setTransPending(false);\n }, false);\n } else if (Transition.running) {\n Transition.running = false;\n Transition.effects.push.apply(Transition.effects, Effects);\n Effects = null;\n setTransPending(true);\n return;\n }\n }\n const e = Effects;\n Effects = null;\n if (e.length) runUpdates(() => runEffects(e), false);\n if (res) res();\n}\nfunction runQueue(queue) {\n for (let i = 0; i < queue.length; i++) runTop(queue[i]);\n}\nfunction scheduleQueue(queue) {\n for (let i = 0; i < queue.length; i++) {\n const item = queue[i];\n const tasks = Transition.queue;\n if (!tasks.has(item)) {\n tasks.add(item);\n Scheduler(() => {\n tasks.delete(item);\n runUpdates(() => {\n Transition.running = true;\n runTop(item);\n }, false);\n Transition && (Transition.running = false);\n });\n }\n }\n}\nfunction runUserEffects(queue) {\n let i,\n userLength = 0;\n for (i = 0; i < queue.length; i++) {\n const e = queue[i];\n if (!e.user) runTop(e);else queue[userLength++] = e;\n }\n if (sharedConfig.context) {\n if (sharedConfig.count) {\n sharedConfig.effects || (sharedConfig.effects = []);\n sharedConfig.effects.push(...queue.slice(0, userLength));\n return;\n }\n setHydrateContext();\n }\n if (sharedConfig.effects && (sharedConfig.done || !sharedConfig.count)) {\n queue = [...sharedConfig.effects, ...queue];\n userLength += sharedConfig.effects.length;\n delete sharedConfig.effects;\n }\n for (i = 0; i < userLength; i++) runTop(queue[i]);\n}\nfunction lookUpstream(node, ignore) {\n const runningTransition = Transition && Transition.running;\n if (runningTransition) node.tState = 0;else node.state = 0;\n for (let i = 0; i < node.sources.length; i += 1) {\n const source = node.sources[i];\n if (source.sources) {\n const state = runningTransition ? source.tState : source.state;\n if (state === STALE) {\n if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount)) runTop(source);\n } else if (state === PENDING) lookUpstream(source, ignore);\n }\n }\n}\nfunction markDownstream(node) {\n const runningTransition = Transition && Transition.running;\n for (let i = 0; i < node.observers.length; i += 1) {\n const o = node.observers[i];\n if (runningTransition ? !o.tState : !o.state) {\n if (runningTransition) o.tState = PENDING;else o.state = PENDING;\n if (o.pure) Updates.push(o);else Effects.push(o);\n o.observers && markDownstream(o);\n }\n }\n}\nfunction cleanNode(node) {\n let i;\n if (node.sources) {\n while (node.sources.length) {\n const source = node.sources.pop(),\n index = node.sourceSlots.pop(),\n obs = source.observers;\n if (obs && obs.length) {\n const n = obs.pop(),\n s = source.observerSlots.pop();\n if (index < obs.length) {\n n.sourceSlots[s] = index;\n obs[index] = n;\n source.observerSlots[index] = s;\n }\n }\n }\n }\n if (node.tOwned) {\n for (i = node.tOwned.length - 1; i >= 0; i--) cleanNode(node.tOwned[i]);\n delete node.tOwned;\n }\n if (Transition && Transition.running && node.pure) {\n reset(node, true);\n } else if (node.owned) {\n for (i = node.owned.length - 1; i >= 0; i--) cleanNode(node.owned[i]);\n node.owned = null;\n }\n if (node.cleanups) {\n for (i = node.cleanups.length - 1; i >= 0; i--) node.cleanups[i]();\n node.cleanups = null;\n }\n if (Transition && Transition.running) node.tState = 0;else node.state = 0;\n}\nfunction reset(node, top) {\n if (!top) {\n node.tState = 0;\n Transition.disposed.add(node);\n }\n if (node.owned) {\n for (let i = 0; i < node.owned.length; i++) reset(node.owned[i]);\n }\n}\nfunction castError(err) {\n if (err instanceof Error) return err;\n return new Error(typeof err === \"string\" ? err : \"Unknown error\", {\n cause: err\n });\n}\nfunction runErrors(err, fns, owner) {\n try {\n for (const f of fns) f(err);\n } catch (e) {\n handleError(e, owner && owner.owner || null);\n }\n}\nfunction handleError(err, owner = Owner) {\n const fns = ERROR && owner && owner.context && owner.context[ERROR];\n const error = castError(err);\n if (!fns) throw error;\n if (Effects) Effects.push({\n fn() {\n runErrors(error, fns, owner);\n },\n state: STALE\n });else runErrors(error, fns, owner);\n}\nfunction resolveChildren(children) {\n if (typeof children === \"function\" && !children.length) return resolveChildren(children());\n if (Array.isArray(children)) {\n const results = [];\n for (let i = 0; i < children.length; i++) {\n const result = resolveChildren(children[i]);\n Array.isArray(result) ? results.push.apply(results, result) : results.push(result);\n }\n return results;\n }\n return children;\n}\nfunction createProvider(id, options) {\n return function provider(props) {\n let res;\n createRenderEffect(() => res = untrack(() => {\n Owner.context = {\n ...Owner.context,\n [id]: props.value\n };\n return children(() => props.children);\n }), undefined);\n return res;\n };\n}\nfunction onError(fn) {\n ERROR || (ERROR = Symbol(\"error\"));\n if (Owner === null) ;else if (Owner.context === null || !Owner.context[ERROR]) {\n Owner.context = {\n ...Owner.context,\n [ERROR]: [fn]\n };\n mutateContext(Owner, ERROR, [fn]);\n } else Owner.context[ERROR].push(fn);\n}\nfunction mutateContext(o, key, value) {\n if (o.owned) {\n for (let i = 0; i < o.owned.length; i++) {\n if (o.owned[i].context === o.context) mutateContext(o.owned[i], key, value);\n if (!o.owned[i].context) {\n o.owned[i].context = o.context;\n mutateContext(o.owned[i], key, value);\n } else if (!o.owned[i].context[key]) {\n o.owned[i].context[key] = value;\n mutateContext(o.owned[i], key, value);\n }\n }\n }\n}\n\nfunction observable(input) {\n return {\n subscribe(observer) {\n if (!(observer instanceof Object) || observer == null) {\n throw new TypeError(\"Expected the observer to be an object.\");\n }\n const handler = typeof observer === \"function\" ? observer : observer.next && observer.next.bind(observer);\n if (!handler) {\n return {\n unsubscribe() {}\n };\n }\n const dispose = createRoot(disposer => {\n createEffect(() => {\n const v = input();\n untrack(() => handler(v));\n });\n return disposer;\n });\n if (getOwner()) onCleanup(dispose);\n return {\n unsubscribe() {\n dispose();\n }\n };\n },\n [Symbol.observable || \"@@observable\"]() {\n return this;\n }\n };\n}\nfunction from(producer, initalValue = undefined) {\n const [s, set] = createSignal(initalValue, {\n equals: false\n });\n if (\"subscribe\" in producer) {\n const unsub = producer.subscribe(v => set(() => v));\n onCleanup(() => \"unsubscribe\" in unsub ? unsub.unsubscribe() : unsub());\n } else {\n const clean = producer(set);\n onCleanup(clean);\n }\n return s;\n}\n\nconst FALLBACK = Symbol(\"fallback\");\nfunction dispose(d) {\n for (let i = 0; i < d.length; i++) d[i]();\n}\nfunction mapArray(list, mapFn, options = {}) {\n let items = [],\n mapped = [],\n disposers = [],\n len = 0,\n indexes = mapFn.length > 1 ? [] : null;\n onCleanup(() => dispose(disposers));\n return () => {\n let newItems = list() || [],\n newLen = newItems.length,\n i,\n j;\n newItems[$TRACK];\n return untrack(() => {\n let newIndices, newIndicesNext, temp, tempdisposers, tempIndexes, start, end, newEnd, item;\n if (newLen === 0) {\n if (len !== 0) {\n dispose(disposers);\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n indexes && (indexes = []);\n }\n if (options.fallback) {\n items = [FALLBACK];\n mapped[0] = createRoot(disposer => {\n disposers[0] = disposer;\n return options.fallback();\n });\n len = 1;\n }\n }\n else if (len === 0) {\n mapped = new Array(newLen);\n for (j = 0; j < newLen; j++) {\n items[j] = newItems[j];\n mapped[j] = createRoot(mapper);\n }\n len = newLen;\n } else {\n temp = new Array(newLen);\n tempdisposers = new Array(newLen);\n indexes && (tempIndexes = new Array(newLen));\n for (start = 0, end = Math.min(len, newLen); start < end && items[start] === newItems[start]; start++);\n for (end = len - 1, newEnd = newLen - 1; end >= start && newEnd >= start && items[end] === newItems[newEnd]; end--, newEnd--) {\n temp[newEnd] = mapped[end];\n tempdisposers[newEnd] = disposers[end];\n indexes && (tempIndexes[newEnd] = indexes[end]);\n }\n newIndices = new Map();\n newIndicesNext = new Array(newEnd + 1);\n for (j = newEnd; j >= start; j--) {\n item = newItems[j];\n i = newIndices.get(item);\n newIndicesNext[j] = i === undefined ? -1 : i;\n newIndices.set(item, j);\n }\n for (i = start; i <= end; i++) {\n item = items[i];\n j = newIndices.get(item);\n if (j !== undefined && j !== -1) {\n temp[j] = mapped[i];\n tempdisposers[j] = disposers[i];\n indexes && (tempIndexes[j] = indexes[i]);\n j = newIndicesNext[j];\n newIndices.set(item, j);\n } else disposers[i]();\n }\n for (j = start; j < newLen; j++) {\n if (j in temp) {\n mapped[j] = temp[j];\n disposers[j] = tempdisposers[j];\n if (indexes) {\n indexes[j] = tempIndexes[j];\n indexes[j](j);\n }\n } else mapped[j] = createRoot(mapper);\n }\n mapped = mapped.slice(0, len = newLen);\n items = newItems.slice(0);\n }\n return mapped;\n });\n function mapper(disposer) {\n disposers[j] = disposer;\n if (indexes) {\n const [s, set] = createSignal(j);\n indexes[j] = set;\n return mapFn(newItems[j], s);\n }\n return mapFn(newItems[j]);\n }\n };\n}\nfunction indexArray(list, mapFn, options = {}) {\n let items = [],\n mapped = [],\n disposers = [],\n signals = [],\n len = 0,\n i;\n onCleanup(() => dispose(disposers));\n return () => {\n const newItems = list() || [],\n newLen = newItems.length;\n newItems[$TRACK];\n return untrack(() => {\n if (newLen === 0) {\n if (len !== 0) {\n dispose(disposers);\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n signals = [];\n }\n if (options.fallback) {\n items = [FALLBACK];\n mapped[0] = createRoot(disposer => {\n disposers[0] = disposer;\n return options.fallback();\n });\n len = 1;\n }\n return mapped;\n }\n if (items[0] === FALLBACK) {\n disposers[0]();\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n }\n for (i = 0; i < newLen; i++) {\n if (i < items.length && items[i] !== newItems[i]) {\n signals[i](() => newItems[i]);\n } else if (i >= items.length) {\n mapped[i] = createRoot(mapper);\n }\n }\n for (; i < items.length; i++) {\n disposers[i]();\n }\n len = signals.length = disposers.length = newLen;\n items = newItems.slice(0);\n return mapped = mapped.slice(0, len);\n });\n function mapper(disposer) {\n disposers[i] = disposer;\n const [s, set] = createSignal(newItems[i]);\n signals[i] = set;\n return mapFn(s, i);\n }\n };\n}\n\nlet hydrationEnabled = false;\nfunction enableHydration() {\n hydrationEnabled = true;\n}\nfunction createComponent(Comp, props) {\n if (hydrationEnabled) {\n if (sharedConfig.context) {\n const c = sharedConfig.context;\n setHydrateContext(nextHydrateContext());\n const r = untrack(() => Comp(props || {}));\n setHydrateContext(c);\n return r;\n }\n }\n return untrack(() => Comp(props || {}));\n}\nfunction trueFn() {\n return true;\n}\nconst propTraps = {\n get(_, property, receiver) {\n if (property === $PROXY) return receiver;\n return _.get(property);\n },\n has(_, property) {\n if (property === $PROXY) return true;\n return _.has(property);\n },\n set: trueFn,\n deleteProperty: trueFn,\n getOwnPropertyDescriptor(_, property) {\n return {\n configurable: true,\n enumerable: true,\n get() {\n return _.get(property);\n },\n set: trueFn,\n deleteProperty: trueFn\n };\n },\n ownKeys(_) {\n return _.keys();\n }\n};\nfunction resolveSource(s) {\n return !(s = typeof s === \"function\" ? s() : s) ? {} : s;\n}\nfunction resolveSources() {\n for (let i = 0, length = this.length; i < length; ++i) {\n const v = this[i]();\n if (v !== undefined) return v;\n }\n}\nfunction mergeProps(...sources) {\n let proxy = false;\n for (let i = 0; i < sources.length; i++) {\n const s = sources[i];\n proxy = proxy || !!s && $PROXY in s;\n sources[i] = typeof s === \"function\" ? (proxy = true, createMemo(s)) : s;\n }\n if (SUPPORTS_PROXY && proxy) {\n return new Proxy({\n get(property) {\n for (let i = sources.length - 1; i >= 0; i--) {\n const v = resolveSource(sources[i])[property];\n if (v !== undefined) return v;\n }\n },\n has(property) {\n for (let i = sources.length - 1; i >= 0; i--) {\n if (property in resolveSource(sources[i])) return true;\n }\n return false;\n },\n keys() {\n const keys = [];\n for (let i = 0; i < sources.length; i++) keys.push(...Object.keys(resolveSource(sources[i])));\n return [...new Set(keys)];\n }\n }, propTraps);\n }\n const sourcesMap = {};\n const defined = Object.create(null);\n for (let i = sources.length - 1; i >= 0; i--) {\n const source = sources[i];\n if (!source) continue;\n const sourceKeys = Object.getOwnPropertyNames(source);\n for (let i = sourceKeys.length - 1; i >= 0; i--) {\n const key = sourceKeys[i];\n if (key === \"__proto__\" || key === \"constructor\") continue;\n const desc = Object.getOwnPropertyDescriptor(source, key);\n if (!defined[key]) {\n defined[key] = desc.get ? {\n enumerable: true,\n configurable: true,\n get: resolveSources.bind(sourcesMap[key] = [desc.get.bind(source)])\n } : desc.value !== undefined ? desc : undefined;\n } else {\n const sources = sourcesMap[key];\n if (sources) {\n if (desc.get) sources.push(desc.get.bind(source));else if (desc.value !== undefined) sources.push(() => desc.value);\n }\n }\n }\n }\n const target = {};\n const definedKeys = Object.keys(defined);\n for (let i = definedKeys.length - 1; i >= 0; i--) {\n const key = definedKeys[i],\n desc = defined[key];\n if (desc && desc.get) Object.defineProperty(target, key, desc);else target[key] = desc ? desc.value : undefined;\n }\n return target;\n}\nfunction splitProps(props, ...keys) {\n if (SUPPORTS_PROXY && $PROXY in props) {\n const blocked = new Set(keys.length > 1 ? keys.flat() : keys[0]);\n const res = keys.map(k => {\n return new Proxy({\n get(property) {\n return k.includes(property) ? props[property] : undefined;\n },\n has(property) {\n return k.includes(property) && property in props;\n },\n keys() {\n return k.filter(property => property in props);\n }\n }, propTraps);\n });\n res.push(new Proxy({\n get(property) {\n return blocked.has(property) ? undefined : props[property];\n },\n has(property) {\n return blocked.has(property) ? false : property in props;\n },\n keys() {\n return Object.keys(props).filter(k => !blocked.has(k));\n }\n }, propTraps));\n return res;\n }\n const otherObject = {};\n const objects = keys.map(() => ({}));\n for (const propName of Object.getOwnPropertyNames(props)) {\n const desc = Object.getOwnPropertyDescriptor(props, propName);\n const isDefaultDesc = !desc.get && !desc.set && desc.enumerable && desc.writable && desc.configurable;\n let blocked = false;\n let objectIndex = 0;\n for (const k of keys) {\n if (k.includes(propName)) {\n blocked = true;\n isDefaultDesc ? objects[objectIndex][propName] = desc.value : Object.defineProperty(objects[objectIndex], propName, desc);\n }\n ++objectIndex;\n }\n if (!blocked) {\n isDefaultDesc ? otherObject[propName] = desc.value : Object.defineProperty(otherObject, propName, desc);\n }\n }\n return [...objects, otherObject];\n}\nfunction lazy(fn) {\n let comp;\n let p;\n const wrap = props => {\n const ctx = sharedConfig.context;\n if (ctx) {\n const [s, set] = createSignal();\n sharedConfig.count || (sharedConfig.count = 0);\n sharedConfig.count++;\n (p || (p = fn())).then(mod => {\n !sharedConfig.done && setHydrateContext(ctx);\n sharedConfig.count--;\n set(() => mod.default);\n setHydrateContext();\n });\n comp = s;\n } else if (!comp) {\n const [s] = createResource(() => (p || (p = fn())).then(mod => mod.default));\n comp = s;\n }\n let Comp;\n return createMemo(() => (Comp = comp()) ? untrack(() => {\n if (IS_DEV) ;\n if (!ctx || sharedConfig.done) return Comp(props);\n const c = sharedConfig.context;\n setHydrateContext(ctx);\n const r = Comp(props);\n setHydrateContext(c);\n return r;\n }) : \"\");\n };\n wrap.preload = () => p || ((p = fn()).then(mod => comp = () => mod.default), p);\n return wrap;\n}\nlet counter = 0;\nfunction createUniqueId() {\n const ctx = sharedConfig.context;\n return ctx ? sharedConfig.getNextContextId() : `cl-${counter++}`;\n}\n\nconst narrowedError = name => `Stale read from <${name}>.`;\nfunction For(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(mapArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Index(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(indexArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Show(props) {\n const keyed = props.keyed;\n const conditionValue = createMemo(() => props.when, undefined, undefined);\n const condition = keyed ? conditionValue : createMemo(conditionValue, undefined, {\n equals: (a, b) => !a === !b\n });\n return createMemo(() => {\n const c = condition();\n if (c) {\n const child = props.children;\n const fn = typeof child === \"function\" && child.length > 0;\n return fn ? untrack(() => child(keyed ? c : () => {\n if (!untrack(condition)) throw narrowedError(\"Show\");\n return conditionValue();\n })) : child;\n }\n return props.fallback;\n }, undefined, undefined);\n}\nfunction Switch(props) {\n const chs = children(() => props.children);\n const switchFunc = createMemo(() => {\n const ch = chs();\n const mps = Array.isArray(ch) ? ch : [ch];\n let func = () => undefined;\n for (let i = 0; i < mps.length; i++) {\n const index = i;\n const mp = mps[i];\n const prevFunc = func;\n const conditionValue = createMemo(() => prevFunc() ? undefined : mp.when, undefined, undefined);\n const condition = mp.keyed ? conditionValue : createMemo(conditionValue, undefined, {\n equals: (a, b) => !a === !b\n });\n func = () => prevFunc() || (condition() ? [index, conditionValue, mp] : undefined);\n }\n return func;\n });\n return createMemo(() => {\n const sel = switchFunc()();\n if (!sel) return props.fallback;\n const [index, conditionValue, mp] = sel;\n const child = mp.children;\n const fn = typeof child === \"function\" && child.length > 0;\n return fn ? untrack(() => child(mp.keyed ? conditionValue() : () => {\n if (untrack(switchFunc)()?.[0] !== index) throw narrowedError(\"Match\");\n return conditionValue();\n })) : child;\n }, undefined, undefined);\n}\nfunction Match(props) {\n return props;\n}\nlet Errors;\nfunction resetErrorBoundaries() {\n Errors && [...Errors].forEach(fn => fn());\n}\nfunction ErrorBoundary(props) {\n let err;\n if (sharedConfig.context && sharedConfig.load) err = sharedConfig.load(sharedConfig.getContextId());\n const [errored, setErrored] = createSignal(err, undefined);\n Errors || (Errors = new Set());\n Errors.add(setErrored);\n onCleanup(() => Errors.delete(setErrored));\n return createMemo(() => {\n let e;\n if (e = errored()) {\n const f = props.fallback;\n return typeof f === \"function\" && f.length ? untrack(() => f(e, () => setErrored())) : f;\n }\n return catchError(() => props.children, setErrored);\n }, undefined, undefined);\n}\n\nconst suspenseListEquals = (a, b) => a.showContent === b.showContent && a.showFallback === b.showFallback;\nconst SuspenseListContext = /* #__PURE__ */createContext();\nfunction SuspenseList(props) {\n let [wrapper, setWrapper] = createSignal(() => ({\n inFallback: false\n })),\n show;\n const listContext = useContext(SuspenseListContext);\n const [registry, setRegistry] = createSignal([]);\n if (listContext) {\n show = listContext.register(createMemo(() => wrapper()().inFallback));\n }\n const resolved = createMemo(prev => {\n const reveal = props.revealOrder,\n tail = props.tail,\n {\n showContent = true,\n showFallback = true\n } = show ? show() : {},\n reg = registry(),\n reverse = reveal === \"backwards\";\n if (reveal === \"together\") {\n const all = reg.every(inFallback => !inFallback());\n const res = reg.map(() => ({\n showContent: all && showContent,\n showFallback\n }));\n res.inFallback = !all;\n return res;\n }\n let stop = false;\n let inFallback = prev.inFallback;\n const res = [];\n for (let i = 0, len = reg.length; i < len; i++) {\n const n = reverse ? len - i - 1 : i,\n s = reg[n]();\n if (!stop && !s) {\n res[n] = {\n showContent,\n showFallback\n };\n } else {\n const next = !stop;\n if (next) inFallback = true;\n res[n] = {\n showContent: next,\n showFallback: !tail || next && tail === \"collapsed\" ? showFallback : false\n };\n stop = true;\n }\n }\n if (!stop) inFallback = false;\n res.inFallback = inFallback;\n return res;\n }, {\n inFallback: false\n });\n setWrapper(() => resolved);\n return createComponent(SuspenseListContext.Provider, {\n value: {\n register: inFallback => {\n let index;\n setRegistry(registry => {\n index = registry.length;\n return [...registry, inFallback];\n });\n return createMemo(() => resolved()[index], undefined, {\n equals: suspenseListEquals\n });\n }\n },\n get children() {\n return props.children;\n }\n });\n}\nfunction Suspense(props) {\n let counter = 0,\n show,\n ctx,\n p,\n flicker,\n error;\n const [inFallback, setFallback] = createSignal(false),\n SuspenseContext = getSuspenseContext(),\n store = {\n increment: () => {\n if (++counter === 1) setFallback(true);\n },\n decrement: () => {\n if (--counter === 0) setFallback(false);\n },\n inFallback,\n effects: [],\n resolved: false\n },\n owner = getOwner();\n if (sharedConfig.context && sharedConfig.load) {\n const key = sharedConfig.getContextId();\n let ref = sharedConfig.load(key);\n if (ref) {\n if (typeof ref !== \"object\" || ref.s !== 1) p = ref;else sharedConfig.gather(key);\n }\n if (p && p !== \"$$f\") {\n const [s, set] = createSignal(undefined, {\n equals: false\n });\n flicker = s;\n p.then(() => {\n if (sharedConfig.done) return set();\n sharedConfig.gather(key);\n setHydrateContext(ctx);\n set();\n setHydrateContext();\n }, err => {\n error = err;\n set();\n });\n }\n }\n const listContext = useContext(SuspenseListContext);\n if (listContext) show = listContext.register(store.inFallback);\n let dispose;\n onCleanup(() => dispose && dispose());\n return createComponent(SuspenseContext.Provider, {\n value: store,\n get children() {\n return createMemo(() => {\n if (error) throw error;\n ctx = sharedConfig.context;\n if (flicker) {\n flicker();\n return flicker = undefined;\n }\n if (ctx && p === \"$$f\") setHydrateContext();\n const rendered = createMemo(() => props.children);\n return createMemo(prev => {\n const inFallback = store.inFallback(),\n {\n showContent = true,\n showFallback = true\n } = show ? show() : {};\n if ((!inFallback || p && p !== \"$$f\") && showContent) {\n store.resolved = true;\n dispose && dispose();\n dispose = ctx = p = undefined;\n resumeEffects(store.effects);\n return rendered();\n }\n if (!showFallback) return;\n if (dispose) return prev;\n return createRoot(disposer => {\n dispose = disposer;\n if (ctx) {\n setHydrateContext({\n id: ctx.id + \"F\",\n count: 0\n });\n ctx = undefined;\n }\n return props.fallback;\n }, owner);\n });\n });\n }\n });\n}\n\nconst DEV = undefined;\n\nexport { $DEVCOMP, $PROXY, $TRACK, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, cancelCallback, catchError, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createReaction, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, indexArray, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, requestCallback, resetErrorBoundaries, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition };\n","import { createMemo, createRoot, createRenderEffect, untrack, sharedConfig, enableHydration, getOwner, createEffect, runWithOwner, createSignal, onCleanup, splitProps } from 'solid-js';\nexport { ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, createComponent, createRenderEffect as effect, getOwner, mergeProps, untrack } from 'solid-js';\n\nconst booleans = [\"allowfullscreen\", \"async\", \"alpha\",\n\"autofocus\",\n\"autoplay\", \"checked\", \"controls\", \"default\", \"disabled\", \"formnovalidate\", \"hidden\",\n\"indeterminate\", \"inert\",\n\"ismap\", \"loop\", \"multiple\", \"muted\", \"nomodule\", \"novalidate\", \"open\", \"playsinline\", \"readonly\", \"required\", \"reversed\", \"seamless\",\n\"selected\", \"adauctionheaders\",\n\"browsingtopics\",\n\"credentialless\",\n\"defaultchecked\", \"defaultmuted\", \"defaultselected\", \"defer\", \"disablepictureinpicture\", \"disableremoteplayback\", \"preservespitch\",\n\"shadowrootclonable\", \"shadowrootcustomelementregistry\",\n\"shadowrootdelegatesfocus\", \"shadowrootserializable\",\n\"sharedstoragewritable\"\n];\nconst Properties = /*#__PURE__*/new Set([\n\"className\", \"value\",\n\"readOnly\", \"noValidate\", \"formNoValidate\", \"isMap\", \"noModule\", \"playsInline\", \"adAuctionHeaders\",\n\"allowFullscreen\", \"browsingTopics\",\n\"defaultChecked\", \"defaultMuted\", \"defaultSelected\", \"disablePictureInPicture\", \"disableRemotePlayback\", \"preservesPitch\", \"shadowRootClonable\", \"shadowRootCustomElementRegistry\",\n\"shadowRootDelegatesFocus\", \"shadowRootSerializable\",\n\"sharedStorageWritable\",\n...booleans]);\nconst ChildProperties = /*#__PURE__*/new Set([\"innerHTML\", \"textContent\", \"innerText\", \"children\"]);\nconst Aliases = /*#__PURE__*/Object.assign(Object.create(null), {\n className: \"class\",\n htmlFor: \"for\"\n});\nconst PropAliases = /*#__PURE__*/Object.assign(Object.create(null), {\n class: \"className\",\n novalidate: {\n $: \"noValidate\",\n FORM: 1\n },\n formnovalidate: {\n $: \"formNoValidate\",\n BUTTON: 1,\n INPUT: 1\n },\n ismap: {\n $: \"isMap\",\n IMG: 1\n },\n nomodule: {\n $: \"noModule\",\n SCRIPT: 1\n },\n playsinline: {\n $: \"playsInline\",\n VIDEO: 1\n },\n readonly: {\n $: \"readOnly\",\n INPUT: 1,\n TEXTAREA: 1\n },\n adauctionheaders: {\n $: \"adAuctionHeaders\",\n IFRAME: 1\n },\n allowfullscreen: {\n $: \"allowFullscreen\",\n IFRAME: 1\n },\n browsingtopics: {\n $: \"browsingTopics\",\n IMG: 1\n },\n defaultchecked: {\n $: \"defaultChecked\",\n INPUT: 1\n },\n defaultmuted: {\n $: \"defaultMuted\",\n AUDIO: 1,\n VIDEO: 1\n },\n defaultselected: {\n $: \"defaultSelected\",\n OPTION: 1\n },\n disablepictureinpicture: {\n $: \"disablePictureInPicture\",\n VIDEO: 1\n },\n disableremoteplayback: {\n $: \"disableRemotePlayback\",\n AUDIO: 1,\n VIDEO: 1\n },\n preservespitch: {\n $: \"preservesPitch\",\n AUDIO: 1,\n VIDEO: 1\n },\n shadowrootclonable: {\n $: \"shadowRootClonable\",\n TEMPLATE: 1\n },\n shadowrootdelegatesfocus: {\n $: \"shadowRootDelegatesFocus\",\n TEMPLATE: 1\n },\n shadowrootserializable: {\n $: \"shadowRootSerializable\",\n TEMPLATE: 1\n },\n sharedstoragewritable: {\n $: \"sharedStorageWritable\",\n IFRAME: 1,\n IMG: 1\n }\n});\nfunction getPropAlias(prop, tagName) {\n const a = PropAliases[prop];\n return typeof a === \"object\" ? a[tagName] ? a[\"$\"] : undefined : a;\n}\nconst DelegatedEvents = /*#__PURE__*/new Set([\"beforeinput\", \"click\", \"dblclick\", \"contextmenu\", \"focusin\", \"focusout\", \"input\", \"keydown\", \"keyup\", \"mousedown\", \"mousemove\", \"mouseout\", \"mouseover\", \"mouseup\", \"pointerdown\", \"pointermove\", \"pointerout\", \"pointerover\", \"pointerup\", \"touchend\", \"touchmove\", \"touchstart\"]);\nconst SVGElements = /*#__PURE__*/new Set([\n\"altGlyph\", \"altGlyphDef\", \"altGlyphItem\", \"animate\", \"animateColor\", \"animateMotion\", \"animateTransform\", \"circle\", \"clipPath\", \"color-profile\", \"cursor\", \"defs\", \"desc\", \"ellipse\", \"feBlend\", \"feColorMatrix\", \"feComponentTransfer\", \"feComposite\", \"feConvolveMatrix\", \"feDiffuseLighting\", \"feDisplacementMap\", \"feDistantLight\", \"feDropShadow\", \"feFlood\", \"feFuncA\", \"feFuncB\", \"feFuncG\", \"feFuncR\", \"feGaussianBlur\", \"feImage\", \"feMerge\", \"feMergeNode\", \"feMorphology\", \"feOffset\", \"fePointLight\", \"feSpecularLighting\", \"feSpotLight\", \"feTile\", \"feTurbulence\", \"filter\", \"font\", \"font-face\", \"font-face-format\", \"font-face-name\", \"font-face-src\", \"font-face-uri\", \"foreignObject\", \"g\", \"glyph\", \"glyphRef\", \"hkern\", \"image\", \"line\", \"linearGradient\", \"marker\", \"mask\", \"metadata\", \"missing-glyph\", \"mpath\", \"path\", \"pattern\", \"polygon\", \"polyline\", \"radialGradient\", \"rect\",\n\"set\", \"stop\",\n\"svg\", \"switch\", \"symbol\", \"text\", \"textPath\",\n\"tref\", \"tspan\", \"use\", \"view\", \"vkern\"]);\nconst SVGNamespace = {\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\"\n};\nconst DOMElements = /*#__PURE__*/new Set([\"html\", \"base\", \"head\", \"link\", \"meta\", \"style\", \"title\", \"body\", \"address\", \"article\", \"aside\", \"footer\", \"header\", \"main\", \"nav\", \"section\", \"body\", \"blockquote\", \"dd\", \"div\", \"dl\", \"dt\", \"figcaption\", \"figure\", \"hr\", \"li\", \"ol\", \"p\", \"pre\", \"ul\", \"a\", \"abbr\", \"b\", \"bdi\", \"bdo\", \"br\", \"cite\", \"code\", \"data\", \"dfn\", \"em\", \"i\", \"kbd\", \"mark\", \"q\", \"rp\", \"rt\", \"ruby\", \"s\", \"samp\", \"small\", \"span\", \"strong\", \"sub\", \"sup\", \"time\", \"u\", \"var\", \"wbr\", \"area\", \"audio\", \"img\", \"map\", \"track\", \"video\", \"embed\", \"iframe\", \"object\", \"param\", \"picture\", \"portal\", \"source\", \"svg\", \"math\", \"canvas\", \"noscript\", \"script\", \"del\", \"ins\", \"caption\", \"col\", \"colgroup\", \"table\", \"tbody\", \"td\", \"tfoot\", \"th\", \"thead\", \"tr\", \"button\", \"datalist\", \"fieldset\", \"form\", \"input\", \"label\", \"legend\", \"meter\", \"optgroup\", \"option\", \"output\", \"progress\", \"select\", \"textarea\", \"details\", \"dialog\", \"menu\", \"summary\", \"details\", \"slot\", \"template\", \"acronym\", \"applet\", \"basefont\", \"bgsound\", \"big\", \"blink\", \"center\", \"content\", \"dir\", \"font\", \"frame\", \"frameset\", \"hgroup\", \"image\", \"keygen\", \"marquee\", \"menuitem\", \"nobr\", \"noembed\", \"noframes\", \"plaintext\", \"rb\", \"rtc\", \"shadow\", \"spacer\", \"strike\", \"tt\", \"xmp\", \"a\", \"abbr\", \"acronym\", \"address\", \"applet\", \"area\", \"article\", \"aside\", \"audio\", \"b\", \"base\", \"basefont\", \"bdi\", \"bdo\", \"bgsound\", \"big\", \"blink\", \"blockquote\", \"body\", \"br\", \"button\", \"canvas\", \"caption\", \"center\", \"cite\", \"code\", \"col\", \"colgroup\", \"content\", \"data\", \"datalist\", \"dd\", \"del\", \"details\", \"dfn\", \"dialog\", \"dir\", \"div\", \"dl\", \"dt\", \"em\", \"embed\", \"fieldset\", \"figcaption\", \"figure\", \"font\", \"footer\", \"form\", \"frame\", \"frameset\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\", \"i\", \"iframe\", \"image\", \"img\", \"input\", \"ins\", \"kbd\", \"keygen\", \"label\", \"legend\", \"li\", \"link\", \"main\", \"map\", \"mark\", \"marquee\", \"menu\", \"menuitem\", \"meta\", \"meter\", \"nav\", \"nobr\", \"noembed\", \"noframes\", \"noscript\", \"object\", \"ol\", \"optgroup\", \"option\", \"output\", \"p\", \"param\", \"picture\", \"plaintext\", \"portal\", \"pre\", \"progress\", \"q\", \"rb\", \"rp\", \"rt\", \"rtc\", \"ruby\", \"s\", \"samp\", \"script\", \"section\", \"select\", \"shadow\", \"slot\", \"small\", \"source\", \"spacer\", \"span\", \"strike\", \"strong\", \"style\", \"sub\", \"summary\", \"sup\", \"table\", \"tbody\", \"td\", \"template\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"time\", \"title\", \"tr\", \"track\", \"tt\", \"u\", \"ul\", \"var\", \"video\", \"wbr\", \"xmp\", \"input\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n\"webview\",\n\"isindex\", \"listing\", \"multicol\", \"nextid\", \"noindex\", \"search\"]);\n\nconst memo = fn => createMemo(() => fn());\n\nfunction reconcileArrays(parentNode, a, b) {\n let bLength = b.length,\n aEnd = a.length,\n bEnd = bLength,\n aStart = 0,\n bStart = 0,\n after = a[aEnd - 1].nextSibling,\n map = null;\n while (aStart < aEnd || bStart < bEnd) {\n if (a[aStart] === b[bStart]) {\n aStart++;\n bStart++;\n continue;\n }\n while (a[aEnd - 1] === b[bEnd - 1]) {\n aEnd--;\n bEnd--;\n }\n if (aEnd === aStart) {\n const node = bEnd < bLength ? bStart ? b[bStart - 1].nextSibling : b[bEnd - bStart] : after;\n while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node);\n } else if (bEnd === bStart) {\n while (aStart < aEnd) {\n if (!map || !map.has(a[aStart])) a[aStart].remove();\n aStart++;\n }\n } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {\n const node = a[--aEnd].nextSibling;\n parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling);\n parentNode.insertBefore(b[--bEnd], node);\n a[aEnd] = b[bEnd];\n } else {\n if (!map) {\n map = new Map();\n let i = bStart;\n while (i < bEnd) map.set(b[i], i++);\n }\n const index = map.get(a[aStart]);\n if (index != null) {\n if (bStart < index && index < bEnd) {\n let i = aStart,\n sequence = 1,\n t;\n while (++i < aEnd && i < bEnd) {\n if ((t = map.get(a[i])) == null || t !== index + sequence) break;\n sequence++;\n }\n if (sequence > index - bStart) {\n const node = a[aStart];\n while (bStart < index) parentNode.insertBefore(b[bStart++], node);\n } else parentNode.replaceChild(b[bStart++], a[aStart++]);\n } else aStart++;\n } else a[aStart++].remove();\n }\n }\n}\n\nconst $$EVENTS = \"_$DX_DELEGATE\";\nfunction render(code, element, init, options = {}) {\n let disposer;\n createRoot(dispose => {\n disposer = dispose;\n element === document ? code() : insert(element, code(), element.firstChild ? null : undefined, init);\n }, options.owner);\n return () => {\n disposer();\n element.textContent = \"\";\n };\n}\nfunction template(html, isImportNode, isSVG, isMathML) {\n let node;\n const create = () => {\n const t = isMathML ? document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"template\") : document.createElement(\"template\");\n t.innerHTML = html;\n return isSVG ? t.content.firstChild.firstChild : isMathML ? t.firstChild : t.content.firstChild;\n };\n const fn = isImportNode ? () => untrack(() => document.importNode(node || (node = create()), true)) : () => (node || (node = create())).cloneNode(true);\n fn.cloneNode = fn;\n return fn;\n}\nfunction delegateEvents(eventNames, document = window.document) {\n const e = document[$$EVENTS] || (document[$$EVENTS] = new Set());\n for (let i = 0, l = eventNames.length; i < l; i++) {\n const name = eventNames[i];\n if (!e.has(name)) {\n e.add(name);\n document.addEventListener(name, eventHandler);\n }\n }\n}\nfunction clearDelegatedEvents(document = window.document) {\n if (document[$$EVENTS]) {\n for (let name of document[$$EVENTS].keys()) document.removeEventListener(name, eventHandler);\n delete document[$$EVENTS];\n }\n}\nfunction setProperty(node, name, value) {\n if (isHydrating(node)) return;\n node[name] = value;\n}\nfunction setAttribute(node, name, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttribute(name);else node.setAttribute(name, value);\n}\nfunction setAttributeNS(node, namespace, name, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttributeNS(namespace, name);else node.setAttributeNS(namespace, name, value);\n}\nfunction setBoolAttribute(node, name, value) {\n if (isHydrating(node)) return;\n value ? node.setAttribute(name, \"\") : node.removeAttribute(name);\n}\nfunction className(node, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttribute(\"class\");else node.className = value;\n}\nfunction addEventListener(node, name, handler, delegate) {\n if (delegate) {\n if (Array.isArray(handler)) {\n node[`$$${name}`] = handler[0];\n node[`$$${name}Data`] = handler[1];\n } else node[`$$${name}`] = handler;\n } else if (Array.isArray(handler)) {\n const handlerFn = handler[0];\n node.addEventListener(name, handler[0] = e => handlerFn.call(node, handler[1], e));\n } else node.addEventListener(name, handler, typeof handler !== \"function\" && handler);\n}\nfunction classList(node, value, prev = {}) {\n const classKeys = Object.keys(value || {}),\n prevKeys = Object.keys(prev);\n let i, len;\n for (i = 0, len = prevKeys.length; i < len; i++) {\n const key = prevKeys[i];\n if (!key || key === \"undefined\" || value[key]) continue;\n toggleClassKey(node, key, false);\n delete prev[key];\n }\n for (i = 0, len = classKeys.length; i < len; i++) {\n const key = classKeys[i],\n classValue = !!value[key];\n if (!key || key === \"undefined\" || prev[key] === classValue || !classValue) continue;\n toggleClassKey(node, key, true);\n prev[key] = classValue;\n }\n return prev;\n}\nfunction style(node, value, prev) {\n if (!value) return prev ? setAttribute(node, \"style\") : value;\n const nodeStyle = node.style;\n if (typeof value === \"string\") return nodeStyle.cssText = value;\n typeof prev === \"string\" && (nodeStyle.cssText = prev = undefined);\n prev || (prev = {});\n value || (value = {});\n let v, s;\n for (s in prev) {\n value[s] == null && nodeStyle.removeProperty(s);\n delete prev[s];\n }\n for (s in value) {\n v = value[s];\n if (v !== prev[s]) {\n nodeStyle.setProperty(s, v);\n prev[s] = v;\n }\n }\n return prev;\n}\nfunction setStyleProperty(node, name, value) {\n value != null ? node.style.setProperty(name, value) : node.style.removeProperty(name);\n}\nfunction spread(node, props = {}, isSVG, skipChildren) {\n const prevProps = {};\n if (!skipChildren) {\n createRenderEffect(() => prevProps.children = insertExpression(node, props.children, prevProps.children));\n }\n createRenderEffect(() => typeof props.ref === \"function\" && use(props.ref, node));\n createRenderEffect(() => assign(node, props, isSVG, true, prevProps, true));\n return prevProps;\n}\nfunction dynamicProperty(props, key) {\n const src = props[key];\n Object.defineProperty(props, key, {\n get() {\n return src();\n },\n enumerable: true\n });\n return props;\n}\nfunction use(fn, element, arg) {\n return untrack(() => fn(element, arg));\n}\nfunction insert(parent, accessor, marker, initial) {\n if (marker !== undefined && !initial) initial = [];\n if (typeof accessor !== \"function\") return insertExpression(parent, accessor, initial, marker);\n createRenderEffect(current => insertExpression(parent, accessor(), current, marker), initial);\n}\nfunction assign(node, props, isSVG, skipChildren, prevProps = {}, skipRef = false) {\n props || (props = {});\n for (const prop in prevProps) {\n if (!(prop in props)) {\n if (prop === \"children\") continue;\n prevProps[prop] = assignProp(node, prop, null, prevProps[prop], isSVG, skipRef, props);\n }\n }\n for (const prop in props) {\n if (prop === \"children\") {\n if (!skipChildren) insertExpression(node, props.children);\n continue;\n }\n const value = props[prop];\n prevProps[prop] = assignProp(node, prop, value, prevProps[prop], isSVG, skipRef, props);\n }\n}\nfunction hydrate$1(code, element, options = {}) {\n if (globalThis._$HY.done) return render(code, element, [...element.childNodes], options);\n sharedConfig.completed = globalThis._$HY.completed;\n sharedConfig.events = globalThis._$HY.events;\n sharedConfig.load = id => globalThis._$HY.r[id];\n sharedConfig.has = id => id in globalThis._$HY.r;\n sharedConfig.gather = root => gatherHydratable(element, root);\n sharedConfig.registry = new Map();\n sharedConfig.context = {\n id: options.renderId || \"\",\n count: 0\n };\n try {\n gatherHydratable(element, options.renderId);\n return render(code, element, [...element.childNodes], options);\n } finally {\n sharedConfig.context = null;\n }\n}\nfunction getNextElement(template) {\n let node,\n key,\n hydrating = isHydrating();\n if (!hydrating || !(node = sharedConfig.registry.get(key = getHydrationKey()))) {\n return template();\n }\n if (sharedConfig.completed) sharedConfig.completed.add(node);\n sharedConfig.registry.delete(key);\n return node;\n}\nfunction getNextMatch(el, nodeName) {\n while (el && el.localName !== nodeName) el = el.nextSibling;\n return el;\n}\nfunction getNextMarker(start) {\n let end = start,\n count = 0,\n current = [];\n if (isHydrating(start)) {\n while (end) {\n if (end.nodeType === 8) {\n const v = end.nodeValue;\n if (v === \"$\") count++;else if (v === \"/\") {\n if (count === 0) return [end, current];\n count--;\n }\n }\n current.push(end);\n end = end.nextSibling;\n }\n }\n return [end, current];\n}\nfunction runHydrationEvents() {\n if (sharedConfig.events && !sharedConfig.events.queued) {\n queueMicrotask(() => {\n const {\n completed,\n events\n } = sharedConfig;\n if (!events) return;\n events.queued = false;\n while (events.length) {\n const [el, e] = events[0];\n if (!completed.has(el)) return;\n events.shift();\n eventHandler(e);\n }\n if (sharedConfig.done) {\n sharedConfig.events = _$HY.events = null;\n sharedConfig.completed = _$HY.completed = null;\n }\n });\n sharedConfig.events.queued = true;\n }\n}\nfunction isHydrating(node) {\n return !!sharedConfig.context && !sharedConfig.done && (!node || node.isConnected);\n}\nfunction toPropertyName(name) {\n return name.toLowerCase().replace(/-([a-z])/g, (_, w) => w.toUpperCase());\n}\nfunction toggleClassKey(node, key, value) {\n const classNames = key.trim().split(/\\s+/);\n for (let i = 0, nameLen = classNames.length; i < nameLen; i++) node.classList.toggle(classNames[i], value);\n}\nfunction assignProp(node, prop, value, prev, isSVG, skipRef, props) {\n let isCE, isProp, isChildProp, propAlias, forceProp;\n if (prop === \"style\") return style(node, value, prev);\n if (prop === \"classList\") return classList(node, value, prev);\n if (value === prev) return prev;\n if (prop === \"ref\") {\n if (!skipRef) value(node);\n } else if (prop.slice(0, 3) === \"on:\") {\n const e = prop.slice(3);\n prev && node.removeEventListener(e, prev, typeof prev !== \"function\" && prev);\n value && node.addEventListener(e, value, typeof value !== \"function\" && value);\n } else if (prop.slice(0, 10) === \"oncapture:\") {\n const e = prop.slice(10);\n prev && node.removeEventListener(e, prev, true);\n value && node.addEventListener(e, value, true);\n } else if (prop.slice(0, 2) === \"on\") {\n const name = prop.slice(2).toLowerCase();\n const delegate = DelegatedEvents.has(name);\n if (!delegate && prev) {\n const h = Array.isArray(prev) ? prev[0] : prev;\n node.removeEventListener(name, h);\n }\n if (delegate || value) {\n addEventListener(node, name, value, delegate);\n delegate && delegateEvents([name]);\n }\n } else if (prop.slice(0, 5) === \"attr:\") {\n setAttribute(node, prop.slice(5), value);\n } else if (prop.slice(0, 5) === \"bool:\") {\n setBoolAttribute(node, prop.slice(5), value);\n } else if ((forceProp = prop.slice(0, 5) === \"prop:\") || (isChildProp = ChildProperties.has(prop)) || !isSVG && ((propAlias = getPropAlias(prop, node.tagName)) || (isProp = Properties.has(prop))) || (isCE = node.nodeName.includes(\"-\") || \"is\" in props)) {\n if (forceProp) {\n prop = prop.slice(5);\n isProp = true;\n } else if (isHydrating(node)) return value;\n if (prop === \"class\" || prop === \"className\") className(node, value);else if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value;else node[propAlias || prop] = value;\n } else {\n const ns = isSVG && prop.indexOf(\":\") > -1 && SVGNamespace[prop.split(\":\")[0]];\n if (ns) setAttributeNS(node, ns, prop, value);else setAttribute(node, Aliases[prop] || prop, value);\n }\n return value;\n}\nfunction eventHandler(e) {\n if (sharedConfig.registry && sharedConfig.events) {\n if (sharedConfig.events.find(([el, ev]) => ev === e)) return;\n }\n let node = e.target;\n const key = `$$${e.type}`;\n const oriTarget = e.target;\n const oriCurrentTarget = e.currentTarget;\n const retarget = value => Object.defineProperty(e, \"target\", {\n configurable: true,\n value\n });\n const handleNode = () => {\n const handler = node[key];\n if (handler && !node.disabled) {\n const data = node[`${key}Data`];\n data !== undefined ? handler.call(node, data, e) : handler.call(node, e);\n if (e.cancelBubble) return;\n }\n node.host && typeof node.host !== \"string\" && !node.host._$host && node.contains(e.target) && retarget(node.host);\n return true;\n };\n const walkUpTree = () => {\n while (handleNode() && (node = node._$host || node.parentNode || node.host));\n };\n Object.defineProperty(e, \"currentTarget\", {\n configurable: true,\n get() {\n return node || document;\n }\n });\n if (sharedConfig.registry && !sharedConfig.done) sharedConfig.done = _$HY.done = true;\n if (e.composedPath) {\n const path = e.composedPath();\n retarget(path[0]);\n for (let i = 0; i < path.length - 2; i++) {\n node = path[i];\n if (!handleNode()) break;\n if (node._$host) {\n node = node._$host;\n walkUpTree();\n break;\n }\n if (node.parentNode === oriCurrentTarget) {\n break;\n }\n }\n }\n else walkUpTree();\n retarget(oriTarget);\n}\nfunction insertExpression(parent, value, current, marker, unwrapArray) {\n const hydrating = isHydrating(parent);\n if (hydrating) {\n !current && (current = [...parent.childNodes]);\n let cleaned = [];\n for (let i = 0; i < current.length; i++) {\n const node = current[i];\n if (node.nodeType === 8 && node.data.slice(0, 2) === \"!$\") node.remove();else cleaned.push(node);\n }\n current = cleaned;\n }\n while (typeof current === \"function\") current = current();\n if (value === current) return current;\n const t = typeof value,\n multi = marker !== undefined;\n parent = multi && current[0] && current[0].parentNode || parent;\n if (t === \"string\" || t === \"number\") {\n if (hydrating) return current;\n if (t === \"number\") {\n value = value.toString();\n if (value === current) return current;\n }\n if (multi) {\n let node = current[0];\n if (node && node.nodeType === 3) {\n node.data !== value && (node.data = value);\n } else node = document.createTextNode(value);\n current = cleanChildren(parent, current, marker, node);\n } else {\n if (current !== \"\" && typeof current === \"string\") {\n current = parent.firstChild.data = value;\n } else current = parent.textContent = value;\n }\n } else if (value == null || t === \"boolean\") {\n if (hydrating) return current;\n current = cleanChildren(parent, current, marker);\n } else if (t === \"function\") {\n createRenderEffect(() => {\n let v = value();\n while (typeof v === \"function\") v = v();\n current = insertExpression(parent, v, current, marker);\n });\n return () => current;\n } else if (Array.isArray(value)) {\n const array = [];\n const currentArray = current && Array.isArray(current);\n if (normalizeIncomingArray(array, value, current, unwrapArray)) {\n createRenderEffect(() => current = insertExpression(parent, array, current, marker, true));\n return () => current;\n }\n if (hydrating) {\n if (!array.length) return current;\n if (marker === undefined) return current = [...parent.childNodes];\n let node = array[0];\n if (node.parentNode !== parent) return current;\n const nodes = [node];\n while ((node = node.nextSibling) !== marker) nodes.push(node);\n return current = nodes;\n }\n if (array.length === 0) {\n current = cleanChildren(parent, current, marker);\n if (multi) return current;\n } else if (currentArray) {\n if (current.length === 0) {\n appendNodes(parent, array, marker);\n } else reconcileArrays(parent, current, array);\n } else {\n current && cleanChildren(parent);\n appendNodes(parent, array);\n }\n current = array;\n } else if (value.nodeType) {\n if (hydrating && value.parentNode) return current = multi ? [value] : value;\n if (Array.isArray(current)) {\n if (multi) return current = cleanChildren(parent, current, marker, value);\n cleanChildren(parent, current, null, value);\n } else if (current == null || current === \"\" || !parent.firstChild) {\n parent.appendChild(value);\n } else parent.replaceChild(value, parent.firstChild);\n current = value;\n } else ;\n return current;\n}\nfunction normalizeIncomingArray(normalized, array, current, unwrap) {\n let dynamic = false;\n for (let i = 0, len = array.length; i < len; i++) {\n let item = array[i],\n prev = current && current[normalized.length],\n t;\n if (item == null || item === true || item === false) ; else if ((t = typeof item) === \"object\" && item.nodeType) {\n normalized.push(item);\n } else if (Array.isArray(item)) {\n dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic;\n } else if (t === \"function\") {\n if (unwrap) {\n while (typeof item === \"function\") item = item();\n dynamic = normalizeIncomingArray(normalized, Array.isArray(item) ? item : [item], Array.isArray(prev) ? prev : [prev]) || dynamic;\n } else {\n normalized.push(item);\n dynamic = true;\n }\n } else {\n const value = String(item);\n if (prev && prev.nodeType === 3 && prev.data === value) normalized.push(prev);else normalized.push(document.createTextNode(value));\n }\n }\n return dynamic;\n}\nfunction appendNodes(parent, array, marker = null) {\n for (let i = 0, len = array.length; i < len; i++) parent.insertBefore(array[i], marker);\n}\nfunction cleanChildren(parent, current, marker, replacement) {\n if (marker === undefined) return parent.textContent = \"\";\n const node = replacement || document.createTextNode(\"\");\n if (current.length) {\n let inserted = false;\n for (let i = current.length - 1; i >= 0; i--) {\n const el = current[i];\n if (node !== el) {\n const isParent = el.parentNode === parent;\n if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && el.remove();\n } else inserted = true;\n }\n } else parent.insertBefore(node, marker);\n return [node];\n}\nfunction gatherHydratable(element, root) {\n const templates = element.querySelectorAll(`*[data-hk]`);\n for (let i = 0; i < templates.length; i++) {\n const node = templates[i];\n const key = node.getAttribute(\"data-hk\");\n if ((!root || key.startsWith(root)) && !sharedConfig.registry.has(key)) sharedConfig.registry.set(key, node);\n }\n}\nfunction getHydrationKey() {\n return sharedConfig.getNextContextId();\n}\nfunction NoHydration(props) {\n return sharedConfig.context ? undefined : props.children;\n}\nfunction Hydration(props) {\n return props.children;\n}\nconst voidFn = () => undefined;\nconst RequestContext = Symbol();\nfunction innerHTML(parent, content) {\n !sharedConfig.context && (parent.innerHTML = content);\n}\n\nfunction throwInBrowser(func) {\n const err = new Error(`${func.name} is not supported in the browser, returning undefined`);\n console.error(err);\n}\nfunction renderToString(fn, options) {\n throwInBrowser(renderToString);\n}\nfunction renderToStringAsync(fn, options) {\n throwInBrowser(renderToStringAsync);\n}\nfunction renderToStream(fn, options) {\n throwInBrowser(renderToStream);\n}\nfunction ssr(template, ...nodes) {}\nfunction ssrElement(name, props, children, needsId) {}\nfunction ssrClassList(value) {}\nfunction ssrStyle(value) {}\nfunction ssrAttribute(key, value) {}\nfunction ssrHydrationKey() {}\nfunction resolveSSRNode(node) {}\nfunction escape(html) {}\nfunction ssrSpread(props, isSVG, skipChildren) {}\n\nconst isServer = false;\nconst isDev = false;\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\nfunction createElement(tagName, isSVG = false, is = undefined) {\n return isSVG ? document.createElementNS(SVG_NAMESPACE, tagName) : document.createElement(tagName, {\n is\n });\n}\nconst hydrate = (...args) => {\n enableHydration();\n return hydrate$1(...args);\n};\nfunction Portal(props) {\n const {\n useShadow\n } = props,\n marker = document.createTextNode(\"\"),\n mount = () => props.mount || document.body,\n owner = getOwner();\n let content;\n let hydrating = !!sharedConfig.context;\n createEffect(() => {\n if (hydrating) getOwner().user = hydrating = false;\n content || (content = runWithOwner(owner, () => createMemo(() => props.children)));\n const el = mount();\n if (el instanceof HTMLHeadElement) {\n const [clean, setClean] = createSignal(false);\n const cleanup = () => setClean(true);\n createRoot(dispose => insert(el, () => !clean() ? content() : dispose(), null));\n onCleanup(cleanup);\n } else {\n const container = createElement(props.isSVG ? \"g\" : \"div\", props.isSVG),\n renderRoot = useShadow && container.attachShadow ? container.attachShadow({\n mode: \"open\"\n }) : container;\n Object.defineProperty(container, \"_$host\", {\n get() {\n return marker.parentNode;\n },\n configurable: true\n });\n insert(renderRoot, content);\n el.appendChild(container);\n props.ref && props.ref(container);\n onCleanup(() => el.removeChild(container));\n }\n }, undefined, {\n render: !hydrating\n });\n return marker;\n}\nfunction createDynamic(component, props) {\n const cached = createMemo(component);\n return createMemo(() => {\n const component = cached();\n switch (typeof component) {\n case \"function\":\n return untrack(() => component(props));\n case \"string\":\n const isSvg = SVGElements.has(component);\n const el = sharedConfig.context ? getNextElement() : createElement(component, isSvg, untrack(() => props.is));\n spread(el, props, isSvg);\n return el;\n }\n });\n}\nfunction Dynamic(props) {\n const [, others] = splitProps(props, [\"component\"]);\n return createDynamic(() => props.component, others);\n}\n\nexport { Aliases, voidFn as Assets, ChildProperties, DOMElements, DelegatedEvents, Dynamic, Hydration, voidFn as HydrationScript, NoHydration, Portal, Properties, RequestContext, SVGElements, SVGNamespace, addEventListener, assign, classList, className, clearDelegatedEvents, createDynamic, delegateEvents, dynamicProperty, escape, voidFn as generateHydrationScript, voidFn as getAssets, getHydrationKey, getNextElement, getNextMarker, getNextMatch, getPropAlias, voidFn as getRequestEvent, hydrate, innerHTML, insert, isDev, isServer, memo, render, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, runHydrationEvents, setAttribute, setAttributeNS, setBoolAttribute, setProperty, setStyleProperty, spread, ssr, ssrAttribute, ssrClassList, ssrElement, ssrHydrationKey, ssrSpread, ssrStyle, style, template, use, voidFn as useAssets };\n","export default \"data:image/svg+xml,%3csvg%20width='44'%20height='40'%20viewBox='0%200%2044%2040'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M36.4826%2032.6733C35.865%2033.1908%2035.1941%2033.6282%2034.4904%2033.957L33.74%2034.2621L29.7612%2035.8775C27.1272%2036.125%2024.4866%2036.253%2021.8465%2036.2542C21.235%2036.2549%2020.6236%2036.2482%2020.0127%2036.2348V33.2478L36.4826%2032.6733Z'%20fill='%239EACBA'/%3e%3cpath%20d='M0.438355%2018.8047C0.245806%2020.9769%200.245812%2023.1226%200.438355%2025.2946C0.535045%2025.9265%200.94889%2026.5048%201.4516%2026.8841C2.21046%2027.3799%202.95285%2027.8531%203.87299%2027.9711C4.74581%2027.9246%205.47724%2026.84%205.59973%2026.0356C5.89635%2023.3667%205.89636%2020.7328%205.59973%2018.0638C5.47724%2017.2593%204.74582%2016.1747%203.873%2016.1282C2.95286%2016.2462%202.21046%2016.7194%201.45161%2017.2152C0.948896%2017.5945%200.535045%2018.1729%200.438355%2018.8047Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M43.0616%2018.8047C43.2541%2020.9769%2043.2541%2023.1226%2043.0616%2025.2946C42.9649%2025.9265%2042.551%2026.5048%2042.0483%2026.8841C41.2895%2027.3799%2040.5471%2027.8531%2039.6269%2027.9711C38.7541%2027.9246%2038.0227%2026.84%2037.9002%2026.0356C37.6036%2023.3667%2037.6036%2020.7328%2037.9002%2018.0638C38.0227%2017.2593%2038.7541%2016.1747%2039.6269%2016.1282C40.5471%2016.2462%2041.2895%2016.7194%2042.0483%2017.2152C42.551%2017.5945%2042.9649%2018.1729%2043.0616%2018.8047Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M25.8389%208.85439H21.8867V7.22803H21.9359C22.2919%207.22803%2022.6365%207.24805%2022.9641%207.28506C24.6208%207.47311%2025.8389%208.10461%2025.8389%208.85439Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M22.9637%208.85422V11.641H20.9072V3.74219H21.8863V8.85422H22.9637Z'%20fill='%23171A3B'/%3e%3cpath%20d='M25.8393%208.85439C25.8393%209.60419%2024.6212%2010.2357%2022.9645%2010.4237C22.6369%2010.4607%2022.2923%2010.4808%2021.9362%2010.4808C21.5801%2010.4808%2021.2356%2010.4607%2020.908%2010.4237C19.2513%2010.2357%2018.0332%209.60419%2018.0332%208.85439C18.0332%208.104%2019.2513%207.47311%2020.908%207.28506C21.2204%207.24987%2021.5486%207.22985%2021.8871%207.22803V8.85439H25.8393Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M21.8871%208.85499V35.245H21.8465C21.235%2035.2456%2020.6235%2035.2389%2020.0127%2035.2256C17.1712%2035.1637%2014.331%2034.9538%2011.5017%2034.5856C7.74793%2034.0979%204.29685%2030.281%203.74784%2026.4459C3.32624%2023.5019%203.32624%2020.598%203.74784%2017.6541C4.29684%2013.819%207.74793%2010.0021%2011.5017%209.5144C14.9401%209.06731%2018.393%208.85317%2021.8465%208.85499H21.8871Z'%20fill='%23E7E9EB'/%3e%3cpath%20d='M40.114%2026.4452C39.7718%2028.7455%2038.3748%2031.0864%2036.4821%2032.6728C35.8646%2033.1902%2035.1936%2033.6276%2034.49%2033.9564C34.2437%2034.0716%2033.9931%2034.1736%2033.7396%2034.2615C33.2888%2034.4168%2032.8272%2034.5272%2032.3601%2034.5848C28.8781%2035.0149%2025.3827%2035.2406%2021.8867%2035.2442V8.85425C25.3821%208.85789%2028.8787%209.08355%2032.3601%209.51366C36.1382%209.98014%2039.5516%2013.8729%2040.114%2017.6533C40.5489%2020.5785%2040.5489%2023.5206%2040.114%2026.4452Z'%20fill='%23D1D3D4'/%3e%3cpath%20d='M27.1787%2013.3372C28.7256%2013.4409%2030.2804%2013.5888%2031.834%2013.7805C33.5282%2013.9898%2035.5612%2016.263%2035.8623%2018.2854C36.2336%2020.7829%2036.2336%2023.3159%2035.8623%2025.8127C35.6791%2027.0417%2034.8396%2028.4416%2033.7217%2029.3782C33.3772%2029.6675%2033.0233%2029.8974%2032.6709%2030.0618C32.5593%2030.1145%2032.4464%2030.1603%2032.3359%2030.1985C32.1609%2030.259%2031.9925%2030.2992%2031.835%2030.3186C28.467%2030.7347%2025.0907%2030.9456%2021.7998%2030.9456C21.2369%2030.9456%2020.667%2030.9391%2020.1064%2030.927C17.3961%2030.8675%2014.6875%2030.6643%2012.0566%2030.3215C11.6382%2030.2669%2011.1776%2030.0829%2010.7197%2029.7961L27.1787%2013.3372ZM21.7988%2013.1536C22.397%2013.1536%2022.9986%2013.1605%2023.6016%2013.175H23.6006C24.7855%2013.2017%2025.9795%2013.2559%2027.1777%2013.3372L10.7188%2029.7961C10.3196%2029.5462%209.92292%2029.2179%209.55957%2028.8303C9.2952%2028.5484%209.05604%2028.2435%208.84863%2027.927V27.926C8.40193%2027.2445%208.10127%2026.5082%208.00488%2025.8352C7.82534%2024.5778%207.73289%2023.3374%207.73047%2022.0969C7.72805%2020.825%207.8205%2019.5531%208.00488%2018.2629C8.14621%2017.2772%208.72802%2016.1571%209.56152%2015.2678C10.341%2014.4363%2011.2736%2013.8785%2012.0566%2013.7766C13.5174%2013.5867%2014.9995%2013.4403%2016.4912%2013.3372C18.2497%2013.2152%2020.0239%2013.1536%2021.7988%2013.1536Z'%20fill='%2333383F'/%3e%3cpath%20d='M21.8877%200.164557V4.90412C21.5382%204.90412%2021.207%204.8289%2020.9086%204.69301C20.0878%204.32054%2019.5176%203.49371%2019.5176%202.53403C19.5176%201.22554%2020.5786%200.164557%2021.8877%200.164557Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M29.7612%2035.877L20.0127%2039.8352V36.2343C20.6236%2036.2476%2021.235%2036.2543%2021.8465%2036.2537C24.4866%2036.2525%2027.1272%2036.1245%2029.7612%2035.877Z'%20fill='%23D1D3D4'/%3e%3cpath%20d='M24.2562%202.53403C24.2562%203.45488%2023.7309%204.2532%2022.9641%204.64569C22.6414%204.8107%2022.275%204.90411%2021.8867%204.90411V0.164551C23.1952%200.164551%2024.2562%201.22553%2024.2562%202.53403Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M22.9641%204.646V7.28541C22.6365%207.24841%2022.2919%207.22839%2021.9359%207.22839H21.8867V4.90441C22.275%204.90441%2022.6414%204.811%2022.9641%204.646Z'%20fill='%2301052B'/%3e%3cpath%20d='M15.4282%2025.5157C14.6141%2025.6903%2014.1949%2025.6903%2013.3808%2025.5157C12.8325%2025.2805%2012.4157%2024.7097%2012.2918%2024.124C12.0811%2022.4009%2012.0811%2020.7336%2012.2918%2019.0104C12.4157%2018.4248%2012.8325%2017.854%2013.3808%2017.6188C14.1949%2017.4441%2014.6141%2017.4441%2015.4282%2017.6188C15.9765%2017.854%2016.3933%2018.4248%2016.5173%2019.0104C16.7279%2020.7336%2016.7279%2022.4009%2016.5173%2024.124C16.3933%2024.7097%2015.9765%2025.2805%2015.4282%2025.5157Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M29.4946%2025.5157C28.6805%2025.6903%2028.2613%2025.6903%2027.4472%2025.5157C26.8989%2025.2805%2026.4821%2024.7097%2026.3582%2024.124C26.1475%2022.4009%2026.1475%2020.7336%2026.3582%2019.0104C26.4821%2018.4248%2026.8989%2017.854%2027.4472%2017.6188C28.2613%2017.4441%2028.6805%2017.4441%2029.4946%2017.6188C30.0429%2017.854%2030.4597%2018.4248%2030.5837%2019.0104C30.7943%2020.7336%2030.7943%2022.4009%2030.5837%2024.124C30.4597%2024.7097%2030.0429%2025.2805%2029.4946%2025.5157Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M18.9688%2024.187H23.91C24.2911%2024.187%2024.6004%2024.5023%2024.6004%2024.8906V24.9011C24.6004%2026.6789%2023.184%2028.1222%2021.4394%2028.1222C19.6948%2028.1222%2018.2783%2026.6789%2018.2783%2024.9011V24.8906C18.2783%2024.5023%2018.5877%2024.187%2018.9688%2024.187Z'%20fill='%2351D6A1'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='28'%20height='28'%20viewBox='0%200%2028%2028'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='28'%20height='28'%20rx='14'%20fill='%23EFEFEF'/%3e%3cpath%20d='M20.667%209.83325L7.33366%209.83325'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M16.5%2014L7.33333%2014'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M11.5%2018.1667H7.33333'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='29'%20height='28'%20viewBox='0%200%2029%2028'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M11.5977%2016.0232C11.8613%2015.7596%2012.2882%2015.7596%2012.5518%2016.0232C12.8152%2016.2868%2012.8153%2016.7137%2012.5518%2016.9773L7.87109%2021.658H11.1221C11.4949%2021.658%2011.7969%2021.9609%2011.7969%2022.3337C11.7967%2022.7064%2011.4948%2023.0085%2011.1221%2023.0085H6.24121C5.86853%2023.0085%205.56658%2022.7064%205.56641%2022.3337V17.4529C5.56641%2017.0801%205.86842%2016.7771%206.24121%2016.7771C6.614%2016.7771%206.91602%2017.0801%206.91602%2017.4529V20.7039L11.5977%2016.0232ZM22.9082%204.99194C23.2808%204.99212%2023.583%205.29406%2023.583%205.66675V10.5476C23.583%2010.9203%2023.2808%2011.2222%2022.9082%2011.2224C22.5354%2011.2224%2022.2324%2010.9204%2022.2324%2010.5476V7.29663L17.5518%2011.9773C17.2882%2012.2408%2016.8613%2012.2407%2016.5977%2011.9773C16.3341%2011.7137%2016.3341%2011.2868%2016.5977%2011.0232L21.2783%206.34155H18.0273C17.6546%206.34155%2017.3516%206.03954%2017.3516%205.66675C17.3516%205.29396%2017.6546%204.99194%2018.0273%204.99194H22.9082Z'%20fill='%23858B93'%20stroke='%23858B93'%20stroke-width='0.1'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='29'%20height='28'%20viewBox='0%200%2029%2028'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M12.0737%2015.8249C12.4464%2015.8249%2012.7493%2016.127%2012.7495%2016.4997V21.3805C12.7495%2021.7533%2012.4465%2022.0563%2012.0737%2022.0563C11.7011%2022.0561%2011.3989%2021.7532%2011.3989%2021.3805V18.1296L6.71826%2022.8102C6.45466%2023.0738%206.02679%2023.0738%205.76318%2022.8102C5.49996%2022.5466%205.49985%2022.1196%205.76318%2021.8561L10.4438%2017.1755H7.19287C6.82019%2017.1753%206.51807%2016.8724%206.51807%2016.4997C6.51824%2016.1271%206.82029%2015.825%207.19287%2015.8249H12.0737ZM22.4302%205.18913C22.6937%204.9258%2023.1207%204.92591%2023.3843%205.18913C23.6479%205.45274%2023.6479%205.88061%2023.3843%206.14421L18.7046%2010.8249H21.9546C22.3273%2010.8249%2022.6302%2011.127%2022.6304%2011.4997C22.6304%2011.8725%2022.3274%2012.1755%2021.9546%2012.1755H17.0737C16.7011%2012.1753%2016.3989%2011.8724%2016.3989%2011.4997V6.61882C16.3991%206.24624%2016.7012%205.94419%2017.0737%205.94402C17.4464%205.94402%2017.7494%206.24613%2017.7495%206.61882V9.8698L22.4302%205.18913Z'%20fill='%23858B93'%20stroke='%23858B93'%20stroke-width='0.1'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='29'%20height='28'%20viewBox='0%200%2029%2028'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M5.55273%2013.6665C5.55273%2013.3904%205.95149%2013.1665%206.44338%2013.1665L20.6139%2013.1665C21.1058%2013.1665%2021.5046%2013.3904%2021.5046%2013.6665C21.5046%2013.9426%2021.1058%2014.1665%2020.6139%2014.1665H6.44338C5.95149%2014.1665%205.55273%2013.9426%205.55273%2013.6665Z'%20stroke='%23858B93'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='34'%20height='34'%20viewBox='0%200%2034%2034'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M10.2391%208.55011C9.85199%208.16298%209.22434%208.16298%208.83722%208.55011C8.45009%208.93723%208.45009%209.56488%208.83722%209.95201L15.885%2016.9998L8.83728%2024.0476C8.45016%2024.4347%208.45016%2025.0624%208.83728%2025.4495C9.22441%2025.8366%209.85206%2025.8366%2010.2392%2025.4495L17.2869%2018.4017L24.3346%2025.4494C24.7217%2025.8365%2025.3494%2025.8365%2025.7365%2025.4494C26.1236%2025.0623%2026.1236%2024.4346%2025.7365%2024.0475L18.6888%2016.9998L25.7366%209.95207C26.1237%209.56495%2026.1237%208.9373%2025.7366%208.55017C25.3495%208.16305%2024.7218%208.16305%2024.3347%208.55017L17.2869%2015.5979L10.2391%208.55011Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M11.9912%202.92969C11.4392%202.92969%2010.9912%203.37769%2010.9912%203.92969V10.9297H3.99121C3.43921%2010.9297%202.99121%2011.3777%202.99121%2011.9297C2.99121%2012.4817%203.43921%2012.9297%203.99121%2012.9297H10.9912V19.9297C10.9912%2020.4817%2011.4392%2020.9297%2011.9912%2020.9297C12.5432%2020.9297%2012.9912%2020.4817%2012.9912%2019.9297V12.9297H19.9912C20.5432%2012.9297%2020.9912%2012.4817%2020.9912%2011.9297C20.9912%2011.3777%2020.5432%2010.9297%2019.9912%2010.9297H12.9912V3.92969C12.9912%203.37769%2012.5432%202.92969%2011.9912%202.92969Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='32'%20height='32'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='32'%20height='32'%20rx='16'%20fill='white'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M15.6464%2010.3132C15.8417%2010.1179%2016.1583%2010.1179%2016.3536%2010.3132L20.3536%2014.3132C20.5488%2014.5085%2020.5488%2014.825%2020.3536%2015.0203C20.1583%2015.2156%2019.8417%2015.2156%2019.6464%2015.0203L16.5%2011.8739L16.5%2021.3334C16.5%2021.6096%2016.2761%2021.8334%2016%2021.8334C15.7239%2021.8334%2015.5%2021.6096%2015.5%2021.3334L15.5%2011.8739L12.3536%2015.0203C12.1583%2015.2156%2011.8417%2015.2156%2011.6464%2015.0203C11.4512%2014.825%2011.4512%2014.5085%2011.6464%2014.3132L15.6464%2010.3132Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='28'%20height='28'%20viewBox='0%200%2028%2028'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='28'%20height='28'%20rx='14'%20fill='%231AAF74'%20fill-opacity='0.1'/%3e%3cpath%20d='M20.667%209.83325L7.33366%209.83325'%20stroke='%231AAF74'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M16.5%2014L7.33333%2014'%20stroke='%231AAF74'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M11.5%2018.1667H7.33333'%20stroke='%231AAF74'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='12'%20cy='6.5'%20r='4'%20stroke='%23858B93'%20stroke-width='1.3'/%3e%3cellipse%20cx='12'%20cy='17.5'%20rx='7'%20ry='4'%20stroke='%23858B93'%20stroke-width='1.3'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M2%2012.5C2%207.78595%202%205.42893%203.46447%203.96447C4.92893%202.5%207.28595%202.5%2012%202.5C16.714%202.5%2019.0711%202.5%2020.5355%203.96447C22%205.42893%2022%207.78595%2022%2012.5C22%2017.214%2022%2019.5711%2020.5355%2021.0355C19.0711%2022.5%2016.714%2022.5%2012%2022.5C7.28595%2022.5%204.92893%2022.5%203.46447%2021.0355C2%2019.5711%202%2017.214%202%2012.5Z'%20stroke='%23858B93'%20stroke-width='1.3'/%3e%3cpath%20d='M7%2014.5L8.79689%2012.3437C9.50894%2011.4893%209.86496%2011.062%2010.3333%2011.062C10.8017%2011.062%2011.1577%2011.4893%2011.8698%2012.3437L12.1302%2012.6563C12.8423%2013.5107%2013.1983%2013.938%2013.6667%2013.938C14.135%2013.938%2014.4911%2013.5107%2015.2031%2012.6563L17%2010.5'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M22%2011V12.5C22%2017.214%2022%2019.5711%2020.5355%2021.0355C19.0711%2022.5%2016.714%2022.5%2012%2022.5C7.28595%2022.5%204.92893%2022.5%203.46447%2021.0355C2%2019.5711%202%2017.214%202%2012.5C2%207.78595%202%205.42893%203.46447%203.96447C4.92893%202.5%207.28595%202.5%2012%202.5H13.5'%20stroke='%23858B93'%20stroke-width='1.3'%20stroke-linecap='round'/%3e%3cpath%20d='M16.652%203.95506L17.3009%203.30624C18.3759%202.23125%2020.1188%202.23125%2021.1938%203.30624C22.2687%204.38124%2022.2687%206.12415%2021.1938%207.19914L20.5449%207.84795M16.652%203.95506C16.652%203.95506%2016.7331%205.33379%2017.9497%206.55032C19.1662%207.76685%2020.5449%207.84795%2020.5449%207.84795M16.652%203.95506L10.6872%209.91993C10.2832%2010.3239%2010.0812%2010.5259%209.90743%2010.7487C9.70249%2011.0114%209.52679%2011.2957%209.38344%2011.5965C9.26191%2011.8515%209.17157%2012.1225%208.99089%2012.6646L8.41242%2014.4M20.5449%207.84795L14.5801%2013.8128C14.1761%2014.2168%2013.9741%2014.4188%2013.7513%2014.5926C13.4886%2014.7975%2013.2043%2014.9732%2012.9035%2015.1166C12.6485%2015.2381%2012.3775%2015.3284%2011.8354%2015.5091L10.1%2016.0876M10.1%2016.0876L8.97709%2016.4619C8.71035%2016.5508%208.41626%2016.4814%208.21744%2016.2826C8.01862%2016.0837%207.9492%2015.7897%208.03811%2015.5229L8.41242%2014.4M10.1%2016.0876L8.41242%2014.4'%20stroke='%23858B93'%20stroke-width='1.5'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='20'%20height='21'%20viewBox='0%200%2020%2021'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M9.58366%202.79175C5.55658%202.79175%202.29199%206.05634%202.29199%2010.0834C2.29199%2014.1105%205.55658%2017.3751%209.58366%2017.3751C13.6107%2017.3751%2016.8753%2014.1105%2016.8753%2010.0834C16.8753%206.05634%2013.6107%202.79175%209.58366%202.79175ZM1.04199%2010.0834C1.04199%205.36598%204.86623%201.54175%209.58366%201.54175C14.3011%201.54175%2018.1253%205.36598%2018.1253%2010.0834C18.1253%2012.2172%2017.3429%2014.1682%2016.0494%2015.6653L18.7756%2018.3915C19.0197%2018.6356%2019.0197%2019.0313%2018.7756%2019.2754C18.5315%2019.5194%2018.1358%2019.5194%2017.8917%2019.2754L15.1655%2016.5491C13.6684%2017.8427%2011.7174%2018.6251%209.58366%2018.6251C4.86623%2018.6251%201.04199%2014.8008%201.04199%2010.0834Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M17%2012.5C17%2011.3954%2017.8954%2010.5%2019%2010.5C20.1046%2010.5%2021%2011.3954%2021%2012.5C21%2013.6046%2020.1046%2014.5%2019%2014.5C17.8954%2014.5%2017%2013.6046%2017%2012.5Z'%20fill='%23858B93'/%3e%3cpath%20d='M10%2012.5C10%2011.3954%2010.8954%2010.5%2012%2010.5C13.1046%2010.5%2014%2011.3954%2014%2012.5C14%2013.6046%2013.1046%2014.5%2012%2014.5C10.8954%2014.5%2010%2013.6046%2010%2012.5Z'%20fill='%23858B93'/%3e%3cpath%20d='M3%2012.5C3%2011.3954%203.89543%2010.5%205%2010.5C6.10457%2010.5%207%2011.3954%207%2012.5C7%2013.6046%206.10457%2014.5%205%2014.5C3.89543%2014.5%203%2013.6046%203%2012.5Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M7%208.5C7%205.73858%209.23858%203.5%2012%203.5C14.7614%203.5%2017%205.73858%2017%208.5V11.5C17%2014.2614%2014.7614%2016.5%2012%2016.5C9.23858%2016.5%207%2014.2614%207%2011.5V8.5Z'%20stroke='%23858B93'%20stroke-width='1.5'/%3e%3cpath%20d='M11%208.5H13'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M10%2011.5L14%2011.5'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M20%2010.5V11.5C20%2015.9183%2016.4183%2019.5%2012%2019.5C7.58172%2019.5%204%2015.9183%204%2011.5V10.5'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M12%2019.5V22.5'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='21'%20height='21'%20viewBox='0%200%2021%2021'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12.25%202.49258C13.5179%201.2247%2015.5735%201.2247%2016.8414%202.49258C18.1093%203.76046%2018.1093%205.8161%2016.8414%207.08398L10.5131%2013.4123C10.1564%2013.769%209.9386%2013.9869%209.69583%2014.1762C9.40981%2014.3993%209.10033%2014.5906%208.77287%2014.7466C8.49494%2014.8791%208.20269%2014.9765%207.72413%2015.136L5.49692%2015.8784L4.9622%2016.0566C4.48358%2016.2162%203.95589%2016.0916%203.59915%2015.7349C3.2424%2015.3781%203.11783%2014.8504%203.27737%2014.3718L4.19801%2011.6099C4.3575%2011.1313%204.4549%2010.8391%204.58736%2010.5611C4.74342%2010.2337%204.93469%209.9242%205.15778%209.63817C5.34714%209.3954%205.56498%209.17759%205.92169%208.82091L12.25%202.49258ZM5.46809%2014.5704L4.76362%2013.8659L5.37064%2012.0449C5.54737%2011.5147%205.62037%2011.2991%205.71577%2011.0989C5.83276%2010.8534%205.97616%2010.6214%206.14342%2010.4069C6.27979%2010.2321%206.43997%2010.0704%206.83516%209.67521L11.7443%204.76607C11.9469%205.27439%2012.2898%205.88791%2012.8679%206.46606C13.4461%207.04422%2014.0596%207.38707%2014.5679%207.5897L9.65879%2012.4988C9.2636%2012.894%209.1019%2013.0542%208.92706%2013.1906C8.71262%2013.3578%208.4806%2013.5012%208.2351%2013.6182C8.03493%2013.7136%207.81935%2013.7866%207.28915%2013.9634L5.46809%2014.5704ZM15.564%206.59368C15.4608%206.57102%2015.3317%206.53694%2015.1851%206.48604C14.7817%206.34611%2014.2511%206.08149%2013.7518%205.58218C13.2525%205.08287%2012.9879%204.5523%2012.848%204.14895C12.7971%204.00226%2012.763%203.87323%2012.7403%203.77004L13.1339%203.37647C13.9136%202.59674%2015.1778%202.59674%2015.9575%203.37647C16.7373%204.15619%2016.7373%205.42038%2015.9575%206.2001L15.564%206.59368ZM3.209%2018.8333C3.209%2018.4882%203.48882%2018.2083%203.834%2018.2083H17.1673V19.4583H3.834C3.48882%2019.4583%203.209%2019.1785%203.209%2018.8333Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='21'%20height='21'%20viewBox='0%200%2021%2021'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M10.4994%202.79166C9.68396%202.79166%208.9886%203.31251%208.7309%204.0416C8.61587%204.36705%208.2588%204.53763%207.93335%204.4226C7.6079%204.30757%207.43733%203.95049%207.55235%203.62504C7.98105%202.41215%209.13775%201.54166%2010.4994%201.54166C11.861%201.54166%2013.0177%202.41215%2013.4464%203.62504C13.5614%203.95049%2013.3908%204.30757%2013.0654%204.4226C12.74%204.53763%2012.3829%204.36705%2012.2678%204.0416C12.0101%203.31251%2011.3148%202.79166%2010.4994%202.79166Z'%20fill='%23858B93'/%3e%3cpath%20d='M2.79102%205.49999C2.79102%205.15481%203.07084%204.87499%203.41602%204.87499H17.5828C17.9279%204.87499%2018.2078%205.15481%2018.2078%205.49999C18.2078%205.84517%2017.9279%206.12499%2017.5828%206.12499H3.41602C3.07084%206.12499%202.79102%205.84517%202.79102%205.49999Z'%20fill='%23858B93'/%3e%3cpath%20d='M5.42859%207.54175C5.40563%207.19733%205.10781%206.93675%204.7634%206.95971C4.41898%206.98267%204.15839%207.28048%204.18135%207.6249L4.56756%2013.418C4.63881%2014.487%204.69636%2015.3504%204.83134%2016.028C4.97167%2016.7324%205.21035%2017.3208%205.70335%2017.782C6.19634%2018.2432%206.7993%2018.4422%207.51151%2018.5354C8.19654%2018.625%209.06191%2018.625%2010.1332%2018.625H10.8656C11.9369%2018.625%2012.8023%2018.625%2013.4873%2018.5354C14.1995%2018.4422%2014.8025%2018.2432%2015.2955%2017.782C15.7885%2017.3208%2016.0272%2016.7324%2016.1675%2016.028C16.3025%2015.3504%2016.36%2014.487%2016.4313%2013.418L16.8175%207.6249C16.8404%207.28048%2016.5798%206.98267%2016.2354%206.95971C15.891%206.93675%2015.5932%207.19733%2015.5702%207.54175L15.187%2013.291C15.1121%2014.4142%2015.0587%2015.1957%2014.9416%2015.7837C14.828%2016.3541%2014.6693%2016.656%2014.4415%2016.8692C14.2137%2017.0824%2013.9019%2017.2205%2013.3252%2017.296C12.7307%2017.3737%2011.9474%2017.375%2010.8216%2017.375H10.1772C9.05148%2017.375%208.26814%2017.3737%207.67364%2017.296C7.09697%2017.2205%206.78517%2017.0824%206.55733%2016.8692C6.32948%2016.656%206.17087%2016.3541%206.05725%2015.7837C5.94011%2015.1957%205.88675%2014.4142%205.81187%2013.291L5.42859%207.54175Z'%20fill='%23858B93'/%3e%3cpath%20d='M8.3539%209.04476C8.69736%209.01041%209.00364%209.261%209.03799%209.60447L9.45465%2013.7711C9.489%2014.1146%209.23841%2014.4209%208.89494%2014.4552C8.55148%2014.4896%208.2452%2014.239%208.21086%2013.8955L7.79419%209.72885C7.75984%209.38538%208.01043%209.0791%208.3539%209.04476Z'%20fill='%23858B93'/%3e%3cpath%20d='M13.2047%209.72885C13.239%209.38538%2012.9884%209.0791%2012.6449%209.04476C12.3015%209.01041%2011.9952%209.261%2011.9609%209.60447L11.5442%2013.7711C11.5098%2014.1146%2011.7604%2014.4209%2012.1039%2014.4552C12.4474%2014.4896%2012.7536%2014.239%2012.788%2013.8955L13.2047%209.72885Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='32'%20height='32'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='32'%20height='32'%20rx='16'%20fill='white'/%3e%3cpath%20d='M16%2022.6666L16%209.33331M16%209.33331L21%2014.3333M16%209.33331L11%2014.3333'%20stroke='%231AAF74'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='17'%20height='17'%20viewBox='0%200%2017%2017'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_2361_172518)'%3e%3cpath%20d='M15.6005%2011.6509C15.9284%2011.2327%2016.0856%2010.7843%2016.0656%2010.3226C16.0455%209.81401%2015.818%209.41585%2015.6306%209.1716C15.8481%208.62956%2015.9317%207.77636%2015.2057%207.11388C14.6737%206.62873%2013.7703%206.41125%2012.5189%206.47147C11.639%206.51162%2010.9029%206.67557%2010.8728%206.68226H10.8694C10.7021%206.71238%2010.5248%206.74918%2010.3441%206.78933C10.3307%206.57519%2010.3675%206.0432%2010.7623%204.84537C11.2308%203.42003%2011.204%202.32927%2010.6754%201.59987C10.1199%200.833663%209.23328%200.773438%208.9723%200.773438C8.72136%200.773438%208.49049%200.87716%208.32655%201.06787C7.95515%201.49949%207.99865%202.29581%208.04549%202.66386C7.60384%203.8483%206.36586%206.75253%205.3186%207.55888C5.29852%207.57227%205.2818%207.589%205.26507%207.60572C4.95724%207.93028%204.7498%208.28159%204.60927%208.58941C4.41187%208.48235%204.18769%208.42212%203.94679%208.42212H1.9058C1.13625%208.42212%200.513916%209.0478%200.513916%209.81401V15.2511C0.513916%2016.0206%201.1396%2016.6429%201.9058%2016.6429H3.94679C4.24457%2016.6429%204.52228%2016.5493%204.7498%2016.3887L5.53608%2016.4823C5.65653%2016.4991%207.7979%2016.7701%209.99614%2016.7266C10.3943%2016.7567%2010.769%2016.7734%2011.117%2016.7734C11.7159%2016.7734%2012.2379%2016.7266%2012.6728%2016.6329C13.6967%2016.4154%2014.396%2015.9805%2014.7506%2015.3414C15.0217%2014.8529%2015.0217%2014.3677%2014.9782%2014.0599C15.644%2013.4577%2015.7611%2012.7918%2015.7377%2012.3234C15.7243%2012.0524%2015.6641%2011.8215%2015.6005%2011.6509ZM1.9058%2015.7396C1.63479%2015.7396%201.4173%2015.5187%201.4173%2015.2511V9.81066C1.4173%209.53964%201.63813%209.32216%201.9058%209.32216H3.94679C4.21781%209.32216%204.43529%209.54299%204.43529%209.81066V15.2477C4.43529%2015.5187%204.21446%2015.7362%203.94679%2015.7362H1.9058V15.7396ZM14.7439%2011.2594C14.6034%2011.4066%2014.5767%2011.6308%2014.6837%2011.8048C14.6837%2011.8082%2014.8209%2012.0424%2014.8376%2012.3636C14.8611%2012.8019%2014.6503%2013.19%2014.2086%2013.5212C14.0513%2013.6417%2013.9878%2013.8491%2014.0547%2014.0365C14.0547%2014.0399%2014.1986%2014.4815%2013.9644%2014.8997C13.7402%2015.3013%2013.2416%2015.589%2012.4855%2015.7496C11.8799%2015.8801%2011.0568%2015.9035%2010.0463%2015.8232C10.0329%2015.8232%2010.0162%2015.8232%209.99949%2015.8232C7.84809%2015.87%205.67326%2015.589%205.64984%2015.5856H5.6465L5.30856%2015.5455C5.32864%2015.4518%205.33868%2015.3514%205.33868%2015.2511V9.81066C5.33868%209.66679%205.31525%209.52626%205.2751%209.39577C5.33533%209.1716%205.50262%208.67306%205.89744%208.24813C7.39974%207.057%208.86858%203.0386%208.93215%202.86461C8.95892%202.79435%208.96561%202.71739%208.95223%202.64044C8.89535%202.2657%208.91542%201.80731%208.99572%201.67013C9.17305%201.67348%209.65152%201.72367%209.93926%202.12183C10.2805%202.5936%2010.2672%203.43676%209.89911%204.55428C9.337%206.25734%209.29016%207.15403%209.73516%207.54885C9.95599%207.74625%2010.2504%207.75629%2010.4646%207.67933C10.6687%207.63249%2010.8627%207.59234%2011.0467%207.56223C11.0601%207.55888%2011.0769%207.55554%2011.0902%207.55219C12.1174%207.32802%2013.9577%207.19084%2014.5967%207.77302C15.1388%208.26821%2014.754%208.924%2014.7105%208.99427C14.5867%209.18163%2014.6235%209.42588%2014.7908%209.57645C14.7941%209.57979%2015.1455%209.91104%2015.1622%2010.356C15.1756%2010.6538%2015.035%2010.9583%2014.7439%2011.2594Z'%20fill='%23858B93'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_2361_172518'%3e%3crect%20width='16'%20height='16'%20fill='white'%20transform='translate(0.290527%200.773438)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='17'%20height='17'%20viewBox='0%200%2017%2017'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_2361_172521)'%3e%3cpath%20d='M0.980564%205.89598C0.652667%206.31422%200.495411%206.76256%200.515487%207.2243C0.535562%207.73287%200.763082%208.13103%200.950451%208.37528C0.732968%208.91731%200.649323%209.77051%201.37538%2010.433C1.90737%2010.9181%202.81076%2011.1356%204.06212%2011.0754C4.94209%2011.0353%205.67818%2010.8713%205.70829%2010.8646H5.71164C5.87893%2010.8345%206.05626%2010.7977%206.23694%2010.7575C6.25033%2010.9717%206.21352%2011.5037%205.81871%2012.7015C5.35028%2014.1268%205.37705%2015.2176%205.9057%2015.947C6.46112%2016.7132%207.34777%2016.7734%207.60875%2016.7734C7.85969%2016.7734%208.09056%2016.6697%208.25451%2016.479C8.6259%2016.0474%208.5824%2015.2511%208.53556%2014.883C8.97722%2013.6986%2010.2152%2010.7943%2011.2625%209.98799C11.2825%209.97461%2011.2993%209.95788%2011.316%209.94115C11.6238%209.6166%2011.8313%209.26528%2011.9718%208.95746C12.1692%209.06453%2012.3934%209.12475%2012.6343%209.12475H14.6753C15.4448%209.12475%2016.0671%208.49907%2016.0671%207.73287V2.29581C16.0671%201.52626%2015.4415%200.903928%2014.6753%200.903928H12.6343C12.3365%200.903928%2012.0588%200.997612%2011.8313%201.15821L11.045%201.06453C10.9245%201.0478%208.78316%200.776784%206.58491%200.820281C6.18675%200.790168%205.81201%200.773438%205.46404%200.773438C4.86513%200.773438%204.34317%200.82028%203.90821%200.913965C2.88437%201.13145%202.18508%201.56641%201.83042%202.20547C1.5594%202.69397%201.5594%203.17913%201.6029%203.48695C0.937067%204.0892%200.819963%204.75504%200.843384%205.22346C0.856767%205.49447%200.916992%205.72534%200.980564%205.89598ZM14.6753%201.80732C14.9463%201.80732%2015.1638%202.02814%2015.1638%202.29581V7.73621C15.1638%208.00723%2014.9429%208.22471%2014.6753%208.22471H12.6343C12.3632%208.22471%2012.1458%208.00389%2012.1458%207.73621V2.29916C12.1458%202.02814%2012.3666%201.81066%2012.6343%201.81066H14.6753V1.80732ZM1.83711%206.28745C1.97764%206.14023%202.0044%205.91606%201.89734%205.74207C1.89734%205.73872%201.76015%205.50451%201.74343%205.18331C1.72%204.745%201.93079%204.35688%202.37245%204.02563C2.52971%203.90518%202.59328%203.69774%202.52636%203.51037C2.52636%203.50702%202.38249%203.06537%202.6167%202.64713C2.84087%202.24562%203.33941%201.95788%204.09558%201.79728C4.70118%201.66679%205.52427%201.64337%206.53473%201.72367C6.54811%201.72367%206.56484%201.72367%206.58157%201.72367C8.73297%201.67683%2010.9078%201.95788%2010.9312%201.96123H10.9346L11.2725%202.00138C11.2524%202.09506%2011.2424%202.19544%2011.2424%202.29581V7.73621C11.2424%207.88009%2011.2658%208.02061%2011.306%208.1511C11.2457%208.37528%2011.0784%208.87381%2010.6836%209.29874C9.18132%2010.4899%207.71248%2014.5083%207.6489%2014.6823C7.62214%2014.7525%207.61545%2014.8295%207.62883%2014.9064C7.68571%2015.2812%207.66563%2015.7396%207.58533%2015.8767C7.408%2015.8734%206.92954%2015.8232%206.64179%2015.425C6.30051%2014.9533%206.3139%2014.1101%206.68194%2012.9926C7.24405%2011.2895%207.29089%2010.3928%206.84589%209.99803C6.62506%209.80062%206.33063%209.79059%206.11649%209.86754C5.91239%209.91438%205.71833%209.95453%205.53431%209.98465C5.52092%209.98799%205.50419%209.99134%205.49081%209.99468C4.46363%2010.2189%202.62339%2010.356%201.98433%209.77386C1.4423%209.27867%201.82707%208.62287%201.87057%208.55261C1.99437%208.36524%201.95756%208.12099%201.79027%207.97043C1.78692%207.96708%201.4356%207.63584%201.41887%207.19084C1.40549%206.89305%201.54602%206.58858%201.83711%206.28745Z'%20fill='%23858B93'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_2361_172521'%3e%3crect%20width='16'%20height='16'%20fill='white'%20transform='matrix(-1%200%200%20-1%2016.2905%2016.7734)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='16'%20height='17'%20viewBox='0%200%2016%2017'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_2361_92626)'%3e%3cpath%20d='M15.3092%2011.4575C15.6371%2011.0393%2015.7944%2010.591%2015.7743%2010.1292C15.7542%209.62065%2015.5267%209.22249%2015.3393%208.97824C15.5568%208.4362%2015.6405%207.58301%2014.9144%206.92052C14.3824%206.43537%2013.479%206.21789%2012.2277%206.27811C11.3477%206.31826%2010.6116%206.48221%2010.5815%206.4889H10.5782C10.4109%206.51902%2010.2335%206.55582%2010.0529%206.59597C10.0395%206.38183%2010.0763%205.84984%2010.4711%204.65201C10.9395%203.22667%2010.9127%202.13591%2010.3841%201.40651C9.82868%200.640304%208.94202%200.580078%208.68104%200.580078C8.4301%200.580078%208.19923%200.6838%208.03529%200.874516C7.66389%201.30613%207.70739%202.10245%207.75423%202.4705C7.31258%203.65494%206.0746%206.55917%205.02734%207.36552C5.00726%207.37891%204.99054%207.39564%204.97381%207.41237C4.66599%207.73692%204.45854%208.08823%204.31801%208.39605C4.12061%208.28899%203.89643%208.22876%203.65553%208.22876H1.61454C0.84499%208.22876%200.222656%208.85444%200.222656%209.62065V15.0577C0.222656%2015.8273%200.848336%2016.4496%201.61454%2016.4496H3.65553C3.95331%2016.4496%204.23102%2016.3559%204.45854%2016.1953L5.24482%2016.289C5.36527%2016.3057%207.50664%2016.5767%209.70488%2016.5332C10.103%2016.5633%2010.4778%2016.5801%2010.8258%2016.5801C11.4247%2016.5801%2011.9466%2016.5332%2012.3816%2016.4396C13.4054%2016.2221%2014.1047%2015.7871%2014.4594%2015.148C14.7304%2014.6595%2014.7304%2014.1744%2014.6869%2013.8666C15.3527%2013.2643%2015.4698%2012.5985%2015.4464%2012.1301C15.433%2011.859%2015.3728%2011.6282%2015.3092%2011.4575ZM1.61454%2015.5462C1.34353%2015.5462%201.12604%2015.3254%201.12604%2015.0577V9.6173C1.12604%209.34628%201.34687%209.1288%201.61454%209.1288H3.65553C3.92655%209.1288%204.14403%209.34963%204.14403%209.6173V15.0544C4.14403%2015.3254%203.9232%2015.5429%203.65553%2015.5429H1.61454V15.5462ZM14.4527%2011.0661C14.3122%2011.2133%2014.2854%2011.4375%2014.3925%2011.6114C14.3925%2011.6148%2014.5296%2011.849%2014.5464%2012.1702C14.5698%2012.6085%2014.359%2012.9966%2013.9173%2013.3279C13.7601%2013.4483%2013.6965%2013.6558%2013.7634%2013.8431C13.7634%2013.8465%2013.9073%2014.2881%2013.6731%2014.7064C13.4489%2015.1079%2012.9504%2015.3956%2012.1942%2015.5562C11.5886%2015.6867%2010.7655%2015.7101%209.75507%2015.6298C9.74169%2015.6298%209.72496%2015.6298%209.70823%2015.6298C7.55683%2015.6767%205.382%2015.3956%205.35858%2015.3923H5.35524L5.0173%2015.3521C5.03738%2015.2585%205.04742%2015.1581%205.04742%2015.0577V9.6173C5.04742%209.47343%205.02399%209.3329%204.98384%209.20241C5.04407%208.97824%205.21136%208.4797%205.60618%208.05477C7.10848%206.86364%208.57732%202.84524%208.64089%202.67125C8.66766%202.60099%208.67435%202.52403%208.66097%202.44708C8.60409%202.07234%208.62416%201.61396%208.70446%201.47677C8.88179%201.48012%209.36026%201.53031%209.648%201.92847C9.98928%202.40024%209.9759%203.2434%209.60785%204.36092C9.04574%206.06398%208.9989%206.96067%209.4439%207.35549C9.66473%207.55289%209.95917%207.56293%2010.1733%207.48597C10.3774%207.43913%2010.5715%207.39898%2010.7555%207.36887C10.7689%207.36552%2010.7856%207.36218%2010.799%207.35883C11.8262%207.13466%2013.6664%206.99748%2014.3055%207.57966C14.8475%208.07485%2014.4627%208.73064%2014.4192%208.80091C14.2954%208.98828%2014.3322%209.23252%2014.4995%209.38309C14.5029%209.38644%2014.8542%209.71768%2014.8709%2010.1627C14.8843%2010.4605%2014.7438%2010.7649%2014.4527%2011.0661Z'%20fill='%231AAF74'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_2361_92626'%3e%3crect%20width='16'%20height='16'%20fill='white'%20transform='translate(0%200.580078)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='17'%20height='17'%20viewBox='0%200%2017%2017'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_2361_214893)'%3e%3cpath%20d='M0.784519%205.70262C0.456622%206.12086%200.299366%206.5692%200.319442%207.03094C0.339517%207.53951%200.567037%207.93767%200.754406%208.18192C0.536923%208.72395%200.453278%209.57715%201.17933%2010.2396C1.71133%2010.7248%202.61472%2010.9423%203.86607%2010.882C4.74604%2010.8419%205.48213%2010.6779%205.51225%2010.6713H5.51559C5.68289%2010.6411%205.86022%2010.6043%206.0409%2010.5642C6.05428%2010.7783%206.01748%2011.3103%205.62266%2012.5081C5.15424%2013.9335%205.18101%2015.0242%205.70965%2015.7536C6.26507%2016.5199%207.15173%2016.5801%207.41271%2016.5801C7.66365%2016.5801%207.89452%2016.4764%208.05846%2016.2856C8.42986%2015.854%208.38636%2015.0577%208.33952%2014.6897C8.78117%2013.5052%2010.0191%2010.601%2011.0664%209.79463C11.0865%209.78125%2011.1032%209.76452%2011.1199%209.74779C11.4278%209.42324%2011.6352%209.07192%2011.7757%208.7641C11.9731%208.87117%2012.1973%208.9314%2012.4382%208.9314H14.4792C15.2488%208.9314%2015.8711%208.30572%2015.8711%207.53951V2.10245C15.8711%201.3329%2015.2454%200.710568%2014.4792%200.710568H12.4382C12.1404%200.710568%2011.8627%200.804253%2011.6352%200.964854L10.8489%200.87117C10.7285%200.854441%208.58711%200.583425%206.38887%200.626922C5.99071%200.596808%205.61597%200.580078%205.268%200.580078C4.66909%200.580078%204.14713%200.626921%203.71216%200.720606C2.68832%200.938087%201.98904%201.37305%201.63437%202.01212C1.36336%202.50061%201.36336%202.98577%201.40685%203.29359C0.741022%203.89585%200.623918%204.56168%200.647339%205.0301C0.660722%205.30112%200.720947%205.53198%200.784519%205.70262ZM14.4792%201.61396C14.7502%201.61396%2014.9677%201.83478%2014.9677%202.10245V7.54286C14.9677%207.81387%2014.7469%208.03135%2014.4792%208.03135H12.4382C12.1672%208.03135%2011.9497%207.81053%2011.9497%207.54286V2.1058C11.9497%201.83478%2012.1706%201.6173%2012.4382%201.6173H14.4792V1.61396ZM1.64106%206.09409C1.78159%205.94687%201.80836%205.7227%201.70129%205.54871C1.70129%205.54536%201.56411%205.31115%201.54738%204.98995C1.52396%204.55164%201.73475%204.16352%202.1764%203.83227C2.33366%203.71182%202.39723%203.50438%202.33032%203.31701C2.33032%203.31366%202.18644%202.87201%202.42066%202.45377C2.64483%202.05227%203.14336%201.76452%203.89953%201.60392C4.50514%201.47343%205.32822%201.45001%206.33868%201.53031C6.35206%201.53031%206.36879%201.53031%206.38552%201.53031C8.53692%201.48347%2010.7117%201.76452%2010.7352%201.76787H10.7385L11.0764%201.80802C11.0564%201.9017%2011.0463%202.00208%2011.0463%202.10245V7.54286C11.0463%207.68673%2011.0698%207.82726%2011.1099%207.95774C11.0497%208.18192%2010.8824%208.68046%2010.4876%209.10538C8.98527%2010.2965%207.51643%2014.3149%207.45286%2014.4889C7.42609%2014.5592%207.4194%2014.6361%207.43278%2014.7131C7.48966%2015.0878%207.46959%2015.5462%207.38929%2015.6834C7.21196%2015.68%206.73349%2015.6298%206.44575%2015.2317C6.10447%2014.7599%206.11785%2013.9168%206.4859%2012.7992C7.04801%2011.0962%207.09485%2010.1995%206.64985%209.80467C6.42902%209.60726%206.13458%209.59723%205.92045%209.67418C5.71635%209.72102%205.52229%209.76117%205.33826%209.79129C5.32488%209.79463%205.30815%209.79798%205.29477%209.80132C4.26758%2010.0255%202.42735%2010.1627%201.78828%209.5805C1.24625%209.08531%201.63103%208.42951%201.67452%208.35925C1.79832%208.17188%201.76152%207.92763%201.59422%207.77707C1.59088%207.77372%201.23956%207.44248%201.22283%206.99748C1.20945%206.69969%201.34997%206.39522%201.64106%206.09409Z'%20fill='%23F34859'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_2361_214893'%3e%3crect%20width='16'%20height='16'%20fill='white'%20transform='matrix(-1%200%200%20-1%2016.0938%2016.5801)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M22%2012.123C22%2017.6459%2017.5228%2022.123%2012%2022.123C6.47715%2022.123%202%2017.6459%202%2012.123C2%206.6002%206.47715%202.12305%2012%202.12305C17.5228%202.12305%2022%206.6002%2022%2012.123ZM16.0303%209.09272C16.3232%209.38561%2016.3232%209.86048%2016.0303%2010.1534L11.0303%2015.1534C10.7374%2015.4463%2010.2626%2015.4463%209.96967%2015.1534L7.96967%2013.1534C7.67678%2012.8605%207.67678%2012.3856%207.96967%2012.0927C8.26256%2011.7998%208.73744%2011.7998%209.03033%2012.0927L10.5%2013.5624L14.9697%209.09272C15.2626%208.79982%2015.7374%208.79982%2016.0303%209.09272Z'%20fill='%231AAF74'/%3e%3c/svg%3e\"","import \"./SurveyMessage.css\";\r\nimport { Component, createSignal, For, onMount } from \"solid-js\";\r\nimport { iconCheck } from \"../../assets/icons/icons\";\r\n\r\nconst SurveyMessage: Component<{\r\n onClose?: () => void;\r\n onSubmit?: (data: string[], type: 'ordered' | 'selected' | 'input') => void;\r\n multiSelect?: boolean;\r\n isInputMode?: boolean;\r\n}> = (props) => {\r\n const [options, setOptions] = createSignal([\r\n \"A. Tự phân bổ đều trên một số lượng cổ phiếu xác định\",\r\n \"B. Dựa vào các phương pháp phân bổ theo rủi ro\",\r\n \"C. Theo tư vấn từ chuyên viên tư vấn đầu tư, báo cáo danh mục đầu tư\",\r\n \"D. Khác\",\r\n ]);\r\n\r\n const [draggedIndex, setDraggedIndex] = createSignal<number | null>(null);\r\n const [hoveredIndex, setHoveredIndex] = createSignal<number | null>(null);\r\n const [selectedIndexes, setSelectedIndexes] = createSignal<number[]>([]);\r\n const [answers, setAnswers] = createSignal<string[]>(Array(options().length).fill(\"\"));\r\n const multiSelect = props.multiSelect ?? false;\r\n const isInputMode = () => props.isInputMode ?? false;\r\n\r\n let containerRef: HTMLDivElement | undefined;\r\n\r\n const handleMouseDown = (index: number, e: MouseEvent) => {\r\n if (e.button !== 0) return;\r\n e.preventDefault();\r\n\r\n setDraggedIndex(index);\r\n };\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (draggedIndex() === null || !containerRef) return;\r\n\r\n const containerRect = containerRef.getBoundingClientRect();\r\n const isInContainer =\r\n e.clientX >= containerRect.left &&\r\n e.clientX <= containerRect.right &&\r\n e.clientY >= containerRect.top &&\r\n e.clientY <= containerRect.bottom;\r\n\r\n if (!isInContainer) {\r\n return;\r\n }\r\n\r\n const buttons = containerRef.querySelectorAll(\".survey-option\");\r\n for (let i = 0; i < buttons.length; i++) {\r\n const btn = buttons[i] as HTMLElement;\r\n const rect = btn.getBoundingClientRect();\r\n\r\n const isOver =\r\n e.clientX >= rect.left &&\r\n e.clientX <= rect.right &&\r\n e.clientY >= rect.top &&\r\n e.clientY <= rect.bottom;\r\n\r\n if (isOver && i !== draggedIndex()) {\r\n setHoveredIndex(i);\r\n return;\r\n }\r\n }\r\n };\r\n\r\n const handleMouseUp = (e: MouseEvent) => {\r\n if (draggedIndex() === null || !containerRef) return;\r\n\r\n const containerRect = containerRef.getBoundingClientRect();\r\n const isInContainer =\r\n e.clientX >= containerRect.left &&\r\n e.clientX <= containerRect.right &&\r\n e.clientY >= containerRect.top &&\r\n e.clientY <= containerRect.bottom;\r\n\r\n if (isInContainer && hoveredIndex() !== null) {\r\n // Hoán đổi items\r\n const newOptions = [...options()];\r\n const temp = newOptions[draggedIndex()!];\r\n newOptions[draggedIndex()!] = newOptions[hoveredIndex()!];\r\n newOptions[hoveredIndex()!] = temp;\r\n setOptions(newOptions);\r\n }\r\n\r\n setDraggedIndex(null);\r\n setHoveredIndex(null);\r\n };\r\n\r\n const handleOptionClick = (idx: number) => {\r\n if (multiSelect) {\r\n setSelectedIndexes(prev =>\r\n prev.includes(idx)\r\n ? prev.filter(i => i !== idx)\r\n : [...prev, idx]\r\n );\r\n } else {\r\n setSelectedIndexes(prev =>\r\n prev.includes(idx) ? [] : [idx]\r\n );\r\n }\r\n };\r\n\r\n const handleAnswerChange = (idx: number, value: string) => {\r\n setAnswers(prev => {\r\n const next = [...prev];\r\n next[idx] = value;\r\n return next;\r\n });\r\n };\r\n\r\n const handleSubmit = () => {\r\n if (props.onSubmit) {\r\n if (isInputMode()) {\r\n const filledAnswers = answers().filter(a => a.trim() !== '');\r\n props.onSubmit(filledAnswers, 'input');\r\n } else if (multiSelect) {\r\n const selectedOptions = options().filter((_, i) => selectedIndexes().includes(i));\r\n props.onSubmit(selectedOptions, 'selected');\r\n } else {\r\n props.onSubmit(options(), 'ordered');\r\n }\r\n }\r\n };\r\n\r\n onMount(() => {\r\n document.addEventListener(\"mousemove\", handleMouseMove);\r\n document.addEventListener(\"mouseup\", handleMouseUp);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousemove\", handleMouseMove);\r\n document.removeEventListener(\"mouseup\", handleMouseUp);\r\n };\r\n });\r\n\r\n return (\r\n <div class=\"survey-message\">\r\n <div style={{ display: \"flex\", \"flex-direction\": \"column\", \"align-items\": \"flex-start\" }}>\r\n <div style={{ \"font-weight\": 600, \"font-size\": \"16px\", \"margin-bottom\": \"8px\" }}>\r\n 12.1 Anh/chị xây dựng danh mục đầu tư dựa vào đâu?\r\n </div>\r\n <div style={{ \"font-weight\": 400, color: \"#858B93\", \"font-size\": \"12px\", \"margin-bottom\": \"16px\" }}>\r\n Bạn có thể chọn {multiSelect ? \"nhiều\" : \"một\"} đáp án hoặc nhập trực tiếp A, B, C, D,... theo thứ tự đáp án\r\n </div>\r\n </div>\r\n {isInputMode() ? (\r\n <div class=\"survey-inputs\">\r\n <For each={options()}>\r\n {(option, index) => (\r\n <div style={{ \"margin-bottom\": \"12px\" }}>\r\n <div style={{ \"font-weight\": 500, \"margin-bottom\": \"4px\", \"text-align\": \"left\" }}>\r\n {option}\r\n </div>\r\n <input\r\n class=\"survey-input\"\r\n type=\"text\"\r\n value={answers()[index()]}\r\n placeholder={option}\r\n onInput={(e) => handleAnswerChange(index(), e.currentTarget.value)}\r\n />\r\n </div>\r\n )}\r\n </For>\r\n </div>\r\n ) : (\r\n <div class=\"survey-options\" ref={containerRef!}>\r\n <For each={options()}>\r\n {(option, index) => (\r\n <button\r\n class={`survey-option${multiSelect ? \" multi-selected\" : \"\"} ${draggedIndex() === index() ? \"dragging\" : \"\"} ${hoveredIndex() === index() ? \"hovered\" : \"\"} ${selectedIndexes().includes(index()) ? \"selected\" : \"\"}`}\r\n type=\"button\"\r\n onMouseDown={(e) => handleMouseDown(index(), e)}\r\n onClick={() => handleOptionClick(index())}\r\n style={{ display: \"flex\", \"justify-content\": \"space-between\", \"align-items\": \"center\", width: multiSelect ? \"100%\" : \"auto\" }}\r\n >\r\n <span>{option}</span>\r\n {multiSelect && selectedIndexes().includes(index()) && (\r\n <img src={iconCheck} style={{ width: \"20px\", height: \"20px\", \"margin-left\": \"16px\" }} />\r\n )}\r\n </button>\r\n )}\r\n </For>\r\n </div>\r\n )}\r\n <div style={{ display: \"flex\", \"justify-content\": \"flex-end\", \"margin-top\": \"16px\" }}>\r\n <button class=\"survey-submit-button\" onClick={handleSubmit}>\r\n Gửi đáp án\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SurveyMessage;","import { For, Show, createEffect, createSignal } from \"solid-js\";\r\nimport \"./ChatMessages.css\";\r\nimport SurveyMessage from \"../../components/SurveyMessage/SurveyMessage\";\r\nimport { iconLike, iconDislike, iconLikeActive, iconDislikeActive } from \"../../assets/icons/icons\";\r\n\r\ninterface Message {\r\n id: number;\r\n text?: string;\r\n sender: \"user\" | \"bot\";\r\n type?: \"survey\";\r\n}\r\n\r\ninterface ChatMessagesProps {\r\n messages: Message[];\r\n isFullScreen?: boolean;\r\n inputHeight?: number;\r\n isMobile?: boolean;\r\n onSubmit?: (data: string[], type: 'ordered' | 'selected' | 'input') => void;\r\n surveyOptions?: { multiSelect?: boolean; isInputMode?: boolean };\r\n}\r\n\r\nexport default function ChatMessages(props: ChatMessagesProps) {\r\n let messagesContainerRef: HTMLDivElement | undefined;\r\n const [hoveredId, setHoveredId] = createSignal<number | null>(null);\r\n const [feedbackState, setFeedbackState] = createSignal<{ [key: number]: \"like\" | \"dislike\" | null }>({});\r\n\r\n const handleMouseEnter = (id: number) => {\r\n setHoveredId(id);\r\n };\r\n\r\n const handleMouseLeave = (id: number) => {\r\n if (hoveredId() === id) setHoveredId(null);\r\n };\r\n\r\n const getPadBottom = () => {\r\n if (props.isFullScreen) {\r\n return props.messages.length > 0 ? \"100px\" : `${(props.inputHeight ?? 0) + 24}px`;\r\n }\r\n if (props.isMobile) {\r\n return props.messages.length > 0 ? \"10px\" : \"0px\";\r\n }\r\n return props.messages.length > 0 ? \"10px\" : \"0px\";\r\n };\r\n\r\n createEffect(() => {\r\n if (messagesContainerRef && props.messages.length > 0) {\r\n setTimeout(() => {\r\n messagesContainerRef!.scrollTop = messagesContainerRef!.scrollHeight;\r\n }, 100);\r\n }\r\n });\r\n\r\n createEffect(() => {\r\n props.isFullScreen;\r\n props.isMobile;\r\n\r\n if (messagesContainerRef && props.messages.length > 0) {\r\n requestAnimationFrame(() => {\r\n messagesContainerRef!.scrollTop = messagesContainerRef!.scrollHeight;\r\n });\r\n }\r\n });\r\n\r\n return (\r\n <div\r\n ref={messagesContainerRef}\r\n class=\"chat-messages-container\"\r\n style={{\r\n \"justify-content\": props.messages.length === 0 ? \"center\" : \"flex-start\",\r\n \"padding-bottom\": getPadBottom(),\r\n }}\r\n >\r\n <Show when={props.messages.length === 0 && !props.isFullScreen}>\r\n <div\r\n style={{\r\n \"text-align\": \"center\",\r\n \"font-size\": props.isMobile ? \"20px\" : \"24px\",\r\n \"font-weight\": \"600\",\r\n \"user-select\": \"none\",\r\n \"white-space\": \"pre-line\"\r\n }}\r\n >\r\n Hôm nay thị trường khiến bạn <br />quan tâm điều gì?\r\n </div>\r\n </Show>\r\n <For each={props.messages}>\r\n {(msg) => (\r\n msg.type === \"survey\" ? (\r\n <div\r\n class=\"chat-message bot\"\r\n style={{\r\n \"margin-left\": \"24px\",\r\n }}\r\n >\r\n <div>\r\n <SurveyMessage\r\n onSubmit={props.onSubmit}\r\n multiSelect={props.surveyOptions?.multiSelect}\r\n isInputMode={props.surveyOptions?.isInputMode}\r\n />\r\n </div>\r\n </div>\r\n ) : (\r\n <div\r\n onMouseEnter={() => msg.sender === \"bot\" && handleMouseEnter(msg.id)}\r\n onMouseLeave={() => msg.sender === \"bot\" && handleMouseLeave(msg.id)}\r\n style={{\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n \"align-items\": \"flex-start\",\r\n \"margin-bottom\": \"8px\"\r\n }}\r\n >\r\n <div\r\n class={`chat-message ${msg.sender}`}\r\n style={{\r\n position: \"relative\",\r\n width: \"100%\"\r\n }}\r\n >\r\n <div\r\n style={{\r\n background: msg.sender === \"user\" ? \"#1AAF741A\" : \"#fff\",\r\n color: \"#000\",\r\n \"border-radius\": \"24px\",\r\n padding: \"10px 16px\",\r\n \"font-weight\": 500,\r\n \"font-size\": \"16px\",\r\n \"max-width\": \"70%\",\r\n \"word-break\": \"break-word\",\r\n \"white-space\": \"pre-line\",\r\n \"text-align\": \"left\"\r\n }}\r\n >\r\n {msg.text}\r\n </div>\r\n </div>\r\n {msg.sender === \"bot\" && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n gap: \"8px\",\r\n \"margin-left\": \"16px\",\r\n height: \"16px\",\r\n opacity: hoveredId() === msg.id ? 1 : 0,\r\n visibility: hoveredId() === msg.id ? \"visible\" : \"hidden\",\r\n \"pointer-events\": hoveredId() === msg.id ? \"auto\" : \"none\",\r\n transition: \"opacity 0.2s\"\r\n }}\r\n >\r\n <button\r\n class=\"feedback-button\"\r\n onClick={() => setFeedbackState(prev => ({ ...prev, [msg.id]: 'like' }))}\r\n >\r\n <img src={feedbackState()[msg.id] === 'like' ? iconLikeActive : iconLike} />\r\n </button>\r\n <button\r\n class=\"feedback-button\"\r\n onClick={() => setFeedbackState(prev => ({ ...prev, [msg.id]: 'dislike' }))}\r\n >\r\n <img src={feedbackState()[msg.id] === 'dislike' ? iconDislikeActive : iconDislike} />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n )}\r\n </For>\r\n </div>\r\n );\r\n}","import { createEffect, createSignal, JSX, onMount } from \"solid-js\";\r\nimport \"./ChatInput.css\";\r\nimport { iconAddItem, iconSend, iconMicrophone, iconSendActive } from \"../../assets/icons/icons\";\r\n\r\ninterface ChatInputProps {\r\n input: string;\r\n setInput: (v: string) => void;\r\n sendMessage: () => void;\r\n onHeightChange?: (h: number) => void;\r\n}\r\n\r\nexport default function ChatInput(props: ChatInputProps) {\r\n let textareaRef: HTMLTextAreaElement | undefined;\r\n const MAX_HEIGHT = 120;\r\n const [isMaxed, setIsMaxed] = createSignal(false);\r\n\r\n function resizeTextarea() {\r\n if (!textareaRef) return;\r\n textareaRef.style.height = \"auto\";\r\n if (!props.input.trim()) {\r\n textareaRef.style.height = \"48px\";\r\n textareaRef.style.overflowY = \"hidden\";\r\n setIsMaxed(false);\r\n props.onHeightChange?.(48);\r\n return;\r\n }\r\n const fullHeight = textareaRef.scrollHeight;\r\n const usedHeight = Math.min(fullHeight, MAX_HEIGHT);\r\n textareaRef.style.height = usedHeight + \"px\";\r\n textareaRef.style.overflowY = fullHeight > MAX_HEIGHT ? \"auto\" : \"hidden\";\r\n setIsMaxed(fullHeight > MAX_HEIGHT);\r\n props.onHeightChange?.(usedHeight);\r\n }\r\n\r\n createEffect(() => {\r\n if (textareaRef) {\r\n resizeTextarea();\r\n }\r\n });\r\n\r\n const handleInput: JSX.EventHandlerUnion<HTMLTextAreaElement, InputEvent> = (e) => {\r\n props.setInput(e.currentTarget.value);\r\n resizeTextarea();\r\n };\r\n\r\n const handleKeyPress: JSX.EventHandlerUnion<HTMLTextAreaElement, KeyboardEvent> = (e) => {\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n props.sendMessage();\r\n setTimeout(() => {\r\n if (textareaRef) {\r\n resizeTextarea();\r\n }\r\n }, 0);\r\n }\r\n };\r\n\r\n return (\r\n <div class=\"chat-input-container\" classList={{ \"is-maxed\": isMaxed() }}>\r\n <div style={{ position: \"relative\", flex: 1, \"min-width\": \"0\" }}>\r\n <img\r\n src={iconAddItem}\r\n style={{\r\n position: \"absolute\",\r\n left: \"18px\",\r\n top: \"50%\",\r\n transform: \"translateY(-60%)\",\r\n width: \"20px\",\r\n height: \"20px\",\r\n cursor: \"pointer\"\r\n }}\r\n />\r\n <textarea\r\n ref={el => (textareaRef = el)}\r\n value={props.input}\r\n onInput={handleInput}\r\n onKeyPress={handleKeyPress}\r\n placeholder=\"Hỏi bất kỳ điều gì...\"\r\n class=\"chat-input-field\"\r\n rows={1}\r\n style={{\r\n \"padding-left\": \"56px\",\r\n resize: \"none\",\r\n width: \"100%\",\r\n \"max-height\": `${MAX_HEIGHT}px`,\r\n overflow: \"hidden\",\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n right: \"16px\",\r\n top: \"50%\",\r\n transform: \"translateY(-55%)\",\r\n display: \"flex\",\r\n gap: \"12px\",\r\n }}\r\n >\r\n <img\r\n src={iconMicrophone}\r\n style={{\r\n \"margin-top\": \"4px\",\r\n width: \"24px\",\r\n height: \"24px\",\r\n cursor: \"pointer\"\r\n }}\r\n onClick={props.sendMessage}\r\n />\r\n <img\r\n src={props.input.trim() ? iconSendActive : iconSend}\r\n style={{\r\n width: \"32px\",\r\n height: \"32px\",\r\n cursor: \"pointer\"\r\n }}\r\n onClick={props.sendMessage}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}","import \"./Sidebar.css\";\r\nimport { chatIcon, iconSideActive, iconUser, iconTrending, iconNewConversation, iconSearch, iconMenudot, iconClose, iconShrink, iconEdit, iconDelete } from \"../../assets/icons/icons\";\r\nimport { createSignal, onCleanup, onMount } from \"solid-js\";\r\n\r\nexport default function Sidebar(props: {\r\n onClose: () => void;\r\n onShrink?: () => void;\r\n open?: boolean;\r\n fullScreen?: boolean;\r\n isMobile?: boolean;\r\n onMobile?: () => void;\r\n onSurveyRequest?: (options?: { multiSelect?: boolean; isInputMode?: boolean }) => void;\r\n onNewConversation?: () => void;\r\n options?: {\r\n onShrink?: () => void;\r\n };\r\n}) {\r\n const [popoverOpen, setPopoverOpen] = createSignal(false);\r\n let popoverRef: HTMLDivElement | undefined;\r\n\r\n onMount(() => {\r\n const handleMouseDownOutside = (e: MouseEvent) => {\r\n if (popoverOpen() && popoverRef && !popoverRef.contains(e.target as Node)) {\r\n setPopoverOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleMouseDownOutside);\r\n\r\n onCleanup(() => {\r\n document.removeEventListener(\"mousedown\", handleMouseDownOutside);\r\n });\r\n });\r\n\r\n return (\r\n <>\r\n {!props.fullScreen && (\r\n <div\r\n class={`sidebar-overlay${props.open ? \" sidebar-overlay--open\" : \"\"}`}\r\n onClick={props.onClose}\r\n ></div>\r\n )}\r\n <div\r\n class={`sidebar${props.open ? \" sidebar--open\" : \"\"}${props.fullScreen ? \" sidebar--fullscreen\" : \"\"}${props.isMobile ? \" sidebar--mobile\" : \"\"}`}\r\n style={props.isMobile ? { width: \"280px\", height: \"100%\" } : {}}\r\n >\r\n <div class=\"sidebar-header\">\r\n {!props.fullScreen && (\r\n <img\r\n src={iconSideActive}\r\n style={{ width: \"28px\", height: \"28px\", \"margin-right\": \"16px\", cursor: \"pointer\" }}\r\n onClick={props.onClose}\r\n />\r\n )}\r\n <img src={chatIcon} style={{ width: \"32px\", height: \"32px\", \"margin-right\": \"4px\" }} />\r\n <span style={{ color: \"#1A1D1F\", \"user-select\": \"none\" }}>Ez</span>\r\n <span style={{ color: \"#1AAF74\", \"margin-left\": \"4px\", \"user-select\": \"none\" }}>Advise</span>\r\n {props.fullScreen && (\r\n <div class=\"sidebar-header-actions\">\r\n {/* <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={() => {\r\n if (props.onMobile) props.onMobile();\r\n }}\r\n >\r\n <img src={iconMinimize} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button> */}\r\n <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={() => {\r\n props.onShrink?.();\r\n // if (props.options?.onShrink) props.options.onShrink();\r\n }}\r\n >\r\n <img src={iconShrink} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button>\r\n <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={props.onClose}\r\n >\r\n <img src={iconClose} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n <div\r\n class=\"sidebar-section\"\r\n tabIndex={0}\r\n onClick={() => {\r\n if (props.onSurveyRequest) props.onSurveyRequest({ multiSelect: true });\r\n if (!props.fullScreen) props.onClose();\r\n }}\r\n >\r\n <img\r\n src={iconUser}\r\n class=\"sidebar-section-icon\"\r\n />\r\n <span class=\"sidebar-section-title\">Chân dung nhà đầu tư</span>\r\n </div>\r\n <div\r\n class=\"sidebar-section sidebar-section--no-padding\"\r\n tabIndex={0}\r\n onClick={() => {\r\n if (props.onSurveyRequest) props.onSurveyRequest({ isInputMode: true });\r\n if (!props.fullScreen) props.onClose();\r\n }}\r\n >\r\n <img\r\n src={iconTrending}\r\n class=\"sidebar-section-icon\"\r\n />\r\n <span class=\"sidebar-section-title\">Định hướng đầu tư</span>\r\n </div>\r\n <div class=\"sidebar-conversation-row\">\r\n <span style={{ \"font-weight\": 400, \"font-size\": \"14px\", color: \"#858B93\", \"user-select\": \"none\" }}>Hội thoại</span>\r\n <div\r\n class=\"sidebar-conversation-action\"\r\n tabIndex={0}\r\n onClick={() => {\r\n if (props.onNewConversation) props.onNewConversation();\r\n if (!props.fullScreen) props.onClose();\r\n }}\r\n >\r\n <span style={{ \"font-weight\": 400, \"font-size\": \"14px\", color: \"#858B93\", \"user-select\": \"none\" }}>Hội thoại mới</span>\r\n <img\r\n src={iconNewConversation}\r\n style={{ width: \"20px\", height: \"20px\", \"margin-left\": \"8px\" }}\r\n />\r\n </div>\r\n </div>\r\n <div class=\"sidebar-search-box\">\r\n <img\r\n src={iconSearch}\r\n style={{ width: \"18px\", height: \"18px\", \"margin-right\": \"8px\", opacity: 0.7 }}\r\n />\r\n <input\r\n type=\"text\"\r\n placeholder=\"Tìm kiếm hội thoại\"\r\n />\r\n </div>\r\n <div>\r\n <div class=\"sidebar-menu-row\" tabIndex={0} style={{ position: \"relative\" }}\r\n onClick={() => {\r\n if (props.onSurveyRequest) props.onSurveyRequest();\r\n if (!props.fullScreen) props.onClose();\r\n }}>\r\n <span style={{ \"font-weight\": 500, \"font-size\": \"14px\", \"user-select\": \"none\" }}>Khảo sát</span>\r\n <img\r\n src={iconMenudot}\r\n class=\"sidebar-menu-dot\"\r\n style={{ width: \"24px\", height: \"24px\", \"margin-left\": \"8px\", cursor: \"pointer\" }}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setPopoverOpen(!popoverOpen());\r\n }}\r\n onMouseDown={e => e.stopPropagation()}\r\n />\r\n {popoverOpen() && (\r\n <div class=\"sidebar-popover\" ref={el => (popoverRef = el)}>\r\n <div\r\n class=\"sidebar-popover-item\"\r\n onClick={(e: MouseEvent) => {\r\n e.stopPropagation();\r\n setPopoverOpen(false);\r\n // TODO:\r\n }}\r\n >\r\n <img src={iconEdit} style={{ width: \"18px\", height: \"18px\" }} />\r\n Đổi tên\r\n </div>\r\n <div\r\n class=\"sidebar-popover-item\"\r\n onClick={(e: MouseEvent) => {\r\n e.stopPropagation();\r\n setPopoverOpen(false);\r\n // TODO:\r\n }}\r\n >\r\n <img src={iconDelete} style={{ width: \"18px\", height: \"18px\" }} />\r\n Xóa\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}","import { JSX } from \"solid-js\";\r\nimport \"./ChatActionButton.css\";\r\n\r\nexport default function ChatActionButton(props: { text: string; onClick?: JSX.EventHandlerUnion<HTMLButtonElement, MouseEvent> }) {\r\n return (\r\n <button class=\"chat-action-btn\" onClick={props.onClick}>\r\n {props.text}\r\n </button>\r\n );\r\n}","import { Component } from \"solid-js\";\r\nimport \"./HeaderSteps.css\";\r\n\r\ninterface HeaderStepsProps {\r\n currentStep?: number;\r\n title?: string;\r\n totalSteps?: number;\r\n}\r\n\r\nconst HeaderSteps: Component<HeaderStepsProps> = (props) => {\r\n const currentStep = () => props.currentStep || 1;\r\n const totalSteps = () => props.totalSteps || 6;\r\n const title = () => props.title || \"Tài chính cá nhân/ Hồ sơ rủi ro\";\r\n\r\n return (\r\n <div class=\"header-steps\">\r\n <div class=\"header-steps-title\">\r\n {title()}\r\n </div>\r\n <div class=\"header-steps-container\">\r\n {Array.from({ length: totalSteps() }, (_, i) => (\r\n <>\r\n <div\r\n class={`header-step ${i + 1 <= currentStep() ? \"active\" : \"\"}`}\r\n >\r\n {i + 1}\r\n </div>\r\n {i < totalSteps() - 1 && (\r\n <div class=\"header-step-line\"></div>\r\n )}\r\n </>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default HeaderSteps;","export async function listMessagesAsync(\r\n conversationId: string,\r\n direction?: string,\r\n fromMessageId?: string,\r\n top?: number\r\n) {\r\n return [\r\n { id: 1, text: \"Xin chào! Tôi là bot hỗ trợ đầu tư.\", sender: \"bot\" },\r\n { id: 2, text: \"Thị trường hôm nay thế nào?\", sender: \"user\" },\r\n { id: 3, text: \"Thị trường hôm nay biến động nhẹ, bạn quan tâm đến mã nào?\", sender: \"bot\" },\r\n { id: 4, text: \"Tôi muốn hỏi về cổ phiếu FPT.\", sender: \"user\" },\r\n { id: 5, text: \"FPT đang có xu hướng tăng trưởng tốt, bạn cần phân tích kỹ thuật hay cơ bản?\", sender: \"bot\" }\r\n ];\r\n}\r\n\r\nexport async function sendMessageAsync(message: any) {\r\n return { id: Date.now(), text: message.text, sender: \"user\" };\r\n}\r\n\r\nexport async function updateMessageAsync(message: any) {\r\n return true;\r\n}\r\n\r\nexport async function deleteMessageAsync(messageId: string, deleteType?: string) {\r\n return true;\r\n}\r\n\r\nexport async function searchMessagesAsync(conversationId: string, keyword: string, from?: string, top?: number) {\r\n const all = await listMessagesAsync(conversationId);\r\n return all.filter(m => m.text.toLowerCase().includes(keyword.toLowerCase()));\r\n}","import * as MessageService from \"./data-provider/services/message-service\";\r\n\r\nclass RemoteRepository {\r\n async listMessages(conversationId: string) {\r\n return await MessageService.listMessagesAsync(conversationId);\r\n }\r\n\r\n async sendMessage(message: { text: string }) {\r\n return await MessageService.sendMessageAsync(message);\r\n }\r\n\r\n async updateMessage(message: any) {\r\n return await MessageService.updateMessageAsync(message);\r\n }\r\n\r\n async deleteMessage(messageId: string, deleteType?: string) {\r\n return await MessageService.deleteMessageAsync(messageId, deleteType);\r\n }\r\n\r\n async searchMessages(conversationId: string, keyword: string, from?: string, top?: number) {\r\n return await MessageService.searchMessagesAsync(conversationId, keyword, from, top);\r\n }\r\n}\r\n\r\nexport default new RemoteRepository();","import { createEffect, createSignal } from \"solid-js\";\r\nimport ChatMessages from \"../ChatMessages/ChatMessages.tsx\";\r\nimport ChatInput from \"../ChatInput/ChatInput.tsx\";\r\nimport \"./ChatPopup.css\";\r\nimport { chatIcon, inforIcon, iconExpand, iconMinimize, iconClose } from \"../../assets/icons/icons\";\r\nimport Sidebar from \"../../components/Sidebar/Siderbar.tsx\";\r\nimport ChatActionButton from \"../../components/ChatActionButton/ChatActionButton.tsx\";\r\nimport HeaderSteps from \"../../components/HeaderSteps/HeaderSteps.tsx\";\r\nimport { onMount } from \"solid-js\";\r\nimport RemoteRepository from \"../../RemoteRepository.ts\";\r\n\r\ninterface ChatPopupProps {\r\n options?: {\r\n onMaximize?: () => void;\r\n onMinimize?: () => void;\r\n onMobile?: (isMobile: boolean) => void;\r\n onFullScreen?: (isFullScreen: boolean) => void;\r\n onClose?: () => void;\r\n onShrink?: () => void;\r\n onOpen?: () => void;\r\n onlyMobile?: boolean;\r\n };\r\n}\r\n\r\ninterface Message {\r\n id: number;\r\n text?: string;\r\n sender: \"user\" | \"bot\";\r\n type?: \"survey\";\r\n}\r\n\r\nexport default function ChatPopup(props: ChatPopupProps) {\r\n const [messages, setMessages] = createSignal<Message[]>([]);\r\n const [input, setInput] = createSignal(\"\");\r\n const [isOpen, setIsOpen] = createSignal(false);\r\n const [isSidebarOpen, setIsSidebarOpen] = createSignal(false);\r\n const [isFullScreen, setIsFullScreen] = createSignal(false);\r\n const [isMobile, setIsMobile] = createSignal(false);\r\n const [inputHeight, setInputHeight] = createSignal(0);\r\n const [surveyOptions, setSurveyOptions] = createSignal<{ multiSelect?: boolean; isInputMode?: boolean }>({});\r\n const [currentStep] = createSignal(2);\r\n const onlyMobile = props.options?.onlyMobile || false;\r\n\r\n createEffect(() => {\r\n if (props.options?.onFullScreen) props.options.onFullScreen(isFullScreen());\r\n if (props.options?.onMobile) props.options.onMobile(isMobile());\r\n });\r\n\r\n createEffect(() => {\r\n if (isFullScreen() || isMobile()) {\r\n setIsOpen(true);\r\n }\r\n });\r\n\r\n onMount(async () => {\r\n // const initialMessages = await RemoteRepository.listMessages(\"1\");\r\n // const normalized = initialMessages.map((m: any) => ({\r\n // id: m.id,\r\n // text: m.text,\r\n // sender: m.sender === \"bot\" ? \"bot\" : \"user\",\r\n // })) as Message[];\r\n setMessages([]);\r\n });\r\n\r\n\r\n function getBotAnswer(userText?: string) {\r\n const lower = (userText ?? \"\").toLowerCase();\r\n if (lower.includes(\"thị trường\"))\r\n return \"Thị trường hôm nay biến động nhẹ, bạn quan tâm đến mã nào?\";\r\n if (lower.includes(\"fpt\"))\r\n return \"FPT đang có xu hướng tăng trưởng tốt, bạn cần phân tích kỹ thuật hay cơ bản?\";\r\n if (lower.includes(\"chào\"))\r\n return \"Xin chào! Tôi là bot hỗ trợ đầu tư.\";\r\n if (lower.includes(\"khảo sát\"))\r\n return \"Bạn muốn tôi hỗ trợ khảo sát thị trường theo ngành, khu vực hay theo xu hướng đầu tư?\";\r\n if (lower.includes(\"mục tiêu\"))\r\n return \"Bạn có thể chia sẻ thêm về mục tiêu tài chính của mình ngắn hạn, trung hạn hay dài hạn?\";\r\n if (lower.includes(\"rủi ro\"))\r\n return \"Hãy cho tôi biết mức độ chấp nhận rủi ro của bạn: thấp, trung bình hay cao?\";\r\n return \"Cảm ơn bạn đã hỏi, tôi sẽ phản hồi sớm!\";\r\n }\r\n\r\n const sendMessage = async () => {\r\n if (!input().trim()) return;\r\n const rawUserMessage = await RemoteRepository.sendMessage({ text: input() });\r\n const userMessage: Message = {\r\n id: rawUserMessage.id,\r\n text: rawUserMessage.text,\r\n sender: rawUserMessage.sender === \"bot\" ? \"bot\" : \"user\",\r\n };\r\n setMessages([...messages(), userMessage]);\r\n setInput(\"\");\r\n setTimeout(() => {\r\n const botMessage: Message = {\r\n id: Date.now() + 1,\r\n text: getBotAnswer(userMessage.text),\r\n sender: \"bot\",\r\n };\r\n setMessages([...messages(), botMessage]);\r\n }, 100);\r\n };\r\n\r\n const sendActionMessage = async (text: string) => {\r\n const rawUserMessage = await RemoteRepository.sendMessage({ text });\r\n const userMessage: Message = {\r\n id: rawUserMessage.id,\r\n text: rawUserMessage.text,\r\n sender: rawUserMessage.sender === \"bot\" ? \"bot\" : \"user\",\r\n };\r\n setMessages([...messages(), userMessage]);\r\n\r\n setTimeout(() => {\r\n const botMessage: Message = {\r\n id: Date.now() + 1,\r\n text: getBotAnswer(userMessage.text),\r\n sender: \"bot\",\r\n };\r\n setMessages([...messages(), botMessage]);\r\n }, 100);\r\n };\r\n\r\n const handleSurveyRequest = (options?: { multiSelect?: boolean; isInputMode?: boolean }) => {\r\n setSurveyOptions(options || {});\r\n setMessages([\r\n ...messages(),\r\n {\r\n id: Date.now(),\r\n sender: \"bot\",\r\n type: \"survey\"\r\n }\r\n ]);\r\n };\r\n\r\n const newConversation = () => {\r\n setMessages([]);\r\n }\r\n\r\n\r\n onMount(() => {\r\n const handleResize = () => {\r\n const width = window.innerWidth;\r\n const isMobileNow = width < 768;\r\n if (onlyMobile) {\r\n setIsMobile(true);\r\n setIsFullScreen(false);\r\n } else {\r\n setIsMobile(isMobileNow);\r\n if (isFullScreen() && isMobileNow) {\r\n setIsFullScreen(false);\r\n setIsMobile(true);\r\n }\r\n }\r\n };\r\n window.addEventListener(\"resize\", handleResize);\r\n handleResize();\r\n return () => {\r\n window.removeEventListener(\"resize\", handleResize);\r\n };\r\n });\r\n\r\n return (\r\n <div>\r\n {!isOpen() && (\r\n <button\r\n onClick={() => {\r\n if (onlyMobile) setIsMobile(true);\r\n setIsOpen(true)\r\n if (props.options?.onOpen) props.options.onOpen();\r\n }}\r\n class=\"chat-popup-button\"\r\n style={{\r\n background: \"none\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n padding: 0\r\n }}\r\n >\r\n <img src={chatIcon} />\r\n </button>\r\n )}\r\n\r\n {isOpen() && (\r\n <div class={`chat-popup-window${isOpen() ? \" chat-popup-window--open\" : \"\"}${isFullScreen() ? \" chat-popup-window--fullscreen\" : \"\"}${isMobile() ? \" chat-popup-window--mobile\" : \"\"}`}\r\n style={isFullScreen() || isMobile() ? { [\"--chat-input-height\"]: `${inputHeight()}px` } : undefined}>\r\n {!isFullScreen() && (\r\n <div class=\"chat-popup-header\">\r\n <img\r\n src={inforIcon}\r\n style={{ width: \"28px\", height: \"28px\", cursor: \"pointer\" }}\r\n onClick={() => setIsSidebarOpen(true)}\r\n />\r\n <div class=\"chat-popup-title\">\r\n <img src={chatIcon} style={{ width: \"32px\", height: \"32px\", \"margin-right\": \"4px\" }} />\r\n <span style={{ color: \"#1A1D1F\", \"user-select\": \"none\" }}>Ez</span>\r\n <span style={{ color: \"#1AAF74\", \"margin-left\": \"4px\", \"user-select\": \"none\" }}>Advise</span>\r\n </div>\r\n <div style={{ display: \"flex\", gap: \"12px\", \"align-items\": \"center\", \"margin-top\": \"4px\" }}>\r\n {!isMobile() && (\r\n <>\r\n <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={() => {\r\n if (isFullScreen()) {\r\n setIsFullScreen(false);\r\n setIsMobile(true);\r\n } else if (isMobile()) {\r\n setIsMobile(false);\r\n } else {\r\n setIsMobile(true);\r\n }\r\n if (props.options?.onMinimize) props.options.onMinimize();\r\n }}\r\n >\r\n <img src={iconMinimize} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button>\r\n <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={() => {\r\n setIsMobile(false);\r\n setIsFullScreen(true);\r\n if (props.options?.onMaximize) props.options.onMaximize();\r\n }}\r\n >\r\n <img src={iconExpand} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button>\r\n </>\r\n )}\r\n <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={() => {\r\n setIsOpen(false);\r\n setIsMobile(false);\r\n setIsFullScreen(false);\r\n if (props.options?.onClose) props.options.onClose();\r\n }}\r\n >\r\n <img src={iconClose} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n <div style={{\r\n display: \"flex\",\r\n height: \"100%\",\r\n \"flex-direction\": \"row\",\r\n }}>\r\n {isFullScreen() ? (\r\n <Sidebar\r\n onClose={() => {\r\n setIsOpen(false);\r\n setIsMobile(false);\r\n setIsFullScreen(false);\r\n if (props.options?.onClose) props.options.onClose();\r\n }}\r\n onShrink={() => {\r\n setIsFullScreen(false);\r\n if (props.options?.onShrink) props.options.onShrink();\r\n }}\r\n open={true}\r\n fullScreen={true}\r\n isMobile={isMobile()}\r\n onMobile={() => {\r\n setIsFullScreen(false);\r\n setIsMobile(true);\r\n }}\r\n onSurveyRequest={handleSurveyRequest}\r\n onNewConversation={newConversation}\r\n options={props.options}\r\n />\r\n ) : (\r\n <Sidebar\r\n onClose={() => setIsSidebarOpen(false)}\r\n open={isSidebarOpen()}\r\n fullScreen={false}\r\n isMobile={isMobile()}\r\n onSurveyRequest={handleSurveyRequest}\r\n onNewConversation={newConversation}\r\n options={props.options}\r\n />\r\n )}\r\n <div style={{ flex: 1, display: \"flex\", \"flex-direction\": \"column\", position: \"relative\", \"min-height\": 0, height: \"100%\" }}>\r\n {isFullScreen() && (\r\n <HeaderSteps currentStep={currentStep()} totalSteps={6} />\r\n )}\r\n <ChatMessages\r\n messages={messages()}\r\n isFullScreen={isFullScreen()}\r\n inputHeight={isFullScreen() ? inputHeight() : undefined}\r\n isMobile={isMobile()}\r\n onSubmit={(data, type) => {\r\n let text;\r\n if (type === 'ordered' || type === 'selected') {\r\n text = data.map(o => o.split('. ')[1]).join('\\n\\n');\r\n } else if (type === 'input') {\r\n text = data.join('\\n\\n');\r\n }\r\n if (text) {\r\n sendActionMessage(text);\r\n }\r\n }}\r\n surveyOptions={surveyOptions()}\r\n />\r\n {isFullScreen() ? (\r\n <>\r\n <div class={`chat-input-floating-box${messages().length > 0 ? \" chat-input-floating-box--with-messages\" : \"\"}`}>\r\n {messages().length === 0 && (\r\n <div\r\n style={{\r\n \"text-align\": \"center\",\r\n \"font-size\": \"32px\",\r\n \"font-weight\": \"600\",\r\n \"margin-bottom\": \"32px\",\r\n \"user-select\": \"none\",\r\n width: \"100%\"\r\n }}\r\n >\r\n Hôm nay thị trường khiến bạn quan tâm điều gì?\r\n </div>\r\n )}\r\n <div style={{ width: \"100%\" }}>\r\n <ChatInput\r\n input={input()}\r\n setInput={setInput}\r\n sendMessage={sendMessage}\r\n onHeightChange={setInputHeight}\r\n />\r\n </div>\r\n {messages().length === 0 && (\r\n <div class=\"chat-popup-action-buttons\">\r\n <ChatActionButton text=\"Khảo sát đầu tư\" onClick={() => sendActionMessage(\"Khảo sát đầu tư\")} />\r\n <ChatActionButton text=\"Mục tiêu tài chính\" onClick={() => sendActionMessage(\"Mục tiêu tài chính\")} />\r\n <ChatActionButton text=\"Khả năng chấp nhận rủi ro\" onClick={() => sendActionMessage(\"Khả năng chấp nhận rủi ro\")} />\r\n <ChatActionButton text=\"Khả năng chấp nhận rủi ro\" onClick={() => sendActionMessage(\"Khả năng chấp nhận rủi ro\")} />\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n <ChatInput\r\n input={input()}\r\n setInput={setInput}\r\n sendMessage={sendMessage}\r\n onHeightChange={setInputHeight}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}","import { render } from \"solid-js/web\";\r\nimport ChatPopup from \"./modules/ChatPopup/ChatPopup\";\r\n\r\nexport function createPopup(\r\n selector: string | Element,\r\n options?: {\r\n onMaximize?: () => void;\r\n onMinimize?: () => void;\r\n onMobile?: (isMobile: boolean) => void;\r\n onFullScreen?: (isFullScreen: boolean) => void;\r\n onShrink?: () => void;\r\n onOpen?: () => void;\r\n }\r\n) {\r\n const container = typeof selector === \"string\"\r\n ? document.querySelector(selector)\r\n : selector;\r\n if (!container) throw new Error(`Element \"${selector}\" not found.`);\r\n container.innerHTML = \"\";\r\n\r\n render(() => <ChatPopup options={options} />, container);\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n EzChat: {\r\n createPopup: typeof createPopup;\r\n };\r\n }\r\n}\r\n\r\nif (typeof window !== 'undefined') {\r\n window.EzChat = { createPopup };\r\n}"],"names":["equalFn","a","b","$TRACK","signalOptions","runEffects","runQueue","STALE","PENDING","UNOWNED","Owner","Transition","ExternalSourceConfig","Listener","Updates","Effects","ExecCount","createRoot","fn","detachedOwner","listener","owner","unowned","current","root","updateFn","untrack","cleanNode","runUpdates","createSignal","value","options","s","setter","writeSignal","readSignal","createRenderEffect","c","createComputation","updateComputation","createEffect","runUserEffects","createMemo","onMount","onCleanup","updates","lookUpstream","sSlot","node","isComp","i","o","TransitionRunning","markDownstream","time","runComputation","nextValue","err","handleError","init","pure","state","runTop","ancestors","wait","res","completeUpdates","e","queue","userLength","ignore","source","index","obs","n","castError","FALLBACK","dispose","d","mapArray","list","mapFn","items","mapped","disposers","len","indexes","newItems","newLen","j","newIndices","newIndicesNext","temp","tempdisposers","tempIndexes","start","end","newEnd","item","disposer","mapper","set","createComponent","Comp","props","narrowedError","name","For","fallback","Show","keyed","conditionValue","condition","child","memo","reconcileArrays","parentNode","bLength","aEnd","bEnd","aStart","bStart","after","map","sequence","t","$$EVENTS","render","code","element","insert","template","html","isImportNode","isSVG","isMathML","create","delegateEvents","eventNames","document","l","eventHandler","setAttribute","className","addEventListener","handler","delegate","style","prev","nodeStyle","v","setStyleProperty","use","arg","parent","accessor","marker","initial","insertExpression","key","oriTarget","oriCurrentTarget","retarget","handleNode","data","walkUpTree","path","unwrapArray","multi","cleanChildren","array","currentArray","normalizeIncomingArray","appendNodes","normalized","unwrap","dynamic","replacement","inserted","el","isParent","chatIcon","inforIcon","iconExpand","iconShrink","iconMinimize","iconClose","iconAddItem","iconSend","iconSideActive","iconUser","iconTrending","iconNewConversation","iconSearch","iconMenudot","iconMicrophone","iconEdit","iconDelete","iconSendActive","iconLike","iconDislike","iconLikeActive","iconDislikeActive","iconCheck","SurveyMessage","setOptions","draggedIndex","setDraggedIndex","hoveredIndex","setHoveredIndex","selectedIndexes","setSelectedIndexes","answers","setAnswers","Array","length","fill","multiSelect","isInputMode","containerRef","handleMouseDown","button","preventDefault","handleMouseMove","containerRect","getBoundingClientRect","clientX","left","right","clientY","top","bottom","buttons","querySelectorAll","rect","handleMouseUp","newOptions","handleOptionClick","idx","includes","filter","handleAnswerChange","next","handleSubmit","onSubmit","filledAnswers","trim","selectedOptions","_","removeEventListener","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$7","_el$8","_el$9","_$setStyleProperty","_$insert","_c$","_$memo","_el$0","_tmpl$2","_$createComponent","each","children","option","_el$1","_tmpl$3","_el$10","_el$11","$$input","currentTarget","_$setAttribute","_$effect","_el$12","_tmpl$4","_ref$","_$use","_el$13","_tmpl$5","_el$14","$$click","$$mousedown","_c$2","_el$15","_tmpl$6","_$className","_$delegateEvents","ChatMessages","messagesContainerRef","hoveredId","setHoveredId","feedbackState","setFeedbackState","handleMouseEnter","id","handleMouseLeave","getPadBottom","isFullScreen","messages","inputHeight","isMobile","setTimeout","scrollTop","scrollHeight","requestAnimationFrame","when","_$p","msg","type","surveyOptions","_el$6","sender","text","__spreadProps","__spreadValues","_p$","_v$5","_v$6","_v$7","_v$8","_v$9","undefined","_v$3","_v$4","_v$","_v$2","ChatInput","textareaRef","isMaxed","setIsMaxed","resizeTextarea","height","input","overflowY","onHeightChange","fullHeight","usedHeight","Math","min","MAX_HEIGHT","handleInput","setInput","handleKeyPress","shiftKey","sendMessage","_$addEventListener","classList","toggle","Sidebar","popoverOpen","setPopoverOpen","popoverRef","handleMouseDownOutside","contains","target","fullScreen","_el$19","onClose","open","_el$16","_el$17","_el$18","_el$20","_el$21","_el$22","_el$23","_el$24","_el$25","onShrink","onSurveyRequest","onNewConversation","stopPropagation","_c$3","_el$26","_el$27","_el$28","_el$29","_el$30","width","_$style","ChatActionButton","onClick","HeaderSteps","currentStep","totalSteps","title","from","listMessagesAsync","conversationId","direction","fromMessageId","__async","sendMessageAsync","message","updateMessageAsync","deleteMessageAsync","messageId","deleteType","searchMessagesAsync","keyword","m","RemoteRepository","MessageService.listMessagesAsync","MessageService.sendMessageAsync","MessageService.updateMessageAsync","MessageService.deleteMessageAsync","MessageService.searchMessagesAsync","RemoteRepository$1","ChatPopup","setMessages","isOpen","setIsOpen","isSidebarOpen","setIsSidebarOpen","setIsFullScreen","setIsMobile","setInputHeight","setSurveyOptions","onlyMobile","onFullScreen","onMobile","getBotAnswer","userText","lower","toLowerCase","rawUserMessage","userMessage","botMessage","Date","now","sendActionMessage","handleSurveyRequest","newConversation","handleResize","isMobileNow","window","innerWidth","onOpen","_c$7","onMinimize","onMaximize","_c$4","_c$5","split","join","_c$6","_c$8","_tmpl$7","_c$9","_tmpl$8","createPopup","selector","container","querySelector","Error","innerHTML","EzChat"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"ezchat.umd.js","sources":["../node_modules/solid-js/dist/solid.js","../node_modules/solid-js/web/dist/web.js","../src/assets/icons/icon-chat-button.svg","../src/assets/icons/icon-more-infor.svg","../src/assets/icons/icon-expand.svg","../src/assets/icons/icon-shrink.svg","../src/assets/icons/icon-minimize.svg","../src/assets/icons/icon-close.svg","../src/assets/icons/icon-add-item.svg","../src/assets/icons/icon-send-message.svg","../src/assets/icons/icon-sidebar-active.svg","../src/assets/icons/icon-user.svg","../src/assets/icons/icon-trending.svg","../src/assets/icons/icon-add-conversation.svg","../src/assets/icons/icon-search.svg","../src/assets/icons/icon-menu-dot.svg","../src/assets/icons/icon-micro.svg","../src/assets/icons/icon-edit.svg","../src/assets/icons/icon-delete.svg","../src/assets/icons/icon-send-active.svg","../src/assets/icons/icon-like.svg","../src/assets/icons/icon-dislike.svg","../src/assets/icons/icon-like-active.svg","../src/assets/icons/icon-dislike-active.svg","../src/assets/icons/icon-check.svg","../src/assets/icons/icon-tooltip.svg","../src/assets/icons/icon-hamburger.svg","../src/components/SurveyMessage/SurveyMessage.tsx","../src/modules/ChatMessages/ChatMessages.tsx","../src/modules/ChatInput/ChatInput.tsx","../src/components/Sidebar/Siderbar.tsx","../src/components/ChatActionButton/ChatActionButton.tsx","../src/components/HeaderSteps/HeaderSteps.tsx","../node_modules/solid-js/store/dist/store.js","../src/utils/constants.ts","../src/utils/utils.ts","../src/context/PopupProvider.tsx","../src/modules/ChatPopup/chatPopup.utils.ts","../src/modules/ChatPopup/ChatPopup.tsx","../src/App.tsx","../node_modules/@microsoft/signalr/dist/esm/Errors.js","../node_modules/@microsoft/signalr/dist/esm/HttpClient.js","../node_modules/@microsoft/signalr/dist/esm/ILogger.js","../node_modules/@microsoft/signalr/dist/esm/Loggers.js","../node_modules/@microsoft/signalr/dist/esm/Utils.js","../node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js","../node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js","../node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js","../node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js","../node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js","../node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js","../node_modules/@microsoft/signalr/dist/esm/Subject.js","../node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js","../node_modules/@microsoft/signalr/dist/esm/HubConnection.js","../node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js","../node_modules/@microsoft/signalr/dist/esm/HeaderNames.js","../node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js","../node_modules/@microsoft/signalr/dist/esm/ITransport.js","../node_modules/@microsoft/signalr/dist/esm/AbortController.js","../node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js","../node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js","../node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js","../node_modules/@microsoft/signalr/dist/esm/HttpConnection.js","../node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js","../node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js","../src/data-provider/http-client.ts","../src/data-provider/apis-data-provider/user-apis.ts","../src/data-provider/index-db.ts","../src/data-provider/user-local-store.ts","../src/data-provider/utils.ts","../src/data-provider/hub-client.ts","../src/data-provider/apis-data-provider/message-apis.ts","../src/data-provider/hubs-data-provider/event-handler.ts","../src/data-provider/hubs-data-provider/index.ts","../src/data-provider/services/chat-type-service.ts","../src/data-provider/apis-data-provider/conversation-apis.ts","../src/data-provider/services/conversation-service.ts","../src/data-provider/apis-data-provider/file-apis.ts","../src/data-provider/services/file-service.ts","../src/data-provider/services/message-service.ts","../src/data-provider/services/user-service.ts","../src/RemoteRepository.ts","../src/index.tsx"],"sourcesContent":["let taskIdCounter = 1,\n isCallbackScheduled = false,\n isPerformingWork = false,\n taskQueue = [],\n currentTask = null,\n shouldYieldToHost = null,\n yieldInterval = 5,\n deadline = 0,\n maxYieldInterval = 300,\n maxDeadline = 0,\n scheduleCallback = null,\n scheduledCallback = null;\nconst maxSigned31BitInt = 1073741823;\nfunction setupScheduler() {\n const channel = new MessageChannel(),\n port = channel.port2;\n scheduleCallback = () => port.postMessage(null);\n channel.port1.onmessage = () => {\n if (scheduledCallback !== null) {\n const currentTime = performance.now();\n deadline = currentTime + yieldInterval;\n maxDeadline = currentTime + maxYieldInterval;\n try {\n const hasMoreWork = scheduledCallback(currentTime);\n if (!hasMoreWork) {\n scheduledCallback = null;\n } else port.postMessage(null);\n } catch (error) {\n port.postMessage(null);\n throw error;\n }\n }\n };\n if (navigator && navigator.scheduling && navigator.scheduling.isInputPending) {\n const scheduling = navigator.scheduling;\n shouldYieldToHost = () => {\n const currentTime = performance.now();\n if (currentTime >= deadline) {\n if (scheduling.isInputPending()) {\n return true;\n }\n return currentTime >= maxDeadline;\n } else {\n return false;\n }\n };\n } else {\n shouldYieldToHost = () => performance.now() >= deadline;\n }\n}\nfunction enqueue(taskQueue, task) {\n function findIndex() {\n let m = 0;\n let n = taskQueue.length - 1;\n while (m <= n) {\n const k = n + m >> 1;\n const cmp = task.expirationTime - taskQueue[k].expirationTime;\n if (cmp > 0) m = k + 1;else if (cmp < 0) n = k - 1;else return k;\n }\n return m;\n }\n taskQueue.splice(findIndex(), 0, task);\n}\nfunction requestCallback(fn, options) {\n if (!scheduleCallback) setupScheduler();\n let startTime = performance.now(),\n timeout = maxSigned31BitInt;\n if (options && options.timeout) timeout = options.timeout;\n const newTask = {\n id: taskIdCounter++,\n fn,\n startTime,\n expirationTime: startTime + timeout\n };\n enqueue(taskQueue, newTask);\n if (!isCallbackScheduled && !isPerformingWork) {\n isCallbackScheduled = true;\n scheduledCallback = flushWork;\n scheduleCallback();\n }\n return newTask;\n}\nfunction cancelCallback(task) {\n task.fn = null;\n}\nfunction flushWork(initialTime) {\n isCallbackScheduled = false;\n isPerformingWork = true;\n try {\n return workLoop(initialTime);\n } finally {\n currentTask = null;\n isPerformingWork = false;\n }\n}\nfunction workLoop(initialTime) {\n let currentTime = initialTime;\n currentTask = taskQueue[0] || null;\n while (currentTask !== null) {\n if (currentTask.expirationTime > currentTime && shouldYieldToHost()) {\n break;\n }\n const callback = currentTask.fn;\n if (callback !== null) {\n currentTask.fn = null;\n const didUserCallbackTimeout = currentTask.expirationTime <= currentTime;\n callback(didUserCallbackTimeout);\n currentTime = performance.now();\n if (currentTask === taskQueue[0]) {\n taskQueue.shift();\n }\n } else taskQueue.shift();\n currentTask = taskQueue[0] || null;\n }\n return currentTask !== null;\n}\n\nconst sharedConfig = {\n context: undefined,\n registry: undefined,\n effects: undefined,\n done: false,\n getContextId() {\n return getContextId(this.context.count);\n },\n getNextContextId() {\n return getContextId(this.context.count++);\n }\n};\nfunction getContextId(count) {\n const num = String(count),\n len = num.length - 1;\n return sharedConfig.context.id + (len ? String.fromCharCode(96 + len) : \"\") + num;\n}\nfunction setHydrateContext(context) {\n sharedConfig.context = context;\n}\nfunction nextHydrateContext() {\n return {\n ...sharedConfig.context,\n id: sharedConfig.getNextContextId(),\n count: 0\n };\n}\n\nconst IS_DEV = false;\nconst equalFn = (a, b) => a === b;\nconst $PROXY = Symbol(\"solid-proxy\");\nconst SUPPORTS_PROXY = typeof Proxy === \"function\";\nconst $TRACK = Symbol(\"solid-track\");\nconst $DEVCOMP = Symbol(\"solid-dev-component\");\nconst signalOptions = {\n equals: equalFn\n};\nlet ERROR = null;\nlet runEffects = runQueue;\nconst STALE = 1;\nconst PENDING = 2;\nconst UNOWNED = {\n owned: null,\n cleanups: null,\n context: null,\n owner: null\n};\nconst NO_INIT = {};\nvar Owner = null;\nlet Transition = null;\nlet Scheduler = null;\nlet ExternalSourceConfig = null;\nlet Listener = null;\nlet Updates = null;\nlet Effects = null;\nlet ExecCount = 0;\nfunction createRoot(fn, detachedOwner) {\n const listener = Listener,\n owner = Owner,\n unowned = fn.length === 0,\n current = detachedOwner === undefined ? owner : detachedOwner,\n root = unowned ? UNOWNED : {\n owned: null,\n cleanups: null,\n context: current ? current.context : null,\n owner: current\n },\n updateFn = unowned ? fn : () => fn(() => untrack(() => cleanNode(root)));\n Owner = root;\n Listener = null;\n try {\n return runUpdates(updateFn, true);\n } finally {\n Listener = listener;\n Owner = owner;\n }\n}\nfunction createSignal(value, options) {\n options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n const s = {\n value,\n observers: null,\n observerSlots: null,\n comparator: options.equals || undefined\n };\n const setter = value => {\n if (typeof value === \"function\") {\n if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue);else value = value(s.value);\n }\n return writeSignal(s, value);\n };\n return [readSignal.bind(s), setter];\n}\nfunction createComputed(fn, value, options) {\n const c = createComputation(fn, value, true, STALE);\n if (Scheduler && Transition && Transition.running) Updates.push(c);else updateComputation(c);\n}\nfunction createRenderEffect(fn, value, options) {\n const c = createComputation(fn, value, false, STALE);\n if (Scheduler && Transition && Transition.running) Updates.push(c);else updateComputation(c);\n}\nfunction createEffect(fn, value, options) {\n runEffects = runUserEffects;\n const c = createComputation(fn, value, false, STALE),\n s = SuspenseContext && useContext(SuspenseContext);\n if (s) c.suspense = s;\n if (!options || !options.render) c.user = true;\n Effects ? Effects.push(c) : updateComputation(c);\n}\nfunction createReaction(onInvalidate, options) {\n let fn;\n const c = createComputation(() => {\n fn ? fn() : untrack(onInvalidate);\n fn = undefined;\n }, undefined, false, 0),\n s = SuspenseContext && useContext(SuspenseContext);\n if (s) c.suspense = s;\n c.user = true;\n return tracking => {\n fn = tracking;\n updateComputation(c);\n };\n}\nfunction createMemo(fn, value, options) {\n options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n const c = createComputation(fn, value, true, 0);\n c.observers = null;\n c.observerSlots = null;\n c.comparator = options.equals || undefined;\n if (Scheduler && Transition && Transition.running) {\n c.tState = STALE;\n Updates.push(c);\n } else updateComputation(c);\n return readSignal.bind(c);\n}\nfunction isPromise(v) {\n return v && typeof v === \"object\" && \"then\" in v;\n}\nfunction createResource(pSource, pFetcher, pOptions) {\n let source;\n let fetcher;\n let options;\n if (typeof pFetcher === \"function\") {\n source = pSource;\n fetcher = pFetcher;\n options = pOptions || {};\n } else {\n source = true;\n fetcher = pSource;\n options = pFetcher || {};\n }\n let pr = null,\n initP = NO_INIT,\n id = null,\n loadedUnderTransition = false,\n scheduled = false,\n resolved = \"initialValue\" in options,\n dynamic = typeof source === \"function\" && createMemo(source);\n const contexts = new Set(),\n [value, setValue] = (options.storage || createSignal)(options.initialValue),\n [error, setError] = createSignal(undefined),\n [track, trigger] = createSignal(undefined, {\n equals: false\n }),\n [state, setState] = createSignal(resolved ? \"ready\" : \"unresolved\");\n if (sharedConfig.context) {\n id = sharedConfig.getNextContextId();\n if (options.ssrLoadFrom === \"initial\") initP = options.initialValue;else if (sharedConfig.load && sharedConfig.has(id)) initP = sharedConfig.load(id);\n }\n function loadEnd(p, v, error, key) {\n if (pr === p) {\n pr = null;\n key !== undefined && (resolved = true);\n if ((p === initP || v === initP) && options.onHydrated) queueMicrotask(() => options.onHydrated(key, {\n value: v\n }));\n initP = NO_INIT;\n if (Transition && p && loadedUnderTransition) {\n Transition.promises.delete(p);\n loadedUnderTransition = false;\n runUpdates(() => {\n Transition.running = true;\n completeLoad(v, error);\n }, false);\n } else completeLoad(v, error);\n }\n return v;\n }\n function completeLoad(v, err) {\n runUpdates(() => {\n if (err === undefined) setValue(() => v);\n setState(err !== undefined ? \"errored\" : resolved ? \"ready\" : \"unresolved\");\n setError(err);\n for (const c of contexts.keys()) c.decrement();\n contexts.clear();\n }, false);\n }\n function read() {\n const c = SuspenseContext && useContext(SuspenseContext),\n v = value(),\n err = error();\n if (err !== undefined && !pr) throw err;\n if (Listener && !Listener.user && c) {\n createComputed(() => {\n track();\n if (pr) {\n if (c.resolved && Transition && loadedUnderTransition) Transition.promises.add(pr);else if (!contexts.has(c)) {\n c.increment();\n contexts.add(c);\n }\n }\n });\n }\n return v;\n }\n function load(refetching = true) {\n if (refetching !== false && scheduled) return;\n scheduled = false;\n const lookup = dynamic ? dynamic() : source;\n loadedUnderTransition = Transition && Transition.running;\n if (lookup == null || lookup === false) {\n loadEnd(pr, untrack(value));\n return;\n }\n if (Transition && pr) Transition.promises.delete(pr);\n let error;\n const p = initP !== NO_INIT ? initP : untrack(() => {\n try {\n return fetcher(lookup, {\n value: value(),\n refetching\n });\n } catch (fetcherError) {\n error = fetcherError;\n }\n });\n if (error !== undefined) {\n loadEnd(pr, undefined, castError(error), lookup);\n return;\n } else if (!isPromise(p)) {\n loadEnd(pr, p, undefined, lookup);\n return p;\n }\n pr = p;\n if (\"v\" in p) {\n if (p.s === 1) loadEnd(pr, p.v, undefined, lookup);else loadEnd(pr, undefined, castError(p.v), lookup);\n return p;\n }\n scheduled = true;\n queueMicrotask(() => scheduled = false);\n runUpdates(() => {\n setState(resolved ? \"refreshing\" : \"pending\");\n trigger();\n }, false);\n return p.then(v => loadEnd(p, v, undefined, lookup), e => loadEnd(p, undefined, castError(e), lookup));\n }\n Object.defineProperties(read, {\n state: {\n get: () => state()\n },\n error: {\n get: () => error()\n },\n loading: {\n get() {\n const s = state();\n return s === \"pending\" || s === \"refreshing\";\n }\n },\n latest: {\n get() {\n if (!resolved) return read();\n const err = error();\n if (err && !pr) throw err;\n return value();\n }\n }\n });\n let owner = Owner;\n if (dynamic) createComputed(() => (owner = Owner, load(false)));else load(false);\n return [read, {\n refetch: info => runWithOwner(owner, () => load(info)),\n mutate: setValue\n }];\n}\nfunction createDeferred(source, options) {\n let t,\n timeout = options ? options.timeoutMs : undefined;\n const node = createComputation(() => {\n if (!t || !t.fn) t = requestCallback(() => setDeferred(() => node.value), timeout !== undefined ? {\n timeout\n } : undefined);\n return source();\n }, undefined, true);\n const [deferred, setDeferred] = createSignal(Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, options);\n updateComputation(node);\n setDeferred(() => Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value);\n return deferred;\n}\nfunction createSelector(source, fn = equalFn, options) {\n const subs = new Map();\n const node = createComputation(p => {\n const v = source();\n for (const [key, val] of subs.entries()) if (fn(key, v) !== fn(key, p)) {\n for (const c of val.values()) {\n c.state = STALE;\n if (c.pure) Updates.push(c);else Effects.push(c);\n }\n }\n return v;\n }, undefined, true, STALE);\n updateComputation(node);\n return key => {\n const listener = Listener;\n if (listener) {\n let l;\n if (l = subs.get(key)) l.add(listener);else subs.set(key, l = new Set([listener]));\n onCleanup(() => {\n l.delete(listener);\n !l.size && subs.delete(key);\n });\n }\n return fn(key, Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value);\n };\n}\nfunction batch(fn) {\n return runUpdates(fn, false);\n}\nfunction untrack(fn) {\n if (!ExternalSourceConfig && Listener === null) return fn();\n const listener = Listener;\n Listener = null;\n try {\n if (ExternalSourceConfig) return ExternalSourceConfig.untrack(fn);\n return fn();\n } finally {\n Listener = listener;\n }\n}\nfunction on(deps, fn, options) {\n const isArray = Array.isArray(deps);\n let prevInput;\n let defer = options && options.defer;\n return prevValue => {\n let input;\n if (isArray) {\n input = Array(deps.length);\n for (let i = 0; i < deps.length; i++) input[i] = deps[i]();\n } else input = deps();\n if (defer) {\n defer = false;\n return prevValue;\n }\n const result = untrack(() => fn(input, prevInput, prevValue));\n prevInput = input;\n return result;\n };\n}\nfunction onMount(fn) {\n createEffect(() => untrack(fn));\n}\nfunction onCleanup(fn) {\n if (Owner === null) ;else if (Owner.cleanups === null) Owner.cleanups = [fn];else Owner.cleanups.push(fn);\n return fn;\n}\nfunction catchError(fn, handler) {\n ERROR || (ERROR = Symbol(\"error\"));\n Owner = createComputation(undefined, undefined, true);\n Owner.context = {\n ...Owner.context,\n [ERROR]: [handler]\n };\n if (Transition && Transition.running) Transition.sources.add(Owner);\n try {\n return fn();\n } catch (err) {\n handleError(err);\n } finally {\n Owner = Owner.owner;\n }\n}\nfunction getListener() {\n return Listener;\n}\nfunction getOwner() {\n return Owner;\n}\nfunction runWithOwner(o, fn) {\n const prev = Owner;\n const prevListener = Listener;\n Owner = o;\n Listener = null;\n try {\n return runUpdates(fn, true);\n } catch (err) {\n handleError(err);\n } finally {\n Owner = prev;\n Listener = prevListener;\n }\n}\nfunction enableScheduling(scheduler = requestCallback) {\n Scheduler = scheduler;\n}\nfunction startTransition(fn) {\n if (Transition && Transition.running) {\n fn();\n return Transition.done;\n }\n const l = Listener;\n const o = Owner;\n return Promise.resolve().then(() => {\n Listener = l;\n Owner = o;\n let t;\n if (Scheduler || SuspenseContext) {\n t = Transition || (Transition = {\n sources: new Set(),\n effects: [],\n promises: new Set(),\n disposed: new Set(),\n queue: new Set(),\n running: true\n });\n t.done || (t.done = new Promise(res => t.resolve = res));\n t.running = true;\n }\n runUpdates(fn, false);\n Listener = Owner = null;\n return t ? t.done : undefined;\n });\n}\nconst [transPending, setTransPending] = /*@__PURE__*/createSignal(false);\nfunction useTransition() {\n return [transPending, startTransition];\n}\nfunction resumeEffects(e) {\n Effects.push.apply(Effects, e);\n e.length = 0;\n}\nfunction createContext(defaultValue, options) {\n const id = Symbol(\"context\");\n return {\n id,\n Provider: createProvider(id),\n defaultValue\n };\n}\nfunction useContext(context) {\n let value;\n return Owner && Owner.context && (value = Owner.context[context.id]) !== undefined ? value : context.defaultValue;\n}\nfunction children(fn) {\n const children = createMemo(fn);\n const memo = createMemo(() => resolveChildren(children()));\n memo.toArray = () => {\n const c = memo();\n return Array.isArray(c) ? c : c != null ? [c] : [];\n };\n return memo;\n}\nlet SuspenseContext;\nfunction getSuspenseContext() {\n return SuspenseContext || (SuspenseContext = createContext());\n}\nfunction enableExternalSource(factory, untrack = fn => fn()) {\n if (ExternalSourceConfig) {\n const {\n factory: oldFactory,\n untrack: oldUntrack\n } = ExternalSourceConfig;\n ExternalSourceConfig = {\n factory: (fn, trigger) => {\n const oldSource = oldFactory(fn, trigger);\n const source = factory(x => oldSource.track(x), trigger);\n return {\n track: x => source.track(x),\n dispose() {\n source.dispose();\n oldSource.dispose();\n }\n };\n },\n untrack: fn => oldUntrack(() => untrack(fn))\n };\n } else {\n ExternalSourceConfig = {\n factory,\n untrack\n };\n }\n}\nfunction readSignal() {\n const runningTransition = Transition && Transition.running;\n if (this.sources && (runningTransition ? this.tState : this.state)) {\n if ((runningTransition ? this.tState : this.state) === STALE) updateComputation(this);else {\n const updates = Updates;\n Updates = null;\n runUpdates(() => lookUpstream(this), false);\n Updates = updates;\n }\n }\n if (Listener) {\n const sSlot = this.observers ? this.observers.length : 0;\n if (!Listener.sources) {\n Listener.sources = [this];\n Listener.sourceSlots = [sSlot];\n } else {\n Listener.sources.push(this);\n Listener.sourceSlots.push(sSlot);\n }\n if (!this.observers) {\n this.observers = [Listener];\n this.observerSlots = [Listener.sources.length - 1];\n } else {\n this.observers.push(Listener);\n this.observerSlots.push(Listener.sources.length - 1);\n }\n }\n if (runningTransition && Transition.sources.has(this)) return this.tValue;\n return this.value;\n}\nfunction writeSignal(node, value, isComp) {\n let current = Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value;\n if (!node.comparator || !node.comparator(current, value)) {\n if (Transition) {\n const TransitionRunning = Transition.running;\n if (TransitionRunning || !isComp && Transition.sources.has(node)) {\n Transition.sources.add(node);\n node.tValue = value;\n }\n if (!TransitionRunning) node.value = value;\n } else node.value = value;\n if (node.observers && node.observers.length) {\n runUpdates(() => {\n for (let i = 0; i < node.observers.length; i += 1) {\n const o = node.observers[i];\n const TransitionRunning = Transition && Transition.running;\n if (TransitionRunning && Transition.disposed.has(o)) continue;\n if (TransitionRunning ? !o.tState : !o.state) {\n if (o.pure) Updates.push(o);else Effects.push(o);\n if (o.observers) markDownstream(o);\n }\n if (!TransitionRunning) o.state = STALE;else o.tState = STALE;\n }\n if (Updates.length > 10e5) {\n Updates = [];\n if (IS_DEV) ;\n throw new Error();\n }\n }, false);\n }\n }\n return value;\n}\nfunction updateComputation(node) {\n if (!node.fn) return;\n cleanNode(node);\n const time = ExecCount;\n runComputation(node, Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, time);\n if (Transition && !Transition.running && Transition.sources.has(node)) {\n queueMicrotask(() => {\n runUpdates(() => {\n Transition && (Transition.running = true);\n Listener = Owner = node;\n runComputation(node, node.tValue, time);\n Listener = Owner = null;\n }, false);\n });\n }\n}\nfunction runComputation(node, value, time) {\n let nextValue;\n const owner = Owner,\n listener = Listener;\n Listener = Owner = node;\n try {\n nextValue = node.fn(value);\n } catch (err) {\n if (node.pure) {\n if (Transition && Transition.running) {\n node.tState = STALE;\n node.tOwned && node.tOwned.forEach(cleanNode);\n node.tOwned = undefined;\n } else {\n node.state = STALE;\n node.owned && node.owned.forEach(cleanNode);\n node.owned = null;\n }\n }\n node.updatedAt = time + 1;\n return handleError(err);\n } finally {\n Listener = listener;\n Owner = owner;\n }\n if (!node.updatedAt || node.updatedAt <= time) {\n if (node.updatedAt != null && \"observers\" in node) {\n writeSignal(node, nextValue, true);\n } else if (Transition && Transition.running && node.pure) {\n Transition.sources.add(node);\n node.tValue = nextValue;\n } else node.value = nextValue;\n node.updatedAt = time;\n }\n}\nfunction createComputation(fn, init, pure, state = STALE, options) {\n const c = {\n fn,\n state: state,\n updatedAt: null,\n owned: null,\n sources: null,\n sourceSlots: null,\n cleanups: null,\n value: init,\n owner: Owner,\n context: Owner ? Owner.context : null,\n pure\n };\n if (Transition && Transition.running) {\n c.state = 0;\n c.tState = state;\n }\n if (Owner === null) ;else if (Owner !== UNOWNED) {\n if (Transition && Transition.running && Owner.pure) {\n if (!Owner.tOwned) Owner.tOwned = [c];else Owner.tOwned.push(c);\n } else {\n if (!Owner.owned) Owner.owned = [c];else Owner.owned.push(c);\n }\n }\n if (ExternalSourceConfig && c.fn) {\n const [track, trigger] = createSignal(undefined, {\n equals: false\n });\n const ordinary = ExternalSourceConfig.factory(c.fn, trigger);\n onCleanup(() => ordinary.dispose());\n const triggerInTransition = () => startTransition(trigger).then(() => inTransition.dispose());\n const inTransition = ExternalSourceConfig.factory(c.fn, triggerInTransition);\n c.fn = x => {\n track();\n return Transition && Transition.running ? inTransition.track(x) : ordinary.track(x);\n };\n }\n return c;\n}\nfunction runTop(node) {\n const runningTransition = Transition && Transition.running;\n if ((runningTransition ? node.tState : node.state) === 0) return;\n if ((runningTransition ? node.tState : node.state) === PENDING) return lookUpstream(node);\n if (node.suspense && untrack(node.suspense.inFallback)) return node.suspense.effects.push(node);\n const ancestors = [node];\n while ((node = node.owner) && (!node.updatedAt || node.updatedAt < ExecCount)) {\n if (runningTransition && Transition.disposed.has(node)) return;\n if (runningTransition ? node.tState : node.state) ancestors.push(node);\n }\n for (let i = ancestors.length - 1; i >= 0; i--) {\n node = ancestors[i];\n if (runningTransition) {\n let top = node,\n prev = ancestors[i + 1];\n while ((top = top.owner) && top !== prev) {\n if (Transition.disposed.has(top)) return;\n }\n }\n if ((runningTransition ? node.tState : node.state) === STALE) {\n updateComputation(node);\n } else if ((runningTransition ? node.tState : node.state) === PENDING) {\n const updates = Updates;\n Updates = null;\n runUpdates(() => lookUpstream(node, ancestors[0]), false);\n Updates = updates;\n }\n }\n}\nfunction runUpdates(fn, init) {\n if (Updates) return fn();\n let wait = false;\n if (!init) Updates = [];\n if (Effects) wait = true;else Effects = [];\n ExecCount++;\n try {\n const res = fn();\n completeUpdates(wait);\n return res;\n } catch (err) {\n if (!wait) Effects = null;\n Updates = null;\n handleError(err);\n }\n}\nfunction completeUpdates(wait) {\n if (Updates) {\n if (Scheduler && Transition && Transition.running) scheduleQueue(Updates);else runQueue(Updates);\n Updates = null;\n }\n if (wait) return;\n let res;\n if (Transition) {\n if (!Transition.promises.size && !Transition.queue.size) {\n const sources = Transition.sources;\n const disposed = Transition.disposed;\n Effects.push.apply(Effects, Transition.effects);\n res = Transition.resolve;\n for (const e of Effects) {\n \"tState\" in e && (e.state = e.tState);\n delete e.tState;\n }\n Transition = null;\n runUpdates(() => {\n for (const d of disposed) cleanNode(d);\n for (const v of sources) {\n v.value = v.tValue;\n if (v.owned) {\n for (let i = 0, len = v.owned.length; i < len; i++) cleanNode(v.owned[i]);\n }\n if (v.tOwned) v.owned = v.tOwned;\n delete v.tValue;\n delete v.tOwned;\n v.tState = 0;\n }\n setTransPending(false);\n }, false);\n } else if (Transition.running) {\n Transition.running = false;\n Transition.effects.push.apply(Transition.effects, Effects);\n Effects = null;\n setTransPending(true);\n return;\n }\n }\n const e = Effects;\n Effects = null;\n if (e.length) runUpdates(() => runEffects(e), false);\n if (res) res();\n}\nfunction runQueue(queue) {\n for (let i = 0; i < queue.length; i++) runTop(queue[i]);\n}\nfunction scheduleQueue(queue) {\n for (let i = 0; i < queue.length; i++) {\n const item = queue[i];\n const tasks = Transition.queue;\n if (!tasks.has(item)) {\n tasks.add(item);\n Scheduler(() => {\n tasks.delete(item);\n runUpdates(() => {\n Transition.running = true;\n runTop(item);\n }, false);\n Transition && (Transition.running = false);\n });\n }\n }\n}\nfunction runUserEffects(queue) {\n let i,\n userLength = 0;\n for (i = 0; i < queue.length; i++) {\n const e = queue[i];\n if (!e.user) runTop(e);else queue[userLength++] = e;\n }\n if (sharedConfig.context) {\n if (sharedConfig.count) {\n sharedConfig.effects || (sharedConfig.effects = []);\n sharedConfig.effects.push(...queue.slice(0, userLength));\n return;\n }\n setHydrateContext();\n }\n if (sharedConfig.effects && (sharedConfig.done || !sharedConfig.count)) {\n queue = [...sharedConfig.effects, ...queue];\n userLength += sharedConfig.effects.length;\n delete sharedConfig.effects;\n }\n for (i = 0; i < userLength; i++) runTop(queue[i]);\n}\nfunction lookUpstream(node, ignore) {\n const runningTransition = Transition && Transition.running;\n if (runningTransition) node.tState = 0;else node.state = 0;\n for (let i = 0; i < node.sources.length; i += 1) {\n const source = node.sources[i];\n if (source.sources) {\n const state = runningTransition ? source.tState : source.state;\n if (state === STALE) {\n if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount)) runTop(source);\n } else if (state === PENDING) lookUpstream(source, ignore);\n }\n }\n}\nfunction markDownstream(node) {\n const runningTransition = Transition && Transition.running;\n for (let i = 0; i < node.observers.length; i += 1) {\n const o = node.observers[i];\n if (runningTransition ? !o.tState : !o.state) {\n if (runningTransition) o.tState = PENDING;else o.state = PENDING;\n if (o.pure) Updates.push(o);else Effects.push(o);\n o.observers && markDownstream(o);\n }\n }\n}\nfunction cleanNode(node) {\n let i;\n if (node.sources) {\n while (node.sources.length) {\n const source = node.sources.pop(),\n index = node.sourceSlots.pop(),\n obs = source.observers;\n if (obs && obs.length) {\n const n = obs.pop(),\n s = source.observerSlots.pop();\n if (index < obs.length) {\n n.sourceSlots[s] = index;\n obs[index] = n;\n source.observerSlots[index] = s;\n }\n }\n }\n }\n if (node.tOwned) {\n for (i = node.tOwned.length - 1; i >= 0; i--) cleanNode(node.tOwned[i]);\n delete node.tOwned;\n }\n if (Transition && Transition.running && node.pure) {\n reset(node, true);\n } else if (node.owned) {\n for (i = node.owned.length - 1; i >= 0; i--) cleanNode(node.owned[i]);\n node.owned = null;\n }\n if (node.cleanups) {\n for (i = node.cleanups.length - 1; i >= 0; i--) node.cleanups[i]();\n node.cleanups = null;\n }\n if (Transition && Transition.running) node.tState = 0;else node.state = 0;\n}\nfunction reset(node, top) {\n if (!top) {\n node.tState = 0;\n Transition.disposed.add(node);\n }\n if (node.owned) {\n for (let i = 0; i < node.owned.length; i++) reset(node.owned[i]);\n }\n}\nfunction castError(err) {\n if (err instanceof Error) return err;\n return new Error(typeof err === \"string\" ? err : \"Unknown error\", {\n cause: err\n });\n}\nfunction runErrors(err, fns, owner) {\n try {\n for (const f of fns) f(err);\n } catch (e) {\n handleError(e, owner && owner.owner || null);\n }\n}\nfunction handleError(err, owner = Owner) {\n const fns = ERROR && owner && owner.context && owner.context[ERROR];\n const error = castError(err);\n if (!fns) throw error;\n if (Effects) Effects.push({\n fn() {\n runErrors(error, fns, owner);\n },\n state: STALE\n });else runErrors(error, fns, owner);\n}\nfunction resolveChildren(children) {\n if (typeof children === \"function\" && !children.length) return resolveChildren(children());\n if (Array.isArray(children)) {\n const results = [];\n for (let i = 0; i < children.length; i++) {\n const result = resolveChildren(children[i]);\n Array.isArray(result) ? results.push.apply(results, result) : results.push(result);\n }\n return results;\n }\n return children;\n}\nfunction createProvider(id, options) {\n return function provider(props) {\n let res;\n createRenderEffect(() => res = untrack(() => {\n Owner.context = {\n ...Owner.context,\n [id]: props.value\n };\n return children(() => props.children);\n }), undefined);\n return res;\n };\n}\nfunction onError(fn) {\n ERROR || (ERROR = Symbol(\"error\"));\n if (Owner === null) ;else if (Owner.context === null || !Owner.context[ERROR]) {\n Owner.context = {\n ...Owner.context,\n [ERROR]: [fn]\n };\n mutateContext(Owner, ERROR, [fn]);\n } else Owner.context[ERROR].push(fn);\n}\nfunction mutateContext(o, key, value) {\n if (o.owned) {\n for (let i = 0; i < o.owned.length; i++) {\n if (o.owned[i].context === o.context) mutateContext(o.owned[i], key, value);\n if (!o.owned[i].context) {\n o.owned[i].context = o.context;\n mutateContext(o.owned[i], key, value);\n } else if (!o.owned[i].context[key]) {\n o.owned[i].context[key] = value;\n mutateContext(o.owned[i], key, value);\n }\n }\n }\n}\n\nfunction observable(input) {\n return {\n subscribe(observer) {\n if (!(observer instanceof Object) || observer == null) {\n throw new TypeError(\"Expected the observer to be an object.\");\n }\n const handler = typeof observer === \"function\" ? observer : observer.next && observer.next.bind(observer);\n if (!handler) {\n return {\n unsubscribe() {}\n };\n }\n const dispose = createRoot(disposer => {\n createEffect(() => {\n const v = input();\n untrack(() => handler(v));\n });\n return disposer;\n });\n if (getOwner()) onCleanup(dispose);\n return {\n unsubscribe() {\n dispose();\n }\n };\n },\n [Symbol.observable || \"@@observable\"]() {\n return this;\n }\n };\n}\nfunction from(producer, initalValue = undefined) {\n const [s, set] = createSignal(initalValue, {\n equals: false\n });\n if (\"subscribe\" in producer) {\n const unsub = producer.subscribe(v => set(() => v));\n onCleanup(() => \"unsubscribe\" in unsub ? unsub.unsubscribe() : unsub());\n } else {\n const clean = producer(set);\n onCleanup(clean);\n }\n return s;\n}\n\nconst FALLBACK = Symbol(\"fallback\");\nfunction dispose(d) {\n for (let i = 0; i < d.length; i++) d[i]();\n}\nfunction mapArray(list, mapFn, options = {}) {\n let items = [],\n mapped = [],\n disposers = [],\n len = 0,\n indexes = mapFn.length > 1 ? [] : null;\n onCleanup(() => dispose(disposers));\n return () => {\n let newItems = list() || [],\n newLen = newItems.length,\n i,\n j;\n newItems[$TRACK];\n return untrack(() => {\n let newIndices, newIndicesNext, temp, tempdisposers, tempIndexes, start, end, newEnd, item;\n if (newLen === 0) {\n if (len !== 0) {\n dispose(disposers);\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n indexes && (indexes = []);\n }\n if (options.fallback) {\n items = [FALLBACK];\n mapped[0] = createRoot(disposer => {\n disposers[0] = disposer;\n return options.fallback();\n });\n len = 1;\n }\n }\n else if (len === 0) {\n mapped = new Array(newLen);\n for (j = 0; j < newLen; j++) {\n items[j] = newItems[j];\n mapped[j] = createRoot(mapper);\n }\n len = newLen;\n } else {\n temp = new Array(newLen);\n tempdisposers = new Array(newLen);\n indexes && (tempIndexes = new Array(newLen));\n for (start = 0, end = Math.min(len, newLen); start < end && items[start] === newItems[start]; start++);\n for (end = len - 1, newEnd = newLen - 1; end >= start && newEnd >= start && items[end] === newItems[newEnd]; end--, newEnd--) {\n temp[newEnd] = mapped[end];\n tempdisposers[newEnd] = disposers[end];\n indexes && (tempIndexes[newEnd] = indexes[end]);\n }\n newIndices = new Map();\n newIndicesNext = new Array(newEnd + 1);\n for (j = newEnd; j >= start; j--) {\n item = newItems[j];\n i = newIndices.get(item);\n newIndicesNext[j] = i === undefined ? -1 : i;\n newIndices.set(item, j);\n }\n for (i = start; i <= end; i++) {\n item = items[i];\n j = newIndices.get(item);\n if (j !== undefined && j !== -1) {\n temp[j] = mapped[i];\n tempdisposers[j] = disposers[i];\n indexes && (tempIndexes[j] = indexes[i]);\n j = newIndicesNext[j];\n newIndices.set(item, j);\n } else disposers[i]();\n }\n for (j = start; j < newLen; j++) {\n if (j in temp) {\n mapped[j] = temp[j];\n disposers[j] = tempdisposers[j];\n if (indexes) {\n indexes[j] = tempIndexes[j];\n indexes[j](j);\n }\n } else mapped[j] = createRoot(mapper);\n }\n mapped = mapped.slice(0, len = newLen);\n items = newItems.slice(0);\n }\n return mapped;\n });\n function mapper(disposer) {\n disposers[j] = disposer;\n if (indexes) {\n const [s, set] = createSignal(j);\n indexes[j] = set;\n return mapFn(newItems[j], s);\n }\n return mapFn(newItems[j]);\n }\n };\n}\nfunction indexArray(list, mapFn, options = {}) {\n let items = [],\n mapped = [],\n disposers = [],\n signals = [],\n len = 0,\n i;\n onCleanup(() => dispose(disposers));\n return () => {\n const newItems = list() || [],\n newLen = newItems.length;\n newItems[$TRACK];\n return untrack(() => {\n if (newLen === 0) {\n if (len !== 0) {\n dispose(disposers);\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n signals = [];\n }\n if (options.fallback) {\n items = [FALLBACK];\n mapped[0] = createRoot(disposer => {\n disposers[0] = disposer;\n return options.fallback();\n });\n len = 1;\n }\n return mapped;\n }\n if (items[0] === FALLBACK) {\n disposers[0]();\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n }\n for (i = 0; i < newLen; i++) {\n if (i < items.length && items[i] !== newItems[i]) {\n signals[i](() => newItems[i]);\n } else if (i >= items.length) {\n mapped[i] = createRoot(mapper);\n }\n }\n for (; i < items.length; i++) {\n disposers[i]();\n }\n len = signals.length = disposers.length = newLen;\n items = newItems.slice(0);\n return mapped = mapped.slice(0, len);\n });\n function mapper(disposer) {\n disposers[i] = disposer;\n const [s, set] = createSignal(newItems[i]);\n signals[i] = set;\n return mapFn(s, i);\n }\n };\n}\n\nlet hydrationEnabled = false;\nfunction enableHydration() {\n hydrationEnabled = true;\n}\nfunction createComponent(Comp, props) {\n if (hydrationEnabled) {\n if (sharedConfig.context) {\n const c = sharedConfig.context;\n setHydrateContext(nextHydrateContext());\n const r = untrack(() => Comp(props || {}));\n setHydrateContext(c);\n return r;\n }\n }\n return untrack(() => Comp(props || {}));\n}\nfunction trueFn() {\n return true;\n}\nconst propTraps = {\n get(_, property, receiver) {\n if (property === $PROXY) return receiver;\n return _.get(property);\n },\n has(_, property) {\n if (property === $PROXY) return true;\n return _.has(property);\n },\n set: trueFn,\n deleteProperty: trueFn,\n getOwnPropertyDescriptor(_, property) {\n return {\n configurable: true,\n enumerable: true,\n get() {\n return _.get(property);\n },\n set: trueFn,\n deleteProperty: trueFn\n };\n },\n ownKeys(_) {\n return _.keys();\n }\n};\nfunction resolveSource(s) {\n return !(s = typeof s === \"function\" ? s() : s) ? {} : s;\n}\nfunction resolveSources() {\n for (let i = 0, length = this.length; i < length; ++i) {\n const v = this[i]();\n if (v !== undefined) return v;\n }\n}\nfunction mergeProps(...sources) {\n let proxy = false;\n for (let i = 0; i < sources.length; i++) {\n const s = sources[i];\n proxy = proxy || !!s && $PROXY in s;\n sources[i] = typeof s === \"function\" ? (proxy = true, createMemo(s)) : s;\n }\n if (SUPPORTS_PROXY && proxy) {\n return new Proxy({\n get(property) {\n for (let i = sources.length - 1; i >= 0; i--) {\n const v = resolveSource(sources[i])[property];\n if (v !== undefined) return v;\n }\n },\n has(property) {\n for (let i = sources.length - 1; i >= 0; i--) {\n if (property in resolveSource(sources[i])) return true;\n }\n return false;\n },\n keys() {\n const keys = [];\n for (let i = 0; i < sources.length; i++) keys.push(...Object.keys(resolveSource(sources[i])));\n return [...new Set(keys)];\n }\n }, propTraps);\n }\n const sourcesMap = {};\n const defined = Object.create(null);\n for (let i = sources.length - 1; i >= 0; i--) {\n const source = sources[i];\n if (!source) continue;\n const sourceKeys = Object.getOwnPropertyNames(source);\n for (let i = sourceKeys.length - 1; i >= 0; i--) {\n const key = sourceKeys[i];\n if (key === \"__proto__\" || key === \"constructor\") continue;\n const desc = Object.getOwnPropertyDescriptor(source, key);\n if (!defined[key]) {\n defined[key] = desc.get ? {\n enumerable: true,\n configurable: true,\n get: resolveSources.bind(sourcesMap[key] = [desc.get.bind(source)])\n } : desc.value !== undefined ? desc : undefined;\n } else {\n const sources = sourcesMap[key];\n if (sources) {\n if (desc.get) sources.push(desc.get.bind(source));else if (desc.value !== undefined) sources.push(() => desc.value);\n }\n }\n }\n }\n const target = {};\n const definedKeys = Object.keys(defined);\n for (let i = definedKeys.length - 1; i >= 0; i--) {\n const key = definedKeys[i],\n desc = defined[key];\n if (desc && desc.get) Object.defineProperty(target, key, desc);else target[key] = desc ? desc.value : undefined;\n }\n return target;\n}\nfunction splitProps(props, ...keys) {\n if (SUPPORTS_PROXY && $PROXY in props) {\n const blocked = new Set(keys.length > 1 ? keys.flat() : keys[0]);\n const res = keys.map(k => {\n return new Proxy({\n get(property) {\n return k.includes(property) ? props[property] : undefined;\n },\n has(property) {\n return k.includes(property) && property in props;\n },\n keys() {\n return k.filter(property => property in props);\n }\n }, propTraps);\n });\n res.push(new Proxy({\n get(property) {\n return blocked.has(property) ? undefined : props[property];\n },\n has(property) {\n return blocked.has(property) ? false : property in props;\n },\n keys() {\n return Object.keys(props).filter(k => !blocked.has(k));\n }\n }, propTraps));\n return res;\n }\n const otherObject = {};\n const objects = keys.map(() => ({}));\n for (const propName of Object.getOwnPropertyNames(props)) {\n const desc = Object.getOwnPropertyDescriptor(props, propName);\n const isDefaultDesc = !desc.get && !desc.set && desc.enumerable && desc.writable && desc.configurable;\n let blocked = false;\n let objectIndex = 0;\n for (const k of keys) {\n if (k.includes(propName)) {\n blocked = true;\n isDefaultDesc ? objects[objectIndex][propName] = desc.value : Object.defineProperty(objects[objectIndex], propName, desc);\n }\n ++objectIndex;\n }\n if (!blocked) {\n isDefaultDesc ? otherObject[propName] = desc.value : Object.defineProperty(otherObject, propName, desc);\n }\n }\n return [...objects, otherObject];\n}\nfunction lazy(fn) {\n let comp;\n let p;\n const wrap = props => {\n const ctx = sharedConfig.context;\n if (ctx) {\n const [s, set] = createSignal();\n sharedConfig.count || (sharedConfig.count = 0);\n sharedConfig.count++;\n (p || (p = fn())).then(mod => {\n !sharedConfig.done && setHydrateContext(ctx);\n sharedConfig.count--;\n set(() => mod.default);\n setHydrateContext();\n });\n comp = s;\n } else if (!comp) {\n const [s] = createResource(() => (p || (p = fn())).then(mod => mod.default));\n comp = s;\n }\n let Comp;\n return createMemo(() => (Comp = comp()) ? untrack(() => {\n if (IS_DEV) ;\n if (!ctx || sharedConfig.done) return Comp(props);\n const c = sharedConfig.context;\n setHydrateContext(ctx);\n const r = Comp(props);\n setHydrateContext(c);\n return r;\n }) : \"\");\n };\n wrap.preload = () => p || ((p = fn()).then(mod => comp = () => mod.default), p);\n return wrap;\n}\nlet counter = 0;\nfunction createUniqueId() {\n const ctx = sharedConfig.context;\n return ctx ? sharedConfig.getNextContextId() : `cl-${counter++}`;\n}\n\nconst narrowedError = name => `Stale read from <${name}>.`;\nfunction For(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(mapArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Index(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(indexArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Show(props) {\n const keyed = props.keyed;\n const conditionValue = createMemo(() => props.when, undefined, undefined);\n const condition = keyed ? conditionValue : createMemo(conditionValue, undefined, {\n equals: (a, b) => !a === !b\n });\n return createMemo(() => {\n const c = condition();\n if (c) {\n const child = props.children;\n const fn = typeof child === \"function\" && child.length > 0;\n return fn ? untrack(() => child(keyed ? c : () => {\n if (!untrack(condition)) throw narrowedError(\"Show\");\n return conditionValue();\n })) : child;\n }\n return props.fallback;\n }, undefined, undefined);\n}\nfunction Switch(props) {\n const chs = children(() => props.children);\n const switchFunc = createMemo(() => {\n const ch = chs();\n const mps = Array.isArray(ch) ? ch : [ch];\n let func = () => undefined;\n for (let i = 0; i < mps.length; i++) {\n const index = i;\n const mp = mps[i];\n const prevFunc = func;\n const conditionValue = createMemo(() => prevFunc() ? undefined : mp.when, undefined, undefined);\n const condition = mp.keyed ? conditionValue : createMemo(conditionValue, undefined, {\n equals: (a, b) => !a === !b\n });\n func = () => prevFunc() || (condition() ? [index, conditionValue, mp] : undefined);\n }\n return func;\n });\n return createMemo(() => {\n const sel = switchFunc()();\n if (!sel) return props.fallback;\n const [index, conditionValue, mp] = sel;\n const child = mp.children;\n const fn = typeof child === \"function\" && child.length > 0;\n return fn ? untrack(() => child(mp.keyed ? conditionValue() : () => {\n if (untrack(switchFunc)()?.[0] !== index) throw narrowedError(\"Match\");\n return conditionValue();\n })) : child;\n }, undefined, undefined);\n}\nfunction Match(props) {\n return props;\n}\nlet Errors;\nfunction resetErrorBoundaries() {\n Errors && [...Errors].forEach(fn => fn());\n}\nfunction ErrorBoundary(props) {\n let err;\n if (sharedConfig.context && sharedConfig.load) err = sharedConfig.load(sharedConfig.getContextId());\n const [errored, setErrored] = createSignal(err, undefined);\n Errors || (Errors = new Set());\n Errors.add(setErrored);\n onCleanup(() => Errors.delete(setErrored));\n return createMemo(() => {\n let e;\n if (e = errored()) {\n const f = props.fallback;\n return typeof f === \"function\" && f.length ? untrack(() => f(e, () => setErrored())) : f;\n }\n return catchError(() => props.children, setErrored);\n }, undefined, undefined);\n}\n\nconst suspenseListEquals = (a, b) => a.showContent === b.showContent && a.showFallback === b.showFallback;\nconst SuspenseListContext = /* #__PURE__ */createContext();\nfunction SuspenseList(props) {\n let [wrapper, setWrapper] = createSignal(() => ({\n inFallback: false\n })),\n show;\n const listContext = useContext(SuspenseListContext);\n const [registry, setRegistry] = createSignal([]);\n if (listContext) {\n show = listContext.register(createMemo(() => wrapper()().inFallback));\n }\n const resolved = createMemo(prev => {\n const reveal = props.revealOrder,\n tail = props.tail,\n {\n showContent = true,\n showFallback = true\n } = show ? show() : {},\n reg = registry(),\n reverse = reveal === \"backwards\";\n if (reveal === \"together\") {\n const all = reg.every(inFallback => !inFallback());\n const res = reg.map(() => ({\n showContent: all && showContent,\n showFallback\n }));\n res.inFallback = !all;\n return res;\n }\n let stop = false;\n let inFallback = prev.inFallback;\n const res = [];\n for (let i = 0, len = reg.length; i < len; i++) {\n const n = reverse ? len - i - 1 : i,\n s = reg[n]();\n if (!stop && !s) {\n res[n] = {\n showContent,\n showFallback\n };\n } else {\n const next = !stop;\n if (next) inFallback = true;\n res[n] = {\n showContent: next,\n showFallback: !tail || next && tail === \"collapsed\" ? showFallback : false\n };\n stop = true;\n }\n }\n if (!stop) inFallback = false;\n res.inFallback = inFallback;\n return res;\n }, {\n inFallback: false\n });\n setWrapper(() => resolved);\n return createComponent(SuspenseListContext.Provider, {\n value: {\n register: inFallback => {\n let index;\n setRegistry(registry => {\n index = registry.length;\n return [...registry, inFallback];\n });\n return createMemo(() => resolved()[index], undefined, {\n equals: suspenseListEquals\n });\n }\n },\n get children() {\n return props.children;\n }\n });\n}\nfunction Suspense(props) {\n let counter = 0,\n show,\n ctx,\n p,\n flicker,\n error;\n const [inFallback, setFallback] = createSignal(false),\n SuspenseContext = getSuspenseContext(),\n store = {\n increment: () => {\n if (++counter === 1) setFallback(true);\n },\n decrement: () => {\n if (--counter === 0) setFallback(false);\n },\n inFallback,\n effects: [],\n resolved: false\n },\n owner = getOwner();\n if (sharedConfig.context && sharedConfig.load) {\n const key = sharedConfig.getContextId();\n let ref = sharedConfig.load(key);\n if (ref) {\n if (typeof ref !== \"object\" || ref.s !== 1) p = ref;else sharedConfig.gather(key);\n }\n if (p && p !== \"$$f\") {\n const [s, set] = createSignal(undefined, {\n equals: false\n });\n flicker = s;\n p.then(() => {\n if (sharedConfig.done) return set();\n sharedConfig.gather(key);\n setHydrateContext(ctx);\n set();\n setHydrateContext();\n }, err => {\n error = err;\n set();\n });\n }\n }\n const listContext = useContext(SuspenseListContext);\n if (listContext) show = listContext.register(store.inFallback);\n let dispose;\n onCleanup(() => dispose && dispose());\n return createComponent(SuspenseContext.Provider, {\n value: store,\n get children() {\n return createMemo(() => {\n if (error) throw error;\n ctx = sharedConfig.context;\n if (flicker) {\n flicker();\n return flicker = undefined;\n }\n if (ctx && p === \"$$f\") setHydrateContext();\n const rendered = createMemo(() => props.children);\n return createMemo(prev => {\n const inFallback = store.inFallback(),\n {\n showContent = true,\n showFallback = true\n } = show ? show() : {};\n if ((!inFallback || p && p !== \"$$f\") && showContent) {\n store.resolved = true;\n dispose && dispose();\n dispose = ctx = p = undefined;\n resumeEffects(store.effects);\n return rendered();\n }\n if (!showFallback) return;\n if (dispose) return prev;\n return createRoot(disposer => {\n dispose = disposer;\n if (ctx) {\n setHydrateContext({\n id: ctx.id + \"F\",\n count: 0\n });\n ctx = undefined;\n }\n return props.fallback;\n }, owner);\n });\n });\n }\n });\n}\n\nconst DEV = undefined;\n\nexport { $DEVCOMP, $PROXY, $TRACK, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, batch, cancelCallback, catchError, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createReaction, createRenderEffect, createResource, createRoot, createSelector, createSignal, createUniqueId, enableExternalSource, enableHydration, enableScheduling, equalFn, from, getListener, getOwner, indexArray, lazy, mapArray, mergeProps, observable, on, onCleanup, onError, onMount, requestCallback, resetErrorBoundaries, runWithOwner, sharedConfig, splitProps, startTransition, untrack, useContext, useTransition };\n","import { createMemo, createRoot, createRenderEffect, untrack, sharedConfig, enableHydration, getOwner, createEffect, runWithOwner, createSignal, onCleanup, splitProps } from 'solid-js';\nexport { ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, createComponent, createRenderEffect as effect, getOwner, mergeProps, untrack } from 'solid-js';\n\nconst booleans = [\"allowfullscreen\", \"async\", \"alpha\",\n\"autofocus\",\n\"autoplay\", \"checked\", \"controls\", \"default\", \"disabled\", \"formnovalidate\", \"hidden\",\n\"indeterminate\", \"inert\",\n\"ismap\", \"loop\", \"multiple\", \"muted\", \"nomodule\", \"novalidate\", \"open\", \"playsinline\", \"readonly\", \"required\", \"reversed\", \"seamless\",\n\"selected\", \"adauctionheaders\",\n\"browsingtopics\",\n\"credentialless\",\n\"defaultchecked\", \"defaultmuted\", \"defaultselected\", \"defer\", \"disablepictureinpicture\", \"disableremoteplayback\", \"preservespitch\",\n\"shadowrootclonable\", \"shadowrootcustomelementregistry\",\n\"shadowrootdelegatesfocus\", \"shadowrootserializable\",\n\"sharedstoragewritable\"\n];\nconst Properties = /*#__PURE__*/new Set([\n\"className\", \"value\",\n\"readOnly\", \"noValidate\", \"formNoValidate\", \"isMap\", \"noModule\", \"playsInline\", \"adAuctionHeaders\",\n\"allowFullscreen\", \"browsingTopics\",\n\"defaultChecked\", \"defaultMuted\", \"defaultSelected\", \"disablePictureInPicture\", \"disableRemotePlayback\", \"preservesPitch\", \"shadowRootClonable\", \"shadowRootCustomElementRegistry\",\n\"shadowRootDelegatesFocus\", \"shadowRootSerializable\",\n\"sharedStorageWritable\",\n...booleans]);\nconst ChildProperties = /*#__PURE__*/new Set([\"innerHTML\", \"textContent\", \"innerText\", \"children\"]);\nconst Aliases = /*#__PURE__*/Object.assign(Object.create(null), {\n className: \"class\",\n htmlFor: \"for\"\n});\nconst PropAliases = /*#__PURE__*/Object.assign(Object.create(null), {\n class: \"className\",\n novalidate: {\n $: \"noValidate\",\n FORM: 1\n },\n formnovalidate: {\n $: \"formNoValidate\",\n BUTTON: 1,\n INPUT: 1\n },\n ismap: {\n $: \"isMap\",\n IMG: 1\n },\n nomodule: {\n $: \"noModule\",\n SCRIPT: 1\n },\n playsinline: {\n $: \"playsInline\",\n VIDEO: 1\n },\n readonly: {\n $: \"readOnly\",\n INPUT: 1,\n TEXTAREA: 1\n },\n adauctionheaders: {\n $: \"adAuctionHeaders\",\n IFRAME: 1\n },\n allowfullscreen: {\n $: \"allowFullscreen\",\n IFRAME: 1\n },\n browsingtopics: {\n $: \"browsingTopics\",\n IMG: 1\n },\n defaultchecked: {\n $: \"defaultChecked\",\n INPUT: 1\n },\n defaultmuted: {\n $: \"defaultMuted\",\n AUDIO: 1,\n VIDEO: 1\n },\n defaultselected: {\n $: \"defaultSelected\",\n OPTION: 1\n },\n disablepictureinpicture: {\n $: \"disablePictureInPicture\",\n VIDEO: 1\n },\n disableremoteplayback: {\n $: \"disableRemotePlayback\",\n AUDIO: 1,\n VIDEO: 1\n },\n preservespitch: {\n $: \"preservesPitch\",\n AUDIO: 1,\n VIDEO: 1\n },\n shadowrootclonable: {\n $: \"shadowRootClonable\",\n TEMPLATE: 1\n },\n shadowrootdelegatesfocus: {\n $: \"shadowRootDelegatesFocus\",\n TEMPLATE: 1\n },\n shadowrootserializable: {\n $: \"shadowRootSerializable\",\n TEMPLATE: 1\n },\n sharedstoragewritable: {\n $: \"sharedStorageWritable\",\n IFRAME: 1,\n IMG: 1\n }\n});\nfunction getPropAlias(prop, tagName) {\n const a = PropAliases[prop];\n return typeof a === \"object\" ? a[tagName] ? a[\"$\"] : undefined : a;\n}\nconst DelegatedEvents = /*#__PURE__*/new Set([\"beforeinput\", \"click\", \"dblclick\", \"contextmenu\", \"focusin\", \"focusout\", \"input\", \"keydown\", \"keyup\", \"mousedown\", \"mousemove\", \"mouseout\", \"mouseover\", \"mouseup\", \"pointerdown\", \"pointermove\", \"pointerout\", \"pointerover\", \"pointerup\", \"touchend\", \"touchmove\", \"touchstart\"]);\nconst SVGElements = /*#__PURE__*/new Set([\n\"altGlyph\", \"altGlyphDef\", \"altGlyphItem\", \"animate\", \"animateColor\", \"animateMotion\", \"animateTransform\", \"circle\", \"clipPath\", \"color-profile\", \"cursor\", \"defs\", \"desc\", \"ellipse\", \"feBlend\", \"feColorMatrix\", \"feComponentTransfer\", \"feComposite\", \"feConvolveMatrix\", \"feDiffuseLighting\", \"feDisplacementMap\", \"feDistantLight\", \"feDropShadow\", \"feFlood\", \"feFuncA\", \"feFuncB\", \"feFuncG\", \"feFuncR\", \"feGaussianBlur\", \"feImage\", \"feMerge\", \"feMergeNode\", \"feMorphology\", \"feOffset\", \"fePointLight\", \"feSpecularLighting\", \"feSpotLight\", \"feTile\", \"feTurbulence\", \"filter\", \"font\", \"font-face\", \"font-face-format\", \"font-face-name\", \"font-face-src\", \"font-face-uri\", \"foreignObject\", \"g\", \"glyph\", \"glyphRef\", \"hkern\", \"image\", \"line\", \"linearGradient\", \"marker\", \"mask\", \"metadata\", \"missing-glyph\", \"mpath\", \"path\", \"pattern\", \"polygon\", \"polyline\", \"radialGradient\", \"rect\",\n\"set\", \"stop\",\n\"svg\", \"switch\", \"symbol\", \"text\", \"textPath\",\n\"tref\", \"tspan\", \"use\", \"view\", \"vkern\"]);\nconst SVGNamespace = {\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\"\n};\nconst DOMElements = /*#__PURE__*/new Set([\"html\", \"base\", \"head\", \"link\", \"meta\", \"style\", \"title\", \"body\", \"address\", \"article\", \"aside\", \"footer\", \"header\", \"main\", \"nav\", \"section\", \"body\", \"blockquote\", \"dd\", \"div\", \"dl\", \"dt\", \"figcaption\", \"figure\", \"hr\", \"li\", \"ol\", \"p\", \"pre\", \"ul\", \"a\", \"abbr\", \"b\", \"bdi\", \"bdo\", \"br\", \"cite\", \"code\", \"data\", \"dfn\", \"em\", \"i\", \"kbd\", \"mark\", \"q\", \"rp\", \"rt\", \"ruby\", \"s\", \"samp\", \"small\", \"span\", \"strong\", \"sub\", \"sup\", \"time\", \"u\", \"var\", \"wbr\", \"area\", \"audio\", \"img\", \"map\", \"track\", \"video\", \"embed\", \"iframe\", \"object\", \"param\", \"picture\", \"portal\", \"source\", \"svg\", \"math\", \"canvas\", \"noscript\", \"script\", \"del\", \"ins\", \"caption\", \"col\", \"colgroup\", \"table\", \"tbody\", \"td\", \"tfoot\", \"th\", \"thead\", \"tr\", \"button\", \"datalist\", \"fieldset\", \"form\", \"input\", \"label\", \"legend\", \"meter\", \"optgroup\", \"option\", \"output\", \"progress\", \"select\", \"textarea\", \"details\", \"dialog\", \"menu\", \"summary\", \"details\", \"slot\", \"template\", \"acronym\", \"applet\", \"basefont\", \"bgsound\", \"big\", \"blink\", \"center\", \"content\", \"dir\", \"font\", \"frame\", \"frameset\", \"hgroup\", \"image\", \"keygen\", \"marquee\", \"menuitem\", \"nobr\", \"noembed\", \"noframes\", \"plaintext\", \"rb\", \"rtc\", \"shadow\", \"spacer\", \"strike\", \"tt\", \"xmp\", \"a\", \"abbr\", \"acronym\", \"address\", \"applet\", \"area\", \"article\", \"aside\", \"audio\", \"b\", \"base\", \"basefont\", \"bdi\", \"bdo\", \"bgsound\", \"big\", \"blink\", \"blockquote\", \"body\", \"br\", \"button\", \"canvas\", \"caption\", \"center\", \"cite\", \"code\", \"col\", \"colgroup\", \"content\", \"data\", \"datalist\", \"dd\", \"del\", \"details\", \"dfn\", \"dialog\", \"dir\", \"div\", \"dl\", \"dt\", \"em\", \"embed\", \"fieldset\", \"figcaption\", \"figure\", \"font\", \"footer\", \"form\", \"frame\", \"frameset\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\", \"i\", \"iframe\", \"image\", \"img\", \"input\", \"ins\", \"kbd\", \"keygen\", \"label\", \"legend\", \"li\", \"link\", \"main\", \"map\", \"mark\", \"marquee\", \"menu\", \"menuitem\", \"meta\", \"meter\", \"nav\", \"nobr\", \"noembed\", \"noframes\", \"noscript\", \"object\", \"ol\", \"optgroup\", \"option\", \"output\", \"p\", \"param\", \"picture\", \"plaintext\", \"portal\", \"pre\", \"progress\", \"q\", \"rb\", \"rp\", \"rt\", \"rtc\", \"ruby\", \"s\", \"samp\", \"script\", \"section\", \"select\", \"shadow\", \"slot\", \"small\", \"source\", \"spacer\", \"span\", \"strike\", \"strong\", \"style\", \"sub\", \"summary\", \"sup\", \"table\", \"tbody\", \"td\", \"template\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"time\", \"title\", \"tr\", \"track\", \"tt\", \"u\", \"ul\", \"var\", \"video\", \"wbr\", \"xmp\", \"input\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n\"webview\",\n\"isindex\", \"listing\", \"multicol\", \"nextid\", \"noindex\", \"search\"]);\n\nconst memo = fn => createMemo(() => fn());\n\nfunction reconcileArrays(parentNode, a, b) {\n let bLength = b.length,\n aEnd = a.length,\n bEnd = bLength,\n aStart = 0,\n bStart = 0,\n after = a[aEnd - 1].nextSibling,\n map = null;\n while (aStart < aEnd || bStart < bEnd) {\n if (a[aStart] === b[bStart]) {\n aStart++;\n bStart++;\n continue;\n }\n while (a[aEnd - 1] === b[bEnd - 1]) {\n aEnd--;\n bEnd--;\n }\n if (aEnd === aStart) {\n const node = bEnd < bLength ? bStart ? b[bStart - 1].nextSibling : b[bEnd - bStart] : after;\n while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node);\n } else if (bEnd === bStart) {\n while (aStart < aEnd) {\n if (!map || !map.has(a[aStart])) a[aStart].remove();\n aStart++;\n }\n } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {\n const node = a[--aEnd].nextSibling;\n parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling);\n parentNode.insertBefore(b[--bEnd], node);\n a[aEnd] = b[bEnd];\n } else {\n if (!map) {\n map = new Map();\n let i = bStart;\n while (i < bEnd) map.set(b[i], i++);\n }\n const index = map.get(a[aStart]);\n if (index != null) {\n if (bStart < index && index < bEnd) {\n let i = aStart,\n sequence = 1,\n t;\n while (++i < aEnd && i < bEnd) {\n if ((t = map.get(a[i])) == null || t !== index + sequence) break;\n sequence++;\n }\n if (sequence > index - bStart) {\n const node = a[aStart];\n while (bStart < index) parentNode.insertBefore(b[bStart++], node);\n } else parentNode.replaceChild(b[bStart++], a[aStart++]);\n } else aStart++;\n } else a[aStart++].remove();\n }\n }\n}\n\nconst $$EVENTS = \"_$DX_DELEGATE\";\nfunction render(code, element, init, options = {}) {\n let disposer;\n createRoot(dispose => {\n disposer = dispose;\n element === document ? code() : insert(element, code(), element.firstChild ? null : undefined, init);\n }, options.owner);\n return () => {\n disposer();\n element.textContent = \"\";\n };\n}\nfunction template(html, isImportNode, isSVG, isMathML) {\n let node;\n const create = () => {\n const t = isMathML ? document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"template\") : document.createElement(\"template\");\n t.innerHTML = html;\n return isSVG ? t.content.firstChild.firstChild : isMathML ? t.firstChild : t.content.firstChild;\n };\n const fn = isImportNode ? () => untrack(() => document.importNode(node || (node = create()), true)) : () => (node || (node = create())).cloneNode(true);\n fn.cloneNode = fn;\n return fn;\n}\nfunction delegateEvents(eventNames, document = window.document) {\n const e = document[$$EVENTS] || (document[$$EVENTS] = new Set());\n for (let i = 0, l = eventNames.length; i < l; i++) {\n const name = eventNames[i];\n if (!e.has(name)) {\n e.add(name);\n document.addEventListener(name, eventHandler);\n }\n }\n}\nfunction clearDelegatedEvents(document = window.document) {\n if (document[$$EVENTS]) {\n for (let name of document[$$EVENTS].keys()) document.removeEventListener(name, eventHandler);\n delete document[$$EVENTS];\n }\n}\nfunction setProperty(node, name, value) {\n if (isHydrating(node)) return;\n node[name] = value;\n}\nfunction setAttribute(node, name, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttribute(name);else node.setAttribute(name, value);\n}\nfunction setAttributeNS(node, namespace, name, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttributeNS(namespace, name);else node.setAttributeNS(namespace, name, value);\n}\nfunction setBoolAttribute(node, name, value) {\n if (isHydrating(node)) return;\n value ? node.setAttribute(name, \"\") : node.removeAttribute(name);\n}\nfunction className(node, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttribute(\"class\");else node.className = value;\n}\nfunction addEventListener(node, name, handler, delegate) {\n if (delegate) {\n if (Array.isArray(handler)) {\n node[`$$${name}`] = handler[0];\n node[`$$${name}Data`] = handler[1];\n } else node[`$$${name}`] = handler;\n } else if (Array.isArray(handler)) {\n const handlerFn = handler[0];\n node.addEventListener(name, handler[0] = e => handlerFn.call(node, handler[1], e));\n } else node.addEventListener(name, handler, typeof handler !== \"function\" && handler);\n}\nfunction classList(node, value, prev = {}) {\n const classKeys = Object.keys(value || {}),\n prevKeys = Object.keys(prev);\n let i, len;\n for (i = 0, len = prevKeys.length; i < len; i++) {\n const key = prevKeys[i];\n if (!key || key === \"undefined\" || value[key]) continue;\n toggleClassKey(node, key, false);\n delete prev[key];\n }\n for (i = 0, len = classKeys.length; i < len; i++) {\n const key = classKeys[i],\n classValue = !!value[key];\n if (!key || key === \"undefined\" || prev[key] === classValue || !classValue) continue;\n toggleClassKey(node, key, true);\n prev[key] = classValue;\n }\n return prev;\n}\nfunction style(node, value, prev) {\n if (!value) return prev ? setAttribute(node, \"style\") : value;\n const nodeStyle = node.style;\n if (typeof value === \"string\") return nodeStyle.cssText = value;\n typeof prev === \"string\" && (nodeStyle.cssText = prev = undefined);\n prev || (prev = {});\n value || (value = {});\n let v, s;\n for (s in prev) {\n value[s] == null && nodeStyle.removeProperty(s);\n delete prev[s];\n }\n for (s in value) {\n v = value[s];\n if (v !== prev[s]) {\n nodeStyle.setProperty(s, v);\n prev[s] = v;\n }\n }\n return prev;\n}\nfunction setStyleProperty(node, name, value) {\n value != null ? node.style.setProperty(name, value) : node.style.removeProperty(name);\n}\nfunction spread(node, props = {}, isSVG, skipChildren) {\n const prevProps = {};\n if (!skipChildren) {\n createRenderEffect(() => prevProps.children = insertExpression(node, props.children, prevProps.children));\n }\n createRenderEffect(() => typeof props.ref === \"function\" && use(props.ref, node));\n createRenderEffect(() => assign(node, props, isSVG, true, prevProps, true));\n return prevProps;\n}\nfunction dynamicProperty(props, key) {\n const src = props[key];\n Object.defineProperty(props, key, {\n get() {\n return src();\n },\n enumerable: true\n });\n return props;\n}\nfunction use(fn, element, arg) {\n return untrack(() => fn(element, arg));\n}\nfunction insert(parent, accessor, marker, initial) {\n if (marker !== undefined && !initial) initial = [];\n if (typeof accessor !== \"function\") return insertExpression(parent, accessor, initial, marker);\n createRenderEffect(current => insertExpression(parent, accessor(), current, marker), initial);\n}\nfunction assign(node, props, isSVG, skipChildren, prevProps = {}, skipRef = false) {\n props || (props = {});\n for (const prop in prevProps) {\n if (!(prop in props)) {\n if (prop === \"children\") continue;\n prevProps[prop] = assignProp(node, prop, null, prevProps[prop], isSVG, skipRef, props);\n }\n }\n for (const prop in props) {\n if (prop === \"children\") {\n if (!skipChildren) insertExpression(node, props.children);\n continue;\n }\n const value = props[prop];\n prevProps[prop] = assignProp(node, prop, value, prevProps[prop], isSVG, skipRef, props);\n }\n}\nfunction hydrate$1(code, element, options = {}) {\n if (globalThis._$HY.done) return render(code, element, [...element.childNodes], options);\n sharedConfig.completed = globalThis._$HY.completed;\n sharedConfig.events = globalThis._$HY.events;\n sharedConfig.load = id => globalThis._$HY.r[id];\n sharedConfig.has = id => id in globalThis._$HY.r;\n sharedConfig.gather = root => gatherHydratable(element, root);\n sharedConfig.registry = new Map();\n sharedConfig.context = {\n id: options.renderId || \"\",\n count: 0\n };\n try {\n gatherHydratable(element, options.renderId);\n return render(code, element, [...element.childNodes], options);\n } finally {\n sharedConfig.context = null;\n }\n}\nfunction getNextElement(template) {\n let node,\n key,\n hydrating = isHydrating();\n if (!hydrating || !(node = sharedConfig.registry.get(key = getHydrationKey()))) {\n return template();\n }\n if (sharedConfig.completed) sharedConfig.completed.add(node);\n sharedConfig.registry.delete(key);\n return node;\n}\nfunction getNextMatch(el, nodeName) {\n while (el && el.localName !== nodeName) el = el.nextSibling;\n return el;\n}\nfunction getNextMarker(start) {\n let end = start,\n count = 0,\n current = [];\n if (isHydrating(start)) {\n while (end) {\n if (end.nodeType === 8) {\n const v = end.nodeValue;\n if (v === \"$\") count++;else if (v === \"/\") {\n if (count === 0) return [end, current];\n count--;\n }\n }\n current.push(end);\n end = end.nextSibling;\n }\n }\n return [end, current];\n}\nfunction runHydrationEvents() {\n if (sharedConfig.events && !sharedConfig.events.queued) {\n queueMicrotask(() => {\n const {\n completed,\n events\n } = sharedConfig;\n if (!events) return;\n events.queued = false;\n while (events.length) {\n const [el, e] = events[0];\n if (!completed.has(el)) return;\n events.shift();\n eventHandler(e);\n }\n if (sharedConfig.done) {\n sharedConfig.events = _$HY.events = null;\n sharedConfig.completed = _$HY.completed = null;\n }\n });\n sharedConfig.events.queued = true;\n }\n}\nfunction isHydrating(node) {\n return !!sharedConfig.context && !sharedConfig.done && (!node || node.isConnected);\n}\nfunction toPropertyName(name) {\n return name.toLowerCase().replace(/-([a-z])/g, (_, w) => w.toUpperCase());\n}\nfunction toggleClassKey(node, key, value) {\n const classNames = key.trim().split(/\\s+/);\n for (let i = 0, nameLen = classNames.length; i < nameLen; i++) node.classList.toggle(classNames[i], value);\n}\nfunction assignProp(node, prop, value, prev, isSVG, skipRef, props) {\n let isCE, isProp, isChildProp, propAlias, forceProp;\n if (prop === \"style\") return style(node, value, prev);\n if (prop === \"classList\") return classList(node, value, prev);\n if (value === prev) return prev;\n if (prop === \"ref\") {\n if (!skipRef) value(node);\n } else if (prop.slice(0, 3) === \"on:\") {\n const e = prop.slice(3);\n prev && node.removeEventListener(e, prev, typeof prev !== \"function\" && prev);\n value && node.addEventListener(e, value, typeof value !== \"function\" && value);\n } else if (prop.slice(0, 10) === \"oncapture:\") {\n const e = prop.slice(10);\n prev && node.removeEventListener(e, prev, true);\n value && node.addEventListener(e, value, true);\n } else if (prop.slice(0, 2) === \"on\") {\n const name = prop.slice(2).toLowerCase();\n const delegate = DelegatedEvents.has(name);\n if (!delegate && prev) {\n const h = Array.isArray(prev) ? prev[0] : prev;\n node.removeEventListener(name, h);\n }\n if (delegate || value) {\n addEventListener(node, name, value, delegate);\n delegate && delegateEvents([name]);\n }\n } else if (prop.slice(0, 5) === \"attr:\") {\n setAttribute(node, prop.slice(5), value);\n } else if (prop.slice(0, 5) === \"bool:\") {\n setBoolAttribute(node, prop.slice(5), value);\n } else if ((forceProp = prop.slice(0, 5) === \"prop:\") || (isChildProp = ChildProperties.has(prop)) || !isSVG && ((propAlias = getPropAlias(prop, node.tagName)) || (isProp = Properties.has(prop))) || (isCE = node.nodeName.includes(\"-\") || \"is\" in props)) {\n if (forceProp) {\n prop = prop.slice(5);\n isProp = true;\n } else if (isHydrating(node)) return value;\n if (prop === \"class\" || prop === \"className\") className(node, value);else if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value;else node[propAlias || prop] = value;\n } else {\n const ns = isSVG && prop.indexOf(\":\") > -1 && SVGNamespace[prop.split(\":\")[0]];\n if (ns) setAttributeNS(node, ns, prop, value);else setAttribute(node, Aliases[prop] || prop, value);\n }\n return value;\n}\nfunction eventHandler(e) {\n if (sharedConfig.registry && sharedConfig.events) {\n if (sharedConfig.events.find(([el, ev]) => ev === e)) return;\n }\n let node = e.target;\n const key = `$$${e.type}`;\n const oriTarget = e.target;\n const oriCurrentTarget = e.currentTarget;\n const retarget = value => Object.defineProperty(e, \"target\", {\n configurable: true,\n value\n });\n const handleNode = () => {\n const handler = node[key];\n if (handler && !node.disabled) {\n const data = node[`${key}Data`];\n data !== undefined ? handler.call(node, data, e) : handler.call(node, e);\n if (e.cancelBubble) return;\n }\n node.host && typeof node.host !== \"string\" && !node.host._$host && node.contains(e.target) && retarget(node.host);\n return true;\n };\n const walkUpTree = () => {\n while (handleNode() && (node = node._$host || node.parentNode || node.host));\n };\n Object.defineProperty(e, \"currentTarget\", {\n configurable: true,\n get() {\n return node || document;\n }\n });\n if (sharedConfig.registry && !sharedConfig.done) sharedConfig.done = _$HY.done = true;\n if (e.composedPath) {\n const path = e.composedPath();\n retarget(path[0]);\n for (let i = 0; i < path.length - 2; i++) {\n node = path[i];\n if (!handleNode()) break;\n if (node._$host) {\n node = node._$host;\n walkUpTree();\n break;\n }\n if (node.parentNode === oriCurrentTarget) {\n break;\n }\n }\n }\n else walkUpTree();\n retarget(oriTarget);\n}\nfunction insertExpression(parent, value, current, marker, unwrapArray) {\n const hydrating = isHydrating(parent);\n if (hydrating) {\n !current && (current = [...parent.childNodes]);\n let cleaned = [];\n for (let i = 0; i < current.length; i++) {\n const node = current[i];\n if (node.nodeType === 8 && node.data.slice(0, 2) === \"!$\") node.remove();else cleaned.push(node);\n }\n current = cleaned;\n }\n while (typeof current === \"function\") current = current();\n if (value === current) return current;\n const t = typeof value,\n multi = marker !== undefined;\n parent = multi && current[0] && current[0].parentNode || parent;\n if (t === \"string\" || t === \"number\") {\n if (hydrating) return current;\n if (t === \"number\") {\n value = value.toString();\n if (value === current) return current;\n }\n if (multi) {\n let node = current[0];\n if (node && node.nodeType === 3) {\n node.data !== value && (node.data = value);\n } else node = document.createTextNode(value);\n current = cleanChildren(parent, current, marker, node);\n } else {\n if (current !== \"\" && typeof current === \"string\") {\n current = parent.firstChild.data = value;\n } else current = parent.textContent = value;\n }\n } else if (value == null || t === \"boolean\") {\n if (hydrating) return current;\n current = cleanChildren(parent, current, marker);\n } else if (t === \"function\") {\n createRenderEffect(() => {\n let v = value();\n while (typeof v === \"function\") v = v();\n current = insertExpression(parent, v, current, marker);\n });\n return () => current;\n } else if (Array.isArray(value)) {\n const array = [];\n const currentArray = current && Array.isArray(current);\n if (normalizeIncomingArray(array, value, current, unwrapArray)) {\n createRenderEffect(() => current = insertExpression(parent, array, current, marker, true));\n return () => current;\n }\n if (hydrating) {\n if (!array.length) return current;\n if (marker === undefined) return current = [...parent.childNodes];\n let node = array[0];\n if (node.parentNode !== parent) return current;\n const nodes = [node];\n while ((node = node.nextSibling) !== marker) nodes.push(node);\n return current = nodes;\n }\n if (array.length === 0) {\n current = cleanChildren(parent, current, marker);\n if (multi) return current;\n } else if (currentArray) {\n if (current.length === 0) {\n appendNodes(parent, array, marker);\n } else reconcileArrays(parent, current, array);\n } else {\n current && cleanChildren(parent);\n appendNodes(parent, array);\n }\n current = array;\n } else if (value.nodeType) {\n if (hydrating && value.parentNode) return current = multi ? [value] : value;\n if (Array.isArray(current)) {\n if (multi) return current = cleanChildren(parent, current, marker, value);\n cleanChildren(parent, current, null, value);\n } else if (current == null || current === \"\" || !parent.firstChild) {\n parent.appendChild(value);\n } else parent.replaceChild(value, parent.firstChild);\n current = value;\n } else ;\n return current;\n}\nfunction normalizeIncomingArray(normalized, array, current, unwrap) {\n let dynamic = false;\n for (let i = 0, len = array.length; i < len; i++) {\n let item = array[i],\n prev = current && current[normalized.length],\n t;\n if (item == null || item === true || item === false) ; else if ((t = typeof item) === \"object\" && item.nodeType) {\n normalized.push(item);\n } else if (Array.isArray(item)) {\n dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic;\n } else if (t === \"function\") {\n if (unwrap) {\n while (typeof item === \"function\") item = item();\n dynamic = normalizeIncomingArray(normalized, Array.isArray(item) ? item : [item], Array.isArray(prev) ? prev : [prev]) || dynamic;\n } else {\n normalized.push(item);\n dynamic = true;\n }\n } else {\n const value = String(item);\n if (prev && prev.nodeType === 3 && prev.data === value) normalized.push(prev);else normalized.push(document.createTextNode(value));\n }\n }\n return dynamic;\n}\nfunction appendNodes(parent, array, marker = null) {\n for (let i = 0, len = array.length; i < len; i++) parent.insertBefore(array[i], marker);\n}\nfunction cleanChildren(parent, current, marker, replacement) {\n if (marker === undefined) return parent.textContent = \"\";\n const node = replacement || document.createTextNode(\"\");\n if (current.length) {\n let inserted = false;\n for (let i = current.length - 1; i >= 0; i--) {\n const el = current[i];\n if (node !== el) {\n const isParent = el.parentNode === parent;\n if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && el.remove();\n } else inserted = true;\n }\n } else parent.insertBefore(node, marker);\n return [node];\n}\nfunction gatherHydratable(element, root) {\n const templates = element.querySelectorAll(`*[data-hk]`);\n for (let i = 0; i < templates.length; i++) {\n const node = templates[i];\n const key = node.getAttribute(\"data-hk\");\n if ((!root || key.startsWith(root)) && !sharedConfig.registry.has(key)) sharedConfig.registry.set(key, node);\n }\n}\nfunction getHydrationKey() {\n return sharedConfig.getNextContextId();\n}\nfunction NoHydration(props) {\n return sharedConfig.context ? undefined : props.children;\n}\nfunction Hydration(props) {\n return props.children;\n}\nconst voidFn = () => undefined;\nconst RequestContext = Symbol();\nfunction innerHTML(parent, content) {\n !sharedConfig.context && (parent.innerHTML = content);\n}\n\nfunction throwInBrowser(func) {\n const err = new Error(`${func.name} is not supported in the browser, returning undefined`);\n console.error(err);\n}\nfunction renderToString(fn, options) {\n throwInBrowser(renderToString);\n}\nfunction renderToStringAsync(fn, options) {\n throwInBrowser(renderToStringAsync);\n}\nfunction renderToStream(fn, options) {\n throwInBrowser(renderToStream);\n}\nfunction ssr(template, ...nodes) {}\nfunction ssrElement(name, props, children, needsId) {}\nfunction ssrClassList(value) {}\nfunction ssrStyle(value) {}\nfunction ssrAttribute(key, value) {}\nfunction ssrHydrationKey() {}\nfunction resolveSSRNode(node) {}\nfunction escape(html) {}\nfunction ssrSpread(props, isSVG, skipChildren) {}\n\nconst isServer = false;\nconst isDev = false;\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\nfunction createElement(tagName, isSVG = false, is = undefined) {\n return isSVG ? document.createElementNS(SVG_NAMESPACE, tagName) : document.createElement(tagName, {\n is\n });\n}\nconst hydrate = (...args) => {\n enableHydration();\n return hydrate$1(...args);\n};\nfunction Portal(props) {\n const {\n useShadow\n } = props,\n marker = document.createTextNode(\"\"),\n mount = () => props.mount || document.body,\n owner = getOwner();\n let content;\n let hydrating = !!sharedConfig.context;\n createEffect(() => {\n if (hydrating) getOwner().user = hydrating = false;\n content || (content = runWithOwner(owner, () => createMemo(() => props.children)));\n const el = mount();\n if (el instanceof HTMLHeadElement) {\n const [clean, setClean] = createSignal(false);\n const cleanup = () => setClean(true);\n createRoot(dispose => insert(el, () => !clean() ? content() : dispose(), null));\n onCleanup(cleanup);\n } else {\n const container = createElement(props.isSVG ? \"g\" : \"div\", props.isSVG),\n renderRoot = useShadow && container.attachShadow ? container.attachShadow({\n mode: \"open\"\n }) : container;\n Object.defineProperty(container, \"_$host\", {\n get() {\n return marker.parentNode;\n },\n configurable: true\n });\n insert(renderRoot, content);\n el.appendChild(container);\n props.ref && props.ref(container);\n onCleanup(() => el.removeChild(container));\n }\n }, undefined, {\n render: !hydrating\n });\n return marker;\n}\nfunction createDynamic(component, props) {\n const cached = createMemo(component);\n return createMemo(() => {\n const component = cached();\n switch (typeof component) {\n case \"function\":\n return untrack(() => component(props));\n case \"string\":\n const isSvg = SVGElements.has(component);\n const el = sharedConfig.context ? getNextElement() : createElement(component, isSvg, untrack(() => props.is));\n spread(el, props, isSvg);\n return el;\n }\n });\n}\nfunction Dynamic(props) {\n const [, others] = splitProps(props, [\"component\"]);\n return createDynamic(() => props.component, others);\n}\n\nexport { Aliases, voidFn as Assets, ChildProperties, DOMElements, DelegatedEvents, Dynamic, Hydration, voidFn as HydrationScript, NoHydration, Portal, Properties, RequestContext, SVGElements, SVGNamespace, addEventListener, assign, classList, className, clearDelegatedEvents, createDynamic, delegateEvents, dynamicProperty, escape, voidFn as generateHydrationScript, voidFn as getAssets, getHydrationKey, getNextElement, getNextMarker, getNextMatch, getPropAlias, voidFn as getRequestEvent, hydrate, innerHTML, insert, isDev, isServer, memo, render, renderToStream, renderToString, renderToStringAsync, resolveSSRNode, runHydrationEvents, setAttribute, setAttributeNS, setBoolAttribute, setProperty, setStyleProperty, spread, ssr, ssrAttribute, ssrClassList, ssrElement, ssrHydrationKey, ssrSpread, ssrStyle, style, template, use, voidFn as useAssets };\n","export default \"data:image/svg+xml,%3csvg%20width='44'%20height='40'%20viewBox='0%200%2044%2040'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M36.4826%2032.6733C35.865%2033.1908%2035.1941%2033.6282%2034.4904%2033.957L33.74%2034.2621L29.7612%2035.8775C27.1272%2036.125%2024.4866%2036.253%2021.8465%2036.2542C21.235%2036.2549%2020.6236%2036.2482%2020.0127%2036.2348V33.2478L36.4826%2032.6733Z'%20fill='%239EACBA'/%3e%3cpath%20d='M0.438355%2018.8047C0.245806%2020.9769%200.245812%2023.1226%200.438355%2025.2946C0.535045%2025.9265%200.94889%2026.5048%201.4516%2026.8841C2.21046%2027.3799%202.95285%2027.8531%203.87299%2027.9711C4.74581%2027.9246%205.47724%2026.84%205.59973%2026.0356C5.89635%2023.3667%205.89636%2020.7328%205.59973%2018.0638C5.47724%2017.2593%204.74582%2016.1747%203.873%2016.1282C2.95286%2016.2462%202.21046%2016.7194%201.45161%2017.2152C0.948896%2017.5945%200.535045%2018.1729%200.438355%2018.8047Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M43.0616%2018.8047C43.2541%2020.9769%2043.2541%2023.1226%2043.0616%2025.2946C42.9649%2025.9265%2042.551%2026.5048%2042.0483%2026.8841C41.2895%2027.3799%2040.5471%2027.8531%2039.6269%2027.9711C38.7541%2027.9246%2038.0227%2026.84%2037.9002%2026.0356C37.6036%2023.3667%2037.6036%2020.7328%2037.9002%2018.0638C38.0227%2017.2593%2038.7541%2016.1747%2039.6269%2016.1282C40.5471%2016.2462%2041.2895%2016.7194%2042.0483%2017.2152C42.551%2017.5945%2042.9649%2018.1729%2043.0616%2018.8047Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M25.8389%208.85439H21.8867V7.22803H21.9359C22.2919%207.22803%2022.6365%207.24805%2022.9641%207.28506C24.6208%207.47311%2025.8389%208.10461%2025.8389%208.85439Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M22.9637%208.85422V11.641H20.9072V3.74219H21.8863V8.85422H22.9637Z'%20fill='%23171A3B'/%3e%3cpath%20d='M25.8393%208.85439C25.8393%209.60419%2024.6212%2010.2357%2022.9645%2010.4237C22.6369%2010.4607%2022.2923%2010.4808%2021.9362%2010.4808C21.5801%2010.4808%2021.2356%2010.4607%2020.908%2010.4237C19.2513%2010.2357%2018.0332%209.60419%2018.0332%208.85439C18.0332%208.104%2019.2513%207.47311%2020.908%207.28506C21.2204%207.24987%2021.5486%207.22985%2021.8871%207.22803V8.85439H25.8393Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M21.8871%208.85499V35.245H21.8465C21.235%2035.2456%2020.6235%2035.2389%2020.0127%2035.2256C17.1712%2035.1637%2014.331%2034.9538%2011.5017%2034.5856C7.74793%2034.0979%204.29685%2030.281%203.74784%2026.4459C3.32624%2023.5019%203.32624%2020.598%203.74784%2017.6541C4.29684%2013.819%207.74793%2010.0021%2011.5017%209.5144C14.9401%209.06731%2018.393%208.85317%2021.8465%208.85499H21.8871Z'%20fill='%23E7E9EB'/%3e%3cpath%20d='M40.114%2026.4452C39.7718%2028.7455%2038.3748%2031.0864%2036.4821%2032.6728C35.8646%2033.1902%2035.1936%2033.6276%2034.49%2033.9564C34.2437%2034.0716%2033.9931%2034.1736%2033.7396%2034.2615C33.2888%2034.4168%2032.8272%2034.5272%2032.3601%2034.5848C28.8781%2035.0149%2025.3827%2035.2406%2021.8867%2035.2442V8.85425C25.3821%208.85789%2028.8787%209.08355%2032.3601%209.51366C36.1382%209.98014%2039.5516%2013.8729%2040.114%2017.6533C40.5489%2020.5785%2040.5489%2023.5206%2040.114%2026.4452Z'%20fill='%23D1D3D4'/%3e%3cpath%20d='M27.1787%2013.3372C28.7256%2013.4409%2030.2804%2013.5888%2031.834%2013.7805C33.5282%2013.9898%2035.5612%2016.263%2035.8623%2018.2854C36.2336%2020.7829%2036.2336%2023.3159%2035.8623%2025.8127C35.6791%2027.0417%2034.8396%2028.4416%2033.7217%2029.3782C33.3772%2029.6675%2033.0233%2029.8974%2032.6709%2030.0618C32.5593%2030.1145%2032.4464%2030.1603%2032.3359%2030.1985C32.1609%2030.259%2031.9925%2030.2992%2031.835%2030.3186C28.467%2030.7347%2025.0907%2030.9456%2021.7998%2030.9456C21.2369%2030.9456%2020.667%2030.9391%2020.1064%2030.927C17.3961%2030.8675%2014.6875%2030.6643%2012.0566%2030.3215C11.6382%2030.2669%2011.1776%2030.0829%2010.7197%2029.7961L27.1787%2013.3372ZM21.7988%2013.1536C22.397%2013.1536%2022.9986%2013.1605%2023.6016%2013.175H23.6006C24.7855%2013.2017%2025.9795%2013.2559%2027.1777%2013.3372L10.7188%2029.7961C10.3196%2029.5462%209.92292%2029.2179%209.55957%2028.8303C9.2952%2028.5484%209.05604%2028.2435%208.84863%2027.927V27.926C8.40193%2027.2445%208.10127%2026.5082%208.00488%2025.8352C7.82534%2024.5778%207.73289%2023.3374%207.73047%2022.0969C7.72805%2020.825%207.8205%2019.5531%208.00488%2018.2629C8.14621%2017.2772%208.72802%2016.1571%209.56152%2015.2678C10.341%2014.4363%2011.2736%2013.8785%2012.0566%2013.7766C13.5174%2013.5867%2014.9995%2013.4403%2016.4912%2013.3372C18.2497%2013.2152%2020.0239%2013.1536%2021.7988%2013.1536Z'%20fill='%2333383F'/%3e%3cpath%20d='M21.8877%200.164557V4.90412C21.5382%204.90412%2021.207%204.8289%2020.9086%204.69301C20.0878%204.32054%2019.5176%203.49371%2019.5176%202.53403C19.5176%201.22554%2020.5786%200.164557%2021.8877%200.164557Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M29.7612%2035.877L20.0127%2039.8352V36.2343C20.6236%2036.2476%2021.235%2036.2543%2021.8465%2036.2537C24.4866%2036.2525%2027.1272%2036.1245%2029.7612%2035.877Z'%20fill='%23D1D3D4'/%3e%3cpath%20d='M24.2562%202.53403C24.2562%203.45488%2023.7309%204.2532%2022.9641%204.64569C22.6414%204.8107%2022.275%204.90411%2021.8867%204.90411V0.164551C23.1952%200.164551%2024.2562%201.22553%2024.2562%202.53403Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M22.9641%204.646V7.28541C22.6365%207.24841%2022.2919%207.22839%2021.9359%207.22839H21.8867V4.90441C22.275%204.90441%2022.6414%204.811%2022.9641%204.646Z'%20fill='%2301052B'/%3e%3cpath%20d='M15.4282%2025.5157C14.6141%2025.6903%2014.1949%2025.6903%2013.3808%2025.5157C12.8325%2025.2805%2012.4157%2024.7097%2012.2918%2024.124C12.0811%2022.4009%2012.0811%2020.7336%2012.2918%2019.0104C12.4157%2018.4248%2012.8325%2017.854%2013.3808%2017.6188C14.1949%2017.4441%2014.6141%2017.4441%2015.4282%2017.6188C15.9765%2017.854%2016.3933%2018.4248%2016.5173%2019.0104C16.7279%2020.7336%2016.7279%2022.4009%2016.5173%2024.124C16.3933%2024.7097%2015.9765%2025.2805%2015.4282%2025.5157Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M29.4946%2025.5157C28.6805%2025.6903%2028.2613%2025.6903%2027.4472%2025.5157C26.8989%2025.2805%2026.4821%2024.7097%2026.3582%2024.124C26.1475%2022.4009%2026.1475%2020.7336%2026.3582%2019.0104C26.4821%2018.4248%2026.8989%2017.854%2027.4472%2017.6188C28.2613%2017.4441%2028.6805%2017.4441%2029.4946%2017.6188C30.0429%2017.854%2030.4597%2018.4248%2030.5837%2019.0104C30.7943%2020.7336%2030.7943%2022.4009%2030.5837%2024.124C30.4597%2024.7097%2030.0429%2025.2805%2029.4946%2025.5157Z'%20fill='%2351D6A1'/%3e%3cpath%20d='M18.9688%2024.187H23.91C24.2911%2024.187%2024.6004%2024.5023%2024.6004%2024.8906V24.9011C24.6004%2026.6789%2023.184%2028.1222%2021.4394%2028.1222C19.6948%2028.1222%2018.2783%2026.6789%2018.2783%2024.9011V24.8906C18.2783%2024.5023%2018.5877%2024.187%2018.9688%2024.187Z'%20fill='%2351D6A1'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='28'%20height='28'%20viewBox='0%200%2028%2028'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='28'%20height='28'%20rx='14'%20fill='%23EFEFEF'/%3e%3cpath%20d='M20.667%209.83325L7.33366%209.83325'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M16.5%2014L7.33333%2014'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M11.5%2018.1667H7.33333'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='29'%20height='28'%20viewBox='0%200%2029%2028'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M11.5977%2016.0232C11.8613%2015.7596%2012.2882%2015.7596%2012.5518%2016.0232C12.8152%2016.2868%2012.8153%2016.7137%2012.5518%2016.9773L7.87109%2021.658H11.1221C11.4949%2021.658%2011.7969%2021.9609%2011.7969%2022.3337C11.7967%2022.7064%2011.4948%2023.0085%2011.1221%2023.0085H6.24121C5.86853%2023.0085%205.56658%2022.7064%205.56641%2022.3337V17.4529C5.56641%2017.0801%205.86842%2016.7771%206.24121%2016.7771C6.614%2016.7771%206.91602%2017.0801%206.91602%2017.4529V20.7039L11.5977%2016.0232ZM22.9082%204.99194C23.2808%204.99212%2023.583%205.29406%2023.583%205.66675V10.5476C23.583%2010.9203%2023.2808%2011.2222%2022.9082%2011.2224C22.5354%2011.2224%2022.2324%2010.9204%2022.2324%2010.5476V7.29663L17.5518%2011.9773C17.2882%2012.2408%2016.8613%2012.2407%2016.5977%2011.9773C16.3341%2011.7137%2016.3341%2011.2868%2016.5977%2011.0232L21.2783%206.34155H18.0273C17.6546%206.34155%2017.3516%206.03954%2017.3516%205.66675C17.3516%205.29396%2017.6546%204.99194%2018.0273%204.99194H22.9082Z'%20fill='%23858B93'%20stroke='%23858B93'%20stroke-width='0.1'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='29'%20height='28'%20viewBox='0%200%2029%2028'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M12.0737%2015.8249C12.4464%2015.8249%2012.7493%2016.127%2012.7495%2016.4997V21.3805C12.7495%2021.7533%2012.4465%2022.0563%2012.0737%2022.0563C11.7011%2022.0561%2011.3989%2021.7532%2011.3989%2021.3805V18.1296L6.71826%2022.8102C6.45466%2023.0738%206.02679%2023.0738%205.76318%2022.8102C5.49996%2022.5466%205.49985%2022.1196%205.76318%2021.8561L10.4438%2017.1755H7.19287C6.82019%2017.1753%206.51807%2016.8724%206.51807%2016.4997C6.51824%2016.1271%206.82029%2015.825%207.19287%2015.8249H12.0737ZM22.4302%205.18913C22.6937%204.9258%2023.1207%204.92591%2023.3843%205.18913C23.6479%205.45274%2023.6479%205.88061%2023.3843%206.14421L18.7046%2010.8249H21.9546C22.3273%2010.8249%2022.6302%2011.127%2022.6304%2011.4997C22.6304%2011.8725%2022.3274%2012.1755%2021.9546%2012.1755H17.0737C16.7011%2012.1753%2016.3989%2011.8724%2016.3989%2011.4997V6.61882C16.3991%206.24624%2016.7012%205.94419%2017.0737%205.94402C17.4464%205.94402%2017.7494%206.24613%2017.7495%206.61882V9.8698L22.4302%205.18913Z'%20fill='%23858B93'%20stroke='%23858B93'%20stroke-width='0.1'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='29'%20height='28'%20viewBox='0%200%2029%2028'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M5.55273%2013.6665C5.55273%2013.3904%205.95149%2013.1665%206.44338%2013.1665L20.6139%2013.1665C21.1058%2013.1665%2021.5046%2013.3904%2021.5046%2013.6665C21.5046%2013.9426%2021.1058%2014.1665%2020.6139%2014.1665H6.44338C5.95149%2014.1665%205.55273%2013.9426%205.55273%2013.6665Z'%20stroke='%23858B93'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='34'%20height='34'%20viewBox='0%200%2034%2034'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M10.2391%208.55011C9.85199%208.16298%209.22434%208.16298%208.83722%208.55011C8.45009%208.93723%208.45009%209.56488%208.83722%209.95201L15.885%2016.9998L8.83728%2024.0476C8.45016%2024.4347%208.45016%2025.0624%208.83728%2025.4495C9.22441%2025.8366%209.85206%2025.8366%2010.2392%2025.4495L17.2869%2018.4017L24.3346%2025.4494C24.7217%2025.8365%2025.3494%2025.8365%2025.7365%2025.4494C26.1236%2025.0623%2026.1236%2024.4346%2025.7365%2024.0475L18.6888%2016.9998L25.7366%209.95207C26.1237%209.56495%2026.1237%208.9373%2025.7366%208.55017C25.3495%208.16305%2024.7218%208.16305%2024.3347%208.55017L17.2869%2015.5979L10.2391%208.55011Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M11.9912%202.92969C11.4392%202.92969%2010.9912%203.37769%2010.9912%203.92969V10.9297H3.99121C3.43921%2010.9297%202.99121%2011.3777%202.99121%2011.9297C2.99121%2012.4817%203.43921%2012.9297%203.99121%2012.9297H10.9912V19.9297C10.9912%2020.4817%2011.4392%2020.9297%2011.9912%2020.9297C12.5432%2020.9297%2012.9912%2020.4817%2012.9912%2019.9297V12.9297H19.9912C20.5432%2012.9297%2020.9912%2012.4817%2020.9912%2011.9297C20.9912%2011.3777%2020.5432%2010.9297%2019.9912%2010.9297H12.9912V3.92969C12.9912%203.37769%2012.5432%202.92969%2011.9912%202.92969Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='32'%20height='32'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='32'%20height='32'%20rx='16'%20fill='white'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M15.6464%2010.3132C15.8417%2010.1179%2016.1583%2010.1179%2016.3536%2010.3132L20.3536%2014.3132C20.5488%2014.5085%2020.5488%2014.825%2020.3536%2015.0203C20.1583%2015.2156%2019.8417%2015.2156%2019.6464%2015.0203L16.5%2011.8739L16.5%2021.3334C16.5%2021.6096%2016.2761%2021.8334%2016%2021.8334C15.7239%2021.8334%2015.5%2021.6096%2015.5%2021.3334L15.5%2011.8739L12.3536%2015.0203C12.1583%2015.2156%2011.8417%2015.2156%2011.6464%2015.0203C11.4512%2014.825%2011.4512%2014.5085%2011.6464%2014.3132L15.6464%2010.3132Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='28'%20height='28'%20viewBox='0%200%2028%2028'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='28'%20height='28'%20rx='14'%20fill='%231AAF74'%20fill-opacity='0.1'/%3e%3cpath%20d='M20.667%209.83325L7.33366%209.83325'%20stroke='%231AAF74'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M16.5%2014L7.33333%2014'%20stroke='%231AAF74'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M11.5%2018.1667H7.33333'%20stroke='%231AAF74'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='12'%20cy='6.5'%20r='4'%20stroke='%23858B93'%20stroke-width='1.3'/%3e%3cellipse%20cx='12'%20cy='17.5'%20rx='7'%20ry='4'%20stroke='%23858B93'%20stroke-width='1.3'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M2%2012.5C2%207.78595%202%205.42893%203.46447%203.96447C4.92893%202.5%207.28595%202.5%2012%202.5C16.714%202.5%2019.0711%202.5%2020.5355%203.96447C22%205.42893%2022%207.78595%2022%2012.5C22%2017.214%2022%2019.5711%2020.5355%2021.0355C19.0711%2022.5%2016.714%2022.5%2012%2022.5C7.28595%2022.5%204.92893%2022.5%203.46447%2021.0355C2%2019.5711%202%2017.214%202%2012.5Z'%20stroke='%23858B93'%20stroke-width='1.3'/%3e%3cpath%20d='M7%2014.5L8.79689%2012.3437C9.50894%2011.4893%209.86496%2011.062%2010.3333%2011.062C10.8017%2011.062%2011.1577%2011.4893%2011.8698%2012.3437L12.1302%2012.6563C12.8423%2013.5107%2013.1983%2013.938%2013.6667%2013.938C14.135%2013.938%2014.4911%2013.5107%2015.2031%2012.6563L17%2010.5'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M22%2011V12.5C22%2017.214%2022%2019.5711%2020.5355%2021.0355C19.0711%2022.5%2016.714%2022.5%2012%2022.5C7.28595%2022.5%204.92893%2022.5%203.46447%2021.0355C2%2019.5711%202%2017.214%202%2012.5C2%207.78595%202%205.42893%203.46447%203.96447C4.92893%202.5%207.28595%202.5%2012%202.5H13.5'%20stroke='%23858B93'%20stroke-width='1.3'%20stroke-linecap='round'/%3e%3cpath%20d='M16.652%203.95506L17.3009%203.30624C18.3759%202.23125%2020.1188%202.23125%2021.1938%203.30624C22.2687%204.38124%2022.2687%206.12415%2021.1938%207.19914L20.5449%207.84795M16.652%203.95506C16.652%203.95506%2016.7331%205.33379%2017.9497%206.55032C19.1662%207.76685%2020.5449%207.84795%2020.5449%207.84795M16.652%203.95506L10.6872%209.91993C10.2832%2010.3239%2010.0812%2010.5259%209.90743%2010.7487C9.70249%2011.0114%209.52679%2011.2957%209.38344%2011.5965C9.26191%2011.8515%209.17157%2012.1225%208.99089%2012.6646L8.41242%2014.4M20.5449%207.84795L14.5801%2013.8128C14.1761%2014.2168%2013.9741%2014.4188%2013.7513%2014.5926C13.4886%2014.7975%2013.2043%2014.9732%2012.9035%2015.1166C12.6485%2015.2381%2012.3775%2015.3284%2011.8354%2015.5091L10.1%2016.0876M10.1%2016.0876L8.97709%2016.4619C8.71035%2016.5508%208.41626%2016.4814%208.21744%2016.2826C8.01862%2016.0837%207.9492%2015.7897%208.03811%2015.5229L8.41242%2014.4M10.1%2016.0876L8.41242%2014.4'%20stroke='%23858B93'%20stroke-width='1.5'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='20'%20height='21'%20viewBox='0%200%2020%2021'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M9.58366%202.79175C5.55658%202.79175%202.29199%206.05634%202.29199%2010.0834C2.29199%2014.1105%205.55658%2017.3751%209.58366%2017.3751C13.6107%2017.3751%2016.8753%2014.1105%2016.8753%2010.0834C16.8753%206.05634%2013.6107%202.79175%209.58366%202.79175ZM1.04199%2010.0834C1.04199%205.36598%204.86623%201.54175%209.58366%201.54175C14.3011%201.54175%2018.1253%205.36598%2018.1253%2010.0834C18.1253%2012.2172%2017.3429%2014.1682%2016.0494%2015.6653L18.7756%2018.3915C19.0197%2018.6356%2019.0197%2019.0313%2018.7756%2019.2754C18.5315%2019.5194%2018.1358%2019.5194%2017.8917%2019.2754L15.1655%2016.5491C13.6684%2017.8427%2011.7174%2018.6251%209.58366%2018.6251C4.86623%2018.6251%201.04199%2014.8008%201.04199%2010.0834Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M17%2012.5C17%2011.3954%2017.8954%2010.5%2019%2010.5C20.1046%2010.5%2021%2011.3954%2021%2012.5C21%2013.6046%2020.1046%2014.5%2019%2014.5C17.8954%2014.5%2017%2013.6046%2017%2012.5Z'%20fill='%23858B93'/%3e%3cpath%20d='M10%2012.5C10%2011.3954%2010.8954%2010.5%2012%2010.5C13.1046%2010.5%2014%2011.3954%2014%2012.5C14%2013.6046%2013.1046%2014.5%2012%2014.5C10.8954%2014.5%2010%2013.6046%2010%2012.5Z'%20fill='%23858B93'/%3e%3cpath%20d='M3%2012.5C3%2011.3954%203.89543%2010.5%205%2010.5C6.10457%2010.5%207%2011.3954%207%2012.5C7%2013.6046%206.10457%2014.5%205%2014.5C3.89543%2014.5%203%2013.6046%203%2012.5Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M7%208.5C7%205.73858%209.23858%203.5%2012%203.5C14.7614%203.5%2017%205.73858%2017%208.5V11.5C17%2014.2614%2014.7614%2016.5%2012%2016.5C9.23858%2016.5%207%2014.2614%207%2011.5V8.5Z'%20stroke='%23858B93'%20stroke-width='1.5'/%3e%3cpath%20d='M11%208.5H13'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M10%2011.5L14%2011.5'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M20%2010.5V11.5C20%2015.9183%2016.4183%2019.5%2012%2019.5C7.58172%2019.5%204%2015.9183%204%2011.5V10.5'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cpath%20d='M12%2019.5V22.5'%20stroke='%23858B93'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='21'%20height='21'%20viewBox='0%200%2021%2021'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M12.25%202.49258C13.5179%201.2247%2015.5735%201.2247%2016.8414%202.49258C18.1093%203.76046%2018.1093%205.8161%2016.8414%207.08398L10.5131%2013.4123C10.1564%2013.769%209.9386%2013.9869%209.69583%2014.1762C9.40981%2014.3993%209.10033%2014.5906%208.77287%2014.7466C8.49494%2014.8791%208.20269%2014.9765%207.72413%2015.136L5.49692%2015.8784L4.9622%2016.0566C4.48358%2016.2162%203.95589%2016.0916%203.59915%2015.7349C3.2424%2015.3781%203.11783%2014.8504%203.27737%2014.3718L4.19801%2011.6099C4.3575%2011.1313%204.4549%2010.8391%204.58736%2010.5611C4.74342%2010.2337%204.93469%209.9242%205.15778%209.63817C5.34714%209.3954%205.56498%209.17759%205.92169%208.82091L12.25%202.49258ZM5.46809%2014.5704L4.76362%2013.8659L5.37064%2012.0449C5.54737%2011.5147%205.62037%2011.2991%205.71577%2011.0989C5.83276%2010.8534%205.97616%2010.6214%206.14342%2010.4069C6.27979%2010.2321%206.43997%2010.0704%206.83516%209.67521L11.7443%204.76607C11.9469%205.27439%2012.2898%205.88791%2012.8679%206.46606C13.4461%207.04422%2014.0596%207.38707%2014.5679%207.5897L9.65879%2012.4988C9.2636%2012.894%209.1019%2013.0542%208.92706%2013.1906C8.71262%2013.3578%208.4806%2013.5012%208.2351%2013.6182C8.03493%2013.7136%207.81935%2013.7866%207.28915%2013.9634L5.46809%2014.5704ZM15.564%206.59368C15.4608%206.57102%2015.3317%206.53694%2015.1851%206.48604C14.7817%206.34611%2014.2511%206.08149%2013.7518%205.58218C13.2525%205.08287%2012.9879%204.5523%2012.848%204.14895C12.7971%204.00226%2012.763%203.87323%2012.7403%203.77004L13.1339%203.37647C13.9136%202.59674%2015.1778%202.59674%2015.9575%203.37647C16.7373%204.15619%2016.7373%205.42038%2015.9575%206.2001L15.564%206.59368ZM3.209%2018.8333C3.209%2018.4882%203.48882%2018.2083%203.834%2018.2083H17.1673V19.4583H3.834C3.48882%2019.4583%203.209%2019.1785%203.209%2018.8333Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='21'%20height='21'%20viewBox='0%200%2021%2021'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M10.4994%202.79166C9.68396%202.79166%208.9886%203.31251%208.7309%204.0416C8.61587%204.36705%208.2588%204.53763%207.93335%204.4226C7.6079%204.30757%207.43733%203.95049%207.55235%203.62504C7.98105%202.41215%209.13775%201.54166%2010.4994%201.54166C11.861%201.54166%2013.0177%202.41215%2013.4464%203.62504C13.5614%203.95049%2013.3908%204.30757%2013.0654%204.4226C12.74%204.53763%2012.3829%204.36705%2012.2678%204.0416C12.0101%203.31251%2011.3148%202.79166%2010.4994%202.79166Z'%20fill='%23858B93'/%3e%3cpath%20d='M2.79102%205.49999C2.79102%205.15481%203.07084%204.87499%203.41602%204.87499H17.5828C17.9279%204.87499%2018.2078%205.15481%2018.2078%205.49999C18.2078%205.84517%2017.9279%206.12499%2017.5828%206.12499H3.41602C3.07084%206.12499%202.79102%205.84517%202.79102%205.49999Z'%20fill='%23858B93'/%3e%3cpath%20d='M5.42859%207.54175C5.40563%207.19733%205.10781%206.93675%204.7634%206.95971C4.41898%206.98267%204.15839%207.28048%204.18135%207.6249L4.56756%2013.418C4.63881%2014.487%204.69636%2015.3504%204.83134%2016.028C4.97167%2016.7324%205.21035%2017.3208%205.70335%2017.782C6.19634%2018.2432%206.7993%2018.4422%207.51151%2018.5354C8.19654%2018.625%209.06191%2018.625%2010.1332%2018.625H10.8656C11.9369%2018.625%2012.8023%2018.625%2013.4873%2018.5354C14.1995%2018.4422%2014.8025%2018.2432%2015.2955%2017.782C15.7885%2017.3208%2016.0272%2016.7324%2016.1675%2016.028C16.3025%2015.3504%2016.36%2014.487%2016.4313%2013.418L16.8175%207.6249C16.8404%207.28048%2016.5798%206.98267%2016.2354%206.95971C15.891%206.93675%2015.5932%207.19733%2015.5702%207.54175L15.187%2013.291C15.1121%2014.4142%2015.0587%2015.1957%2014.9416%2015.7837C14.828%2016.3541%2014.6693%2016.656%2014.4415%2016.8692C14.2137%2017.0824%2013.9019%2017.2205%2013.3252%2017.296C12.7307%2017.3737%2011.9474%2017.375%2010.8216%2017.375H10.1772C9.05148%2017.375%208.26814%2017.3737%207.67364%2017.296C7.09697%2017.2205%206.78517%2017.0824%206.55733%2016.8692C6.32948%2016.656%206.17087%2016.3541%206.05725%2015.7837C5.94011%2015.1957%205.88675%2014.4142%205.81187%2013.291L5.42859%207.54175Z'%20fill='%23858B93'/%3e%3cpath%20d='M8.3539%209.04476C8.69736%209.01041%209.00364%209.261%209.03799%209.60447L9.45465%2013.7711C9.489%2014.1146%209.23841%2014.4209%208.89494%2014.4552C8.55148%2014.4896%208.2452%2014.239%208.21086%2013.8955L7.79419%209.72885C7.75984%209.38538%208.01043%209.0791%208.3539%209.04476Z'%20fill='%23858B93'/%3e%3cpath%20d='M13.2047%209.72885C13.239%209.38538%2012.9884%209.0791%2012.6449%209.04476C12.3015%209.01041%2011.9952%209.261%2011.9609%209.60447L11.5442%2013.7711C11.5098%2014.1146%2011.7604%2014.4209%2012.1039%2014.4552C12.4474%2014.4896%2012.7536%2014.239%2012.788%2013.8955L13.2047%209.72885Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='32'%20height='32'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='32'%20height='32'%20rx='16'%20fill='white'/%3e%3cpath%20d='M16%2022.6666L16%209.33331M16%209.33331L21%2014.3333M16%209.33331L11%2014.3333'%20stroke='%231AAF74'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='17'%20height='17'%20viewBox='0%200%2017%2017'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_2361_172518)'%3e%3cpath%20d='M15.6005%2011.6509C15.9284%2011.2327%2016.0856%2010.7843%2016.0656%2010.3226C16.0455%209.81401%2015.818%209.41585%2015.6306%209.1716C15.8481%208.62956%2015.9317%207.77636%2015.2057%207.11388C14.6737%206.62873%2013.7703%206.41125%2012.5189%206.47147C11.639%206.51162%2010.9029%206.67557%2010.8728%206.68226H10.8694C10.7021%206.71238%2010.5248%206.74918%2010.3441%206.78933C10.3307%206.57519%2010.3675%206.0432%2010.7623%204.84537C11.2308%203.42003%2011.204%202.32927%2010.6754%201.59987C10.1199%200.833663%209.23328%200.773438%208.9723%200.773438C8.72136%200.773438%208.49049%200.87716%208.32655%201.06787C7.95515%201.49949%207.99865%202.29581%208.04549%202.66386C7.60384%203.8483%206.36586%206.75253%205.3186%207.55888C5.29852%207.57227%205.2818%207.589%205.26507%207.60572C4.95724%207.93028%204.7498%208.28159%204.60927%208.58941C4.41187%208.48235%204.18769%208.42212%203.94679%208.42212H1.9058C1.13625%208.42212%200.513916%209.0478%200.513916%209.81401V15.2511C0.513916%2016.0206%201.1396%2016.6429%201.9058%2016.6429H3.94679C4.24457%2016.6429%204.52228%2016.5493%204.7498%2016.3887L5.53608%2016.4823C5.65653%2016.4991%207.7979%2016.7701%209.99614%2016.7266C10.3943%2016.7567%2010.769%2016.7734%2011.117%2016.7734C11.7159%2016.7734%2012.2379%2016.7266%2012.6728%2016.6329C13.6967%2016.4154%2014.396%2015.9805%2014.7506%2015.3414C15.0217%2014.8529%2015.0217%2014.3677%2014.9782%2014.0599C15.644%2013.4577%2015.7611%2012.7918%2015.7377%2012.3234C15.7243%2012.0524%2015.6641%2011.8215%2015.6005%2011.6509ZM1.9058%2015.7396C1.63479%2015.7396%201.4173%2015.5187%201.4173%2015.2511V9.81066C1.4173%209.53964%201.63813%209.32216%201.9058%209.32216H3.94679C4.21781%209.32216%204.43529%209.54299%204.43529%209.81066V15.2477C4.43529%2015.5187%204.21446%2015.7362%203.94679%2015.7362H1.9058V15.7396ZM14.7439%2011.2594C14.6034%2011.4066%2014.5767%2011.6308%2014.6837%2011.8048C14.6837%2011.8082%2014.8209%2012.0424%2014.8376%2012.3636C14.8611%2012.8019%2014.6503%2013.19%2014.2086%2013.5212C14.0513%2013.6417%2013.9878%2013.8491%2014.0547%2014.0365C14.0547%2014.0399%2014.1986%2014.4815%2013.9644%2014.8997C13.7402%2015.3013%2013.2416%2015.589%2012.4855%2015.7496C11.8799%2015.8801%2011.0568%2015.9035%2010.0463%2015.8232C10.0329%2015.8232%2010.0162%2015.8232%209.99949%2015.8232C7.84809%2015.87%205.67326%2015.589%205.64984%2015.5856H5.6465L5.30856%2015.5455C5.32864%2015.4518%205.33868%2015.3514%205.33868%2015.2511V9.81066C5.33868%209.66679%205.31525%209.52626%205.2751%209.39577C5.33533%209.1716%205.50262%208.67306%205.89744%208.24813C7.39974%207.057%208.86858%203.0386%208.93215%202.86461C8.95892%202.79435%208.96561%202.71739%208.95223%202.64044C8.89535%202.2657%208.91542%201.80731%208.99572%201.67013C9.17305%201.67348%209.65152%201.72367%209.93926%202.12183C10.2805%202.5936%2010.2672%203.43676%209.89911%204.55428C9.337%206.25734%209.29016%207.15403%209.73516%207.54885C9.95599%207.74625%2010.2504%207.75629%2010.4646%207.67933C10.6687%207.63249%2010.8627%207.59234%2011.0467%207.56223C11.0601%207.55888%2011.0769%207.55554%2011.0902%207.55219C12.1174%207.32802%2013.9577%207.19084%2014.5967%207.77302C15.1388%208.26821%2014.754%208.924%2014.7105%208.99427C14.5867%209.18163%2014.6235%209.42588%2014.7908%209.57645C14.7941%209.57979%2015.1455%209.91104%2015.1622%2010.356C15.1756%2010.6538%2015.035%2010.9583%2014.7439%2011.2594Z'%20fill='%23858B93'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_2361_172518'%3e%3crect%20width='16'%20height='16'%20fill='white'%20transform='translate(0.290527%200.773438)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='17'%20height='17'%20viewBox='0%200%2017%2017'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_2361_172521)'%3e%3cpath%20d='M0.980564%205.89598C0.652667%206.31422%200.495411%206.76256%200.515487%207.2243C0.535562%207.73287%200.763082%208.13103%200.950451%208.37528C0.732968%208.91731%200.649323%209.77051%201.37538%2010.433C1.90737%2010.9181%202.81076%2011.1356%204.06212%2011.0754C4.94209%2011.0353%205.67818%2010.8713%205.70829%2010.8646H5.71164C5.87893%2010.8345%206.05626%2010.7977%206.23694%2010.7575C6.25033%2010.9717%206.21352%2011.5037%205.81871%2012.7015C5.35028%2014.1268%205.37705%2015.2176%205.9057%2015.947C6.46112%2016.7132%207.34777%2016.7734%207.60875%2016.7734C7.85969%2016.7734%208.09056%2016.6697%208.25451%2016.479C8.6259%2016.0474%208.5824%2015.2511%208.53556%2014.883C8.97722%2013.6986%2010.2152%2010.7943%2011.2625%209.98799C11.2825%209.97461%2011.2993%209.95788%2011.316%209.94115C11.6238%209.6166%2011.8313%209.26528%2011.9718%208.95746C12.1692%209.06453%2012.3934%209.12475%2012.6343%209.12475H14.6753C15.4448%209.12475%2016.0671%208.49907%2016.0671%207.73287V2.29581C16.0671%201.52626%2015.4415%200.903928%2014.6753%200.903928H12.6343C12.3365%200.903928%2012.0588%200.997612%2011.8313%201.15821L11.045%201.06453C10.9245%201.0478%208.78316%200.776784%206.58491%200.820281C6.18675%200.790168%205.81201%200.773438%205.46404%200.773438C4.86513%200.773438%204.34317%200.82028%203.90821%200.913965C2.88437%201.13145%202.18508%201.56641%201.83042%202.20547C1.5594%202.69397%201.5594%203.17913%201.6029%203.48695C0.937067%204.0892%200.819963%204.75504%200.843384%205.22346C0.856767%205.49447%200.916992%205.72534%200.980564%205.89598ZM14.6753%201.80732C14.9463%201.80732%2015.1638%202.02814%2015.1638%202.29581V7.73621C15.1638%208.00723%2014.9429%208.22471%2014.6753%208.22471H12.6343C12.3632%208.22471%2012.1458%208.00389%2012.1458%207.73621V2.29916C12.1458%202.02814%2012.3666%201.81066%2012.6343%201.81066H14.6753V1.80732ZM1.83711%206.28745C1.97764%206.14023%202.0044%205.91606%201.89734%205.74207C1.89734%205.73872%201.76015%205.50451%201.74343%205.18331C1.72%204.745%201.93079%204.35688%202.37245%204.02563C2.52971%203.90518%202.59328%203.69774%202.52636%203.51037C2.52636%203.50702%202.38249%203.06537%202.6167%202.64713C2.84087%202.24562%203.33941%201.95788%204.09558%201.79728C4.70118%201.66679%205.52427%201.64337%206.53473%201.72367C6.54811%201.72367%206.56484%201.72367%206.58157%201.72367C8.73297%201.67683%2010.9078%201.95788%2010.9312%201.96123H10.9346L11.2725%202.00138C11.2524%202.09506%2011.2424%202.19544%2011.2424%202.29581V7.73621C11.2424%207.88009%2011.2658%208.02061%2011.306%208.1511C11.2457%208.37528%2011.0784%208.87381%2010.6836%209.29874C9.18132%2010.4899%207.71248%2014.5083%207.6489%2014.6823C7.62214%2014.7525%207.61545%2014.8295%207.62883%2014.9064C7.68571%2015.2812%207.66563%2015.7396%207.58533%2015.8767C7.408%2015.8734%206.92954%2015.8232%206.64179%2015.425C6.30051%2014.9533%206.3139%2014.1101%206.68194%2012.9926C7.24405%2011.2895%207.29089%2010.3928%206.84589%209.99803C6.62506%209.80062%206.33063%209.79059%206.11649%209.86754C5.91239%209.91438%205.71833%209.95453%205.53431%209.98465C5.52092%209.98799%205.50419%209.99134%205.49081%209.99468C4.46363%2010.2189%202.62339%2010.356%201.98433%209.77386C1.4423%209.27867%201.82707%208.62287%201.87057%208.55261C1.99437%208.36524%201.95756%208.12099%201.79027%207.97043C1.78692%207.96708%201.4356%207.63584%201.41887%207.19084C1.40549%206.89305%201.54602%206.58858%201.83711%206.28745Z'%20fill='%23858B93'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_2361_172521'%3e%3crect%20width='16'%20height='16'%20fill='white'%20transform='matrix(-1%200%200%20-1%2016.2905%2016.7734)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='16'%20height='17'%20viewBox='0%200%2016%2017'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_2361_92626)'%3e%3cpath%20d='M15.3092%2011.4575C15.6371%2011.0393%2015.7944%2010.591%2015.7743%2010.1292C15.7542%209.62065%2015.5267%209.22249%2015.3393%208.97824C15.5568%208.4362%2015.6405%207.58301%2014.9144%206.92052C14.3824%206.43537%2013.479%206.21789%2012.2277%206.27811C11.3477%206.31826%2010.6116%206.48221%2010.5815%206.4889H10.5782C10.4109%206.51902%2010.2335%206.55582%2010.0529%206.59597C10.0395%206.38183%2010.0763%205.84984%2010.4711%204.65201C10.9395%203.22667%2010.9127%202.13591%2010.3841%201.40651C9.82868%200.640304%208.94202%200.580078%208.68104%200.580078C8.4301%200.580078%208.19923%200.6838%208.03529%200.874516C7.66389%201.30613%207.70739%202.10245%207.75423%202.4705C7.31258%203.65494%206.0746%206.55917%205.02734%207.36552C5.00726%207.37891%204.99054%207.39564%204.97381%207.41237C4.66599%207.73692%204.45854%208.08823%204.31801%208.39605C4.12061%208.28899%203.89643%208.22876%203.65553%208.22876H1.61454C0.84499%208.22876%200.222656%208.85444%200.222656%209.62065V15.0577C0.222656%2015.8273%200.848336%2016.4496%201.61454%2016.4496H3.65553C3.95331%2016.4496%204.23102%2016.3559%204.45854%2016.1953L5.24482%2016.289C5.36527%2016.3057%207.50664%2016.5767%209.70488%2016.5332C10.103%2016.5633%2010.4778%2016.5801%2010.8258%2016.5801C11.4247%2016.5801%2011.9466%2016.5332%2012.3816%2016.4396C13.4054%2016.2221%2014.1047%2015.7871%2014.4594%2015.148C14.7304%2014.6595%2014.7304%2014.1744%2014.6869%2013.8666C15.3527%2013.2643%2015.4698%2012.5985%2015.4464%2012.1301C15.433%2011.859%2015.3728%2011.6282%2015.3092%2011.4575ZM1.61454%2015.5462C1.34353%2015.5462%201.12604%2015.3254%201.12604%2015.0577V9.6173C1.12604%209.34628%201.34687%209.1288%201.61454%209.1288H3.65553C3.92655%209.1288%204.14403%209.34963%204.14403%209.6173V15.0544C4.14403%2015.3254%203.9232%2015.5429%203.65553%2015.5429H1.61454V15.5462ZM14.4527%2011.0661C14.3122%2011.2133%2014.2854%2011.4375%2014.3925%2011.6114C14.3925%2011.6148%2014.5296%2011.849%2014.5464%2012.1702C14.5698%2012.6085%2014.359%2012.9966%2013.9173%2013.3279C13.7601%2013.4483%2013.6965%2013.6558%2013.7634%2013.8431C13.7634%2013.8465%2013.9073%2014.2881%2013.6731%2014.7064C13.4489%2015.1079%2012.9504%2015.3956%2012.1942%2015.5562C11.5886%2015.6867%2010.7655%2015.7101%209.75507%2015.6298C9.74169%2015.6298%209.72496%2015.6298%209.70823%2015.6298C7.55683%2015.6767%205.382%2015.3956%205.35858%2015.3923H5.35524L5.0173%2015.3521C5.03738%2015.2585%205.04742%2015.1581%205.04742%2015.0577V9.6173C5.04742%209.47343%205.02399%209.3329%204.98384%209.20241C5.04407%208.97824%205.21136%208.4797%205.60618%208.05477C7.10848%206.86364%208.57732%202.84524%208.64089%202.67125C8.66766%202.60099%208.67435%202.52403%208.66097%202.44708C8.60409%202.07234%208.62416%201.61396%208.70446%201.47677C8.88179%201.48012%209.36026%201.53031%209.648%201.92847C9.98928%202.40024%209.9759%203.2434%209.60785%204.36092C9.04574%206.06398%208.9989%206.96067%209.4439%207.35549C9.66473%207.55289%209.95917%207.56293%2010.1733%207.48597C10.3774%207.43913%2010.5715%207.39898%2010.7555%207.36887C10.7689%207.36552%2010.7856%207.36218%2010.799%207.35883C11.8262%207.13466%2013.6664%206.99748%2014.3055%207.57966C14.8475%208.07485%2014.4627%208.73064%2014.4192%208.80091C14.2954%208.98828%2014.3322%209.23252%2014.4995%209.38309C14.5029%209.38644%2014.8542%209.71768%2014.8709%2010.1627C14.8843%2010.4605%2014.7438%2010.7649%2014.4527%2011.0661Z'%20fill='%231AAF74'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_2361_92626'%3e%3crect%20width='16'%20height='16'%20fill='white'%20transform='translate(0%200.580078)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='17'%20height='17'%20viewBox='0%200%2017%2017'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_2361_214893)'%3e%3cpath%20d='M0.784519%205.70262C0.456622%206.12086%200.299366%206.5692%200.319442%207.03094C0.339517%207.53951%200.567037%207.93767%200.754406%208.18192C0.536923%208.72395%200.453278%209.57715%201.17933%2010.2396C1.71133%2010.7248%202.61472%2010.9423%203.86607%2010.882C4.74604%2010.8419%205.48213%2010.6779%205.51225%2010.6713H5.51559C5.68289%2010.6411%205.86022%2010.6043%206.0409%2010.5642C6.05428%2010.7783%206.01748%2011.3103%205.62266%2012.5081C5.15424%2013.9335%205.18101%2015.0242%205.70965%2015.7536C6.26507%2016.5199%207.15173%2016.5801%207.41271%2016.5801C7.66365%2016.5801%207.89452%2016.4764%208.05846%2016.2856C8.42986%2015.854%208.38636%2015.0577%208.33952%2014.6897C8.78117%2013.5052%2010.0191%2010.601%2011.0664%209.79463C11.0865%209.78125%2011.1032%209.76452%2011.1199%209.74779C11.4278%209.42324%2011.6352%209.07192%2011.7757%208.7641C11.9731%208.87117%2012.1973%208.9314%2012.4382%208.9314H14.4792C15.2488%208.9314%2015.8711%208.30572%2015.8711%207.53951V2.10245C15.8711%201.3329%2015.2454%200.710568%2014.4792%200.710568H12.4382C12.1404%200.710568%2011.8627%200.804253%2011.6352%200.964854L10.8489%200.87117C10.7285%200.854441%208.58711%200.583425%206.38887%200.626922C5.99071%200.596808%205.61597%200.580078%205.268%200.580078C4.66909%200.580078%204.14713%200.626921%203.71216%200.720606C2.68832%200.938087%201.98904%201.37305%201.63437%202.01212C1.36336%202.50061%201.36336%202.98577%201.40685%203.29359C0.741022%203.89585%200.623918%204.56168%200.647339%205.0301C0.660722%205.30112%200.720947%205.53198%200.784519%205.70262ZM14.4792%201.61396C14.7502%201.61396%2014.9677%201.83478%2014.9677%202.10245V7.54286C14.9677%207.81387%2014.7469%208.03135%2014.4792%208.03135H12.4382C12.1672%208.03135%2011.9497%207.81053%2011.9497%207.54286V2.1058C11.9497%201.83478%2012.1706%201.6173%2012.4382%201.6173H14.4792V1.61396ZM1.64106%206.09409C1.78159%205.94687%201.80836%205.7227%201.70129%205.54871C1.70129%205.54536%201.56411%205.31115%201.54738%204.98995C1.52396%204.55164%201.73475%204.16352%202.1764%203.83227C2.33366%203.71182%202.39723%203.50438%202.33032%203.31701C2.33032%203.31366%202.18644%202.87201%202.42066%202.45377C2.64483%202.05227%203.14336%201.76452%203.89953%201.60392C4.50514%201.47343%205.32822%201.45001%206.33868%201.53031C6.35206%201.53031%206.36879%201.53031%206.38552%201.53031C8.53692%201.48347%2010.7117%201.76452%2010.7352%201.76787H10.7385L11.0764%201.80802C11.0564%201.9017%2011.0463%202.00208%2011.0463%202.10245V7.54286C11.0463%207.68673%2011.0698%207.82726%2011.1099%207.95774C11.0497%208.18192%2010.8824%208.68046%2010.4876%209.10538C8.98527%2010.2965%207.51643%2014.3149%207.45286%2014.4889C7.42609%2014.5592%207.4194%2014.6361%207.43278%2014.7131C7.48966%2015.0878%207.46959%2015.5462%207.38929%2015.6834C7.21196%2015.68%206.73349%2015.6298%206.44575%2015.2317C6.10447%2014.7599%206.11785%2013.9168%206.4859%2012.7992C7.04801%2011.0962%207.09485%2010.1995%206.64985%209.80467C6.42902%209.60726%206.13458%209.59723%205.92045%209.67418C5.71635%209.72102%205.52229%209.76117%205.33826%209.79129C5.32488%209.79463%205.30815%209.79798%205.29477%209.80132C4.26758%2010.0255%202.42735%2010.1627%201.78828%209.5805C1.24625%209.08531%201.63103%208.42951%201.67452%208.35925C1.79832%208.17188%201.76152%207.92763%201.59422%207.77707C1.59088%207.77372%201.23956%207.44248%201.22283%206.99748C1.20945%206.69969%201.34997%206.39522%201.64106%206.09409Z'%20fill='%23F34859'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_2361_214893'%3e%3crect%20width='16'%20height='16'%20fill='white'%20transform='matrix(-1%200%200%20-1%2016.0938%2016.5801)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='25'%20viewBox='0%200%2024%2025'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M22%2012.123C22%2017.6459%2017.5228%2022.123%2012%2022.123C6.47715%2022.123%202%2017.6459%202%2012.123C2%206.6002%206.47715%202.12305%2012%202.12305C17.5228%202.12305%2022%206.6002%2022%2012.123ZM16.0303%209.09272C16.3232%209.38561%2016.3232%209.86048%2016.0303%2010.1534L11.0303%2015.1534C10.7374%2015.4463%2010.2626%2015.4463%209.96967%2015.1534L7.96967%2013.1534C7.67678%2012.8605%207.67678%2012.3856%207.96967%2012.0927C8.26256%2011.7998%208.73744%2011.7998%209.03033%2012.0927L10.5%2013.5624L14.9697%209.09272C15.2626%208.79982%2015.7374%208.79982%2016.0303%209.09272Z'%20fill='%231AAF74'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='21'%20height='20'%20viewBox='0%200%2021%2020'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M10.2904%2014.791C10.6355%2014.791%2010.9154%2014.5112%2010.9154%2014.166V9.16602C10.9154%208.82084%2010.6355%208.54102%2010.2904%208.54102C9.94519%208.54102%209.66537%208.82084%209.66537%209.16602V14.166C9.66537%2014.5112%209.94519%2014.791%2010.2904%2014.791Z'%20fill='%23858B93'/%3e%3cpath%20d='M10.2904%205.83268C10.7506%205.83268%2011.1237%206.20578%2011.1237%206.66602C11.1237%207.12625%2010.7506%207.49935%2010.2904%207.49935C9.83013%207.49935%209.45703%207.12625%209.45703%206.66602C9.45703%206.20578%209.83013%205.83268%2010.2904%205.83268Z'%20fill='%23858B93'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M1.33203%209.99935C1.33203%205.0518%205.34281%201.04102%2010.2904%201.04102C15.2379%201.04102%2019.2487%205.0518%2019.2487%209.99935C19.2487%2014.9469%2015.2379%2018.9577%2010.2904%2018.9577C5.34281%2018.9577%201.33203%2014.9469%201.33203%209.99935ZM10.2904%202.29102C6.03317%202.29102%202.58203%205.74215%202.58203%209.99935C2.58203%2014.2565%206.03317%2017.7077%2010.2904%2017.7077C14.5476%2017.7077%2017.9987%2014.2565%2017.9987%209.99935C17.9987%205.74215%2014.5476%202.29102%2010.2904%202.29102Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='20'%20height='20'%20viewBox='0%200%2020%2020'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M17.291%205.83301C17.291%206.17819%2017.0112%206.45801%2016.666%206.45801L3.33268%206.45801C2.9875%206.45801%202.70768%206.17819%202.70768%205.83301C2.70768%205.48783%202.9875%205.20801%203.33268%205.20801L16.666%205.20801C17.0112%205.20801%2017.291%205.48783%2017.291%205.83301Z'%20fill='%23858B93'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M17.291%2010C17.291%2010.3452%2017.0112%2010.625%2016.666%2010.625L3.33268%2010.625C2.9875%2010.625%202.70768%2010.3452%202.70768%2010C2.70768%209.65482%202.9875%209.375%203.33268%209.375L16.666%209.375C17.0112%209.375%2017.291%209.65482%2017.291%2010Z'%20fill='%23858B93'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M17.291%2014.167C17.291%2014.5122%2017.0112%2014.792%2016.666%2014.792L3.33268%2014.792C2.9875%2014.792%202.70768%2014.5122%202.70768%2014.167C2.70768%2013.8218%202.9875%2013.542%203.33268%2013.542L16.666%2013.542C17.0112%2013.542%2017.291%2013.8218%2017.291%2014.167Z'%20fill='%23858B93'/%3e%3c/svg%3e\"","import \"./SurveyMessage.css\";\r\nimport { Component, createEffect, createSignal, For, on, onMount, Show } from \"solid-js\";\r\nimport { iconCheck, iconTooltip, iconHamburger } from \"../../assets/icons/icons\";\r\nimport { SurveyMessageProps } from \"../../types/chat.types\";\r\n\r\nconst SurveyMessage: Component<SurveyMessageProps> = (props) => {\r\n const [draggedIndex, setDraggedIndex] = createSignal<number | null>(null);\r\n const [hoveredIndex, setHoveredIndex] = createSignal<number | null>(null);\r\n const [selectedIndexes, setSelectedIndexes] = createSignal<number[]>(props.selectedIndexes || []);\r\n const [answers, setAnswers] = createSignal<string[]>(Array((props.options || []).length).fill(\"\"));\r\n const [options, setOptions] = createSignal<string[]>(props.options || []);\r\n const [showTooltip, setShowTooltip] = createSignal(false);\r\n const description = props.contents?.find(c => c.metadata?.description)?.metadata?.description;\r\n\r\n const multiSelect = props.multiSelect ?? false;\r\n const isInputMode = () => props.isInputMode ?? false;\r\n const messageType = () => props.type || \"choice\";\r\n\r\n let containerRef: HTMLDivElement | undefined;\r\n\r\n // const handleMouseDown = (index: number, e: MouseEvent) => {\r\n // if (e.button !== 0) return;\r\n // if (multiSelect) return;\r\n // e.preventDefault();\r\n // setDraggedIndex(index);\r\n // };\r\n\r\n const handleMouseDown = (index: number, e: MouseEvent) => {\r\n if (!props.isEditing && props.canSubmit === false) return;\r\n if (e.button !== 0) return;\r\n if (!props.isDragDrop) return;\r\n e.preventDefault();\r\n setDraggedIndex(index);\r\n };\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (draggedIndex() === null || !containerRef) return;\r\n\r\n const containerRect = containerRef.getBoundingClientRect();\r\n const isInContainer =\r\n e.clientX >= containerRect.left &&\r\n e.clientX <= containerRect.right &&\r\n e.clientY >= containerRect.top &&\r\n e.clientY <= containerRect.bottom;\r\n\r\n if (!isInContainer) return;\r\n\r\n const buttons = containerRef.querySelectorAll(\".survey-option\");\r\n for (let i = 0; i < buttons.length; i++) {\r\n const btn = buttons[i] as HTMLElement;\r\n const rect = btn.getBoundingClientRect();\r\n\r\n const isOver =\r\n e.clientX >= rect.left &&\r\n e.clientX <= rect.right &&\r\n e.clientY >= rect.top &&\r\n e.clientY <= rect.bottom;\r\n\r\n if (isOver && i !== draggedIndex()) {\r\n setHoveredIndex(i);\r\n return;\r\n }\r\n }\r\n };\r\n\r\n const handleMouseUp = (e: MouseEvent) => {\r\n if (draggedIndex() === null || !containerRef) return;\r\n\r\n const containerRect = containerRef.getBoundingClientRect();\r\n const isInContainer =\r\n e.clientX >= containerRect.left &&\r\n e.clientX <= containerRect.right &&\r\n e.clientY >= containerRect.top &&\r\n e.clientY <= containerRect.bottom;\r\n\r\n if (isInContainer && hoveredIndex() !== null) {\r\n const newOptions = [...options()];\r\n const temp = newOptions[draggedIndex()!];\r\n newOptions[draggedIndex()!] = newOptions[hoveredIndex()!];\r\n newOptions[hoveredIndex()!] = temp;\r\n setOptions(newOptions);\r\n }\r\n\r\n setDraggedIndex(null);\r\n setHoveredIndex(null);\r\n };\r\n\r\n const handleOptionClick = (idx: number) => {\r\n if (!props.isEditing && props.canSubmit === false) return;\r\n if (props.isDragDrop) return;\r\n if (multiSelect) {\r\n setSelectedIndexes(prev =>\r\n prev.includes(idx)\r\n ? prev.filter(i => i !== idx)\r\n : [...prev, idx]\r\n );\r\n } else {\r\n setSelectedIndexes(prev =>\r\n prev.includes(idx) ? [] : [idx]\r\n );\r\n }\r\n };\r\n\r\n const handleAnswerChange = (idx: number, value: string) => {\r\n setAnswers(prev => {\r\n const next = [...prev];\r\n next[idx] = value;\r\n return next;\r\n });\r\n };\r\n\r\n const handleSubmit = () => {\r\n if (props.onSubmit) {\r\n const msgId = props.msgId || '';\r\n\r\n if (isInputMode()) {\r\n const filledAnswers = answers().filter(a => a.trim() !== '');\r\n props.onSubmit(filledAnswers, 'input', msgId);\r\n } else if (props.isDragDrop) {\r\n props.onSubmit(options(), 'ordered', msgId);\r\n } else if (multiSelect) {\r\n const selectedOptions = options().filter((_, i) => selectedIndexes().includes(i));\r\n props.onSubmit(selectedOptions, 'selected', msgId);\r\n } else {\r\n const selectedOption = options()[selectedIndexes()[0]];\r\n props.onSubmit([selectedOption], 'selected', msgId);\r\n }\r\n }\r\n };\r\n\r\n onMount(() => {\r\n document.addEventListener(\"mousemove\", handleMouseMove);\r\n document.addEventListener(\"mouseup\", handleMouseUp);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousemove\", handleMouseMove);\r\n document.removeEventListener(\"mouseup\", handleMouseUp);\r\n };\r\n });\r\n\r\n createEffect(() => {\r\n setOptions(props.options || []);\r\n });\r\n\r\n createEffect(on(() => props.isEditing, (isEditing: any) => {\r\n if (isEditing) {\r\n setSelectedIndexes(props.selectedIndexes || []);\r\n setAnswers(Array((props.options || []).length).fill(\"\").map((_, i) =>\r\n props.fields && props.fields[i]?.value !== undefined\r\n ? props.fields[i].value\r\n : \"\"\r\n ));\r\n setOptions(props.options || []);\r\n }\r\n }));\r\n\r\n if (messageType() === \"normal\") {\r\n return (\r\n <div class=\"survey-message\">\r\n <For each={props.contents || []}>\r\n {(content) => (\r\n <div style={{ \"margin-bottom\": \"12px\", \"text-align\": \"left\" }}>\r\n <div style={{ \"font-weight\": 500, \"font-size\": \"14px\", color: \"#1A1D1F\" }}>\r\n {content.content}\r\n </div>\r\n {content.metadata?.description && (\r\n <div style={{ \"font-weight\": 400, \"font-size\": \"12px\", color: \"#858B93\", \"margin-top\": \"4px\" }}>\r\n {content.metadata.description}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </For>\r\n </div>\r\n );\r\n }\r\n\r\n if (messageType() === \"form\") {\r\n return (\r\n <div class=\"survey-message\">\r\n <div style={{ \"text-align\": \"center\", color: \"#858B93\", \"padding\": \"24px\" }}>\r\n Biểu mẫu khảo sát\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div class=\"survey-message\">\r\n <div style={{ display: \"flex\", \"flex-direction\": \"column\", \"align-items\": \"flex-start\" }}>\r\n <div style={{ display: \"flex\", \"align-items\": \"center\", \"margin-bottom\": \"8px\" }}>\r\n <span style={{ \"font-weight\": 600, \"font-size\": \"16px\", color: \"#1A1D1F\", \"text-align\": \"left\" }}>\r\n {isInputMode() ? \"Nhập đáp án\" : (props.question || \"Chọn đáp án\")}\r\n </span>\r\n <Show when={description}>\r\n <button\r\n style={{\r\n background: \"none\",\r\n border: \"none\",\r\n \"margin-left\": \"8px\",\r\n \"margin-top\": \"6px\",\r\n cursor: \"pointer\",\r\n position: \"relative\"\r\n }}\r\n onMouseEnter={() => setShowTooltip(true)}\r\n onMouseLeave={() => setShowTooltip(false)}\r\n tabIndex={-1}\r\n >\r\n <img src={iconTooltip} alt=\"tooltip\" style={{ width: \"20px\", height: \"20px\" }} />\r\n <Show when={showTooltip()}>\r\n <div class=\"survey-tooltip\">\r\n <For each={(description || \"Bạn có thể kéo thả để sắp xếp thứ tự đáp án ưu tiên A, B, C, D\")\r\n .split(/-\\s*/).filter((line: string) => line.trim() !== \"\")}>\r\n {(line, idx) => (\r\n <div>\r\n {idx() > 0 && <span style={{ \"margin-right\": \"4px\" }}>-</span>}\r\n {line.trim()}\r\n </div>\r\n )}\r\n </For>\r\n </div>\r\n </Show>\r\n </button>\r\n </Show>\r\n </div>\r\n <div style={{ \"font-weight\": 400, color: \"#858B93\", \"font-size\": \"12px\", \"margin-bottom\": \"16px\" }}>\r\n {isInputMode()\r\n ? \"Vui lòng nhập đầy đủ thông tin vào các trường bên dưới.\"\r\n : props.isDragDrop\r\n ? \"Bạn có thể kéo thả để sắp xếp thứ tự đáp án ưu tiên A, B, C, D\"\r\n : multiSelect\r\n ? \"Bạn có thể chọn nhiều đáp án hoặc nhập trực tiếp A, B, C, D theo thứ tự đáp án\"\r\n : \"Bạn có thể chọn 1 đáp án hoặc nhập trực tiếp A, B, C, D\"}\r\n </div>\r\n </div>\r\n {isInputMode() ? (\r\n <div class=\"survey-inputs\">\r\n <For each={options()}>\r\n {(option, index) => (\r\n <div style={{ \"margin-bottom\": \"12px\" }}>\r\n <div style={{ \"font-weight\": 500, \"margin-bottom\": \"4px\", \"text-align\": \"left\", color: \"#1A1D1F\" }}>\r\n {option}\r\n </div>\r\n <input\r\n class=\"survey-input\"\r\n type=\"text\"\r\n value={answers()[index()]}\r\n placeholder={props.placeholders ? props.placeholders[index()] : option}\r\n onInput={(e) => handleAnswerChange(index(), e.currentTarget.value)}\r\n disabled={!props.isEditing && props.canSubmit === false}\r\n style={{\r\n color: \"#1A1D1F\"\r\n }}\r\n />\r\n </div>\r\n )}\r\n </For>\r\n </div>\r\n ) : (\r\n <div class=\"survey-options\" ref={containerRef!}>\r\n <For each={options()}>\r\n {(option, index) => (\r\n <button\r\n class={`survey-option${multiSelect ? \" multi-selected\" : \"\"} ${draggedIndex() === index() ? \"dragging\" : \"\"} ${hoveredIndex() === index() ? \"hovered\" : \"\"} ${!props.isDragDrop && selectedIndexes().includes(index()) ? \"selected\" : \"\"}`}\r\n type=\"button\"\r\n onMouseDown={(e) => handleMouseDown(index(), e)}\r\n onClick={() => handleOptionClick(index())}\r\n style={{\r\n display: \"flex\",\r\n \"justify-content\": \"space-between\",\r\n \"align-items\": \"center\",\r\n width: multiSelect ? \"100%\" : \"auto\",\r\n ...(props.isDragDrop ? {} : { cursor: \"pointer\" })\r\n }}\r\n >\r\n {props.isDragDrop && (\r\n <img\r\n src={iconHamburger}\r\n style={{ width: \"20px\", height: \"20px\", \"margin-right\": \"10px\" }}\r\n />\r\n )}\r\n <span style={{ color: \"#1A1D1F\" }}>{option}</span>\r\n {!props.isDragDrop && selectedIndexes().includes(index()) && (\r\n <img src={iconCheck} style={{ width: \"20px\", height: \"20px\", \"margin-left\": \"16px\" }} />\r\n )}\r\n </button>\r\n )}\r\n </For>\r\n </div>\r\n )}\r\n <div style={{ display: \"flex\", \"justify-content\": \"flex-end\", \"margin-top\": \"16px\" }}>\r\n {props.isEditing && (\r\n <button class=\"survey-cancel-button\" onClick={props.onCancelEdit}>Hủy</button>\r\n )}\r\n {(props.canSubmit || props.isEditing) && (\r\n <button class=\"survey-submit-button\" onClick={handleSubmit}>\r\n Gửi đáp án\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SurveyMessage;","import { For, Show, createEffect, createSignal, onCleanup } from \"solid-js\";\r\nimport \"./ChatMessages.css\";\r\nimport SurveyMessage from \"../../components/SurveyMessage/SurveyMessage\";\r\nimport { iconLike, iconDislike, iconLikeActive, iconDislikeActive, iconEdit, iconDelete } from \"../../assets/icons/icons\";\r\nimport { ChatMessagesProps } from \"../../types/chat.types\";\r\n\r\nexport default function ChatMessages(props: ChatMessagesProps & { isLoadingMessages?: boolean }) {\r\n let messagesContainerRef: HTMLDivElement | undefined;\r\n const [hoveredId, setHoveredId] = createSignal<number | null>(null);\r\n const [feedbackState, setFeedbackState] = createSignal<{ [key: number]: \"like\" | \"dislike\" | null }>({});\r\n const [timeoutId, setTimeoutId] = createSignal<number | null>(null);\r\n const [scrollTimeoutId, setScrollTimeoutId] = createSignal<number | null>(null);\r\n const [selectedMsgId, setSelectedMsgId] = createSignal<string | null>(null);\r\n const [hoveredMsgId, setHoveredMsgId] = createSignal<string | null>(null);\r\n const [editInputValue, setEditInputValue] = createSignal(\"\");\r\n\r\n function canEditMessage(msgId: string) {\r\n const lastMsg = props.messages[props.messages.length - 1];\r\n const isLastInteractive =\r\n (lastMsg.type === \"survey\" || lastMsg.type === \"choice\" || lastMsg.type === \"form\") &&\r\n !(props.submittedMessages?.has(lastMsg.id) ?? false);\r\n if (isLastInteractive && lastMsg.id !== msgId) return false;\r\n return true;\r\n }\r\n\r\n const handleMouseEnter = (id: string) => {\r\n if (timeoutId()) {\r\n clearTimeout(timeoutId()!);\r\n setTimeoutId(null);\r\n }\r\n setHoveredId(Number(id));\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n setTimeoutId(setTimeout(() => setHoveredId(null), 300));\r\n };\r\n\r\n const getPadBottom = () => {\r\n if (props.isFullScreen) {\r\n return props.messages.length > 0 ? \"100px\" : `${(props.inputHeight ?? 0) + 24}px`;\r\n }\r\n if (props.isMobile) {\r\n return props.messages.length > 0 ? \"10px\" : \"0px\";\r\n }\r\n return props.messages.length > 0 ? \"10px\" : \"0px\";\r\n };\r\n\r\n createEffect(() => {\r\n if (!messagesContainerRef) return;\r\n const handleScroll = () => {\r\n if (scrollTimeoutId()) {\r\n clearTimeout(scrollTimeoutId()!);\r\n }\r\n setScrollTimeoutId(setTimeout(() => {\r\n if (messagesContainerRef.scrollTop === 0) {\r\n props.onLoadMoreMessages?.();\r\n }\r\n setScrollTimeoutId(null);\r\n }, 0));\r\n };\r\n messagesContainerRef.addEventListener(\"scroll\", handleScroll);\r\n onCleanup(() => {\r\n messagesContainerRef.removeEventListener(\"scroll\", handleScroll);\r\n if (scrollTimeoutId()) {\r\n clearTimeout(scrollTimeoutId()!);\r\n }\r\n });\r\n });\r\n\r\n return (\r\n <div\r\n ref={messagesContainerRef}\r\n class=\"chat-messages-container\"\r\n style={{\r\n \"justify-content\": props.messages.length === 0 ? \"center\" : \"flex-start\",\r\n \"padding-bottom\": getPadBottom(),\r\n visibility: props.isLoadingMessages ? \"hidden\" : \"visible\",\r\n \"scroll-behavior\": \"auto\"\r\n }}\r\n >\r\n <Show when={props.messages.length === 0 && !props.isFullScreen}>\r\n <div\r\n style={{\r\n \"text-align\": \"center\",\r\n \"font-size\": props.isMobile ? \"20px\" : \"24px\",\r\n \"font-weight\": \"600\",\r\n \"user-select\": \"none\",\r\n \"white-space\": \"pre-line\",\r\n color: \"#1A1D1F\"\r\n }}\r\n >\r\n Hôm nay thị trường khiến bạn <br />quan tâm điều gì?\r\n </div>\r\n </Show>\r\n <For each={props.messages}>\r\n {(msg, idx) => {\r\n const isLastMessage = idx() === props.messages.length - 1;\r\n if (msg.type === \"normal\" && Array.isArray(msg.contents)) {\r\n return (\r\n <>\r\n <For each={msg.contents}>\r\n {(content) => (\r\n <div\r\n class={`chat-message ${msg.sender}`}\r\n data-message-id={msg.id}\r\n style={{\r\n \"margin-left\": msg.sender === \"bot\" ? \"24px\" : \"0px\",\r\n \"margin-right\": msg.sender === \"user\" ? \"24px\" : \"0px\",\r\n \"margin-bottom\": \"8px\",\r\n display: \"flex\",\r\n \"justify-content\": msg.sender === \"user\" ? \"flex-end\" : \"flex-start\",\r\n position: \"relative\"\r\n }}\r\n onClick={() => setSelectedMsgId(selectedMsgId() === msg.id ? null : msg.id)}\r\n onMouseEnter={() => msg.sender === \"user\" && setHoveredMsgId(msg.id)}\r\n onMouseLeave={() => msg.sender === \"user\" && setHoveredMsgId(null)}\r\n >\r\n {msg.sender === \"user\" && hoveredMsgId() === msg.id && (\r\n <div class=\"message-popup\">\r\n <button\r\n class=\"message-popup-button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n const userIdx = idx();\r\n const prevMsg = props.messages[userIdx - 1];\r\n\r\n if (!canEditMessage(msg.id)) {\r\n alert(\"Hoàn thành câu hỏi theo mẫu trước khi chỉnh sửa\");\r\n return;\r\n }\r\n\r\n if (msg.type === \"normal\") {\r\n if (prevMsg && prevMsg.sender === \"bot\" && prevMsg.type === \"normal\") {\r\n setEditInputValue(\"\");\r\n props.setEditingMsgIdUser?.(msg.id);\r\n props.setEditingMsgIdBot?.(null);\r\n }\r\n else if (\r\n prevMsg &&\r\n prevMsg.sender === \"bot\" &&\r\n (prevMsg.type === \"survey\" || prevMsg.type === \"choice\" || prevMsg.type === \"form\")\r\n ) {\r\n props.setEditingMsgIdBot?.(prevMsg.id);\r\n props.setEditingMsgIdUser?.(msg.id);\r\n setEditInputValue(\"\");\r\n }\r\n }\r\n }}\r\n onMouseEnter={(e) => (e.currentTarget.style.background = \"#f0f0f0\")}\r\n onMouseLeave={(e) => (e.currentTarget.style.background = \"none\")}\r\n >\r\n <img src={iconEdit} style={{ width: \"16px\", height: \"16px\" }} />\r\n </button>\r\n <button\r\n class=\"message-popup-button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n console.log(\"Delete message:\", msg.id);\r\n // TODO\r\n }}\r\n onMouseEnter={(e) => (e.currentTarget.style.background = \"#f0f0f0\")}\r\n onMouseLeave={(e) => (e.currentTarget.style.background = \"none\")}\r\n >\r\n <img src={iconDelete} style={{ width: \"16px\", height: \"16px\" }} />\r\n </button>\r\n </div>\r\n )}\r\n {msg.sender === \"user\" && msg.type === \"normal\" && props.editingMsgIdUser === msg.id && !props.editingMsgIdBot ? (\r\n <div\r\n style={{\r\n background: \"#1AAF741A\",\r\n color: \"#000\",\r\n \"border-radius\": \"24px\",\r\n padding: \"10px 16px\",\r\n \"font-weight\": 500,\r\n \"font-size\": \"16px\",\r\n \"max-width\": \"70%\",\r\n \"word-break\": \"break-word\",\r\n \"white-space\": \"pre-line\",\r\n \"text-align\": \"left\",\r\n \"cursor\": \"pointer\"\r\n }}\r\n >\r\n <form\r\n style={{ width: \"100%\", display: \"flex\", \"flex-direction\": \"column\", \"align-items\": \"flex-end\" }}\r\n onSubmit={e => {\r\n e.preventDefault();\r\n if (editInputValue().trim()) {\r\n props.onUpdateSurvey?.([editInputValue()], \"input\", msg.id);\r\n props.setEditingMsgIdUser?.(null);\r\n }\r\n }}\r\n >\r\n <textarea\r\n class=\"chat-message-edit-textarea\"\r\n placeholder=\"Nhập vào tin nhắn...\"\r\n value={editInputValue()}\r\n onInput={e => setEditInputValue(e.currentTarget.value)}\r\n rows={3}\r\n autofocus\r\n />\r\n <div style={{ display: \"flex\", gap: \"4px\", \"margin-top\": \"8px\" }}>\r\n <button class=\"message-cancel-button\" type=\"button\" onClick={() => props.setEditingMsgIdUser?.(null)}>Hủy</button>\r\n <button class=\"message-edit-button\" type=\"submit\">Lưu</button>\r\n </div>\r\n </form>\r\n </div>\r\n ) : (\r\n <div\r\n style={{\r\n background: msg.sender === \"user\" ? \"#1AAF741A\" : \"#fff\",\r\n color: \"#000\",\r\n \"border-radius\": \"24px\",\r\n padding: \"10px 16px\",\r\n \"font-weight\": 500,\r\n \"font-size\": \"16px\",\r\n \"max-width\": \"70%\",\r\n \"word-break\": \"break-word\",\r\n \"white-space\": \"pre-line\",\r\n \"text-align\": \"left\",\r\n \"cursor\": \"pointer\"\r\n }}\r\n >\r\n {content.content}\r\n {msg.sender === \"user\" && msg.sentAt && selectedMsgId() === msg.id && (\r\n <div\r\n style={{\r\n \"font-size\": \"12px\",\r\n color: \"#858B93\",\r\n \"margin-top\": \"12px\",\r\n \"user-select\": \"none\",\r\n \"font-weight\": 400\r\n }}\r\n >\r\n {new Date(msg.sentAt).toLocaleString(\"vi-VN\", {\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </For>\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n (msg.type === \"survey\" || msg.type === \"choice\" || msg.type === \"form\") ? (\r\n <div\r\n class=\"chat-message bot\"\r\n data-message-id={msg.id}\r\n style={{\r\n \"margin-left\": \"24px\",\r\n }}\r\n >\r\n <div>\r\n <SurveyMessage\r\n msgId={msg.id}\r\n question={msg.question}\r\n options={msg.options}\r\n selectedIndexes={msg.selectedIndexes}\r\n fields={msg.fields}\r\n contents={msg.contents}\r\n multiSelect={msg.multiSelect !== undefined ? msg.multiSelect : props.surveyOptions?.multiSelect}\r\n isInputMode={msg.isInputMode !== undefined ? msg.isInputMode : props.surveyOptions?.isInputMode}\r\n isFormType={msg.isFormType}\r\n isNormalType={msg.isNormalType}\r\n isDragDrop={msg.isDragDrop}\r\n isEditing={props.editingMsgIdBot === msg.id}\r\n onCancelEdit={() => {\r\n props.setEditingMsgIdBot?.(null);\r\n props.setEditingMsgIdUser?.(null);\r\n }}\r\n onSubmit={(data, type, msgId) => {\r\n // console.log(\"SurveyMessage.onSubmit:\", { data, type, msgId });\r\n if (props.editingMsgIdUser) {\r\n props.onUpdateSurvey?.(data, type, props.editingMsgIdUser);\r\n props.setEditingMsgIdBot?.(null);\r\n props.setEditingMsgIdUser?.(null);\r\n } else {\r\n props.onSubmit?.(data, type, msgId);\r\n }\r\n }}\r\n canSubmit={isLastMessage && (!(props.submittedMessages?.has(msg.id)) || props.editingMsgIdBot === msg.id)}\r\n placeholders={msg.placeholders}\r\n />\r\n </div>\r\n </div>\r\n ) : (\r\n <div\r\n data-message-id={msg.id}\r\n style={{\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n \"align-items\": \"flex-start\",\r\n \"margin-bottom\": \"8px\"\r\n }}\r\n >\r\n <div\r\n class={`chat-message ${msg.sender}`}\r\n data-message-id={msg.id}\r\n onMouseEnter={() => msg.sender === \"bot\" && handleMouseEnter(msg.id)}\r\n onMouseLeave={() => handleMouseLeave()}\r\n style={{\r\n position: \"relative\",\r\n width: \"100%\"\r\n }}\r\n >\r\n <div\r\n style={{\r\n background: msg.sender === \"user\" ? \"#1AAF741A\" : \"#fff\",\r\n color: \"#000\",\r\n \"border-radius\": \"24px\",\r\n padding: \"10px 16px\",\r\n \"font-weight\": 500,\r\n \"font-size\": \"16px\",\r\n \"max-width\": \"70%\",\r\n \"word-break\": \"break-word\",\r\n \"white-space\": \"pre-line\",\r\n \"text-align\": \"left\"\r\n }}\r\n >\r\n {msg.text}\r\n </div>\r\n </div>\r\n {msg.sender === \"bot\" && (\r\n <div\r\n onMouseEnter={() => handleMouseEnter(msg.id)}\r\n onMouseLeave={() => handleMouseLeave()}\r\n style={{\r\n display: \"flex\",\r\n gap: \"8px\",\r\n \"margin-left\": \"16px\",\r\n height: \"16px\",\r\n opacity: hoveredId() === Number(msg.id) ? 1 : 0,\r\n visibility: hoveredId() === Number(msg.id) ? \"visible\" : \"hidden\",\r\n \"pointer-events\": hoveredId() === Number(msg.id) ? \"auto\" : \"none\",\r\n transition: \"opacity 0.2s\"\r\n }}\r\n >\r\n <button\r\n class=\"feedback-button\"\r\n onClick={() => setFeedbackState(prev => ({ ...prev, [msg.id]: 'like' }))}\r\n >\r\n <img src={feedbackState()[Number(msg.id)] === 'like' ? iconLikeActive : iconLike} />\r\n </button>\r\n <button\r\n class=\"feedback-button\"\r\n onClick={() => setFeedbackState(prev => ({ ...prev, [msg.id]: 'dislike' }))}\r\n >\r\n <img src={feedbackState()[Number(msg.id)] === 'dislike' ? iconDislikeActive : iconDislike} />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n );\r\n }}\r\n </For>\r\n </div >\r\n );\r\n}","import { createEffect, createSignal, JSX } from \"solid-js\";\r\nimport \"./ChatInput.css\";\r\nimport { iconAddItem, iconSend, iconMicrophone, iconSendActive } from \"../../assets/icons/icons\";\r\nimport { ChatInputProps } from \"../../types/chat.types\";\r\n\r\nexport default function ChatInput(props: ChatInputProps) {\r\n let textareaRef: HTMLTextAreaElement | undefined;\r\n const MAX_HEIGHT = 120;\r\n const [isMaxed, setIsMaxed] = createSignal(false);\r\n\r\n function resizeTextarea() {\r\n if (!textareaRef) return;\r\n textareaRef.style.height = \"auto\";\r\n if (!props.input.trim()) {\r\n textareaRef.style.height = \"48px\";\r\n textareaRef.style.overflowY = \"hidden\";\r\n setIsMaxed(false);\r\n props.onHeightChange?.(48);\r\n return;\r\n }\r\n const fullHeight = textareaRef.scrollHeight;\r\n const usedHeight = Math.min(fullHeight, MAX_HEIGHT);\r\n textareaRef.style.height = usedHeight + \"px\";\r\n textareaRef.style.overflowY = fullHeight > MAX_HEIGHT ? \"auto\" : \"hidden\";\r\n setIsMaxed(fullHeight > MAX_HEIGHT);\r\n props.onHeightChange?.(usedHeight);\r\n }\r\n\r\n createEffect(() => {\r\n if (textareaRef) {\r\n resizeTextarea();\r\n }\r\n });\r\n\r\n const handleInput: JSX.EventHandlerUnion<HTMLTextAreaElement, InputEvent> = (e) => {\r\n props.setInput(e.currentTarget.value);\r\n resizeTextarea();\r\n };\r\n\r\n const handleKeyPress: JSX.EventHandlerUnion<HTMLTextAreaElement, KeyboardEvent> = (e) => {\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n props.sendMessage();\r\n setTimeout(() => {\r\n if (textareaRef) {\r\n resizeTextarea();\r\n }\r\n }, 0);\r\n }\r\n };\r\n\r\n return (\r\n <div class=\"chat-input-container\" classList={{ \"is-maxed\": isMaxed() }}>\r\n <div style={{ position: \"relative\", flex: 1, \"min-width\": \"0\" }}>\r\n <img\r\n src={iconAddItem}\r\n style={{\r\n position: \"absolute\",\r\n left: \"18px\",\r\n top: \"50%\",\r\n transform: \"translateY(-60%)\",\r\n width: \"20px\",\r\n height: \"20px\",\r\n cursor: \"pointer\"\r\n }}\r\n />\r\n <textarea\r\n ref={el => (textareaRef = el)}\r\n value={props.input}\r\n onInput={handleInput}\r\n onKeyPress={handleKeyPress}\r\n placeholder=\"Hỏi bất kỳ điều gì...\"\r\n class=\"chat-input-field\"\r\n disabled={props.disabled}\r\n rows={1}\r\n style={{\r\n color: \"#1A1D1F\",\r\n \"padding-left\": \"56px\",\r\n resize: \"none\",\r\n width: \"100%\",\r\n \"max-height\": `${MAX_HEIGHT}px`,\r\n overflow: \"hidden\",\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n right: \"16px\",\r\n top: \"50%\",\r\n transform: \"translateY(-55%)\",\r\n display: \"flex\",\r\n gap: \"12px\",\r\n }}\r\n >\r\n <img\r\n src={iconMicrophone}\r\n style={{\r\n \"margin-top\": \"4px\",\r\n width: \"24px\",\r\n height: \"24px\",\r\n cursor: \"pointer\"\r\n }}\r\n onClick={props.sendMessage}\r\n />\r\n <img\r\n src={props.input.trim() ? iconSendActive : iconSend}\r\n style={{\r\n width: \"32px\",\r\n height: \"32px\",\r\n cursor: \"pointer\"\r\n }}\r\n onClick={props.sendMessage}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}","import \"./Sidebar.css\";\r\nimport { chatIcon, iconSideActive, iconUser, iconTrending, iconNewConversation, iconSearch, iconMenudot, iconClose, iconShrink, iconEdit, iconDelete } from \"../../assets/icons/icons\";\r\nimport { createMemo, createSignal, For, onCleanup, onMount, Show } from \"solid-js\";\r\nimport { SiderbarProps } from \"../../types/chat.types\";\r\n\r\nexport default function Sidebar(props: SiderbarProps) {\r\n const [popoverOpen, setPopoverOpen] = createSignal(false);\r\n const [popoverOpenFor, setPopoverOpenFor] = createSignal<string | null>(null);\r\n const [conversations, setConversations] = createSignal<any[]>([]);\r\n const [searchKeyword, setSearchKeyword] = createSignal(\"\");\r\n const [editingConvId, setEditingConvId] = createSignal<string | null>(null);\r\n const [editName, setEditName] = createSignal(\"\");\r\n let popoverRef: HTMLDivElement | undefined;\r\n let conversationPopoverRefs: { [key: string]: HTMLDivElement | undefined } = {};\r\n\r\n function normalizeText(text: string) {\r\n return text\r\n .toLowerCase()\r\n .normalize(\"NFD\")\r\n .replace(/[\\u0300-\\u036f]/g, \"\")\r\n .replace(/đ/g, \"d\")\r\n .replace(/Đ/g, \"d\");\r\n }\r\n function handleCloseSidebar() {\r\n setEditingConvId(null);\r\n props.onClose();\r\n }\r\n async function reloadConversations() {\r\n if (props.remoteRepo) {\r\n try {\r\n const convs = await props.remoteRepo.listConversationAsync(10);\r\n setConversations(convs || []);\r\n } catch (err) {\r\n console.error(\"Sidebar listConversationAsync error:\", err);\r\n }\r\n }\r\n }\r\n onMount(reloadConversations);\r\n if (props.onReloadConversations) {\r\n props.onReloadConversations(reloadConversations);\r\n }\r\n\r\n const filteredConversations = createMemo(() => {\r\n const keyword = normalizeText(searchKeyword());\r\n if (!keyword) return conversations();\r\n return conversations().filter(conv =>\r\n normalizeText(conv.name || \"\").includes(keyword)\r\n );\r\n });\r\n const conversationListMaxHeight = () => {\r\n if (props.isMobile) return \"calc(90vh - 320px)\";\r\n if (props.fullScreen) return \"calc(90vh - 330px)\";\r\n return \"calc(400px - 220px)\"\r\n };\r\n\r\n onMount(() => {\r\n const handleMouseDownOutside = (e: MouseEvent) => {\r\n if (popoverOpen() && popoverRef && !popoverRef.contains(e.target as Node)) {\r\n setPopoverOpen(false);\r\n }\r\n if (popoverOpenFor() && conversationPopoverRefs[popoverOpenFor()!] && !conversationPopoverRefs[popoverOpenFor()!]?.contains(e.target as Node)) {\r\n setPopoverOpenFor(null);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleMouseDownOutside);\r\n\r\n onCleanup(() => {\r\n document.removeEventListener(\"mousedown\", handleMouseDownOutside);\r\n });\r\n });\r\n\r\n onMount(async () => {\r\n if (props.remoteRepo) {\r\n try {\r\n const convs = await props.remoteRepo.listConversationAsync(10);\r\n setConversations(convs || []);\r\n } catch (err) {\r\n console.error(\"Sidebar listConversationAsync error:\", err);\r\n }\r\n }\r\n });\r\n\r\n return (\r\n <>\r\n {!props.fullScreen && (\r\n <div\r\n class={`sidebar-overlay${props.open ? \" sidebar-overlay--open\" : \"\"}`}\r\n onClick={handleCloseSidebar}\r\n ></div>\r\n )}\r\n <div\r\n class={`sidebar${props.open ? \" sidebar--open\" : \"\"}${props.fullScreen ? \" sidebar--fullscreen\" : \"\"}${props.isMobile ? \" sidebar--mobile\" : \"\"}`}\r\n style={props.isMobile ? { width: \"280px\", height: \"100%\" } : {}}\r\n >\r\n <div class=\"sidebar-header\">\r\n {!props.fullScreen && (\r\n <img\r\n src={iconSideActive}\r\n style={{ width: \"28px\", height: \"28px\", \"margin-right\": \"16px\", cursor: \"pointer\" }}\r\n onClick={handleCloseSidebar}\r\n />\r\n )}\r\n <img src={chatIcon} style={{ width: \"32px\", height: \"32px\", \"margin-right\": \"4px\" }} />\r\n <span style={{ color: \"#1A1D1F\", \"user-select\": \"none\" }}>Ez</span>\r\n <span style={{ color: \"#1AAF74\", \"margin-left\": \"4px\", \"user-select\": \"none\" }}>Advise</span>\r\n {props.fullScreen && (\r\n <div class=\"sidebar-header-actions\">\r\n {/* <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={() => {\r\n if (props.onMobile) props.onMobile();\r\n }}\r\n >\r\n <img src={iconMinimize} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button> */}\r\n <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={() => {\r\n props.onShrink?.();\r\n // if (props.options?.onShrink) props.options.onShrink();\r\n }}\r\n >\r\n <img src={iconShrink} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button>\r\n <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={handleCloseSidebar}\r\n >\r\n <img src={iconClose} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n <div\r\n class=\"sidebar-section\"\r\n tabIndex={0}\r\n >\r\n <img\r\n src={iconUser}\r\n class=\"sidebar-section-icon\"\r\n />\r\n <span class=\"sidebar-section-title\" style={{ color: \"#1A1D1F\" }}>Chân dung nhà đầu tư</span>\r\n </div>\r\n <div\r\n class=\"sidebar-section sidebar-section--no-padding\"\r\n tabIndex={0}\r\n >\r\n <img\r\n src={iconTrending}\r\n class=\"sidebar-section-icon\"\r\n />\r\n <span class=\"sidebar-section-title\" style={{ color: \"#1A1D1F\" }}>Định hướng đầu tư</span>\r\n </div>\r\n <div class=\"sidebar-conversation-row\">\r\n <span style={{ \"font-weight\": 400, \"font-size\": \"14px\", color: \"#858B93\", \"user-select\": \"none\" }}>Hội thoại</span>\r\n <div\r\n class=\"sidebar-conversation-action\"\r\n tabIndex={0}\r\n onClick={() => {\r\n if (props.onNewConversation) props.onNewConversation();\r\n if (!props.fullScreen) handleCloseSidebar();\r\n }}\r\n >\r\n <span style={{ \"font-weight\": 400, \"font-size\": \"14px\", color: \"#858B93\", \"user-select\": \"none\" }}>Hội thoại mới</span>\r\n <img\r\n src={iconNewConversation}\r\n style={{ width: \"20px\", height: \"20px\", \"margin-left\": \"8px\" }}\r\n />\r\n </div>\r\n </div>\r\n <div class=\"sidebar-search-box\">\r\n <img\r\n src={iconSearch}\r\n style={{ width: \"18px\", height: \"18px\", \"margin-right\": \"8px\", opacity: 0.7 }}\r\n />\r\n <input\r\n type=\"text\"\r\n placeholder=\"Tìm kiếm hội thoại\"\r\n value={searchKeyword()}\r\n onInput={e => setSearchKeyword(e.currentTarget.value)}\r\n onChange={e => setSearchKeyword(e.currentTarget.value)}\r\n style={{\r\n color: \"#1A1D1F\"\r\n }}\r\n />\r\n </div>\r\n <div>\r\n {/* <div class=\"sidebar-menu-row\" tabIndex={0} style={{ position: \"relative\" }}>\r\n <span style={{ \"font-weight\": 500, \"font-size\": \"14px\", \"user-select\": \"none\" }}>Khảo sát</span>\r\n <img\r\n src={iconMenudot}\r\n class=\"sidebar-menu-dot\"\r\n style={{ width: \"24px\", height: \"24px\", \"margin-left\": \"8px\", cursor: \"pointer\" }}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setPopoverOpen(!popoverOpen());\r\n }}\r\n onMouseDown={e => e.stopPropagation()}\r\n />\r\n {popoverOpen() && (\r\n <div class=\"sidebar-popover\" ref={el => (popoverRef = el)}>\r\n <div\r\n class=\"sidebar-popover-item\"\r\n onClick={(e: MouseEvent) => {\r\n e.stopPropagation();\r\n setPopoverOpen(false);\r\n // TODO:\r\n }}\r\n >\r\n <img src={iconEdit} style={{ width: \"18px\", height: \"18px\" }} />\r\n Đổi tên\r\n </div>\r\n <div\r\n class=\"sidebar-popover-item\"\r\n onClick={(e: MouseEvent) => {\r\n e.stopPropagation();\r\n setPopoverOpen(false);\r\n // TODO:\r\n }}\r\n >\r\n <img src={iconDelete} style={{ width: \"18px\", height: \"18px\" }} />\r\n Xóa\r\n </div>\r\n </div>\r\n )}\r\n </div> */}\r\n </div>\r\n <div style={{ \"margin-top\": \"15px\" }}>\r\n <Show\r\n when={filteredConversations().length > 0}\r\n fallback={\r\n conversations().length > 0 ? (\r\n <div class=\"sidebar-no-results\" style={{ \"text-align\": \"center\", padding: \"32px 0\" }}>\r\n <img\r\n src=\"data:image/webp;base64,...\"\r\n alt=\"no results\"\r\n style={{ width: \"80px\", height: \"80px\", margin: \"0 auto 12px\" }}\r\n />\r\n <div style={{ color: \"#888\", \"font-size\": \"14px\", \"margin-top\": \"8px\" }}>\r\n Không tìm thấy cuộc hội thoại nào!\r\n </div>\r\n </div>\r\n ) : null\r\n }\r\n >\r\n <div\r\n class=\"sidebar-conversation-list\"\r\n style={{\r\n \"min-height\": conversationListMaxHeight(),\r\n \"max-height\": conversationListMaxHeight(),\r\n \"overflow-y\": \"auto\"\r\n }}\r\n >\r\n <For each={filteredConversations()}>\r\n {(conv) => (\r\n <div\r\n class=\"sidebar-menu-row\"\r\n style={{ cursor: \"pointer\", position: \"relative\" }}\r\n onClick={() => {\r\n props.onLoadMessages?.(conv.id, conv.name);\r\n if (!props.fullScreen) handleCloseSidebar();\r\n }}\r\n >\r\n {editingConvId() === conv.id ? (\r\n <>\r\n <input\r\n class=\"sider-bar-input\"\r\n value={editName()}\r\n onInput={e => setEditName(e.currentTarget.value)}\r\n style={{ color: \"#1A1D1F\" }}\r\n onKeyDown={async (e) => {\r\n if (e.key === \"Enter\") {\r\n if (!editName().trim()) {\r\n console.log(\"Tên không được để trống\");\r\n return;\r\n }\r\n try {\r\n await props.remoteRepo?.updateConversationNameAsync(conv.id, editName().trim());\r\n setEditingConvId(null);\r\n reloadConversations();\r\n } catch (e) {\r\n console.log(\"Error while rename: \", e);\r\n }\r\n }\r\n if (e.key === \"Escape\") {\r\n setEditingConvId(null);\r\n }\r\n }}\r\n onBlur={() => {\r\n setEditingConvId(null);\r\n }}\r\n autofocus\r\n onClick={e => e.stopPropagation()}\r\n />\r\n </>\r\n ) : (\r\n <>\r\n <span style={{ \"font-weight\": 500, \"font-size\": \"15px\", \"user-select\": \"none\", color: \"#1A1D1F\" }}>{conv.name}</span>\r\n <img\r\n src={iconMenudot}\r\n class=\"sidebar-menu-dot\"\r\n style={{ width: \"24px\", height: \"24px\", \"margin-left\": \"8px\" }}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setPopoverOpenFor(popoverOpenFor() === conv.id ? null : conv.id);\r\n }}\r\n onMouseDown={e => e.stopPropagation()}\r\n />\r\n {popoverOpenFor() === conv.id && (\r\n <div class=\"sidebar-popover\" ref={el => (conversationPopoverRefs[conv.id] = el)}>\r\n <div\r\n class=\"sidebar-popover-item\"\r\n onClick={(e: MouseEvent) => {\r\n e.stopPropagation();\r\n setPopoverOpenFor(null);\r\n setEditingConvId(conv.id);\r\n setEditName(conv.name);\r\n }}\r\n >\r\n <img src={iconEdit} style={{ width: \"18px\", height: \"18px\", color: \"#1A1D1F\" }} />\r\n Đổi tên\r\n </div>\r\n <div\r\n class=\"sidebar-popover-item\"\r\n onClick={(e: MouseEvent) => {\r\n e.stopPropagation();\r\n setPopoverOpenFor(null);\r\n props.onDeleteConversation?.(conv);\r\n }}\r\n >\r\n <img src={iconDelete} style={{ width: \"18px\", height: \"18px\", color: \"#1A1D1F\" }} />\r\n Xóa\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </For>\r\n </div>\r\n </Show>\r\n </div >\r\n </div >\r\n </>\r\n );\r\n}","import { JSX } from \"solid-js\";\r\nimport \"./ChatActionButton.css\";\r\n\r\nexport default function ChatActionButton(props: { text: string; onClick?: JSX.EventHandlerUnion<HTMLButtonElement, MouseEvent> }) {\r\n return (\r\n <button class=\"chat-action-btn\" onClick={props.onClick}>\r\n {props.text}\r\n </button>\r\n );\r\n}","import { Component, Show } from \"solid-js\";\r\nimport \"./HeaderSteps.css\";\r\nimport { HeaderStepsProps } from \"../../types/chat.types\";\r\n\r\nconst HeaderSteps: Component<HeaderStepsProps> = (props) => {\r\n const currentStep = () => props.currentStep || 1;\r\n const totalSteps = () => props.totalSteps || 6;\r\n const title = () => props.title;\r\n\r\n return (\r\n <div class=\"header-steps\">\r\n <div class=\"header-steps-title\">\r\n {title()}\r\n </div>\r\n <Show when={props.isSurveyConversation}>\r\n <div class=\"header-steps-container\">\r\n {Array.from({ length: totalSteps() }, (_, i) => (\r\n <>\r\n <div\r\n class={`header-step ${i + 1 <= currentStep() ? \"active\" : \"\"}`}\r\n >\r\n {i + 1}\r\n </div>\r\n {i < totalSteps() - 1 && (\r\n <div class=\"header-step-line\"></div>\r\n )}\r\n </>\r\n ))}\r\n </div>\r\n </Show>\r\n </div>\r\n );\r\n};\r\n\r\nexport default HeaderSteps;","import { $PROXY, $TRACK, getListener, batch, createSignal } from 'solid-js';\n\nconst $RAW = Symbol(\"store-raw\"),\n $NODE = Symbol(\"store-node\"),\n $HAS = Symbol(\"store-has\"),\n $SELF = Symbol(\"store-self\");\nfunction wrap$1(value) {\n let p = value[$PROXY];\n if (!p) {\n Object.defineProperty(value, $PROXY, {\n value: p = new Proxy(value, proxyTraps$1)\n });\n if (!Array.isArray(value)) {\n const keys = Object.keys(value),\n desc = Object.getOwnPropertyDescriptors(value);\n for (let i = 0, l = keys.length; i < l; i++) {\n const prop = keys[i];\n if (desc[prop].get) {\n Object.defineProperty(value, prop, {\n enumerable: desc[prop].enumerable,\n get: desc[prop].get.bind(p)\n });\n }\n }\n }\n }\n return p;\n}\nfunction isWrappable(obj) {\n let proto;\n return obj != null && typeof obj === \"object\" && (obj[$PROXY] || !(proto = Object.getPrototypeOf(obj)) || proto === Object.prototype || Array.isArray(obj));\n}\nfunction unwrap(item, set = new Set()) {\n let result, unwrapped, v, prop;\n if (result = item != null && item[$RAW]) return result;\n if (!isWrappable(item) || set.has(item)) return item;\n if (Array.isArray(item)) {\n if (Object.isFrozen(item)) item = item.slice(0);else set.add(item);\n for (let i = 0, l = item.length; i < l; i++) {\n v = item[i];\n if ((unwrapped = unwrap(v, set)) !== v) item[i] = unwrapped;\n }\n } else {\n if (Object.isFrozen(item)) item = Object.assign({}, item);else set.add(item);\n const keys = Object.keys(item),\n desc = Object.getOwnPropertyDescriptors(item);\n for (let i = 0, l = keys.length; i < l; i++) {\n prop = keys[i];\n if (desc[prop].get) continue;\n v = item[prop];\n if ((unwrapped = unwrap(v, set)) !== v) item[prop] = unwrapped;\n }\n }\n return item;\n}\nfunction getNodes(target, symbol) {\n let nodes = target[symbol];\n if (!nodes) Object.defineProperty(target, symbol, {\n value: nodes = Object.create(null)\n });\n return nodes;\n}\nfunction getNode(nodes, property, value) {\n if (nodes[property]) return nodes[property];\n const [s, set] = createSignal(value, {\n equals: false,\n internal: true\n });\n s.$ = set;\n return nodes[property] = s;\n}\nfunction proxyDescriptor$1(target, property) {\n const desc = Reflect.getOwnPropertyDescriptor(target, property);\n if (!desc || desc.get || !desc.configurable || property === $PROXY || property === $NODE) return desc;\n delete desc.value;\n delete desc.writable;\n desc.get = () => target[$PROXY][property];\n return desc;\n}\nfunction trackSelf(target) {\n getListener() && getNode(getNodes(target, $NODE), $SELF)();\n}\nfunction ownKeys(target) {\n trackSelf(target);\n return Reflect.ownKeys(target);\n}\nconst proxyTraps$1 = {\n get(target, property, receiver) {\n if (property === $RAW) return target;\n if (property === $PROXY) return receiver;\n if (property === $TRACK) {\n trackSelf(target);\n return receiver;\n }\n const nodes = getNodes(target, $NODE);\n const tracked = nodes[property];\n let value = tracked ? tracked() : target[property];\n if (property === $NODE || property === $HAS || property === \"__proto__\") return value;\n if (!tracked) {\n const desc = Object.getOwnPropertyDescriptor(target, property);\n if (getListener() && (typeof value !== \"function\" || target.hasOwnProperty(property)) && !(desc && desc.get)) value = getNode(nodes, property, value)();\n }\n return isWrappable(value) ? wrap$1(value) : value;\n },\n has(target, property) {\n if (property === $RAW || property === $PROXY || property === $TRACK || property === $NODE || property === $HAS || property === \"__proto__\") return true;\n getListener() && getNode(getNodes(target, $HAS), property)();\n return property in target;\n },\n set() {\n return true;\n },\n deleteProperty() {\n return true;\n },\n ownKeys: ownKeys,\n getOwnPropertyDescriptor: proxyDescriptor$1\n};\nfunction setProperty(state, property, value, deleting = false) {\n if (!deleting && state[property] === value) return;\n const prev = state[property],\n len = state.length;\n if (value === undefined) {\n delete state[property];\n if (state[$HAS] && state[$HAS][property] && prev !== undefined) state[$HAS][property].$();\n } else {\n state[property] = value;\n if (state[$HAS] && state[$HAS][property] && prev === undefined) state[$HAS][property].$();\n }\n let nodes = getNodes(state, $NODE),\n node;\n if (node = getNode(nodes, property, prev)) node.$(() => value);\n if (Array.isArray(state) && state.length !== len) {\n for (let i = state.length; i < len; i++) (node = nodes[i]) && node.$();\n (node = getNode(nodes, \"length\", len)) && node.$(state.length);\n }\n (node = nodes[$SELF]) && node.$();\n}\nfunction mergeStoreNode(state, value) {\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n setProperty(state, key, value[key]);\n }\n}\nfunction updateArray(current, next) {\n if (typeof next === \"function\") next = next(current);\n next = unwrap(next);\n if (Array.isArray(next)) {\n if (current === next) return;\n let i = 0,\n len = next.length;\n for (; i < len; i++) {\n const value = next[i];\n if (current[i] !== value) setProperty(current, i, value);\n }\n setProperty(current, \"length\", len);\n } else mergeStoreNode(current, next);\n}\nfunction updatePath(current, path, traversed = []) {\n let part,\n prev = current;\n if (path.length > 1) {\n part = path.shift();\n const partType = typeof part,\n isArray = Array.isArray(current);\n if (Array.isArray(part)) {\n for (let i = 0; i < part.length; i++) {\n updatePath(current, [part[i]].concat(path), traversed);\n }\n return;\n } else if (isArray && partType === \"function\") {\n for (let i = 0; i < current.length; i++) {\n if (part(current[i], i)) updatePath(current, [i].concat(path), traversed);\n }\n return;\n } else if (isArray && partType === \"object\") {\n const {\n from = 0,\n to = current.length - 1,\n by = 1\n } = part;\n for (let i = from; i <= to; i += by) {\n updatePath(current, [i].concat(path), traversed);\n }\n return;\n } else if (path.length > 1) {\n updatePath(current[part], path, [part].concat(traversed));\n return;\n }\n prev = current[part];\n traversed = [part].concat(traversed);\n }\n let value = path[0];\n if (typeof value === \"function\") {\n value = value(prev, traversed);\n if (value === prev) return;\n }\n if (part === undefined && value == undefined) return;\n value = unwrap(value);\n if (part === undefined || isWrappable(prev) && isWrappable(value) && !Array.isArray(value)) {\n mergeStoreNode(prev, value);\n } else setProperty(current, part, value);\n}\nfunction createStore(...[store, options]) {\n const unwrappedStore = unwrap(store || {});\n const isArray = Array.isArray(unwrappedStore);\n const wrappedStore = wrap$1(unwrappedStore);\n function setStore(...args) {\n batch(() => {\n isArray && args.length === 1 ? updateArray(unwrappedStore, args[0]) : updatePath(unwrappedStore, args);\n });\n }\n return [wrappedStore, setStore];\n}\n\nfunction proxyDescriptor(target, property) {\n const desc = Reflect.getOwnPropertyDescriptor(target, property);\n if (!desc || desc.get || desc.set || !desc.configurable || property === $PROXY || property === $NODE) return desc;\n delete desc.value;\n delete desc.writable;\n desc.get = () => target[$PROXY][property];\n desc.set = v => target[$PROXY][property] = v;\n return desc;\n}\nconst proxyTraps = {\n get(target, property, receiver) {\n if (property === $RAW) return target;\n if (property === $PROXY) return receiver;\n if (property === $TRACK) {\n trackSelf(target);\n return receiver;\n }\n const nodes = getNodes(target, $NODE);\n const tracked = nodes[property];\n let value = tracked ? tracked() : target[property];\n if (property === $NODE || property === $HAS || property === \"__proto__\") return value;\n if (!tracked) {\n const desc = Object.getOwnPropertyDescriptor(target, property);\n const isFunction = typeof value === \"function\";\n if (getListener() && (!isFunction || target.hasOwnProperty(property)) && !(desc && desc.get)) value = getNode(nodes, property, value)();else if (value != null && isFunction && value === Array.prototype[property]) {\n return (...args) => batch(() => Array.prototype[property].apply(receiver, args));\n }\n }\n return isWrappable(value) ? wrap(value) : value;\n },\n has(target, property) {\n if (property === $RAW || property === $PROXY || property === $TRACK || property === $NODE || property === $HAS || property === \"__proto__\") return true;\n getListener() && getNode(getNodes(target, $HAS), property)();\n return property in target;\n },\n set(target, property, value) {\n batch(() => setProperty(target, property, unwrap(value)));\n return true;\n },\n deleteProperty(target, property) {\n batch(() => setProperty(target, property, undefined, true));\n return true;\n },\n ownKeys: ownKeys,\n getOwnPropertyDescriptor: proxyDescriptor\n};\nfunction wrap(value) {\n let p = value[$PROXY];\n if (!p) {\n Object.defineProperty(value, $PROXY, {\n value: p = new Proxy(value, proxyTraps)\n });\n const keys = Object.keys(value),\n desc = Object.getOwnPropertyDescriptors(value);\n const proto = Object.getPrototypeOf(value);\n const isClass = proto !== null && value !== null && typeof value === \"object\" && !Array.isArray(value) && proto !== Object.prototype;\n if (isClass) {\n let curProto = proto;\n while (curProto != null) {\n const descriptors = Object.getOwnPropertyDescriptors(curProto);\n keys.push(...Object.keys(descriptors));\n Object.assign(desc, descriptors);\n curProto = Object.getPrototypeOf(curProto);\n }\n }\n for (let i = 0, l = keys.length; i < l; i++) {\n const prop = keys[i];\n if (isClass && prop === \"constructor\") continue;\n if (desc[prop].get) {\n const get = desc[prop].get.bind(p);\n Object.defineProperty(value, prop, {\n get,\n configurable: true\n });\n }\n if (desc[prop].set) {\n const og = desc[prop].set,\n set = v => batch(() => og.call(p, v));\n Object.defineProperty(value, prop, {\n set,\n configurable: true\n });\n }\n }\n }\n return p;\n}\nfunction createMutable(state, options) {\n const unwrappedStore = unwrap(state || {});\n const wrappedStore = wrap(unwrappedStore);\n return wrappedStore;\n}\nfunction modifyMutable(state, modifier) {\n batch(() => modifier(unwrap(state)));\n}\n\nconst $ROOT = Symbol(\"store-root\");\nfunction applyState(target, parent, property, merge, key) {\n const previous = parent[property];\n if (target === previous) return;\n const isArray = Array.isArray(target);\n if (property !== $ROOT && (!isWrappable(target) || !isWrappable(previous) || isArray !== Array.isArray(previous) || key && target[key] !== previous[key])) {\n setProperty(parent, property, target);\n return;\n }\n if (isArray) {\n if (target.length && previous.length && (!merge || key && target[0] && target[0][key] != null)) {\n let i, j, start, end, newEnd, item, newIndicesNext, keyVal;\n for (start = 0, end = Math.min(previous.length, target.length); start < end && (previous[start] === target[start] || key && previous[start] && target[start] && previous[start][key] && previous[start][key] === target[start][key]); start++) {\n applyState(target[start], previous, start, merge, key);\n }\n const temp = new Array(target.length),\n newIndices = new Map();\n for (end = previous.length - 1, newEnd = target.length - 1; end >= start && newEnd >= start && (previous[end] === target[newEnd] || key && previous[end] && target[newEnd] && previous[end][key] && previous[end][key] === target[newEnd][key]); end--, newEnd--) {\n temp[newEnd] = previous[end];\n }\n if (start > newEnd || start > end) {\n for (j = start; j <= newEnd; j++) setProperty(previous, j, target[j]);\n for (; j < target.length; j++) {\n setProperty(previous, j, temp[j]);\n applyState(target[j], previous, j, merge, key);\n }\n if (previous.length > target.length) setProperty(previous, \"length\", target.length);\n return;\n }\n newIndicesNext = new Array(newEnd + 1);\n for (j = newEnd; j >= start; j--) {\n item = target[j];\n keyVal = key && item ? item[key] : item;\n i = newIndices.get(keyVal);\n newIndicesNext[j] = i === undefined ? -1 : i;\n newIndices.set(keyVal, j);\n }\n for (i = start; i <= end; i++) {\n item = previous[i];\n keyVal = key && item ? item[key] : item;\n j = newIndices.get(keyVal);\n if (j !== undefined && j !== -1) {\n temp[j] = previous[i];\n j = newIndicesNext[j];\n newIndices.set(keyVal, j);\n }\n }\n for (j = start; j < target.length; j++) {\n if (j in temp) {\n setProperty(previous, j, temp[j]);\n applyState(target[j], previous, j, merge, key);\n } else setProperty(previous, j, target[j]);\n }\n } else {\n for (let i = 0, len = target.length; i < len; i++) {\n applyState(target[i], previous, i, merge, key);\n }\n }\n if (previous.length > target.length) setProperty(previous, \"length\", target.length);\n return;\n }\n const targetKeys = Object.keys(target);\n for (let i = 0, len = targetKeys.length; i < len; i++) {\n applyState(target[targetKeys[i]], previous, targetKeys[i], merge, key);\n }\n const previousKeys = Object.keys(previous);\n for (let i = 0, len = previousKeys.length; i < len; i++) {\n if (target[previousKeys[i]] === undefined) setProperty(previous, previousKeys[i], undefined);\n }\n}\nfunction reconcile(value, options = {}) {\n const {\n merge,\n key = \"id\"\n } = options,\n v = unwrap(value);\n return state => {\n if (!isWrappable(state) || !isWrappable(v)) return v;\n const res = applyState(v, {\n [$ROOT]: state\n }, $ROOT, merge, key);\n return res === undefined ? state : res;\n };\n}\nconst producers = new WeakMap();\nconst setterTraps = {\n get(target, property) {\n if (property === $RAW) return target;\n const value = target[property];\n let proxy;\n return isWrappable(value) ? producers.get(value) || (producers.set(value, proxy = new Proxy(value, setterTraps)), proxy) : value;\n },\n set(target, property, value) {\n setProperty(target, property, unwrap(value));\n return true;\n },\n deleteProperty(target, property) {\n setProperty(target, property, undefined, true);\n return true;\n }\n};\nfunction produce(fn) {\n return state => {\n if (isWrappable(state)) {\n let proxy;\n if (!(proxy = producers.get(state))) {\n producers.set(state, proxy = new Proxy(state, setterTraps));\n }\n fn(proxy);\n }\n return state;\n };\n}\n\nconst DEV = undefined;\n\nexport { $RAW, DEV, createMutable, createStore, modifyMutable, produce, reconcile, unwrap };\n","export const DEFAULT_TOP = 30\r\nexport const DRAFT_ID = 'draft'\r\nexport const SURVEY_SUFFIX = '~SURVEY'\r\nexport const USER_SURVEY_ID = `me${SURVEY_SUFFIX}`\r\nexport const DEFAULT_AVATAR = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMCAwaDI0djI0SDB6Ii8+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yIDEyQzIgNi40NzcgNi40NzcgMiAxMiAyczEwIDQuNDc3IDEwIDEwLTQuNDc3IDEwLTEwIDEwUzIgMTcuNTIzIDIgMTJ6bTEwLTZhNCA0IDAgMSAwIDAgOCA0IDQgMCAwIDAgMC04em01LjExMSA5Ljk5N2MuNzU4LjQ4OC43MjEgMS41NTIuMDMxIDIuMTMyQTcuOTY4IDcuOTY4IDAgMCAxIDEyIDIwYTcuOTY3IDcuOTY3IDAgMCAxLTUuMTE0LTEuODQ4Yy0uNjk3LS41OC0uNzM0LTEuNjQ5LjAyOC0yLjE0LjIzNi0uMTUzLjQ5NC0uMjg3Ljc3NC0uNDAyQzguODE1IDE1LjE0NSAxMC4yNTQgMTUgMTIgMTVjMS43NTUgMCAzLjIwMi4xMzYgNC4zMzEuNTk1LjI4My4xMTUuNTQyLjI1Ljc4LjQwMnoiIGZpbGw9IiM2MTYxNjEiLz48L3N2Zz4=\";","import { Message } from \"./model\";\r\n\r\nexport function formatDate(date: Date, format: string): string {\r\n const formatTokens: { [key: string]: (date: Date) => string } = {\r\n 'dd': (date) => ('0' + date.getDate()).slice(-2),\r\n 'd': (date) => date.getDate().toString(),\r\n 'MM': (date) => ('0' + (date.getMonth() + 1)).slice(-2),\r\n 'M': (date) => (date.getMonth() + 1).toString(),\r\n 'yyyy': (date) => date.getFullYear().toString(),\r\n 'yy': (date) => date.getFullYear().toString().slice(-2),\r\n 'HH': (date) => ('0' + date.getHours()).slice(-2),\r\n 'H': (date) => date.getHours().toString(),\r\n 'hh': (date) => ('0' + (date.getHours() % 12 || 12)).slice(-2),\r\n 'h': (date) => (date.getHours() % 12 || 12).toString(),\r\n 'mm': (date) => ('0' + date.getMinutes()).slice(-2),\r\n 'm': (date) => date.getMinutes().toString(),\r\n 'ss': (date) => ('0' + date.getSeconds()).slice(-2),\r\n 's': (date) => date.getSeconds().toString(),\r\n 'fff': (date) => ('00' + date.getMilliseconds()).slice(-3),\r\n 'ff': (date) => ('0' + Math.floor(date.getMilliseconds() / 10)).slice(-2),\r\n 'f': (date) => Math.floor(date.getMilliseconds() / 100).toString(),\r\n 'tt': (date) => date.getHours() >= 12 ? 'PM' : 'AM',\r\n 't': (date) => date.getHours() >= 12 ? 'P' : 'A',\r\n };\r\n\r\n const tokens = Object.keys(formatTokens).sort((a, b) => b.length - a.length);\r\n const tokenRegex = new RegExp(tokens.join('|'), 'g');\r\n\r\n return format.replace(tokenRegex, (match) => formatTokens[match](date));\r\n}\r\n\r\nexport function generateGuid(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n\r\nexport function compareObjectIds(id1: string, id2: string) {\r\n if (id1.length !== 24 || id2.length !== 24) throw new Error(\"Invalid ObjectId length\");\r\n\r\n const parts = [\r\n { name: \"timestamp\", start: 0, end: 8 },\r\n { name: \"machine\", start: 8, end: 14 },\r\n { name: \"process\", start: 14, end: 18 },\r\n { name: \"counter\", start: 18, end: 24 }\r\n ];\r\n\r\n for (let part of parts) {\r\n const value1 = id1.substring(part.start, part.end);\r\n const value2 = id2.substring(part.start, part.end);\r\n if (value1 < value2) {\r\n return -1;\r\n } else if (value1 > value2) {\r\n return 1;\r\n }\r\n }\r\n\r\n return 0;\r\n}\r\n\r\nconst IMAGE_ICON = '<svg viewBox=\"0 0 24 24\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"/></svg>';\r\nconst VIDEO_ICON = '<svg viewBox=\"0 0 24 24\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"m9 8 6 4-6 4Z\"/></svg>';\r\nconst AUDIO_ICON = '<svg viewBox=\"0 0 24 24\"><path d=\"M10.5 22H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v8.4\"/><path d=\"M8 18v-7.7L16 9v7\"/><circle cx=\"14\" cy=\"16\" r=\"2\"/><circle cx=\"6\" cy=\"18\" r=\"2\"/></svg>'\r\nconst FILE_ICON = '<svg viewBox=\"0 0 24 24\"><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"/></svg>'\r\n\r\nfunction getFileIcon(contentType?: string) {\r\n if (!contentType) return FILE_ICON;\r\n if (contentType.startsWith(\"image/\")) return IMAGE_ICON;\r\n if (contentType.startsWith(\"video/\")) return VIDEO_ICON;\r\n if (contentType.startsWith(\"audio/\")) return AUDIO_ICON;\r\n return FILE_ICON;\r\n}\r\n\r\nexport function getMessageTextPlainContent(message?: Message, showFileName?: boolean): string {\r\n if (!message) return '';\r\n if (message.deleted || !message.body) return 'Tin nhắn đã bị thu hồi';\r\n\r\n const { type: bodyType, content, children, files } = message.body;\r\n\r\n const { items: choiceItems, submitted: isChoiceSubmitted } = message.body.choice || {};\r\n const { items: rankingItems, submitted: isRankingSubmitted } = message.body.ranking || {};\r\n const { submitted: isFormSubmitted } = message.body.form || {};\r\n const { isRange, submitted, type: notiType } = message.body.metadata || {};\r\n const contentEl = document.createElement('div');\r\n contentEl.innerHTML = content || '';\r\n const textPlainContent = contentEl.innerText;\r\n\r\n const defaultMessages: Record<string, string | (() => string)> = {\r\n 'TEXT_INPUT': 'Hãy nhập một tin nhắn.',\r\n 'NUMBER_INPUT': 'Hãy nhập một số.',\r\n 'PHONE_NUMBER_INPUT': 'Hãy nhập một số điện thoại.',\r\n 'EMAIL_INPUT': 'Hãy nhập một địa chỉ email.',\r\n 'URL_INPUT': 'Hãy nhập một url.',\r\n 'DATE_INPUT': () => {\r\n if (!submitted) return isRange ? 'Hãy chọn một khoảng thời gian' : 'Hãy chọn một thời điểm'\r\n else return isRange ? 'Đã chọn một khoảng thời gian' : 'Đã chọn một thời điểm';\r\n },\r\n };\r\n\r\n switch (bodyType) {\r\n case 'MULTIPLE':\r\n if (Array.isArray(children)) {\r\n return children.map(child => getMessageTextPlainContent({\r\n sender: message.sender, body: child,\r\n id: message.id, conversationId: message.conversationId, sentAt: message.sentAt\r\n }, showFileName)).join(' ');\r\n }\r\n return '';\r\n\r\n case 'CHOICE':\r\n if (Array.isArray(choiceItems)) {\r\n if (!isChoiceSubmitted) {\r\n return choiceItems.map(item => item.label || item.value).join(' ');\r\n } else {\r\n return choiceItems.filter(item => item.selected).map(item => item.label || item.value).join(', ');\r\n }\r\n }\r\n return '';\r\n\r\n case 'RANKING':\r\n if (Array.isArray(rankingItems)) {\r\n if (!isRankingSubmitted) {\r\n return rankingItems.map(item => item.label || item.value).join(' ');\r\n } else {\r\n return rankingItems.filter(item => item.rank && item.rank > 0).map(item => item.label || item.value).join(', ');\r\n }\r\n }\r\n return '';\r\n\r\n case 'FORM':\r\n if(isFormSubmitted) return 'Bạn đã submit form';\r\n else return 'Hãy điền vào form sau';\r\n\r\n case 'NOTIFICATION':\r\n return notiType == 'MEMBERS_ADDED' ? 'Người dùng đã tham gia cuộc hội thoại'\r\n : notiType == 'MEMBERS_REMOVED' ? 'Người dùng đã rời khỏi cuộc hội thoại' : 'Thông báo';\r\n\r\n case 'NORMAL':\r\n if (files && Array.isArray(files) && files.length > 0) {\r\n return textPlainContent + files.map(file => ` ${showFileName ? '' : getFileIcon(file.contentType) + ' '}${showFileName ? file.name : ''}`).join('');\r\n }\r\n return textPlainContent;\r\n\r\n default:\r\n if (defaultMessages[bodyType]) {\r\n const defaultContent =\r\n typeof defaultMessages[bodyType] === 'function'\r\n ? defaultMessages[bodyType]()\r\n : defaultMessages[bodyType];\r\n return textPlainContent || defaultContent;\r\n }\r\n return '';\r\n }\r\n}\r\n\r\nconst VIETNAMESE_CHARS = \"ÀÁÃẢẠĂẰẮẲẴẶÂẦẤẨẪẬÈÉẺẼẸÊỀẾỂỄỆĐÙÚỦŨỤƯỪỨỬỮỰÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢÌÍỈĨỊÄËÏÎÖÜÛÑÇÝỲỸỴỶ\";\r\nconst ALPHABET_CHARS = \"AAAAAAAAAAAAAAAAAEEEEEEEEEEEDUUUUUUUUUUUOOOOOOOOOOOOOOOOOIIIIIAEIIOUUNCYYYYY\";\r\n\r\nlet _charMap: Map<string, string> | null = null;\r\n\r\nfunction getCharMap(): Map<string, string> {\r\n if (!_charMap) {\r\n _charMap = new Map<string, string>();\r\n for (let i = 0; i < VIETNAMESE_CHARS.length; i++) {\r\n _charMap.set(VIETNAMESE_CHARS[i], ALPHABET_CHARS[i]);\r\n }\r\n }\r\n return _charMap;\r\n}\r\n\r\n/**\r\n * Chuẩn hóa chuỗi: loại bỏ dấu Tiếng Việt, chuyển uppercase và trim khoảng trắng\r\n * @param input Chuỗi đầu vào\r\n * @returns Chuỗi đã chuẩn hóa\r\n */\r\nexport function normalize(input: string): string {\r\n if (!input || !input.trim()) {\r\n return input;\r\n }\r\n\r\n const trimmed = input.trim().toUpperCase();\r\n const map = getCharMap();\r\n let result = \"\";\r\n\r\n for (const ch of trimmed) {\r\n result += map.has(ch) ? map.get(ch) : ch;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function toPlainText(html: string): string {\r\n if (!html) {\r\n return html;\r\n }\r\n\r\n try {\r\n // 1. Thay nhiều khoảng trắng, tab, newline thành một khoảng trắng\r\n let result = html.replace(/\\s+/g, ' ');\r\n\r\n // 2. Loại bỏ <head>, <script>, <style> và nội dung bên trong\r\n result = result.replace(/<head[^>]*>.*?<\\/head>/gi, '');\r\n result = result.replace(/<script[^>]*>.*?<\\/script>/gi, '');\r\n result = result.replace(/<style[^>]*>.*?<\\/style>/gi, '');\r\n\r\n // 3. Thay <br> và <li> thành xuống dòng (\\r)\r\n result = result.replace(/<br\\s*\\/?>|<li\\s*\\/?>/gi, '\\r');\r\n\r\n // 4. Thay <p>, <div>, <tr> thành đôi xuống dòng\r\n result = result.replace(/<p\\s*\\/?>|<div\\s*\\/?>|<tr\\s*\\/?>/gi, '\\r\\r');\r\n\r\n // 5. Thay <td> thành tab\r\n result = result.replace(/<td\\s*\\/?>/gi, '\\t');\r\n\r\n // 6. Loại bỏ tất cả thẻ HTML còn lại\r\n result = result.replace(/<[^>]*>/g, '');\r\n\r\n // 7. Loại bỏ các HTML entity như &nbsp;, &amp;, …\r\n result = result.replace(/&(.{2,6});/gi, ' ');\r\n\r\n // 8. Chuẩn hóa khoảng trắng một lần nữa\r\n result = result.replace(/\\s+/g, ' ');\r\n\r\n // 9. Thay các ký tự đặc biệt\r\n result = result\r\n .replace(/•/g, ' * ')\r\n .replace(/‹/g, '<')\r\n .replace(/›/g, '>')\r\n .replace(/™/g, '(tm)')\r\n .replace(/⁄/g, '/')\r\n .replace(/©/g, '(c)')\r\n .replace(/®/g, '(r)');\r\n\r\n // 10. Đồng nhất xuống dòng\r\n result = result.replace(/\\n/g, '\\r');\r\n\r\n // 11. Nén nhiều dòng xuống còn hai và nhiều tab xuống còn hai\r\n result = result.replace(/(\\r\\s*){2,}/g, '\\r\\r');\r\n result = result.replace(/(\\t\\s*){2,}/g, '\\t\\t');\r\n\r\n return result.trim();\r\n } catch {\r\n // Nếu có lỗi bất ngờ, trả về chuỗi rỗng\r\n return '';\r\n }\r\n}\r\n\r\n\r\nexport function processAndHighlight(str1: string, str2: string) {\r\n const MAX_FINAL_LENGTH = 90;\r\n const MAX_INPUT_LENGTH = 20;\r\n const ELLIPSIS = \"...\";\r\n const ELLIPSIS_LENGTH = ELLIPSIS.length; // 3\r\n\r\n // Hàm helper để rút gọn chuỗi từ cuối, thêm \"...\" nếu cần\r\n function truncateStringFromEnd(text: string, maxLength: number) {\r\n if (text.length <= maxLength) {\r\n return text;\r\n }\r\n // Đảm bảo có đủ chỗ cho dấu \"...\"\r\n if (maxLength < ELLIPSIS_LENGTH) {\r\n return text.substring(0, maxLength); // Không đủ chỗ cho \"...\", chỉ cắt\r\n }\r\n return text.substring(0, maxLength - ELLIPSIS_LENGTH) + ELLIPSIS;\r\n }\r\n\r\n // str2 = toPlainText(str2);\r\n\r\n // Điều kiện 1: Nếu chuỗi 1 có độ dài bé hơn MAX_INPUT_LENGTH (và không rỗng)\r\n if (str1.length < MAX_INPUT_LENGTH && str1.length > 0) {\r\n const lowerStr2 = normalize(str2);\r\n const lowerStr1 = normalize(str1);\r\n const foundIndex = lowerStr2.indexOf(lowerStr1);\r\n\r\n // Nếu tìm thấy chuỗi 1 trong chuỗi 2\r\n if (foundIndex !== -1) {\r\n const originalFoundText = str2.substring(foundIndex, foundIndex + str1.length);\r\n const highlightedSegment = `<mark>${originalFoundText}</mark>`;\r\n\r\n // Độ dài tối đa của originalFoundText là 19 (do str1.length < MAX_INPUT_LENGTH).\r\n // Vậy highlightedSegment có độ dài tối đa là 19 (text) + 7 (cho <mark>) + 6 (cho </mark>) = 32 ký tự.\r\n // Luôn nhỏ hơn MAX_FINAL_LENGTH (40), nên không cần cắt chính highlightedSegment.\r\n\r\n const preText = str2.substring(0, foundIndex);\r\n const postText = str2.substring(foundIndex + originalFoundText.length);\r\n\r\n let currentLength = highlightedSegment.length;\r\n let prefixCandidate = \"\";\r\n let suffixCandidate = \"\";\r\n\r\n // Tính toán phần văn bản phía trước (prefix)\r\n if (preText.length > 0) {\r\n // Ngân sách cho prefix, cố gắng giữ phần highlight ở giữa\r\n let budgetForPrefix = Math.floor((MAX_FINAL_LENGTH - currentLength) / 2);\r\n\r\n if (preText.length <= budgetForPrefix) {\r\n prefixCandidate = preText;\r\n } else { // preText dài hơn ngân sách cho nó\r\n if (budgetForPrefix >= ELLIPSIS_LENGTH) {\r\n prefixCandidate = ELLIPSIS + preText.substring(preText.length - (budgetForPrefix - ELLIPSIS_LENGTH));\r\n } else if (budgetForPrefix > 0) { // Không đủ cho \"...\" nhưng đủ cho một ít text\r\n prefixCandidate = preText.substring(preText.length - budgetForPrefix);\r\n }\r\n // Nếu budgetForPrefix là 0, prefixCandidate giữ nguyên là \"\"\r\n }\r\n }\r\n currentLength += prefixCandidate.length;\r\n\r\n // Tính toán phần văn bản phía sau (suffix)\r\n if (postText.length > 0) {\r\n // Ngân sách còn lại cho suffix\r\n let budgetForSuffix = MAX_FINAL_LENGTH - currentLength;\r\n\r\n if (postText.length <= budgetForSuffix) {\r\n suffixCandidate = postText;\r\n } else { // postText dài hơn ngân sách cho nó\r\n if (budgetForSuffix >= ELLIPSIS_LENGTH) {\r\n suffixCandidate = postText.substring(0, budgetForSuffix - ELLIPSIS_LENGTH) + ELLIPSIS;\r\n } else if (budgetForSuffix > 0) { // Không đủ cho \"...\" nhưng đủ cho một ít text\r\n suffixCandidate = postText.substring(0, budgetForSuffix);\r\n }\r\n // Nếu budgetForSuffix là 0, suffixCandidate giữ nguyên là \"\"\r\n }\r\n }\r\n\r\n return prefixCandidate + highlightedSegment + suffixCandidate;\r\n\r\n } else {\r\n // Không tìm thấy chuỗi 1 trong chuỗi 2, rút gọn chuỗi 2 từ cuối\r\n return truncateStringFromEnd(str2, MAX_FINAL_LENGTH);\r\n }\r\n } else {\r\n // Điều kiện 2: Nếu chuỗi 1 có độ dài >= MAX_INPUT_LENGTH hoặc chuỗi 1 rỗng\r\n // Trả về chuỗi 2 dạng rút gọn cắt bớt phần đuôi\r\n return truncateStringFromEnd(str2, MAX_FINAL_LENGTH);\r\n }\r\n}","import { createContext, createSignal, ParentComponent, Setter, useContext } from \"solid-js\";\r\nimport { createStore, produce } from \"solid-js/store\";\r\nimport { CurrentMessage, MessageLoadingStatus, PopupContextType, PopupProviderProps } from \"./context-types\";\r\nimport { ChatType, Conversation, Message } from \"../utils/model\";\r\nimport { DEFAULT_TOP, USER_SURVEY_ID } from \"../utils/constants\";\r\nimport { generateGuid } from \"../utils/utils\";\r\n\r\nconst PopupContext = createContext<PopupContextType>();\r\n\r\nexport const PopupProvider: ParentComponent<PopupProviderProps> = props => {\r\n // Trạng thái đóng mở panel\r\n const [getPopupState, setPopupState] = createSignal(false);\r\n\r\n // Trạng thái mở panel full màn hình hay không\r\n const [getFullscreenState, setFullscreenState] = createSignal(false)\r\n\r\n // Trạng thái đóng mở sidebar\r\n const [getSidebarState, setSidebarState] = createSignal(false)\r\n\r\n // Trạng thái footer sendbox\r\n const [getFooterSendBoxState, setFooterSendBoxState] = createSignal(false)\r\n\r\n // Cuộc hội thoại hiện tại đang được mở\r\n const [getCurrentConversation, setCurrentConversation] = createSignal<Conversation>()\r\n\r\n // Message cuối cùng của cuộc hội thoại hiện tại\r\n const [getLastMessage, setLastMessage] = createSignal<Message>();\r\n\r\n // Store lưu lại danh sách các cuộc hội thoại đang hiển thị\r\n const [conversations, setConversations] = createStore<Array<Conversation>>([])\r\n\r\n const [getPanelElement, setPanelElement] = createSignal<HTMLElement>();\r\n\r\n // Store lưu lại các messages của cuộc hội thoại hiện tại\r\n const [messages, setMessages] = createStore<Array<Message>>([])\r\n\r\n const [getCurrentMessage, setCurrentMessage] = createSignal<CurrentMessage>();\r\n\r\n const [getCurrentQuotedMessage, setCurrentQuotedMessage] = createSignal<Message>();\r\n\r\n const [getMessageLoadingStatus, setMessageLoadingStatus] = createSignal<MessageLoadingStatus>({})\r\n\r\n const [getCurrentChatType, setCurrentChatType] = createSignal<ChatType>();\r\n\r\n const [getTitle, setTitle] = createSignal<string>();\r\n\r\n const globalToggler = new Map<string, Setter<boolean>>();\r\n\r\n const remoteRepository = props.remoteRepository;\r\n\r\n props.exportMethods.appendConversation = (conversation: Conversation) => {\r\n if (!conversation.traceId) {\r\n setConversations(produce(convs => {\r\n convs.unshift(conversation);\r\n }));\r\n } else {\r\n const currentConversation = getCurrentConversation();\r\n if (currentConversation && currentConversation.id === conversation.traceId) {\r\n setMessageLoadingStatus({ hasNewer: false, hasOlder: false });\r\n setCurrentConversation(conversation);\r\n }\r\n setConversations(produce(convs => {\r\n let index = convs.findIndex(c => c.id === conversation.traceId);\r\n if (index >= 0) {\r\n convs[index].id = conversation.id;\r\n convs[index].creating = false;\r\n } else {\r\n index = convs.findIndex(c => c.id === conversation.id);\r\n if (index < 0) convs.unshift(conversation);\r\n }\r\n }));\r\n }\r\n }\r\n\r\n props.exportMethods.appendMessage = (message: Message) => {\r\n // console.log(\"appendMessage called with:\", message.id, message.conversationId, message.sender);\r\n const currentConversation = getCurrentConversation();\r\n // console.log(\"currentConversation.id:\", currentConversation?.id);\r\n if (currentConversation && currentConversation.id == message.conversationId) {\r\n // console.log(\"Appending message to store\");\r\n if (!message.traceId) {\r\n setMessages(produce(msgs => {\r\n msgs.push(message);\r\n }));\r\n } else {\r\n setMessages(produce(msgs => {\r\n let index = msgs.findIndex(c => c.id === message.traceId);\r\n if (index >= 0) {\r\n msgs[index].id = message.id;\r\n msgs[index].mentions = message.mentions;\r\n msgs[index].sending = false;\r\n } else {\r\n index = msgs.findIndex(c => c.id === message.id);\r\n if (index < 0) msgs.push(message);\r\n }\r\n }));\r\n }\r\n const currentMessage = getCurrentMessage();\r\n if (!currentMessage || (currentMessage && currentMessage.messageId != message.id)) {\r\n setCurrentMessage({\r\n messageId: message.id,\r\n highlight: false\r\n });\r\n }\r\n }\r\n const convIndex = conversations.findIndex(c => c.id === message.conversationId);\r\n if (convIndex >= 0) {\r\n setConversations(produce(convs => {\r\n const conv = convs[convIndex];\r\n conv.updatedAt = message.sentAt;\r\n conv.lastMessage = message;\r\n convs.splice(convIndex, 1);\r\n convs.unshift(conv);\r\n }));\r\n } else {\r\n // console.log(\"Not appending: conversation not match\");\r\n remoteRepository.getConversationAsync(message.conversationId).then((conv) => {\r\n if (!conv) return;\r\n setConversations(produce(convs => {\r\n conv.updatedAt = message.sentAt || new Date();\r\n conv.lastMessage = message;\r\n convs.unshift(conv);\r\n }));\r\n })\r\n }\r\n setLastMessage(message);\r\n }\r\n\r\n props.exportMethods.updateMessage = (message: Message) => {\r\n setMessages(produce(msgs => {\r\n const index = msgs.findIndex(m => m.id === message.id);\r\n if (index >= 0) {\r\n const oldMsg = msgs[index];\r\n message.sentAt = oldMsg.sentAt;\r\n msgs[index] = message;\r\n }\r\n }));\r\n setConversations(produce(convs => {\r\n const convIndex = convs.findIndex(c => c.id === message.conversationId);\r\n if (convIndex >= 0) {\r\n const conv = convs[convIndex];\r\n conv.updatedAt = message.sentAt;\r\n if (conv.lastMessage && conv.lastMessage.id === message.id) {\r\n conv.lastMessage = message;\r\n }\r\n }\r\n }));\r\n if (getLastMessage()?.id == message.id) setLastMessage(message);\r\n };\r\n\r\n props.exportMethods.deleteMessage = (message: Message) => {\r\n setMessages(produce(msgs => {\r\n const index = msgs.findIndex(m => m.id === message.id);\r\n if (index >= 0) {\r\n msgs[index].deleted = true;\r\n msgs[index].body = undefined;\r\n }\r\n }));\r\n setConversations(produce(convs => {\r\n const convIndex = convs.findIndex(c => c.id === message.conversationId);\r\n if (convIndex >= 0) {\r\n const conv = convs[convIndex];\r\n if (conv.lastMessage && conv.lastMessage.id === message.id) {\r\n conv.lastMessage = {\r\n ...conv.lastMessage,\r\n deleted: true,\r\n body: undefined\r\n }\r\n }\r\n }\r\n }));\r\n }\r\n\r\n function toggleEl(id: string, isClose?: boolean) {\r\n const setter = globalToggler.get(id);\r\n if (setter) {\r\n if (isClose) {\r\n setter(false);\r\n } else if (isClose === false) {\r\n setter(true);\r\n } else {\r\n setter(prev => !prev);\r\n }\r\n }\r\n }\r\n\r\n function toggleLoader(id: string, isClose?: boolean) {\r\n const loaderId = `cp-loader-${id}`;\r\n toggleEl(loaderId, isClose);\r\n }\r\n\r\n function registerLoader(id: string, setter: Setter<boolean>) {\r\n const loaderId = `cp-loader-${id}`;\r\n globalToggler.set(loaderId, setter);\r\n }\r\n\r\n function toggleDrawer(id: string, isClose?: boolean) {\r\n const panelElement = getPanelElement();\r\n if (!panelElement) return;\r\n const drawerId = `cp-drawer-${id}`;\r\n toggleEl(drawerId, isClose);\r\n }\r\n\r\n function registerDrawer(id: string, setter: Setter<boolean>) {\r\n const drawerId = `cp-drawer-${id}`;\r\n globalToggler.set(drawerId, setter);\r\n }\r\n\r\n props.exportMethods.deleteConversation = deleteConversationFromLocal;\r\n\r\n props.exportMethods.updateConversationName = updateConversationNameFromLocal;\r\n\r\n function updateConversationNameFromLocal(conversationId: string, newName: string) {\r\n setConversations(produce(conv => {\r\n const index = conv.findIndex(c => c.id === conversationId);\r\n if (index >= 0) {\r\n conv[index].name = newName;\r\n }\r\n }));\r\n const currentConversation = getCurrentConversation();\r\n if (currentConversation && currentConversation.id === conversationId) {\r\n setCurrentConversation({\r\n ...currentConversation,\r\n name: newName\r\n });\r\n }\r\n }\r\n\r\n function deleteConversationFromLocal(conversationId: string) {\r\n if (getCurrentConversation()?.id === conversationId) {\r\n setCurrentConversationState(undefined);\r\n }\r\n setConversations(produce(conv => {\r\n const index = conv.findIndex(c => c.id === conversationId);\r\n if (index >= 0) {\r\n conv.splice(index, 1);\r\n }\r\n }));\r\n }\r\n\r\n function setCurrentConversationState(conversation: Conversation | string | undefined, isNew?: boolean) {\r\n setMessages([]);\r\n let conv: Conversation | undefined;\r\n if (typeof conversation == \"string\") {\r\n const convIndex = conversations.findIndex(c => c.id === conversation);\r\n if (convIndex >= 0) conv = conversations[convIndex];\r\n else {\r\n remoteRepository.getConversationAsync(conversation).then((c) => {\r\n if (c) {\r\n if (!isNew) {\r\n setMessageLoadingStatus(prev => ({ ...prev, hasOlder: true }));\r\n } else {\r\n setMessageLoadingStatus({ hasNewer: false, hasOlder: false });\r\n }\r\n setCurrentConversation({\r\n ...c\r\n });\r\n setTitle(c.name);\r\n } else setCurrentConversation(undefined);\r\n })\r\n }\r\n } else conv = conversation;\r\n if (conv) {\r\n if (!isNew) {\r\n setMessageLoadingStatus(prev => ({ ...prev, hasOlder: true }));\r\n } else {\r\n setMessageLoadingStatus({ hasNewer: false, hasOlder: false });\r\n }\r\n setCurrentConversation({\r\n ...conv\r\n });\r\n setTitle(conv.name);\r\n } else setCurrentConversation(undefined);\r\n }\r\n\r\n async function listConversationsAsync(top?: number, type?: string) {\r\n const convs = await remoteRepository.listConversationAsync(top, type);\r\n setConversations(convs);\r\n return conversations;\r\n }\r\n\r\n async function pinConversationAsync(conversationId: string, isPinned: boolean) {\r\n setConversations(produce(convs => {\r\n const index = convs.findIndex(c => c.id === conversationId);\r\n if (index >= 0) {\r\n const conv = convs[index];\r\n conv.isPinned = isPinned;\r\n convs.splice(index, 1);\r\n convs.unshift(conv);\r\n }\r\n }));\r\n await remoteRepository.pinConversationAsync(conversationId, isPinned);\r\n return true;\r\n }\r\n\r\n async function createConversationAsync(conversation: Conversation, beforeCreateRemoteConversation?: any) {\r\n // Cuộc hội thoại không có sẵn id là cuộc hội thoại tạm thời sẽ chưa được tạo ngay mà phải chờ tin nhắn đầu tiên được gửi thì mới tạo\r\n if (conversation.id) {\r\n conversation.traceId = conversation.id;\r\n conversation.creating = true;\r\n setConversations(produce(convs => {\r\n convs.unshift(conversation);\r\n }));\r\n setCurrentConversationState(conversation, true);\r\n if (beforeCreateRemoteConversation) {\r\n beforeCreateRemoteConversation();\r\n }\r\n return remoteRepository.createConversationAsync(conversation);\r\n } else {\r\n setCurrentConversationState(conversation, true);\r\n }\r\n return conversation;\r\n }\r\n\r\n async function updateConversationNameAsync(conversationId: string, newName: string) {\r\n updateConversationNameFromLocal(conversationId, newName);\r\n await remoteRepository.updateConversationNameAsync(conversationId, newName);\r\n return true;\r\n }\r\n\r\n async function deleteConversationAsync(conversationId: string) {\r\n deleteConversationFromLocal(conversationId);\r\n await remoteRepository.deleteConversationAsync(conversationId);\r\n return true;\r\n }\r\n\r\n async function listMessagesAsync(direction?: string, fromMessageId?: string, top?: number) {\r\n const currentConversation = getCurrentConversation();\r\n const conversationId = currentConversation?.id;\r\n const convId = conversationId || currentConversation?.id;\r\n if (!convId) {\r\n return messages;\r\n }\r\n if (!conversationId) return messages;\r\n if (direction) {\r\n direction = direction.toUpperCase();\r\n if (direction != \"BEFORE\" && direction != \"AFTER\") direction = \"BEFORE\";\r\n } else direction = \"BEFORE\";\r\n const topRs = top || DEFAULT_TOP;\r\n if (!direction) {\r\n const remoteMsgs = await remoteRepository.listMessagesAsync(convId, undefined, undefined, topRs);\r\n setMessages(produce(msgs => {\r\n msgs.splice(0, msgs.length, ...remoteMsgs);\r\n }));\r\n return messages;\r\n }\r\n if (fromMessageId) {\r\n const index = messages.findIndex(m => m.id === fromMessageId);\r\n if (index >= 0) {\r\n if (direction === \"BEFORE\") {\r\n if (index - topRs >= 0) return messages;\r\n } else {\r\n if (index + topRs < messages.length) return messages;\r\n }\r\n }\r\n } else {\r\n if (direction === \"BEFORE\") {\r\n fromMessageId = messages[0]?.id;\r\n } else {\r\n fromMessageId = messages[messages.length - 1]?.id;\r\n }\r\n }\r\n const remoteMsgs = await remoteRepository.listMessagesAsync(conversationId, direction, fromMessageId, topRs);\r\n\r\n if (remoteMsgs.length > 0) {\r\n setMessages(produce(msgs => {\r\n if (direction === \"BEFORE\") {\r\n msgs.unshift(...remoteMsgs);\r\n } else {\r\n msgs.push(...remoteMsgs);\r\n }\r\n }));\r\n } else {\r\n if (direction === \"BEFORE\") {\r\n setMessageLoadingStatus(prev => ({ ...prev, hasOlder: false }));\r\n }\r\n else {\r\n setMessageLoadingStatus(prev => ({ ...prev, hasNewer: false }));\r\n }\r\n }\r\n return messages;\r\n }\r\n\r\n async function initMessagesAsync(top?: number) {\r\n if (messages.length > 0) return messages;\r\n const { hasOlder } = getMessageLoadingStatus();\r\n if (!hasOlder) return messages;\r\n await listMessagesAsync(undefined, undefined, top);\r\n return messages;\r\n }\r\n\r\n async function gotoMessageAsync(messageId: string, conversationId: string) {\r\n const index = messages.findIndex(m => m.id === messageId);\r\n if (index >= 0) {\r\n setCurrentMessage({\r\n messageId,\r\n highlight: true\r\n });\r\n return;\r\n }\r\n let currentConversation = getCurrentConversation();\r\n setMessageLoadingStatus({ hasOlder: true, hasNewer: true });\r\n setMessages([]);\r\n if (!currentConversation || currentConversation.id !== conversationId) {\r\n const convIndex = conversations.findIndex(c => c.id === conversationId);\r\n if (convIndex >= 0) {\r\n const conv = conversations[convIndex];\r\n await listMessagesAsync(\"AFTER\", messageId);\r\n setCurrentConversationState(conv);\r\n } else {\r\n const conv = await remoteRepository.getConversationAsync(conversationId);\r\n if (!conv) return;\r\n // setConversations(produce(convs => {\r\n // convs.push(conv);\r\n // }));\r\n await listMessagesAsync(\"AFTER\", messageId);\r\n setCurrentConversationState(conv);\r\n }\r\n } else {\r\n await listMessagesAsync(\"AFTER\", messageId);\r\n await listMessagesAsync(\"BEFORE\");\r\n }\r\n setTimeout(() => {\r\n setCurrentMessage({\r\n messageId,\r\n highlight: true\r\n });\r\n }, 100);\r\n }\r\n\r\n async function sendMessageAsync(message: Message) {\r\n let currentConversation = getCurrentConversation();\r\n if (!currentConversation) throw new Error(\"No current conversation\");\r\n let conversationId = currentConversation.id;\r\n const draftId = generateGuid();\r\n const msg = {\r\n ...message,\r\n id: draftId,\r\n conversationId,\r\n traceId: draftId,\r\n sending: true,\r\n sentAt: new Date()\r\n }\r\n if (!conversationId) {\r\n currentConversation.id = generateGuid();\r\n const conv = await createConversationAsync(currentConversation, () => {\r\n msg.conversationId = currentConversation.id;\r\n setMessages(produce(msgs => {\r\n msgs.push(msg);\r\n }));\r\n });\r\n msg.conversationId = conv.id;\r\n setMessages(produce(msgs => {\r\n const index = msgs.findIndex(c => c.id === draftId);\r\n if (index >= 0) {\r\n msgs[index].conversationId = conv.id;\r\n }\r\n }));\r\n } else {\r\n setMessages(produce(msgs => {\r\n msgs.push(msg);\r\n }));\r\n }\r\n setCurrentMessage({\r\n messageId: draftId,\r\n highlight: false\r\n });\r\n const result = await remoteRepository.sendMessageAsync(msg);\r\n setMessages(produce(msgs => {\r\n const index = msgs.findIndex(c => c.id === draftId);\r\n if (index >= 0) {\r\n msgs[index].id = result.id;\r\n msgs[index].mentions = result.mentions;\r\n msgs[index].sending = false;\r\n }\r\n }));\r\n return result;\r\n }\r\n\r\n async function getSurveyStatusAsync() {\r\n const conv = await remoteRepository.getConversationAsync(USER_SURVEY_ID);\r\n if (!conv || !conv.status) return \"NOT_DONE\";\r\n return (conv.status as (\"IN_PROGRESS\" | \"DONE\" | \"REDOING\"));\r\n }\r\n\r\n return <PopupContext.Provider value={{\r\n getPanelElement,\r\n setPanelElement,\r\n toggleLoader,\r\n registerLoader,\r\n toggleDrawer,\r\n registerDrawer,\r\n getPopupState,\r\n setPopupState,\r\n getFullscreenState,\r\n setFullscreenState,\r\n getSidebarState,\r\n setSidebarState,\r\n getFooterSendBoxState,\r\n setFooterSendBoxState,\r\n gotoMessageAsync,\r\n getCurrentConversation,\r\n getLastMessage,\r\n setCurrentConversation: setCurrentConversationState,\r\n getCurrentMessage,\r\n setCurrentQuotedMessage,\r\n getCurrentQuotedMessage,\r\n getCurrentMessages: () => messages,\r\n listConversationsAsync,\r\n createConversationAsync,\r\n pinConversationAsync,\r\n updateConversationNameAsync,\r\n deleteConversationAsync,\r\n listMessagesAsync,\r\n initMessagesAsync,\r\n getMessageLoadingStatus,\r\n listChatTypesAsync: remoteRepository.listChatTypesAsync,\r\n sendMessageAsync,\r\n updateMessageAsync: remoteRepository.updateMessageAsync,\r\n deleteMessageAsync: remoteRepository.deleteMessageAsync,\r\n batchGetUsersAsync: remoteRepository.batchGetUsersAsync,\r\n searchConversationsAsync: remoteRepository.searchConversationsAsync,\r\n searchMessagesAsync: remoteRepository.searchMessagesAsync,\r\n uploadFile: remoteRepository.uploadFile,\r\n getSurveyStatusAsync,\r\n getCurrentChatType,\r\n setCurrentChatType,\r\n getTitle,\r\n setTitle\r\n }}>\r\n {props.children}\r\n </PopupContext.Provider>\r\n}\r\n\r\nexport function usePopup(): PopupContextType {\r\n const context = useContext(PopupContext);\r\n if (!context) {\r\n throw new Error(\"usePopup must be used within a PopupProvider\");\r\n }\r\n return context;\r\n}\r\n","import type { ChatPopupProps, Message } from \"../../types/chat.types\";\r\nimport { generateGuid } from \"../../utils/utils\";\r\n\r\nexport function convertMessages(msgs: any[]): Message[] {\r\n return msgs\r\n .map((msg: any) => {\r\n const senderId = msg.sender?.id || \"\";\r\n const sender: \"user\" | \"bot\" = senderId === \"me\" ? \"user\" : \"bot\";\r\n const baseMessage = {\r\n id: msg.id,\r\n text: msg.content,\r\n sender,\r\n type: undefined as Message[\"type\"],\r\n sentAt: msg.sentAt,\r\n };\r\n\r\n // Xử lý flat format từ server:\r\n // if (msg.body?.type === \"CHOICE\" && msg.body?.choice && sender === \"bot\") {\r\n // return [{\r\n // ...baseMessage,\r\n // type: \"choice\" as const,\r\n // question: msg.content || \"\",\r\n // options: msg.body.choice.items?.map((item: any) => item.label) || [],\r\n // rawItems: msg.body.choice.items || [],\r\n // multiSelect: !!msg.body.choice.multiple,\r\n // isDragDrop: false,\r\n // selectedIndexes: msg.body.choice.items?.map((item: any, idx: number) => item.selected ? idx : -1).filter((idx: number) => idx !== -1) || []\r\n // }];\r\n // } else if (msg.body?.type === \"RANKING\" && msg.body?.ranking && sender === \"bot\") {\r\n // return [{\r\n // ...baseMessage,\r\n // type: \"choice\" as const,\r\n // question: msg.content || \"\",\r\n // options: msg.body.ranking.items?.map((item: any) => item.label) || [],\r\n // rawItems: msg.body.ranking.items || [],\r\n // multiSelect: false,\r\n // isDragDrop: true,\r\n // selectedIndexes: msg.body.ranking.items?.map((item: any, idx: number) => item.rank ? idx : -1).filter((idx: number) => idx !== -1) || []\r\n // }];\r\n // } else if (msg.body?.type === \"FORM\" && msg.body?.form && sender === \"bot\") {\r\n // return [{\r\n // ...baseMessage,\r\n // type: \"survey\" as const,\r\n // question: msg.content || \"\",\r\n // options: msg.body.form.fields?.map((field: any) => field.label) || [],\r\n // placeholders: msg.body.form.fields?.map((field: any) => field.options?.placeHolder || field.label) || [],\r\n // isInputMode: true,\r\n // fields: msg.body.form.fields,\r\n // }];\r\n // } else if (msg.body?.type === \"NORMAL\" && sender === \"bot\") {\r\n // return [{\r\n // ...baseMessage,\r\n // type: \"normal\" as const,\r\n // isNormalType: true,\r\n // contents: msg.content ? [{ content: msg.content }] : []\r\n // }];\r\n // }\r\n // new format\r\n if (msg.body?.type === \"CHOICE\" && sender === \"bot\") {\r\n return [{\r\n ...baseMessage,\r\n type: \"choice\" as const,\r\n question: msg.body.content || \"\",\r\n options: msg.body.choice?.items?.map((item: any) => item.label) || [],\r\n rawItems: msg.body.choice?.items || [],\r\n multiSelect: !!msg.body.choice?.multiple,\r\n isDragDrop: false,\r\n selectedIndexes: msg.body.choice?.items\r\n ? msg.body.choice.items.map((item: any, idx: number) => item.selected ? idx : -1).filter((idx: number) => idx !== -1)\r\n : [],\r\n contents: [{ content: msg.body.content, metadata: msg.body.metadata }]\r\n }];\r\n }\r\n if (msg.body?.type === \"FORM\" && msg.body?.form && sender === \"bot\") {\r\n return [{\r\n ...baseMessage,\r\n type: \"survey\" as const,\r\n question: msg.content || \"\",\r\n options: msg.body.form.fields?.map((field: any) => field.label) || [],\r\n placeholders: msg.body.form.fields?.map((field: any) => field.options?.placeHolder || field.label) || [],\r\n isInputMode: true,\r\n fields: msg.body.form.fields,\r\n }];\r\n }\r\n if (msg.body?.type === \"FORM\" && sender === \"user\") {\r\n const fields = msg.body.form?.fields || [];\r\n const text = fields.map((field: any) => field.value).join('\\n\\n');\r\n return [{\r\n ...baseMessage,\r\n text,\r\n type: \"normal\" as const,\r\n isNormalType: true,\r\n contents: [{ content: text }]\r\n }];\r\n }\r\n // Xử lý MULTIPLE format\r\n if (msg.body?.children && Array.isArray(msg.body.children)) {\r\n const choiceChild = msg.body.children.find((child: any) => child.choice && Array.isArray(child.choice.items));\r\n const rankingChild = msg.body.children.find((child: any) => child.ranking && Array.isArray(child.ranking.items));\r\n const formChild = msg.body.children.find((child: any) => child.form && Array.isArray(child.form.fields));\r\n\r\n const normalMessages = msg.body.children\r\n .filter((child: any) => typeof child.content === \"string\")\r\n .map((child: any) => {\r\n let text = child.content;\r\n if (typeof text === \"string\" && text.includes(\"|\")) {\r\n text = text.split(\"|\").map((s: string) => s.trim()).join('\\n\\n');\r\n }\r\n return {\r\n ...baseMessage,\r\n text,\r\n type: \"normal\" as const,\r\n isNormalType: true,\r\n contents: [{ content: text, metadata: child.metadata }]\r\n };\r\n });\r\n\r\n if (rankingChild) {\r\n const questionNormal = msg.body.children.find(\r\n (child: any) => child.type === \"NORMAL\" && typeof child.content === \"string\" && child.content.includes(\"Câu\")\r\n );\r\n const question = normalMessages.length > 0\r\n ? normalMessages[normalMessages.length - 1].text\r\n : (msg.body.children.length > 0 ? msg.body.children[msg.body.children.length - 1].content : \"\");\r\n\r\n let messagesToReturn = normalMessages;\r\n if (questionNormal) {\r\n messagesToReturn = normalMessages.filter((m: { text: any; }) => m.text !== questionNormal.content);\r\n } else if (normalMessages.length > 1) {\r\n messagesToReturn = normalMessages.slice(0, -1);\r\n }\r\n if (messagesToReturn.length === 1 && messagesToReturn[0].text === question) {\r\n messagesToReturn = [];\r\n }\r\n return [\r\n ...messagesToReturn,\r\n {\r\n ...baseMessage,\r\n type: \"choice\" as const,\r\n question,\r\n options: rankingChild.ranking.items.map((item: any) => item.label) || [],\r\n rawItems: rankingChild.ranking.items || [],\r\n multiSelect: false,\r\n isDragDrop: true,\r\n selectedIndexes: rankingChild.ranking.items\r\n .map((item: any, idx: number) => item.rank ? idx : -1)\r\n .filter((idx: number) => idx !== -1) || []\r\n }\r\n ];\r\n } else if (choiceChild) {\r\n const questionNormal = msg.body.children.find(\r\n (child: any) => child.type === \"NORMAL\" && typeof child.content === \"string\" && child.content.includes(\"Câu\")\r\n );\r\n const question = normalMessages.length > 0\r\n ? normalMessages[normalMessages.length - 1].text\r\n : (msg.body.children.length > 0 ? msg.body.children[msg.body.children.length - 1].content : \"\");\r\n\r\n let messagesToReturn = normalMessages;\r\n if (questionNormal) {\r\n messagesToReturn = normalMessages.filter((m: { text: any; }) => m.text !== questionNormal.content);\r\n } else if (normalMessages.length > 1) {\r\n messagesToReturn = normalMessages.slice(0, -1);\r\n }\r\n if (messagesToReturn.length === 1 && messagesToReturn[0].text === question) {\r\n messagesToReturn = [];\r\n }\r\n return [\r\n ...messagesToReturn,\r\n {\r\n ...baseMessage,\r\n type: \"choice\" as const,\r\n question,\r\n options: choiceChild.choice.items.map((item: any) => item.label) || [],\r\n rawItems: choiceChild.choice.items || [],\r\n multiSelect: !!choiceChild.choice.multiple,\r\n isDragDrop: false,\r\n selectedIndexes: choiceChild.choice.items\r\n .map((item: any, idx: number) => item.selected ? idx : -1)\r\n .filter((idx: number) => idx !== -1) || [],\r\n contents: msg.body.children\r\n }\r\n ];\r\n } else if (formChild) {\r\n const questionNormal = msg.body.children.find(\r\n (child: any) => child.type === \"NORMAL\" && typeof child.content === \"string\" && child.content.includes(\"Câu\")\r\n );\r\n const question = normalMessages.length > 0\r\n ? normalMessages[normalMessages.length - 1].text\r\n : (msg.body.children.length > 0 ? msg.body.children[msg.body.children.length - 1].content : \"\");\r\n\r\n let messagesToReturn = normalMessages;\r\n if (questionNormal) {\r\n messagesToReturn = normalMessages.filter((m: { text: any; }) => m.text !== questionNormal.content);\r\n } else if (normalMessages.length > 1) {\r\n messagesToReturn = normalMessages.slice(0, -1);\r\n }\r\n if (messagesToReturn.length === 1 && messagesToReturn[0].text === question) {\r\n messagesToReturn = [];\r\n }\r\n return [\r\n ...messagesToReturn,\r\n {\r\n ...baseMessage,\r\n type: \"survey\" as const,\r\n question,\r\n options: formChild.form.fields.map((field: any) => field.label) || [],\r\n placeholders: formChild.form.fields.map((field: any) => field.options?.placeHolder || field.label) || [],\r\n isInputMode: true,\r\n fields: formChild.form.fields,\r\n }\r\n ];\r\n } else if (msg.body.children.every((child: any) => child.type === \"NORMAL\")) {\r\n return msg.body.children.map((child: any) => ({\r\n ...baseMessage,\r\n text: child.content,\r\n type: \"normal\" as const,\r\n isNormalType: true,\r\n contents: [{ content: child.content, metadata: child.metadata }]\r\n }));\r\n }\r\n }\r\n if (msg.body?.type === \"CHOICE\" && sender === \"user\") {\r\n const selectedItems = msg.body.choice?.items?.filter((item: any) => item.selected);\r\n if (selectedItems && selectedItems.length > 0) {\r\n const text = selectedItems.map((item: any) => item.label).join('\\n\\n');\r\n return [{\r\n ...baseMessage,\r\n text,\r\n type: \"normal\" as const,\r\n isNormalType: true,\r\n contents: [{ content: text }]\r\n }];\r\n }\r\n }\r\n if (msg.body?.type === \"NORMAL\" && sender === \"user\") {\r\n return [{\r\n ...baseMessage,\r\n text: msg.body.content,\r\n type: \"normal\" as const,\r\n isNormalType: true,\r\n contents: [{ content: msg.body.content }]\r\n }];\r\n }\r\n if (msg.body?.type === \"RANKING\" && sender === \"user\") {\r\n const items = msg.body.ranking?.items;\r\n if (Array.isArray(items) && items.length > 0) {\r\n const sorted = [...items].sort((a, b) => (a.rank ?? 0) - (b.rank ?? 0));\r\n const text = sorted.map(item => item.label).join('\\n\\n');\r\n return [{\r\n ...baseMessage,\r\n text,\r\n type: \"normal\" as const,\r\n isNormalType: true,\r\n contents: [{ content: text }]\r\n }];\r\n }\r\n }\r\n if (msg.body?.type === \"MULTIPLE\" && sender === \"user\") {\r\n const normalChild = msg.body.children.find((child: any) => child.type === \"NORMAL\" && typeof child.content === \"string\");\r\n if (normalChild && normalChild.content) {\r\n const text = normalChild.content.split(\"|\").map((s: string) => s.trim()).join('\\n\\n');\r\n return [{\r\n ...baseMessage,\r\n text,\r\n type: \"normal\" as const,\r\n isNormalType: true,\r\n contents: [{ content: text }]\r\n }];\r\n }\r\n }\r\n if (\r\n sender === \"bot\" &&\r\n msg.body &&\r\n typeof msg.body.content === \"string\" &&\r\n !msg.body.type\r\n ) {\r\n return [{\r\n ...baseMessage,\r\n text: msg.body.content,\r\n type: \"normal\" as const,\r\n isNormalType: true,\r\n contents: [{ content: msg.body.content, metadata: msg.body.metadata }]\r\n }];\r\n }\r\n return [{\r\n ...baseMessage,\r\n type: \"normal\" as const,\r\n isNormalType: true,\r\n contents: baseMessage.text ? [{ content: baseMessage.text }] : []\r\n }];\r\n })\r\n .flat()\r\n .filter((msg) => {\r\n if (msg.type === \"choice\") {\r\n return !!(msg as any).question && Array.isArray((msg as any).options) && (msg as any).options.length > 0;\r\n }\r\n if (msg.type === \"normal\") {\r\n return !!msg.text && msg.text.trim() !== \"\";\r\n }\r\n if (msg.type === \"form\") {\r\n return Array.isArray((msg as any).fields) && (msg as any).fields.length > 0;\r\n }\r\n if (msg.type === \"survey\") {\r\n return Array.isArray(msg.options) && msg.options.length > 0;\r\n }\r\n return !!msg.text && msg.text.trim() !== \"\";\r\n }) as Message[];\r\n}\r\n\r\nexport function updateStepFromLastMessage(messages: Message[], setCurrentStep: (n: number) => void, setTotalSteps: (n: number) => void) {\r\n const lastBotMsg = [...messages].reverse().find(m => m.sender === \"bot\");\r\n let metadata: any = undefined;\r\n if (lastBotMsg && lastBotMsg.contents && Array.isArray(lastBotMsg.contents)) {\r\n metadata = lastBotMsg.contents.find((c: any) => c.metadata)?.metadata;\r\n }\r\n\r\n if (metadata) {\r\n const section = parseInt(metadata.section);\r\n const totalSections = parseInt(metadata.totalSections) || 6;\r\n setCurrentStep(section);\r\n setTotalSteps(totalSections);\r\n } else {\r\n setCurrentStep(1);\r\n setTotalSteps(6);\r\n }\r\n}\r\n\r\nexport async function hasIncompleteSurveyConversation(remoteRepo: ChatPopupProps[\"remoteRepo\"]) {\r\n if (!remoteRepo) return false;\r\n const convs = await remoteRepo.listConversationAsync(100);\r\n for (const conv of convs) {\r\n if (conv.id && conv.id.endsWith(\"~SURVEY\")) {\r\n const messages = await remoteRepo.listMessagesAsync(conv.id);\r\n let section = 1, totalSections = 6;\r\n for (let i = messages.length - 1; i >= 0; i--) {\r\n const msg = messages[i];\r\n if (msg.sender?.id !== \"me\" && msg.body?.children) {\r\n const meta = msg.body.children.find((c: any) => c.metadata)?.metadata;\r\n if (meta) {\r\n section = parseInt(meta.section);\r\n totalSections = parseInt(meta.totalSections) || 6;\r\n break;\r\n }\r\n }\r\n }\r\n if (section < totalSections) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport async function ensureSurveyConversation(\r\n props: ChatPopupProps,\r\n popup: any,\r\n setCurrentConversationId: (id: string) => void,\r\n setConversationName: (name: string) => void,\r\n setHasOlder: (v: boolean) => void,\r\n setSubmittedMessages: (s: Set<string>) => void,\r\n setIsLoadingMessages: (v: boolean) => void,\r\n reloadSidebarConversations: (() => void) | null,\r\n onSurveyCreated?: () => void\r\n) {\r\n if (!props.remoteRepo) return;\r\n const convs = await props.remoteRepo.listConversationAsync(100);\r\n const surveyConv = convs.find((conv: any) => conv.id && conv.id.endsWith(\"~SURVEY\"));\r\n if (!surveyConv) {\r\n const id = `${generateGuid()}~SURVEY`;\r\n const botId = \"BOT~surveybot\";\r\n const conv = await popup.createConversationAsync({\r\n id,\r\n name: \"Tư vấn đầu tư\",\r\n type: \"BOT\",\r\n members: [{ userId: botId, role: \"MEMBER\" }],\r\n updatedAt: new Date()\r\n });\r\n popup.setCurrentConversation({ id: conv.id, name: conv.name, type: \"BOT\" });\r\n setCurrentConversationId(conv.id);\r\n setConversationName(conv.name);\r\n setHasOlder(true);\r\n setSubmittedMessages(new Set<string>());\r\n setIsLoadingMessages(false);\r\n await popup.listMessagesAsync(conv.id);\r\n if (reloadSidebarConversations) reloadSidebarConversations();\r\n if (onSurveyCreated) onSurveyCreated();\r\n } else {\r\n popup.setCurrentConversation({ id: surveyConv.id, name: surveyConv.name, type: \"BOT\" });\r\n setCurrentConversationId(surveyConv.id);\r\n setConversationName(surveyConv.name);\r\n setHasOlder(true);\r\n setSubmittedMessages(new Set<string>());\r\n setIsLoadingMessages(false);\r\n await popup.listMessagesAsync(surveyConv.id);\r\n if (reloadSidebarConversations) reloadSidebarConversations();\r\n }\r\n}\r\n\r\nexport function allowInput(messages: Message[], currentConversationId: string | null): boolean {\r\n if (!currentConversationId || messages.length === 0) return true;\r\n const lastBotMsg = [...messages].reverse().find(m => m.sender === \"bot\");\r\n return !!(lastBotMsg && lastBotMsg.type === \"normal\");\r\n}\r\n\r\nexport async function handleCreateConversation(\r\n props: ChatPopupProps,\r\n newConvName: string,\r\n setNameError: (msg: string | undefined) => void,\r\n setShowNameModal: (v: boolean) => void,\r\n popup: any,\r\n setCurrentConversationId: (id: string) => void,\r\n setConversationName: (name: string) => void,\r\n setHasOlder: (v: boolean) => void,\r\n setSubmittedMessages: (s: Set<string>) => void,\r\n setIsLoadingMessages: (v: boolean) => void,\r\n reloadSidebarConversations: (() => void) | null\r\n) {\r\n if (await hasIncompleteSurveyConversation(props.remoteRepo)) {\r\n alert(\"Bạn chưa hoàn thành khảo sát hiện tại!\");\r\n return;\r\n }\r\n const conversationName = newConvName.trim();\r\n if (!conversationName) {\r\n setNameError(\"Vui lòng nhập tên cuộc hội thoại\");\r\n return;\r\n }\r\n if (conversationName.length > 100) {\r\n setNameError(\"Tên cuộc hội thoại không được quá 100 ký tự\");\r\n return;\r\n }\r\n setNameError(undefined);\r\n setShowNameModal(false);\r\n try {\r\n const id = generateGuid();\r\n const botId = \"BOT~rasaconnector\";\r\n const conv = await popup.createConversationAsync({\r\n id,\r\n name: conversationName,\r\n type: \"BOT\",\r\n members: [{ userId: botId, role: \"MEMBER\" }],\r\n updatedAt: new Date()\r\n });\r\n popup.setCurrentConversation({ id: conv.id, name: conv.name, type: \"BOT\" });\r\n setCurrentConversationId(conv.id);\r\n setConversationName(conv.name);\r\n setHasOlder(true);\r\n setSubmittedMessages(new Set<string>());\r\n setIsLoadingMessages(false);\r\n await popup.listMessagesAsync(conv.id);\r\n if (reloadSidebarConversations) reloadSidebarConversations();\r\n } catch (err) {\r\n console.error(\"Tạo hội thoại mới thất bại:\", err);\r\n }\r\n}\r\n\r\nexport async function handleSurveySubmitUtil(\r\n data: string[],\r\n type: 'ordered' | 'selected' | 'input',\r\n msgId: string,\r\n dependencies: {\r\n props: any,\r\n currentConversationId: string | null,\r\n formattedMessages: Message[],\r\n popup: any,\r\n setSubmittedMessages: (fn: (prev: Set<string>) => Set<string>) => void\r\n }\r\n) {\r\n const { props, currentConversationId, formattedMessages, popup, setSubmittedMessages } = dependencies;\r\n if (!props.remoteRepo || !currentConversationId) return;\r\n\r\n try {\r\n const botMsg = [...formattedMessages].reverse().find(m => m.type === \"choice\" && m.sender === \"bot\");\r\n if (!botMsg) return;\r\n\r\n const botMetadata =\r\n Array.isArray(botMsg.contents) && botMsg.contents.length > 0\r\n ? botMsg.contents[botMsg.contents.length - 1].metadata || {}\r\n : {};\r\n\r\n setSubmittedMessages(prev => new Set([...prev, msgId]));\r\n\r\n let messageBody: any = {};\r\n\r\n if (type === 'ordered') {\r\n const items = botMsg.rawItems?.map((item: any) => ({\r\n ...item,\r\n rank: data.indexOf(item.label) + 1\r\n })) || data.map((option, index) => ({\r\n label: option,\r\n value: option,\r\n rank: index + 1\r\n }));\r\n\r\n messageBody = {\r\n type: \"RANKING\",\r\n content: '',\r\n ranking: {\r\n items: items,\r\n submitted: true\r\n },\r\n metadata: botMetadata\r\n };\r\n } else if (type === 'selected') {\r\n const items = botMsg.rawItems?.map((item: any) => ({\r\n ...item,\r\n selected: data.includes(item.label)\r\n })) || botMsg.options?.map((option) => ({\r\n label: option,\r\n value: option,\r\n selected: data.includes(option)\r\n })) || [];\r\n\r\n messageBody = {\r\n type: \"CHOICE\",\r\n content: '',\r\n choice: {\r\n items: items,\r\n multiple: botMsg.multiSelect || false,\r\n submitted: true\r\n },\r\n metadata: botMetadata\r\n };\r\n } else if (type === 'input') {\r\n messageBody = {\r\n type: \"FORM\",\r\n content: '',\r\n form: {\r\n fields: botMsg.fields?.map((field, idx) => ({\r\n ...field,\r\n value: data[idx] || \"\"\r\n })) || [],\r\n submitted: true\r\n },\r\n metadata: botMetadata\r\n };\r\n }\r\n\r\n const message = {\r\n body: messageBody,\r\n conversationId: currentConversationId,\r\n sender: { id: \"me\" }\r\n };\r\n\r\n await popup.sendMessageAsync(message as any);\r\n\r\n } catch (error) {\r\n console.error(\"Error sending survey response:\", error);\r\n }\r\n}\r\n\r\nexport async function handleSurveyUpdateUtil(\r\n data: string[],\r\n type: 'ordered' | 'selected' | 'input',\r\n userMsgId: string,\r\n dependencies: {\r\n props: any,\r\n currentConversationId: string | null,\r\n formattedMessages: Message[],\r\n popup: any,\r\n setEditingMsgIdBot: (v: string | null) => void,\r\n setEditingMsgIdUser: (v: string | null) => void\r\n }\r\n) {\r\n const { props, currentConversationId, formattedMessages, popup, setEditingMsgIdBot, setEditingMsgIdUser } = dependencies;\r\n if (!props.remoteRepo || !currentConversationId) return;\r\n\r\n try {\r\n const userMsg = formattedMessages.find(m => m.id === userMsgId && m.sender === \"user\");\r\n if (!userMsg) return;\r\n\r\n const userIdx = formattedMessages.findIndex(m => m.id === userMsgId);\r\n let botMsg: Message | undefined;\r\n for (let i = userIdx - 1; i >= 0; i--) {\r\n const m = formattedMessages[i];\r\n if (m.sender === \"bot\" && (m.type === \"choice\" || m.type === \"survey\" || m.type === \"form\")) {\r\n botMsg = m;\r\n break;\r\n }\r\n }\r\n if (!botMsg) return;\r\n\r\n const botMetadata =\r\n Array.isArray(botMsg.contents) && botMsg.contents.length > 0\r\n ? botMsg.contents[botMsg.contents.length - 1].metadata || {}\r\n : {};\r\n\r\n let messageBody: any = {};\r\n if (type === \"input\") {\r\n messageBody = {\r\n type: \"NORMAL\",\r\n content: data[0],\r\n metadata: botMetadata\r\n };\r\n } else if (type === 'ordered') {\r\n const items = botMsg.rawItems?.map((item: any) => ({\r\n ...item,\r\n rank: data.indexOf(item.label) + 1\r\n })) || data.map((option, index) => ({\r\n label: option,\r\n value: option,\r\n rank: index + 1\r\n }));\r\n\r\n messageBody = {\r\n type: \"RANKING\",\r\n content: '',\r\n ranking: {\r\n items: items,\r\n submitted: true\r\n },\r\n metadata: botMetadata\r\n };\r\n } else if (type === 'selected') {\r\n const items = botMsg.rawItems?.map((item: any) => ({\r\n ...item,\r\n selected: data.includes(item.label)\r\n })) || botMsg.options?.map((option) => ({\r\n label: option,\r\n value: option,\r\n selected: data.includes(option)\r\n })) || [];\r\n\r\n messageBody = {\r\n type: \"CHOICE\",\r\n content: '',\r\n choice: {\r\n items: items,\r\n multiple: botMsg.multiSelect || false,\r\n submitted: true\r\n },\r\n metadata: botMetadata\r\n };\r\n } else if (type === 'input') {\r\n messageBody = {\r\n type: \"FORM\",\r\n content: '',\r\n form: {\r\n fields: botMsg.fields?.map((field, idx) => ({\r\n ...field,\r\n value: data[idx] || \"\"\r\n })) || [],\r\n submitted: true\r\n },\r\n metadata: botMetadata\r\n };\r\n }\r\n\r\n const message = {\r\n id: userMsgId,\r\n body: messageBody,\r\n conversationId: currentConversationId,\r\n sender: { id: \"me\" }\r\n };\r\n\r\n await popup.updateMessageAsync(message as any);\r\n setEditingMsgIdBot(null);\r\n setEditingMsgIdUser(null);\r\n } catch (error) {\r\n console.error(\"Error updating survey response:\", error);\r\n }\r\n}","import { createEffect, createMemo, createSignal, Show } from \"solid-js\";\r\nimport ChatMessages from \"../ChatMessages/ChatMessages.tsx\";\r\nimport ChatInput from \"../ChatInput/ChatInput.tsx\";\r\nimport \"./ChatPopup.css\";\r\nimport { chatIcon, inforIcon, iconExpand, iconMinimize, iconClose } from \"../../assets/icons/icons\";\r\nimport Sidebar from \"../../components/Sidebar/Siderbar.tsx\";\r\nimport ChatActionButton from \"../../components/ChatActionButton/ChatActionButton.tsx\";\r\nimport HeaderSteps from \"../../components/HeaderSteps/HeaderSteps.tsx\";\r\nimport { onMount } from \"solid-js\";\r\nimport { usePopup } from \"../../context/PopupProvider\";\r\nimport { generateGuid } from \"../../utils/utils.ts\";\r\nimport { ChatPopupProps } from \"../../types/chat.types.ts\";\r\nimport { convertMessages, updateStepFromLastMessage, hasIncompleteSurveyConversation, allowInput, handleCreateConversation, handleSurveySubmitUtil, handleSurveyUpdateUtil, ensureSurveyConversation } from \"./chatPopup.utils.ts\";\r\n\r\ndeclare global {\r\n interface Window {\r\n currentUserId: string;\r\n }\r\n}\r\n\r\nexport default function ChatPopup(props: ChatPopupProps) {\r\n const popup = usePopup();\r\n const [input, setInput] = createSignal(\"\");\r\n const [isOpen, setIsOpen] = createSignal(false);\r\n const [isSidebarOpen, setIsSidebarOpen] = createSignal(false);\r\n const [isFullScreen, setIsFullScreen] = createSignal(false);\r\n const [isMobile, setIsMobile] = createSignal(false);\r\n const [inputHeight, setInputHeight] = createSignal(0);\r\n const [surveyOptions] = createSignal<{ multiSelect?: boolean; isInputMode?: boolean }>({});\r\n const [submittedMessages, setSubmittedMessages] = createSignal<Set<string>>(new Set());\r\n const [currentConversationId, setCurrentConversationId] = createSignal<string | null>(null);\r\n const [isLoadingMessages, setIsLoadingMessages] = createSignal(false);\r\n const [hasOlder, setHasOlder] = createSignal(true);\r\n const [conversationName, setConversationName] = createSignal<string>(\"\");\r\n const [currentStep, setCurrentStep] = createSignal(1);\r\n const [totalSteps, setTotalSteps] = createSignal(6);\r\n const [editingMsgIdBot, setEditingMsgIdBot] = createSignal<string | null>(null);\r\n const [editingMsgIdUser, setEditingMsgIdUser] = createSignal<string | null>(null);\r\n const [showNameModal, setShowNameModal] = createSignal(false);\r\n const [newConvName, setNewConvName] = createSignal(\"\");\r\n const [nameError, setNameError] = createSignal<string | undefined>(undefined);\r\n let reloadSidebarConversations: (() => void) | null = null;\r\n const [deletingConv, setDeletingConv] = createSignal<any | null>(null);\r\n const [showSurveyAlert, setShowSurveyAlert] = createSignal(false);\r\n const onlyMobile = props.options?.onlyMobile || false;\r\n const onCreateConversation = async () => {\r\n await ensureSurveyConversation(\r\n props,\r\n popup,\r\n setCurrentConversationId,\r\n setConversationName,\r\n setHasOlder,\r\n setSubmittedMessages,\r\n setIsLoadingMessages,\r\n reloadSidebarConversations,\r\n () => setShowSurveyAlert(true)\r\n );\r\n await handleCreateConversation(\r\n props,\r\n newConvName(),\r\n setNameError,\r\n setShowNameModal,\r\n popup,\r\n setCurrentConversationId,\r\n setConversationName,\r\n setHasOlder,\r\n setSubmittedMessages,\r\n setIsLoadingMessages,\r\n reloadSidebarConversations\r\n );\r\n };\r\n\r\n createEffect(async () => {\r\n if (!props.remoteRepo) return;\r\n try {\r\n const convs = await props.remoteRepo.listConversationAsync(10);\r\n console.log(\"listConversationAsync result:\", convs);\r\n if (!convs || convs.length === 0) {\r\n console.warn(\"listConversationAsync returned empty or null\");\r\n }\r\n } catch (error) {\r\n console.error(\"Error calling listConversationAsync:\", error);\r\n }\r\n });\r\n\r\n createEffect(() => {\r\n const messages = popup.getCurrentMessages();\r\n if (messages && messages.length > 0) {\r\n updateStepFromLastMessage(\r\n convertMessages(messages),\r\n setCurrentStep,\r\n setTotalSteps\r\n );\r\n }\r\n });\r\n\r\n const isSurveyConversation = () => {\r\n const id = currentConversationId();\r\n return !!id && id.endsWith(\"~SURVEY\");\r\n };\r\n\r\n const newConversation = async () => {\r\n setNewConvName(\"\");\r\n setNameError(undefined);\r\n setShowNameModal(true);\r\n };\r\n\r\n onMount(() => {\r\n const handleResize = () => {\r\n const width = window.innerWidth;\r\n const isMobileNow = width < 768;\r\n setIsMobile(isMobileNow);\r\n if (isFullScreen() && isMobileNow) {\r\n setIsFullScreen(false);\r\n setIsMobile(true);\r\n }\r\n };\r\n window.addEventListener(\"resize\", handleResize);\r\n handleResize();\r\n return () => {\r\n window.removeEventListener(\"resize\", handleResize);\r\n };\r\n });\r\n\r\n createEffect(() => {\r\n if (props.options?.onFullScreen) props.options.onFullScreen(isFullScreen());\r\n if (props.options?.onMobile) props.options.onMobile(isMobile());\r\n });\r\n\r\n return (\r\n <div>\r\n {!isOpen() && (\r\n <button\r\n onClick={() => {\r\n if (onlyMobile) setIsMobile(true);\r\n setIsOpen(true)\r\n if (props.options?.onOpen) props.options.onOpen();\r\n }}\r\n class=\"chat-popup-button\"\r\n style={{\r\n background: \"none\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n padding: 0\r\n }}\r\n >\r\n <img src={chatIcon} />\r\n </button>\r\n )}\r\n\r\n {isOpen() && (() => {\r\n const formattedMessages = createMemo(() => convertMessages(popup.getCurrentMessages()));\r\n const canInput = () => allowInput(formattedMessages(), currentConversationId());\r\n const handleSurveySubmit = (data: string[], type: 'ordered' | 'selected' | 'input', msgId: string) =>\r\n handleSurveySubmitUtil(data, type, msgId, {\r\n props,\r\n currentConversationId: currentConversationId(),\r\n formattedMessages: formattedMessages(),\r\n popup,\r\n setSubmittedMessages\r\n });\r\n\r\n const handleSurveyUpdate = (data: string[], type: 'ordered' | 'selected' | 'input', userMsgId: string) =>\r\n handleSurveyUpdateUtil(data, type, userMsgId, {\r\n props,\r\n currentConversationId: currentConversationId(),\r\n formattedMessages: formattedMessages(),\r\n popup,\r\n setEditingMsgIdBot,\r\n setEditingMsgIdUser\r\n });\r\n\r\n const sendMessage = async () => {\r\n if (!input().trim() || !props.remoteRepo) return;\r\n if (await hasIncompleteSurveyConversation(props.remoteRepo)) {\r\n alert(\"Bạn chưa hoàn thành khảo sát hiện tại!\");\r\n return;\r\n }\r\n if (!currentConversationId()) {\r\n await ensureSurveyConversation(\r\n props,\r\n popup,\r\n setCurrentConversationId,\r\n setConversationName,\r\n setHasOlder,\r\n setSubmittedMessages,\r\n setIsLoadingMessages,\r\n reloadSidebarConversations,\r\n () => setShowSurveyAlert(true)\r\n );\r\n try {\r\n const id = generateGuid();\r\n const botId = \"BOT~rasaconnector\";\r\n const autoName = `Cuộc hội thoại mới ${id.slice(-4)}`;\r\n const conv = await popup.createConversationAsync({\r\n id,\r\n name: autoName,\r\n type: \"BOT\",\r\n members: [{ userId: botId, role: \"MEMBER\" }],\r\n updatedAt: new Date()\r\n });\r\n popup.setCurrentConversation({ id: conv.id, name: conv.name, type: \"BOT\" });\r\n setCurrentConversationId(conv.id);\r\n setConversationName(conv.name);\r\n setHasOlder(true);\r\n setSubmittedMessages(new Set<string>());\r\n setIsLoadingMessages(false);\r\n await popup.listMessagesAsync(conv.id);\r\n if (reloadSidebarConversations) reloadSidebarConversations();\r\n } catch (err) {\r\n console.error(\"Tạo hội thoại mới thất bại:\", err);\r\n return;\r\n }\r\n }\r\n try {\r\n let botMetadata = {};\r\n const botMsgs = formattedMessages().filter(m =>\r\n m.sender === \"bot\" &&\r\n Array.isArray(m.contents) &&\r\n m.contents.length > 0 &&\r\n m.contents[m.contents.length - 1].metadata\r\n );\r\n if (botMsgs.length > 0) {\r\n const lastBotMsg = botMsgs[botMsgs.length - 1];\r\n botMetadata = lastBotMsg.contents?.[lastBotMsg.contents.length - 1]?.metadata || {};\r\n }\r\n const message = {\r\n body: {\r\n type: \"NORMAL\",\r\n content: input(),\r\n metadata: botMetadata\r\n },\r\n conversationId: currentConversationId()!,\r\n sender: { id: \"me\" }\r\n };\r\n\r\n // console.log(\"sending message via PopupProvider:\", message);\r\n await popup.sendMessageAsync(message as any);\r\n setInput(\"\");\r\n\r\n } catch (error) {\r\n console.error(\"Error sending message:\", error);\r\n }\r\n };\r\n\r\n const loadMoreMessage = async () => {\r\n if (!popup || formattedMessages().length === 0 || !currentConversationId() || !hasOlder()) return;\r\n try {\r\n const firstMsgId = formattedMessages()[0].id;\r\n const topRs = 30;\r\n\r\n const firstMsgIndex = formattedMessages().findIndex(m => m.id === firstMsgId);\r\n if (firstMsgIndex >= 0 && firstMsgIndex - topRs >= 0) {\r\n return;\r\n }\r\n\r\n const container = document.querySelector(\".chat-messages-container\") as HTMLElement;\r\n const firstMsgElement = container?.querySelector(`[data-message-id=\"${firstMsgId}\"]`) as HTMLElement | null;\r\n const Y = firstMsgElement?.offsetTop ?? 0;\r\n const S = container?.scrollTop ?? 0;\r\n\r\n await popup.listMessagesAsync(\"BEFORE\", firstMsgId, topRs);\r\n\r\n requestAnimationFrame(() => {\r\n const newFirstMsgElement = container?.querySelector(`[data-message-id=\"${firstMsgId}\"]`) as HTMLElement | null;\r\n const YPrime = newFirstMsgElement?.offsetTop ?? 0;\r\n if (container) container.scrollTop = YPrime - (Y - S);\r\n });\r\n\r\n } catch (error) {\r\n console.error(\"Error loading more messages:\", error);\r\n }\r\n };\r\n\r\n createEffect(() => {\r\n formattedMessages();\r\n if (isOpen()) {\r\n requestAnimationFrame(() => {\r\n const container = document.querySelector(\".chat-messages-container\") as HTMLElement | null;\r\n if (container) {\r\n container.scrollTop = container.scrollHeight;\r\n }\r\n });\r\n }\r\n });\r\n\r\n return (\r\n <div class={`chat-popup-window${isOpen() ? \" chat-popup-window--open\" : \"\"}${isFullScreen() ? \" chat-popup-window--fullscreen\" : \"\"}${isMobile() ? \" chat-popup-window--mobile\" : \"\"}`}\r\n style={isFullScreen() || isMobile() ? { [\"--chat-input-height\"]: `${inputHeight()}px` } : undefined}>\r\n <Show when={showNameModal()}>\r\n <div\r\n class=\"modal-backdrop\"\r\n onClick={() => setShowNameModal(false)}\r\n >\r\n <div\r\n class=\"modal-content\"\r\n style={{\r\n \"background-color\": \"white\",\r\n padding: \"20px\",\r\n \"border-radius\": \"8px\",\r\n width: \"400px\",\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div style={{ \"margin-bottom\": \"12px\" }}>\r\n <label\r\n style={{\r\n display: \"block\",\r\n \"margin-bottom\": \"18px\",\r\n \"font-weight\": \"500\",\r\n color: \"#1A1D1F\",\r\n \"text-align\": \"left\"\r\n }}\r\n >\r\n Tên cuộc trò chuyện mới:\r\n </label>\r\n <input\r\n value={newConvName()}\r\n onInput={(e) => setNewConvName(e.currentTarget.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") onCreateConversation();\r\n }}\r\n autofocus\r\n class=\"chat-popup-input\"\r\n />\r\n <Show when={nameError()}>\r\n <div style={{ color: \"red\", \"font-size\": \"14px\", \"margin-top\": \"4px\" }}>\r\n {nameError()}\r\n </div>\r\n </Show>\r\n </div>\r\n <div style={{ \"text-align\": \"right\" }}>\r\n <button\r\n onClick={() => setShowNameModal(false)}\r\n class=\"modal-button-delete\"\r\n style={{\r\n \"margin-right\": \"8px\",\r\n \"background-color\": \"#f0f0f0\",\r\n }}\r\n >\r\n Hủy bỏ\r\n </button>\r\n <button\r\n onClick={onCreateConversation}\r\n class=\"modal-button-delete\"\r\n style={{\r\n \"background-color\": \"#1AAF74\",\r\n color: \"#fff\"\r\n }}\r\n >\r\n Tạo\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </Show>\r\n {!isFullScreen() && (\r\n <div class=\"chat-popup-header\">\r\n <img\r\n src={inforIcon}\r\n style={{ width: \"28px\", height: \"28px\", cursor: \"pointer\" }}\r\n onClick={() => setIsSidebarOpen(true)}\r\n />\r\n <div class=\"chat-popup-title\">\r\n <img src={chatIcon} style={{ width: \"32px\", height: \"32px\", \"margin-right\": \"4px\" }} />\r\n <span style={{ color: \"#1A1D1F\", \"user-select\": \"none\" }}>Ez</span>\r\n <span style={{ color: \"#1AAF74\", \"margin-left\": \"4px\", \"user-select\": \"none\" }}>Advise</span>\r\n </div>\r\n <div style={{ display: \"flex\", gap: \"12px\", \"align-items\": \"center\", \"margin-top\": \"4px\" }}>\r\n {!isMobile() && (\r\n <>\r\n <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={() => {\r\n if (isFullScreen()) {\r\n setIsFullScreen(false);\r\n setIsMobile(true);\r\n } else if (isMobile()) {\r\n setIsMobile(false);\r\n } else {\r\n setIsMobile(true);\r\n }\r\n if (props.options?.onMinimize) props.options.onMinimize();\r\n }}\r\n >\r\n <img src={iconMinimize} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button>\r\n <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={() => {\r\n setIsMobile(false);\r\n setIsFullScreen(true);\r\n if (props.options?.onMaximize) props.options.onMaximize();\r\n }}\r\n >\r\n <img src={iconExpand} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button>\r\n </>\r\n )}\r\n <button\r\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0 }}\r\n onClick={() => {\r\n setIsOpen(false);\r\n setIsMobile(false);\r\n setIsFullScreen(false);\r\n if (props.options?.onClose) props.options.onClose();\r\n }}\r\n >\r\n <img src={iconClose} style={{ width: \"20px\", height: \"20px\" }} />\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n <div style={{\r\n display: \"flex\",\r\n height: \"100%\",\r\n \"flex-direction\": \"row\",\r\n }}>\r\n {isFullScreen() ? (\r\n <Sidebar\r\n onClose={() => {\r\n setIsOpen(false);\r\n setIsMobile(false);\r\n setIsFullScreen(false);\r\n if (props.options?.onClose) props.options.onClose();\r\n }}\r\n onShrink={() => {\r\n setIsFullScreen(false);\r\n if (props.options?.onShrink) props.options.onShrink();\r\n }}\r\n open={true}\r\n fullScreen={true}\r\n isMobile={isMobile()}\r\n onMobile={() => {\r\n setIsFullScreen(false);\r\n setIsMobile(true);\r\n }}\r\n onNewConversation={newConversation}\r\n options={props.options}\r\n remoteRepo={props.remoteRepo ?? undefined}\r\n onDeleteConversation={setDeletingConv}\r\n onReloadConversations={fn => reloadSidebarConversations = fn}\r\n onLoadMessages={async (conversationId, name) => {\r\n popup.setCurrentConversation({ id: conversationId, name: \"\", type: \"BOT\" });\r\n setCurrentConversationId(conversationId);\r\n setConversationName(name || \"\");\r\n setHasOlder(true);\r\n if (props.remoteRepo) {\r\n try {\r\n await popup.listMessagesAsync(conversationId);\r\n setSubmittedMessages(new Set<string>());\r\n setIsLoadingMessages(false);\r\n\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n const container = document.querySelector(\".chat-messages-container\") as HTMLElement | null;\r\n if (container) {\r\n container.scrollTop = container.scrollHeight;\r\n }\r\n setIsLoadingMessages(false);\r\n });\r\n });\r\n } catch (error) {\r\n console.error(\"Error loading messages:\", error);\r\n setIsLoadingMessages(false);\r\n }\r\n }\r\n }}\r\n />\r\n ) : (\r\n <Sidebar\r\n onClose={() => setIsSidebarOpen(false)}\r\n open={isSidebarOpen()}\r\n fullScreen={false}\r\n isMobile={isMobile()}\r\n onNewConversation={newConversation}\r\n options={props.options}\r\n remoteRepo={props.remoteRepo ?? undefined}\r\n onDeleteConversation={setDeletingConv}\r\n onReloadConversations={fn => reloadSidebarConversations = fn}\r\n onLoadMessages={async (conversationId, name) => {\r\n popup.setCurrentConversation({ id: conversationId, name: \"\", type: \"BOT\" });\r\n setCurrentConversationId(conversationId);\r\n setConversationName(name || \"\");\r\n setHasOlder(true);\r\n if (props.remoteRepo) {\r\n try {\r\n await popup.listMessagesAsync(conversationId);\r\n const messagesData = popup.getCurrentMessages();\r\n console.log(\"message data: \", messagesData)\r\n setSubmittedMessages(new Set<string>());\r\n setIsLoadingMessages(false);\r\n\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n const container = document.querySelector(\".chat-messages-container\") as HTMLElement | null;\r\n if (container) {\r\n container.scrollTop = container.scrollHeight;\r\n }\r\n setIsLoadingMessages(false);\r\n });\r\n });\r\n } catch (error) {\r\n console.error(\"Error loading messages:\", error);\r\n setIsLoadingMessages(false);\r\n }\r\n }\r\n }}\r\n />\r\n )}\r\n <div style={{ flex: 1, display: \"flex\", \"flex-direction\": \"column\", position: \"relative\", \"min-height\": 0, height: \"100%\" }}>\r\n {isFullScreen() && (\r\n <HeaderSteps currentStep={currentStep()} totalSteps={totalSteps()} title={conversationName()} isSurveyConversation={isSurveyConversation()} />)}\r\n <ChatMessages\r\n messages={formattedMessages()}\r\n isFullScreen={isFullScreen()}\r\n inputHeight={isFullScreen() ? inputHeight() : undefined}\r\n isMobile={isMobile()}\r\n onSubmit={handleSurveySubmit}\r\n onUpdateSurvey={handleSurveyUpdate}\r\n surveyOptions={surveyOptions()}\r\n submittedMessages={submittedMessages()}\r\n onLoadMoreMessages={loadMoreMessage}\r\n conversationId={currentConversationId()}\r\n isLoadingMessages={isLoadingMessages()}\r\n editingMsgIdBot={editingMsgIdBot()}\r\n setEditingMsgIdBot={setEditingMsgIdBot}\r\n editingMsgIdUser={editingMsgIdUser()}\r\n setEditingMsgIdUser={setEditingMsgIdUser}\r\n />\r\n {isFullScreen() ? (\r\n <>\r\n <div class={`chat-input-floating-box${formattedMessages().length > 0 ? \" chat-input-floating-box--with-messages\" : \"\"}`}>\r\n {formattedMessages().length === 0 && (\r\n <div\r\n style={{\r\n \"text-align\": \"center\",\r\n \"font-size\": \"32px\",\r\n \"font-weight\": \"600\",\r\n \"margin-bottom\": \"32px\",\r\n \"user-select\": \"none\",\r\n width: \"100%\",\r\n color: \"#1A1D1F\"\r\n }}\r\n >\r\n Hôm nay thị trường khiến bạn quan tâm điều gì?\r\n </div>\r\n )}\r\n <div style={{ width: \"100%\" }}>\r\n <ChatInput\r\n input={input()}\r\n setInput={setInput}\r\n sendMessage={sendMessage}\r\n onHeightChange={setInputHeight}\r\n disabled={!canInput()}\r\n />\r\n </div>\r\n {formattedMessages().length === 0 && (\r\n <div class=\"chat-popup-action-buttons\">\r\n <ChatActionButton text=\"Khảo sát đầu tư\" />\r\n <ChatActionButton text=\"Mục tiêu tài chính\" />\r\n <ChatActionButton text=\"Khả năng chấp nhận rủi ro\" />\r\n <ChatActionButton text=\"Khả năng chấp nhận rủi ro\" />\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n <ChatInput\r\n input={input()}\r\n setInput={setInput}\r\n sendMessage={sendMessage}\r\n onHeightChange={setInputHeight}\r\n disabled={!canInput()}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n <Show when={!!deletingConv()}>\r\n <div\r\n class=\"modal-backdrop\"\r\n onClick={() => setDeletingConv(null)}\r\n >\r\n <div\r\n style={{\r\n \"background-color\": \"white\",\r\n padding: \"20px\",\r\n \"border-radius\": \"8px\",\r\n width: \"350px\"\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div style={{ \"font-size\": \"16px\", \"font-weight\": \"500\", \"margin-bottom\": \"12px\", color: \"#1A1D1F\", \"text-align\": \"left\" }}>Xóa đoạn chat?</div>\r\n <div style={{ \"font-size\": \"14px\", \"margin-bottom\": \"16px\", color: \"#1A1D1F\", \"text-align\": \"left\" }}>\r\n Hành động này sẽ xóa <b>{deletingConv()?.name}</b>?\r\n </div>\r\n <div style={{ \"text-align\": \"right\" }}>\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setDeletingConv(null);\r\n }}\r\n class=\"modal-button-delete\"\r\n style={{ \"margin-right\": \"8px\" }}\r\n >Hủy bỏ</button>\r\n <button\r\n onClick={async (e) => {\r\n e.stopPropagation();\r\n try {\r\n await props.remoteRepo?.deleteConversationAsync(deletingConv().id);\r\n setDeletingConv(null);\r\n if (reloadSidebarConversations) reloadSidebarConversations();\r\n } catch (err) {\r\n alert(\"Xóa hội thoại thất bại!\");\r\n }\r\n }}\r\n class=\"modal-button-delete\"\r\n style={{\r\n \"background-color\": \"#e74c3c\",\r\n color: \"#fff\"\r\n }}\r\n >Xóa</button>\r\n </div>\r\n </div>\r\n </div>\r\n </Show>\r\n <Show when={showSurveyAlert()}>\r\n <div class=\"modal-backdrop\" onClick={() => setShowSurveyAlert(false)}>\r\n <div\r\n class=\"modal-content\"\r\n style={{\r\n \"background-color\": \"white\",\r\n padding: \"20px\",\r\n \"border-radius\": \"8px\",\r\n width: \"350px\"\r\n }}\r\n onClick={e => e.stopPropagation()}\r\n >\r\n <div style={{ \"font-size\": \"16px\", \"font-weight\": \"500\", \"margin-bottom\": \"12px\" }}>\r\n Bạn chưa làm khảo sát. Vui lòng thực hiện khảo sát trước khi bắt đầu tư vấn!\r\n </div>\r\n <div style={{ \"text-align\": \"right\" }}>\r\n <button\r\n onClick={() => setShowSurveyAlert(false)}\r\n class=\"modal-button-delete\"\r\n style={{\r\n \"background-color\": \"#1AAF74\",\r\n color: \"#fff\"\r\n }}\r\n >Đã hiểu</button>\r\n </div>\r\n </div>\r\n </div>\r\n </Show>\r\n </div>\r\n );\r\n })()}\r\n </div>\r\n );\r\n}","import ChatPopup from \"./modules/ChatPopup/ChatPopup\";\r\nimport RemoteRepository from \"./RemoteRepository\";\r\n\r\ninterface AppProps {\r\n remoteRepo: RemoteRepository | null;\r\n options?: {\r\n onMaximize?: () => void;\r\n onMinimize?: () => void;\r\n onMobile?: (isMobile: boolean) => void;\r\n onFullScreen?: (isFullScreen: boolean) => void;\r\n onClose?: () => void;\r\n onShrink?: () => void;\r\n onOpen?: () => void;\r\n onlyMobile?: boolean;\r\n };\r\n}\r\n\r\nexport default function App(props: AppProps) {\r\n return <ChatPopup remoteRepo={props.remoteRepo} options={props.options} />;\r\n}","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** Error thrown when an HTTP request fails. */\r\nexport class HttpError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.HttpError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n * @param {number} statusCode The HTTP status code represented by this error.\r\n */\r\n constructor(errorMessage, statusCode) {\r\n const trueProto = new.target.prototype;\r\n super(`${errorMessage}: Status code '${statusCode}'`);\r\n this.statusCode = statusCode;\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when a timeout elapses. */\r\nexport class TimeoutError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.TimeoutError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n */\r\n constructor(errorMessage = \"A timeout occurred.\") {\r\n const trueProto = new.target.prototype;\r\n super(errorMessage);\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when an action is aborted. */\r\nexport class AbortError extends Error {\r\n /** Constructs a new instance of {@link AbortError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n */\r\n constructor(errorMessage = \"An abort occurred.\") {\r\n const trueProto = new.target.prototype;\r\n super(errorMessage);\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the selected transport is unsupported by the browser. */\r\n/** @private */\r\nexport class UnsupportedTransportError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.UnsupportedTransportError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {HttpTransportType} transport The {@link @microsoft/signalr.HttpTransportType} this error occurred on.\r\n */\r\n constructor(message, transport) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'UnsupportedTransportError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the selected transport is disabled by the browser. */\r\n/** @private */\r\nexport class DisabledTransportError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.DisabledTransportError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {HttpTransportType} transport The {@link @microsoft/signalr.HttpTransportType} this error occurred on.\r\n */\r\n constructor(message, transport) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'DisabledTransportError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the selected transport cannot be started. */\r\n/** @private */\r\nexport class FailedToStartTransportError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.FailedToStartTransportError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {HttpTransportType} transport The {@link @microsoft/signalr.HttpTransportType} this error occurred on.\r\n */\r\n constructor(message, transport) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'FailedToStartTransportError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the negotiation with the server failed to complete. */\r\n/** @private */\r\nexport class FailedToNegotiateWithServerError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.FailedToNegotiateWithServerError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n */\r\n constructor(message) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.errorType = 'FailedToNegotiateWithServerError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when multiple errors have occurred. */\r\n/** @private */\r\nexport class AggregateErrors extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.AggregateErrors}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {Error[]} innerErrors The collection of errors this error is aggregating.\r\n */\r\n constructor(message, innerErrors) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.innerErrors = innerErrors;\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n//# sourceMappingURL=Errors.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** Represents an HTTP response. */\r\nexport class HttpResponse {\r\n constructor(statusCode, statusText, content) {\r\n this.statusCode = statusCode;\r\n this.statusText = statusText;\r\n this.content = content;\r\n }\r\n}\r\n/** Abstraction over an HTTP client.\r\n *\r\n * This class provides an abstraction over an HTTP client so that a different implementation can be provided on different platforms.\r\n */\r\nexport class HttpClient {\r\n get(url, options) {\r\n return this.send({\r\n ...options,\r\n method: \"GET\",\r\n url,\r\n });\r\n }\r\n post(url, options) {\r\n return this.send({\r\n ...options,\r\n method: \"POST\",\r\n url,\r\n });\r\n }\r\n delete(url, options) {\r\n return this.send({\r\n ...options,\r\n method: \"DELETE\",\r\n url,\r\n });\r\n }\r\n /** Gets all cookies that apply to the specified URL.\r\n *\r\n * @param url The URL that the cookies are valid for.\r\n * @returns {string} A string containing all the key-value cookie pairs for the specified URL.\r\n */\r\n // @ts-ignore\r\n getCookieString(url) {\r\n return \"\";\r\n }\r\n}\r\n//# sourceMappingURL=HttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// These values are designed to match the ASP.NET Log Levels since that's the pattern we're emulating here.\r\n/** Indicates the severity of a log message.\r\n *\r\n * Log Levels are ordered in increasing severity. So `Debug` is more severe than `Trace`, etc.\r\n */\r\nexport var LogLevel;\r\n(function (LogLevel) {\r\n /** Log level for very low severity diagnostic messages. */\r\n LogLevel[LogLevel[\"Trace\"] = 0] = \"Trace\";\r\n /** Log level for low severity diagnostic messages. */\r\n LogLevel[LogLevel[\"Debug\"] = 1] = \"Debug\";\r\n /** Log level for informational diagnostic messages. */\r\n LogLevel[LogLevel[\"Information\"] = 2] = \"Information\";\r\n /** Log level for diagnostic messages that indicate a non-fatal problem. */\r\n LogLevel[LogLevel[\"Warning\"] = 3] = \"Warning\";\r\n /** Log level for diagnostic messages that indicate a failure in the current operation. */\r\n LogLevel[LogLevel[\"Error\"] = 4] = \"Error\";\r\n /** Log level for diagnostic messages that indicate a failure that will terminate the entire application. */\r\n LogLevel[LogLevel[\"Critical\"] = 5] = \"Critical\";\r\n /** The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted. */\r\n LogLevel[LogLevel[\"None\"] = 6] = \"None\";\r\n})(LogLevel || (LogLevel = {}));\r\n//# sourceMappingURL=ILogger.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** A logger that does nothing when log messages are sent to it. */\r\nexport class NullLogger {\r\n constructor() { }\r\n /** @inheritDoc */\r\n // eslint-disable-next-line\r\n log(_logLevel, _message) {\r\n }\r\n}\r\n/** The singleton instance of the {@link @microsoft/signalr.NullLogger}. */\r\nNullLogger.instance = new NullLogger();\r\n//# sourceMappingURL=Loggers.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { NullLogger } from \"./Loggers\";\r\n// Version token that will be replaced by the prepack command\r\n/** The version of the SignalR client. */\r\nexport const VERSION = \"8.0.17\";\r\n/** @private */\r\nexport class Arg {\r\n static isRequired(val, name) {\r\n if (val === null || val === undefined) {\r\n throw new Error(`The '${name}' argument is required.`);\r\n }\r\n }\r\n static isNotEmpty(val, name) {\r\n if (!val || val.match(/^\\s*$/)) {\r\n throw new Error(`The '${name}' argument should not be empty.`);\r\n }\r\n }\r\n static isIn(val, values, name) {\r\n // TypeScript enums have keys for **both** the name and the value of each enum member on the type itself.\r\n if (!(val in values)) {\r\n throw new Error(`Unknown ${name} value: ${val}.`);\r\n }\r\n }\r\n}\r\n/** @private */\r\nexport class Platform {\r\n // react-native has a window but no document so we should check both\r\n static get isBrowser() {\r\n return !Platform.isNode && typeof window === \"object\" && typeof window.document === \"object\";\r\n }\r\n // WebWorkers don't have a window object so the isBrowser check would fail\r\n static get isWebWorker() {\r\n return !Platform.isNode && typeof self === \"object\" && \"importScripts\" in self;\r\n }\r\n // react-native has a window but no document\r\n static get isReactNative() {\r\n return !Platform.isNode && typeof window === \"object\" && typeof window.document === \"undefined\";\r\n }\r\n // Node apps shouldn't have a window object, but WebWorkers don't either\r\n // so we need to check for both WebWorker and window\r\n static get isNode() {\r\n return typeof process !== \"undefined\" && process.release && process.release.name === \"node\";\r\n }\r\n}\r\n/** @private */\r\nexport function getDataDetail(data, includeContent) {\r\n let detail = \"\";\r\n if (isArrayBuffer(data)) {\r\n detail = `Binary data of length ${data.byteLength}`;\r\n if (includeContent) {\r\n detail += `. Content: '${formatArrayBuffer(data)}'`;\r\n }\r\n }\r\n else if (typeof data === \"string\") {\r\n detail = `String data of length ${data.length}`;\r\n if (includeContent) {\r\n detail += `. Content: '${data}'`;\r\n }\r\n }\r\n return detail;\r\n}\r\n/** @private */\r\nexport function formatArrayBuffer(data) {\r\n const view = new Uint8Array(data);\r\n // Uint8Array.map only supports returning another Uint8Array?\r\n let str = \"\";\r\n view.forEach((num) => {\r\n const pad = num < 16 ? \"0\" : \"\";\r\n str += `0x${pad}${num.toString(16)} `;\r\n });\r\n // Trim of trailing space.\r\n return str.substr(0, str.length - 1);\r\n}\r\n// Also in signalr-protocol-msgpack/Utils.ts\r\n/** @private */\r\nexport function isArrayBuffer(val) {\r\n return val && typeof ArrayBuffer !== \"undefined\" &&\r\n (val instanceof ArrayBuffer ||\r\n // Sometimes we get an ArrayBuffer that doesn't satisfy instanceof\r\n (val.constructor && val.constructor.name === \"ArrayBuffer\"));\r\n}\r\n/** @private */\r\nexport async function sendMessage(logger, transportName, httpClient, url, content, options) {\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n logger.log(LogLevel.Trace, `(${transportName} transport) sending data. ${getDataDetail(content, options.logMessageContent)}.`);\r\n const responseType = isArrayBuffer(content) ? \"arraybuffer\" : \"text\";\r\n const response = await httpClient.post(url, {\r\n content,\r\n headers: { ...headers, ...options.headers },\r\n responseType,\r\n timeout: options.timeout,\r\n withCredentials: options.withCredentials,\r\n });\r\n logger.log(LogLevel.Trace, `(${transportName} transport) request complete. Response status: ${response.statusCode}.`);\r\n}\r\n/** @private */\r\nexport function createLogger(logger) {\r\n if (logger === undefined) {\r\n return new ConsoleLogger(LogLevel.Information);\r\n }\r\n if (logger === null) {\r\n return NullLogger.instance;\r\n }\r\n if (logger.log !== undefined) {\r\n return logger;\r\n }\r\n return new ConsoleLogger(logger);\r\n}\r\n/** @private */\r\nexport class SubjectSubscription {\r\n constructor(subject, observer) {\r\n this._subject = subject;\r\n this._observer = observer;\r\n }\r\n dispose() {\r\n const index = this._subject.observers.indexOf(this._observer);\r\n if (index > -1) {\r\n this._subject.observers.splice(index, 1);\r\n }\r\n if (this._subject.observers.length === 0 && this._subject.cancelCallback) {\r\n this._subject.cancelCallback().catch((_) => { });\r\n }\r\n }\r\n}\r\n/** @private */\r\nexport class ConsoleLogger {\r\n constructor(minimumLogLevel) {\r\n this._minLevel = minimumLogLevel;\r\n this.out = console;\r\n }\r\n log(logLevel, message) {\r\n if (logLevel >= this._minLevel) {\r\n const msg = `[${new Date().toISOString()}] ${LogLevel[logLevel]}: ${message}`;\r\n switch (logLevel) {\r\n case LogLevel.Critical:\r\n case LogLevel.Error:\r\n this.out.error(msg);\r\n break;\r\n case LogLevel.Warning:\r\n this.out.warn(msg);\r\n break;\r\n case LogLevel.Information:\r\n this.out.info(msg);\r\n break;\r\n default:\r\n // console.debug only goes to attached debuggers in Node, so we use console.log for Trace and Debug\r\n this.out.log(msg);\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n/** @private */\r\nexport function getUserAgentHeader() {\r\n let userAgentHeaderName = \"X-SignalR-User-Agent\";\r\n if (Platform.isNode) {\r\n userAgentHeaderName = \"User-Agent\";\r\n }\r\n return [userAgentHeaderName, constructUserAgent(VERSION, getOsName(), getRuntime(), getRuntimeVersion())];\r\n}\r\n/** @private */\r\nexport function constructUserAgent(version, os, runtime, runtimeVersion) {\r\n // Microsoft SignalR/[Version] ([Detailed Version]; [Operating System]; [Runtime]; [Runtime Version])\r\n let userAgent = \"Microsoft SignalR/\";\r\n const majorAndMinor = version.split(\".\");\r\n userAgent += `${majorAndMinor[0]}.${majorAndMinor[1]}`;\r\n userAgent += ` (${version}; `;\r\n if (os && os !== \"\") {\r\n userAgent += `${os}; `;\r\n }\r\n else {\r\n userAgent += \"Unknown OS; \";\r\n }\r\n userAgent += `${runtime}`;\r\n if (runtimeVersion) {\r\n userAgent += `; ${runtimeVersion}`;\r\n }\r\n else {\r\n userAgent += \"; Unknown Runtime Version\";\r\n }\r\n userAgent += \")\";\r\n return userAgent;\r\n}\r\n// eslint-disable-next-line spaced-comment\r\n/*#__PURE__*/ function getOsName() {\r\n if (Platform.isNode) {\r\n switch (process.platform) {\r\n case \"win32\":\r\n return \"Windows NT\";\r\n case \"darwin\":\r\n return \"macOS\";\r\n case \"linux\":\r\n return \"Linux\";\r\n default:\r\n return process.platform;\r\n }\r\n }\r\n else {\r\n return \"\";\r\n }\r\n}\r\n// eslint-disable-next-line spaced-comment\r\n/*#__PURE__*/ function getRuntimeVersion() {\r\n if (Platform.isNode) {\r\n return process.versions.node;\r\n }\r\n return undefined;\r\n}\r\nfunction getRuntime() {\r\n if (Platform.isNode) {\r\n return \"NodeJS\";\r\n }\r\n else {\r\n return \"Browser\";\r\n }\r\n}\r\n/** @private */\r\nexport function getErrorString(e) {\r\n if (e.stack) {\r\n return e.stack;\r\n }\r\n else if (e.message) {\r\n return e.message;\r\n }\r\n return `${e}`;\r\n}\r\n/** @private */\r\nexport function getGlobalThis() {\r\n // globalThis is semi-new and not available in Node until v12\r\n if (typeof globalThis !== \"undefined\") {\r\n return globalThis;\r\n }\r\n if (typeof self !== \"undefined\") {\r\n return self;\r\n }\r\n if (typeof window !== \"undefined\") {\r\n return window;\r\n }\r\n if (typeof global !== \"undefined\") {\r\n return global;\r\n }\r\n throw new Error(\"could not find global\");\r\n}\r\n//# sourceMappingURL=Utils.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpResponse } from \"./HttpClient\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { Platform, getGlobalThis, isArrayBuffer } from \"./Utils\";\r\nexport class FetchHttpClient extends HttpClient {\r\n constructor(logger) {\r\n super();\r\n this._logger = logger;\r\n // Node added a fetch implementation to the global scope starting in v18.\r\n // We need to add a cookie jar in node to be able to share cookies with WebSocket\r\n if (typeof fetch === \"undefined\" || Platform.isNode) {\r\n // In order to ignore the dynamic require in webpack builds we need to do this magic\r\n // @ts-ignore: TS doesn't know about these names\r\n const requireFunc = typeof __webpack_require__ === \"function\" ? __non_webpack_require__ : require;\r\n // Cookies aren't automatically handled in Node so we need to add a CookieJar to preserve cookies across requests\r\n this._jar = new (requireFunc(\"tough-cookie\")).CookieJar();\r\n if (typeof fetch === \"undefined\") {\r\n this._fetchType = requireFunc(\"node-fetch\");\r\n }\r\n else {\r\n // Use fetch from Node if available\r\n this._fetchType = fetch;\r\n }\r\n // node-fetch doesn't have a nice API for getting and setting cookies\r\n // fetch-cookie will wrap a fetch implementation with a default CookieJar or a provided one\r\n this._fetchType = requireFunc(\"fetch-cookie\")(this._fetchType, this._jar);\r\n }\r\n else {\r\n this._fetchType = fetch.bind(getGlobalThis());\r\n }\r\n if (typeof AbortController === \"undefined\") {\r\n // In order to ignore the dynamic require in webpack builds we need to do this magic\r\n // @ts-ignore: TS doesn't know about these names\r\n const requireFunc = typeof __webpack_require__ === \"function\" ? __non_webpack_require__ : require;\r\n // Node needs EventListener methods on AbortController which our custom polyfill doesn't provide\r\n this._abortControllerType = requireFunc(\"abort-controller\");\r\n }\r\n else {\r\n this._abortControllerType = AbortController;\r\n }\r\n }\r\n /** @inheritDoc */\r\n async send(request) {\r\n // Check that abort was not signaled before calling send\r\n if (request.abortSignal && request.abortSignal.aborted) {\r\n throw new AbortError();\r\n }\r\n if (!request.method) {\r\n throw new Error(\"No method defined.\");\r\n }\r\n if (!request.url) {\r\n throw new Error(\"No url defined.\");\r\n }\r\n const abortController = new this._abortControllerType();\r\n let error;\r\n // Hook our abortSignal into the abort controller\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = () => {\r\n abortController.abort();\r\n error = new AbortError();\r\n };\r\n }\r\n // If a timeout has been passed in, setup a timeout to call abort\r\n // Type needs to be any to fit window.setTimeout and NodeJS.setTimeout\r\n let timeoutId = null;\r\n if (request.timeout) {\r\n const msTimeout = request.timeout;\r\n timeoutId = setTimeout(() => {\r\n abortController.abort();\r\n this._logger.log(LogLevel.Warning, `Timeout from HTTP request.`);\r\n error = new TimeoutError();\r\n }, msTimeout);\r\n }\r\n if (request.content === \"\") {\r\n request.content = undefined;\r\n }\r\n if (request.content) {\r\n // Explicitly setting the Content-Type header for React Native on Android platform.\r\n request.headers = request.headers || {};\r\n if (isArrayBuffer(request.content)) {\r\n request.headers[\"Content-Type\"] = \"application/octet-stream\";\r\n }\r\n else {\r\n request.headers[\"Content-Type\"] = \"text/plain;charset=UTF-8\";\r\n }\r\n }\r\n let response;\r\n try {\r\n response = await this._fetchType(request.url, {\r\n body: request.content,\r\n cache: \"no-cache\",\r\n credentials: request.withCredentials === true ? \"include\" : \"same-origin\",\r\n headers: {\r\n \"X-Requested-With\": \"XMLHttpRequest\",\r\n ...request.headers,\r\n },\r\n method: request.method,\r\n mode: \"cors\",\r\n redirect: \"follow\",\r\n signal: abortController.signal,\r\n });\r\n }\r\n catch (e) {\r\n if (error) {\r\n throw error;\r\n }\r\n this._logger.log(LogLevel.Warning, `Error from HTTP request. ${e}.`);\r\n throw e;\r\n }\r\n finally {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = null;\r\n }\r\n }\r\n if (!response.ok) {\r\n const errorMessage = await deserializeContent(response, \"text\");\r\n throw new HttpError(errorMessage || response.statusText, response.status);\r\n }\r\n const content = deserializeContent(response, request.responseType);\r\n const payload = await content;\r\n return new HttpResponse(response.status, response.statusText, payload);\r\n }\r\n getCookieString(url) {\r\n let cookies = \"\";\r\n if (Platform.isNode && this._jar) {\r\n // @ts-ignore: unused variable\r\n this._jar.getCookies(url, (e, c) => cookies = c.join(\"; \"));\r\n }\r\n return cookies;\r\n }\r\n}\r\nfunction deserializeContent(response, responseType) {\r\n let content;\r\n switch (responseType) {\r\n case \"arraybuffer\":\r\n content = response.arrayBuffer();\r\n break;\r\n case \"text\":\r\n content = response.text();\r\n break;\r\n case \"blob\":\r\n case \"document\":\r\n case \"json\":\r\n throw new Error(`${responseType} is not supported.`);\r\n default:\r\n content = response.text();\r\n break;\r\n }\r\n return content;\r\n}\r\n//# sourceMappingURL=FetchHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpResponse } from \"./HttpClient\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\nexport class XhrHttpClient extends HttpClient {\r\n constructor(logger) {\r\n super();\r\n this._logger = logger;\r\n }\r\n /** @inheritDoc */\r\n send(request) {\r\n // Check that abort was not signaled before calling send\r\n if (request.abortSignal && request.abortSignal.aborted) {\r\n return Promise.reject(new AbortError());\r\n }\r\n if (!request.method) {\r\n return Promise.reject(new Error(\"No method defined.\"));\r\n }\r\n if (!request.url) {\r\n return Promise.reject(new Error(\"No url defined.\"));\r\n }\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(request.method, request.url, true);\r\n xhr.withCredentials = request.withCredentials === undefined ? true : request.withCredentials;\r\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n if (request.content === \"\") {\r\n request.content = undefined;\r\n }\r\n if (request.content) {\r\n // Explicitly setting the Content-Type header for React Native on Android platform.\r\n if (isArrayBuffer(request.content)) {\r\n xhr.setRequestHeader(\"Content-Type\", \"application/octet-stream\");\r\n }\r\n else {\r\n xhr.setRequestHeader(\"Content-Type\", \"text/plain;charset=UTF-8\");\r\n }\r\n }\r\n const headers = request.headers;\r\n if (headers) {\r\n Object.keys(headers)\r\n .forEach((header) => {\r\n xhr.setRequestHeader(header, headers[header]);\r\n });\r\n }\r\n if (request.responseType) {\r\n xhr.responseType = request.responseType;\r\n }\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = () => {\r\n xhr.abort();\r\n reject(new AbortError());\r\n };\r\n }\r\n if (request.timeout) {\r\n xhr.timeout = request.timeout;\r\n }\r\n xhr.onload = () => {\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = null;\r\n }\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n resolve(new HttpResponse(xhr.status, xhr.statusText, xhr.response || xhr.responseText));\r\n }\r\n else {\r\n reject(new HttpError(xhr.response || xhr.responseText || xhr.statusText, xhr.status));\r\n }\r\n };\r\n xhr.onerror = () => {\r\n this._logger.log(LogLevel.Warning, `Error from HTTP request. ${xhr.status}: ${xhr.statusText}.`);\r\n reject(new HttpError(xhr.statusText, xhr.status));\r\n };\r\n xhr.ontimeout = () => {\r\n this._logger.log(LogLevel.Warning, `Timeout from HTTP request.`);\r\n reject(new TimeoutError());\r\n };\r\n xhr.send(request.content);\r\n });\r\n }\r\n}\r\n//# sourceMappingURL=XhrHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortError } from \"./Errors\";\r\nimport { FetchHttpClient } from \"./FetchHttpClient\";\r\nimport { HttpClient } from \"./HttpClient\";\r\nimport { Platform } from \"./Utils\";\r\nimport { XhrHttpClient } from \"./XhrHttpClient\";\r\n/** Default implementation of {@link @microsoft/signalr.HttpClient}. */\r\nexport class DefaultHttpClient extends HttpClient {\r\n /** Creates a new instance of the {@link @microsoft/signalr.DefaultHttpClient}, using the provided {@link @microsoft/signalr.ILogger} to log messages. */\r\n constructor(logger) {\r\n super();\r\n if (typeof fetch !== \"undefined\" || Platform.isNode) {\r\n this._httpClient = new FetchHttpClient(logger);\r\n }\r\n else if (typeof XMLHttpRequest !== \"undefined\") {\r\n this._httpClient = new XhrHttpClient(logger);\r\n }\r\n else {\r\n throw new Error(\"No usable HttpClient found.\");\r\n }\r\n }\r\n /** @inheritDoc */\r\n send(request) {\r\n // Check that abort was not signaled before calling send\r\n if (request.abortSignal && request.abortSignal.aborted) {\r\n return Promise.reject(new AbortError());\r\n }\r\n if (!request.method) {\r\n return Promise.reject(new Error(\"No method defined.\"));\r\n }\r\n if (!request.url) {\r\n return Promise.reject(new Error(\"No url defined.\"));\r\n }\r\n return this._httpClient.send(request);\r\n }\r\n getCookieString(url) {\r\n return this._httpClient.getCookieString(url);\r\n }\r\n}\r\n//# sourceMappingURL=DefaultHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// Not exported from index\r\n/** @private */\r\nexport class TextMessageFormat {\r\n static write(output) {\r\n return `${output}${TextMessageFormat.RecordSeparator}`;\r\n }\r\n static parse(input) {\r\n if (input[input.length - 1] !== TextMessageFormat.RecordSeparator) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n const messages = input.split(TextMessageFormat.RecordSeparator);\r\n messages.pop();\r\n return messages;\r\n }\r\n}\r\nTextMessageFormat.RecordSeparatorCode = 0x1e;\r\nTextMessageFormat.RecordSeparator = String.fromCharCode(TextMessageFormat.RecordSeparatorCode);\r\n//# sourceMappingURL=TextMessageFormat.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { TextMessageFormat } from \"./TextMessageFormat\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\n/** @private */\r\nexport class HandshakeProtocol {\r\n // Handshake request is always JSON\r\n writeHandshakeRequest(handshakeRequest) {\r\n return TextMessageFormat.write(JSON.stringify(handshakeRequest));\r\n }\r\n parseHandshakeResponse(data) {\r\n let messageData;\r\n let remainingData;\r\n if (isArrayBuffer(data)) {\r\n // Format is binary but still need to read JSON text from handshake response\r\n const binaryData = new Uint8Array(data);\r\n const separatorIndex = binaryData.indexOf(TextMessageFormat.RecordSeparatorCode);\r\n if (separatorIndex === -1) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n // content before separator is handshake response\r\n // optional content after is additional messages\r\n const responseLength = separatorIndex + 1;\r\n messageData = String.fromCharCode.apply(null, Array.prototype.slice.call(binaryData.slice(0, responseLength)));\r\n remainingData = (binaryData.byteLength > responseLength) ? binaryData.slice(responseLength).buffer : null;\r\n }\r\n else {\r\n const textData = data;\r\n const separatorIndex = textData.indexOf(TextMessageFormat.RecordSeparator);\r\n if (separatorIndex === -1) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n // content before separator is handshake response\r\n // optional content after is additional messages\r\n const responseLength = separatorIndex + 1;\r\n messageData = textData.substring(0, responseLength);\r\n remainingData = (textData.length > responseLength) ? textData.substring(responseLength) : null;\r\n }\r\n // At this point we should have just the single handshake message\r\n const messages = TextMessageFormat.parse(messageData);\r\n const response = JSON.parse(messages[0]);\r\n if (response.type) {\r\n throw new Error(\"Expected a handshake response from the server.\");\r\n }\r\n const responseMessage = response;\r\n // multiple messages could have arrived with handshake\r\n // return additional data to be parsed as usual, or null if all parsed\r\n return [remainingData, responseMessage];\r\n }\r\n}\r\n//# sourceMappingURL=HandshakeProtocol.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** Defines the type of a Hub Message. */\r\nexport var MessageType;\r\n(function (MessageType) {\r\n /** Indicates the message is an Invocation message and implements the {@link @microsoft/signalr.InvocationMessage} interface. */\r\n MessageType[MessageType[\"Invocation\"] = 1] = \"Invocation\";\r\n /** Indicates the message is a StreamItem message and implements the {@link @microsoft/signalr.StreamItemMessage} interface. */\r\n MessageType[MessageType[\"StreamItem\"] = 2] = \"StreamItem\";\r\n /** Indicates the message is a Completion message and implements the {@link @microsoft/signalr.CompletionMessage} interface. */\r\n MessageType[MessageType[\"Completion\"] = 3] = \"Completion\";\r\n /** Indicates the message is a Stream Invocation message and implements the {@link @microsoft/signalr.StreamInvocationMessage} interface. */\r\n MessageType[MessageType[\"StreamInvocation\"] = 4] = \"StreamInvocation\";\r\n /** Indicates the message is a Cancel Invocation message and implements the {@link @microsoft/signalr.CancelInvocationMessage} interface. */\r\n MessageType[MessageType[\"CancelInvocation\"] = 5] = \"CancelInvocation\";\r\n /** Indicates the message is a Ping message and implements the {@link @microsoft/signalr.PingMessage} interface. */\r\n MessageType[MessageType[\"Ping\"] = 6] = \"Ping\";\r\n /** Indicates the message is a Close message and implements the {@link @microsoft/signalr.CloseMessage} interface. */\r\n MessageType[MessageType[\"Close\"] = 7] = \"Close\";\r\n MessageType[MessageType[\"Ack\"] = 8] = \"Ack\";\r\n MessageType[MessageType[\"Sequence\"] = 9] = \"Sequence\";\r\n})(MessageType || (MessageType = {}));\r\n//# sourceMappingURL=IHubProtocol.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { SubjectSubscription } from \"./Utils\";\r\n/** Stream implementation to stream items to the server. */\r\nexport class Subject {\r\n constructor() {\r\n this.observers = [];\r\n }\r\n next(item) {\r\n for (const observer of this.observers) {\r\n observer.next(item);\r\n }\r\n }\r\n error(err) {\r\n for (const observer of this.observers) {\r\n if (observer.error) {\r\n observer.error(err);\r\n }\r\n }\r\n }\r\n complete() {\r\n for (const observer of this.observers) {\r\n if (observer.complete) {\r\n observer.complete();\r\n }\r\n }\r\n }\r\n subscribe(observer) {\r\n this.observers.push(observer);\r\n return new SubjectSubscription(this, observer);\r\n }\r\n}\r\n//# sourceMappingURL=Subject.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { MessageType } from \"./IHubProtocol\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\n/** @private */\r\nexport class MessageBuffer {\r\n constructor(protocol, connection, bufferSize) {\r\n this._bufferSize = 100000;\r\n this._messages = [];\r\n this._totalMessageCount = 0;\r\n this._waitForSequenceMessage = false;\r\n // Message IDs start at 1 and always increment by 1\r\n this._nextReceivingSequenceId = 1;\r\n this._latestReceivedSequenceId = 0;\r\n this._bufferedByteCount = 0;\r\n this._reconnectInProgress = false;\r\n this._protocol = protocol;\r\n this._connection = connection;\r\n this._bufferSize = bufferSize;\r\n }\r\n async _send(message) {\r\n const serializedMessage = this._protocol.writeMessage(message);\r\n let backpressurePromise = Promise.resolve();\r\n // Only count invocation messages. Acks, pings, etc. don't need to be resent on reconnect\r\n if (this._isInvocationMessage(message)) {\r\n this._totalMessageCount++;\r\n let backpressurePromiseResolver = () => { };\r\n let backpressurePromiseRejector = () => { };\r\n if (isArrayBuffer(serializedMessage)) {\r\n this._bufferedByteCount += serializedMessage.byteLength;\r\n }\r\n else {\r\n this._bufferedByteCount += serializedMessage.length;\r\n }\r\n if (this._bufferedByteCount >= this._bufferSize) {\r\n backpressurePromise = new Promise((resolve, reject) => {\r\n backpressurePromiseResolver = resolve;\r\n backpressurePromiseRejector = reject;\r\n });\r\n }\r\n this._messages.push(new BufferedItem(serializedMessage, this._totalMessageCount, backpressurePromiseResolver, backpressurePromiseRejector));\r\n }\r\n try {\r\n // If this is set it means we are reconnecting or resending\r\n // We don't want to send on a disconnected connection\r\n // And we don't want to send if resend is running since that would mean sending\r\n // this message twice\r\n if (!this._reconnectInProgress) {\r\n await this._connection.send(serializedMessage);\r\n }\r\n }\r\n catch {\r\n this._disconnected();\r\n }\r\n await backpressurePromise;\r\n }\r\n _ack(ackMessage) {\r\n let newestAckedMessage = -1;\r\n // Find index of newest message being acked\r\n for (let index = 0; index < this._messages.length; index++) {\r\n const element = this._messages[index];\r\n if (element._id <= ackMessage.sequenceId) {\r\n newestAckedMessage = index;\r\n if (isArrayBuffer(element._message)) {\r\n this._bufferedByteCount -= element._message.byteLength;\r\n }\r\n else {\r\n this._bufferedByteCount -= element._message.length;\r\n }\r\n // resolve items that have already been sent and acked\r\n element._resolver();\r\n }\r\n else if (this._bufferedByteCount < this._bufferSize) {\r\n // resolve items that now fall under the buffer limit but haven't been acked\r\n element._resolver();\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n if (newestAckedMessage !== -1) {\r\n // We're removing everything including the message pointed to, so add 1\r\n this._messages = this._messages.slice(newestAckedMessage + 1);\r\n }\r\n }\r\n _shouldProcessMessage(message) {\r\n if (this._waitForSequenceMessage) {\r\n if (message.type !== MessageType.Sequence) {\r\n return false;\r\n }\r\n else {\r\n this._waitForSequenceMessage = false;\r\n return true;\r\n }\r\n }\r\n // No special processing for acks, pings, etc.\r\n if (!this._isInvocationMessage(message)) {\r\n return true;\r\n }\r\n const currentId = this._nextReceivingSequenceId;\r\n this._nextReceivingSequenceId++;\r\n if (currentId <= this._latestReceivedSequenceId) {\r\n if (currentId === this._latestReceivedSequenceId) {\r\n // Should only hit this if we just reconnected and the server is sending\r\n // Messages it has buffered, which would mean it hasn't seen an Ack for these messages\r\n this._ackTimer();\r\n }\r\n // Ignore, this is a duplicate message\r\n return false;\r\n }\r\n this._latestReceivedSequenceId = currentId;\r\n // Only start the timer for sending an Ack message when we have a message to ack. This also conveniently solves\r\n // timer throttling by not having a recursive timer, and by starting the timer via a network call (recv)\r\n this._ackTimer();\r\n return true;\r\n }\r\n _resetSequence(message) {\r\n if (message.sequenceId > this._nextReceivingSequenceId) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._connection.stop(new Error(\"Sequence ID greater than amount of messages we've received.\"));\r\n return;\r\n }\r\n this._nextReceivingSequenceId = message.sequenceId;\r\n }\r\n _disconnected() {\r\n this._reconnectInProgress = true;\r\n this._waitForSequenceMessage = true;\r\n }\r\n async _resend() {\r\n const sequenceId = this._messages.length !== 0\r\n ? this._messages[0]._id\r\n : this._totalMessageCount + 1;\r\n await this._connection.send(this._protocol.writeMessage({ type: MessageType.Sequence, sequenceId }));\r\n // Get a local variable to the _messages, just in case messages are acked while resending\r\n // Which would slice the _messages array (which creates a new copy)\r\n const messages = this._messages;\r\n for (const element of messages) {\r\n await this._connection.send(element._message);\r\n }\r\n this._reconnectInProgress = false;\r\n }\r\n _dispose(error) {\r\n error !== null && error !== void 0 ? error : (error = new Error(\"Unable to reconnect to server.\"));\r\n // Unblock backpressure if any\r\n for (const element of this._messages) {\r\n element._rejector(error);\r\n }\r\n }\r\n _isInvocationMessage(message) {\r\n // There is no way to check if something implements an interface.\r\n // So we individually check the messages in a switch statement.\r\n // To make sure we don't miss any message types we rely on the compiler\r\n // seeing the function returns a value and it will do the\r\n // exhaustive check for us on the switch statement, since we don't use 'case default'\r\n switch (message.type) {\r\n case MessageType.Invocation:\r\n case MessageType.StreamItem:\r\n case MessageType.Completion:\r\n case MessageType.StreamInvocation:\r\n case MessageType.CancelInvocation:\r\n return true;\r\n case MessageType.Close:\r\n case MessageType.Sequence:\r\n case MessageType.Ping:\r\n case MessageType.Ack:\r\n return false;\r\n }\r\n }\r\n _ackTimer() {\r\n if (this._ackTimerHandle === undefined) {\r\n this._ackTimerHandle = setTimeout(async () => {\r\n try {\r\n if (!this._reconnectInProgress) {\r\n await this._connection.send(this._protocol.writeMessage({ type: MessageType.Ack, sequenceId: this._latestReceivedSequenceId }));\r\n }\r\n // Ignore errors, that means the connection is closed and we don't care about the Ack message anymore.\r\n }\r\n catch { }\r\n clearTimeout(this._ackTimerHandle);\r\n this._ackTimerHandle = undefined;\r\n // 1 second delay so we don't spam Ack messages if there are many messages being received at once.\r\n }, 1000);\r\n }\r\n }\r\n}\r\nclass BufferedItem {\r\n constructor(message, id, resolver, rejector) {\r\n this._message = message;\r\n this._id = id;\r\n this._resolver = resolver;\r\n this._rejector = rejector;\r\n }\r\n}\r\n//# sourceMappingURL=MessageBuffer.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { HandshakeProtocol } from \"./HandshakeProtocol\";\r\nimport { AbortError } from \"./Errors\";\r\nimport { MessageType } from \"./IHubProtocol\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { Subject } from \"./Subject\";\r\nimport { Arg, getErrorString, Platform } from \"./Utils\";\r\nimport { MessageBuffer } from \"./MessageBuffer\";\r\nconst DEFAULT_TIMEOUT_IN_MS = 30 * 1000;\r\nconst DEFAULT_PING_INTERVAL_IN_MS = 15 * 1000;\r\nconst DEFAULT_STATEFUL_RECONNECT_BUFFER_SIZE = 100000;\r\n/** Describes the current state of the {@link HubConnection} to the server. */\r\nexport var HubConnectionState;\r\n(function (HubConnectionState) {\r\n /** The hub connection is disconnected. */\r\n HubConnectionState[\"Disconnected\"] = \"Disconnected\";\r\n /** The hub connection is connecting. */\r\n HubConnectionState[\"Connecting\"] = \"Connecting\";\r\n /** The hub connection is connected. */\r\n HubConnectionState[\"Connected\"] = \"Connected\";\r\n /** The hub connection is disconnecting. */\r\n HubConnectionState[\"Disconnecting\"] = \"Disconnecting\";\r\n /** The hub connection is reconnecting. */\r\n HubConnectionState[\"Reconnecting\"] = \"Reconnecting\";\r\n})(HubConnectionState || (HubConnectionState = {}));\r\n/** Represents a connection to a SignalR Hub. */\r\nexport class HubConnection {\r\n /** @internal */\r\n // Using a public static factory method means we can have a private constructor and an _internal_\r\n // create method that can be used by HubConnectionBuilder. An \"internal\" constructor would just\r\n // be stripped away and the '.d.ts' file would have no constructor, which is interpreted as a\r\n // public parameter-less constructor.\r\n static create(connection, logger, protocol, reconnectPolicy, serverTimeoutInMilliseconds, keepAliveIntervalInMilliseconds, statefulReconnectBufferSize) {\r\n return new HubConnection(connection, logger, protocol, reconnectPolicy, serverTimeoutInMilliseconds, keepAliveIntervalInMilliseconds, statefulReconnectBufferSize);\r\n }\r\n constructor(connection, logger, protocol, reconnectPolicy, serverTimeoutInMilliseconds, keepAliveIntervalInMilliseconds, statefulReconnectBufferSize) {\r\n this._nextKeepAlive = 0;\r\n this._freezeEventListener = () => {\r\n this._logger.log(LogLevel.Warning, \"The page is being frozen, this will likely lead to the connection being closed and messages being lost. For more information see the docs at https://learn.microsoft.com/aspnet/core/signalr/javascript-client#bsleep\");\r\n };\r\n Arg.isRequired(connection, \"connection\");\r\n Arg.isRequired(logger, \"logger\");\r\n Arg.isRequired(protocol, \"protocol\");\r\n this.serverTimeoutInMilliseconds = serverTimeoutInMilliseconds !== null && serverTimeoutInMilliseconds !== void 0 ? serverTimeoutInMilliseconds : DEFAULT_TIMEOUT_IN_MS;\r\n this.keepAliveIntervalInMilliseconds = keepAliveIntervalInMilliseconds !== null && keepAliveIntervalInMilliseconds !== void 0 ? keepAliveIntervalInMilliseconds : DEFAULT_PING_INTERVAL_IN_MS;\r\n this._statefulReconnectBufferSize = statefulReconnectBufferSize !== null && statefulReconnectBufferSize !== void 0 ? statefulReconnectBufferSize : DEFAULT_STATEFUL_RECONNECT_BUFFER_SIZE;\r\n this._logger = logger;\r\n this._protocol = protocol;\r\n this.connection = connection;\r\n this._reconnectPolicy = reconnectPolicy;\r\n this._handshakeProtocol = new HandshakeProtocol();\r\n this.connection.onreceive = (data) => this._processIncomingData(data);\r\n this.connection.onclose = (error) => this._connectionClosed(error);\r\n this._callbacks = {};\r\n this._methods = {};\r\n this._closedCallbacks = [];\r\n this._reconnectingCallbacks = [];\r\n this._reconnectedCallbacks = [];\r\n this._invocationId = 0;\r\n this._receivedHandshakeResponse = false;\r\n this._connectionState = HubConnectionState.Disconnected;\r\n this._connectionStarted = false;\r\n this._cachedPingMessage = this._protocol.writeMessage({ type: MessageType.Ping });\r\n }\r\n /** Indicates the state of the {@link HubConnection} to the server. */\r\n get state() {\r\n return this._connectionState;\r\n }\r\n /** Represents the connection id of the {@link HubConnection} on the server. The connection id will be null when the connection is either\r\n * in the disconnected state or if the negotiation step was skipped.\r\n */\r\n get connectionId() {\r\n return this.connection ? (this.connection.connectionId || null) : null;\r\n }\r\n /** Indicates the url of the {@link HubConnection} to the server. */\r\n get baseUrl() {\r\n return this.connection.baseUrl || \"\";\r\n }\r\n /**\r\n * Sets a new url for the HubConnection. Note that the url can only be changed when the connection is in either the Disconnected or\r\n * Reconnecting states.\r\n * @param {string} url The url to connect to.\r\n */\r\n set baseUrl(url) {\r\n if (this._connectionState !== HubConnectionState.Disconnected && this._connectionState !== HubConnectionState.Reconnecting) {\r\n throw new Error(\"The HubConnection must be in the Disconnected or Reconnecting state to change the url.\");\r\n }\r\n if (!url) {\r\n throw new Error(\"The HubConnection url must be a valid url.\");\r\n }\r\n this.connection.baseUrl = url;\r\n }\r\n /** Starts the connection.\r\n *\r\n * @returns {Promise<void>} A Promise that resolves when the connection has been successfully established, or rejects with an error.\r\n */\r\n start() {\r\n this._startPromise = this._startWithStateTransitions();\r\n return this._startPromise;\r\n }\r\n async _startWithStateTransitions() {\r\n if (this._connectionState !== HubConnectionState.Disconnected) {\r\n return Promise.reject(new Error(\"Cannot start a HubConnection that is not in the 'Disconnected' state.\"));\r\n }\r\n this._connectionState = HubConnectionState.Connecting;\r\n this._logger.log(LogLevel.Debug, \"Starting HubConnection.\");\r\n try {\r\n await this._startInternal();\r\n if (Platform.isBrowser) {\r\n // Log when the browser freezes the tab so users know why their connection unexpectedly stopped working\r\n window.document.addEventListener(\"freeze\", this._freezeEventListener);\r\n }\r\n this._connectionState = HubConnectionState.Connected;\r\n this._connectionStarted = true;\r\n this._logger.log(LogLevel.Debug, \"HubConnection connected successfully.\");\r\n }\r\n catch (e) {\r\n this._connectionState = HubConnectionState.Disconnected;\r\n this._logger.log(LogLevel.Debug, `HubConnection failed to start successfully because of error '${e}'.`);\r\n return Promise.reject(e);\r\n }\r\n }\r\n async _startInternal() {\r\n this._stopDuringStartError = undefined;\r\n this._receivedHandshakeResponse = false;\r\n // Set up the promise before any connection is (re)started otherwise it could race with received messages\r\n const handshakePromise = new Promise((resolve, reject) => {\r\n this._handshakeResolver = resolve;\r\n this._handshakeRejecter = reject;\r\n });\r\n await this.connection.start(this._protocol.transferFormat);\r\n try {\r\n let version = this._protocol.version;\r\n if (!this.connection.features.reconnect) {\r\n // Stateful Reconnect starts with HubProtocol version 2, newer clients connecting to older servers will fail to connect due to\r\n // the handshake only supporting version 1, so we will try to send version 1 during the handshake to keep old servers working.\r\n version = 1;\r\n }\r\n const handshakeRequest = {\r\n protocol: this._protocol.name,\r\n version,\r\n };\r\n this._logger.log(LogLevel.Debug, \"Sending handshake request.\");\r\n await this._sendMessage(this._handshakeProtocol.writeHandshakeRequest(handshakeRequest));\r\n this._logger.log(LogLevel.Information, `Using HubProtocol '${this._protocol.name}'.`);\r\n // defensively cleanup timeout in case we receive a message from the server before we finish start\r\n this._cleanupTimeout();\r\n this._resetTimeoutPeriod();\r\n this._resetKeepAliveInterval();\r\n await handshakePromise;\r\n // It's important to check the stopDuringStartError instead of just relying on the handshakePromise\r\n // being rejected on close, because this continuation can run after both the handshake completed successfully\r\n // and the connection was closed.\r\n if (this._stopDuringStartError) {\r\n // It's important to throw instead of returning a rejected promise, because we don't want to allow any state\r\n // transitions to occur between now and the calling code observing the exceptions. Returning a rejected promise\r\n // will cause the calling continuation to get scheduled to run later.\r\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\r\n throw this._stopDuringStartError;\r\n }\r\n const useStatefulReconnect = this.connection.features.reconnect || false;\r\n if (useStatefulReconnect) {\r\n this._messageBuffer = new MessageBuffer(this._protocol, this.connection, this._statefulReconnectBufferSize);\r\n this.connection.features.disconnected = this._messageBuffer._disconnected.bind(this._messageBuffer);\r\n this.connection.features.resend = () => {\r\n if (this._messageBuffer) {\r\n return this._messageBuffer._resend();\r\n }\r\n };\r\n }\r\n if (!this.connection.features.inherentKeepAlive) {\r\n await this._sendMessage(this._cachedPingMessage);\r\n }\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Debug, `Hub handshake failed with error '${e}' during start(). Stopping HubConnection.`);\r\n this._cleanupTimeout();\r\n this._cleanupPingTimer();\r\n // HttpConnection.stop() should not complete until after the onclose callback is invoked.\r\n // This will transition the HubConnection to the disconnected state before HttpConnection.stop() completes.\r\n await this.connection.stop(e);\r\n throw e;\r\n }\r\n }\r\n /** Stops the connection.\r\n *\r\n * @returns {Promise<void>} A Promise that resolves when the connection has been successfully terminated, or rejects with an error.\r\n */\r\n async stop() {\r\n // Capture the start promise before the connection might be restarted in an onclose callback.\r\n const startPromise = this._startPromise;\r\n this.connection.features.reconnect = false;\r\n this._stopPromise = this._stopInternal();\r\n await this._stopPromise;\r\n try {\r\n // Awaiting undefined continues immediately\r\n await startPromise;\r\n }\r\n catch (e) {\r\n // This exception is returned to the user as a rejected Promise from the start method.\r\n }\r\n }\r\n _stopInternal(error) {\r\n if (this._connectionState === HubConnectionState.Disconnected) {\r\n this._logger.log(LogLevel.Debug, `Call to HubConnection.stop(${error}) ignored because it is already in the disconnected state.`);\r\n return Promise.resolve();\r\n }\r\n if (this._connectionState === HubConnectionState.Disconnecting) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stop(${error}) ignored because the connection is already in the disconnecting state.`);\r\n return this._stopPromise;\r\n }\r\n const state = this._connectionState;\r\n this._connectionState = HubConnectionState.Disconnecting;\r\n this._logger.log(LogLevel.Debug, \"Stopping HubConnection.\");\r\n if (this._reconnectDelayHandle) {\r\n // We're in a reconnect delay which means the underlying connection is currently already stopped.\r\n // Just clear the handle to stop the reconnect loop (which no one is waiting on thankfully) and\r\n // fire the onclose callbacks.\r\n this._logger.log(LogLevel.Debug, \"Connection stopped during reconnect delay. Done reconnecting.\");\r\n clearTimeout(this._reconnectDelayHandle);\r\n this._reconnectDelayHandle = undefined;\r\n this._completeClose();\r\n return Promise.resolve();\r\n }\r\n if (state === HubConnectionState.Connected) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._sendCloseMessage();\r\n }\r\n this._cleanupTimeout();\r\n this._cleanupPingTimer();\r\n this._stopDuringStartError = error || new AbortError(\"The connection was stopped before the hub handshake could complete.\");\r\n // HttpConnection.stop() should not complete until after either HttpConnection.start() fails\r\n // or the onclose callback is invoked. The onclose callback will transition the HubConnection\r\n // to the disconnected state if need be before HttpConnection.stop() completes.\r\n return this.connection.stop(error);\r\n }\r\n async _sendCloseMessage() {\r\n try {\r\n await this._sendWithProtocol(this._createCloseMessage());\r\n }\r\n catch {\r\n // Ignore, this is a best effort attempt to let the server know the client closed gracefully.\r\n }\r\n }\r\n /** Invokes a streaming hub method on the server using the specified name and arguments.\r\n *\r\n * @typeparam T The type of the items returned by the server.\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {IStreamResult<T>} An object that yields results from the server as they are received.\r\n */\r\n stream(methodName, ...args) {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const invocationDescriptor = this._createStreamInvocation(methodName, args, streamIds);\r\n // eslint-disable-next-line prefer-const\r\n let promiseQueue;\r\n const subject = new Subject();\r\n subject.cancelCallback = () => {\r\n const cancelInvocation = this._createCancelInvocation(invocationDescriptor.invocationId);\r\n delete this._callbacks[invocationDescriptor.invocationId];\r\n return promiseQueue.then(() => {\r\n return this._sendWithProtocol(cancelInvocation);\r\n });\r\n };\r\n this._callbacks[invocationDescriptor.invocationId] = (invocationEvent, error) => {\r\n if (error) {\r\n subject.error(error);\r\n return;\r\n }\r\n else if (invocationEvent) {\r\n // invocationEvent will not be null when an error is not passed to the callback\r\n if (invocationEvent.type === MessageType.Completion) {\r\n if (invocationEvent.error) {\r\n subject.error(new Error(invocationEvent.error));\r\n }\r\n else {\r\n subject.complete();\r\n }\r\n }\r\n else {\r\n subject.next((invocationEvent.item));\r\n }\r\n }\r\n };\r\n promiseQueue = this._sendWithProtocol(invocationDescriptor)\r\n .catch((e) => {\r\n subject.error(e);\r\n delete this._callbacks[invocationDescriptor.invocationId];\r\n });\r\n this._launchStreams(streams, promiseQueue);\r\n return subject;\r\n }\r\n _sendMessage(message) {\r\n this._resetKeepAliveInterval();\r\n return this.connection.send(message);\r\n }\r\n /**\r\n * Sends a js object to the server.\r\n * @param message The js object to serialize and send.\r\n */\r\n _sendWithProtocol(message) {\r\n if (this._messageBuffer) {\r\n return this._messageBuffer._send(message);\r\n }\r\n else {\r\n return this._sendMessage(this._protocol.writeMessage(message));\r\n }\r\n }\r\n /** Invokes a hub method on the server using the specified name and arguments. Does not wait for a response from the receiver.\r\n *\r\n * The Promise returned by this method resolves when the client has sent the invocation to the server. The server may still\r\n * be processing the invocation.\r\n *\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {Promise<void>} A Promise that resolves when the invocation has been successfully sent, or rejects with an error.\r\n */\r\n send(methodName, ...args) {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const sendPromise = this._sendWithProtocol(this._createInvocation(methodName, args, true, streamIds));\r\n this._launchStreams(streams, sendPromise);\r\n return sendPromise;\r\n }\r\n /** Invokes a hub method on the server using the specified name and arguments.\r\n *\r\n * The Promise returned by this method resolves when the server indicates it has finished invoking the method. When the promise\r\n * resolves, the server has finished invoking the method. If the server method returns a result, it is produced as the result of\r\n * resolving the Promise.\r\n *\r\n * @typeparam T The expected return type.\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {Promise<T>} A Promise that resolves with the result of the server method (if any), or rejects with an error.\r\n */\r\n invoke(methodName, ...args) {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const invocationDescriptor = this._createInvocation(methodName, args, false, streamIds);\r\n const p = new Promise((resolve, reject) => {\r\n // invocationId will always have a value for a non-blocking invocation\r\n this._callbacks[invocationDescriptor.invocationId] = (invocationEvent, error) => {\r\n if (error) {\r\n reject(error);\r\n return;\r\n }\r\n else if (invocationEvent) {\r\n // invocationEvent will not be null when an error is not passed to the callback\r\n if (invocationEvent.type === MessageType.Completion) {\r\n if (invocationEvent.error) {\r\n reject(new Error(invocationEvent.error));\r\n }\r\n else {\r\n resolve(invocationEvent.result);\r\n }\r\n }\r\n else {\r\n reject(new Error(`Unexpected message type: ${invocationEvent.type}`));\r\n }\r\n }\r\n };\r\n const promiseQueue = this._sendWithProtocol(invocationDescriptor)\r\n .catch((e) => {\r\n reject(e);\r\n // invocationId will always have a value for a non-blocking invocation\r\n delete this._callbacks[invocationDescriptor.invocationId];\r\n });\r\n this._launchStreams(streams, promiseQueue);\r\n });\r\n return p;\r\n }\r\n on(methodName, newMethod) {\r\n if (!methodName || !newMethod) {\r\n return;\r\n }\r\n methodName = methodName.toLowerCase();\r\n if (!this._methods[methodName]) {\r\n this._methods[methodName] = [];\r\n }\r\n // Preventing adding the same handler multiple times.\r\n if (this._methods[methodName].indexOf(newMethod) !== -1) {\r\n return;\r\n }\r\n this._methods[methodName].push(newMethod);\r\n }\r\n off(methodName, method) {\r\n if (!methodName) {\r\n return;\r\n }\r\n methodName = methodName.toLowerCase();\r\n const handlers = this._methods[methodName];\r\n if (!handlers) {\r\n return;\r\n }\r\n if (method) {\r\n const removeIdx = handlers.indexOf(method);\r\n if (removeIdx !== -1) {\r\n handlers.splice(removeIdx, 1);\r\n if (handlers.length === 0) {\r\n delete this._methods[methodName];\r\n }\r\n }\r\n }\r\n else {\r\n delete this._methods[methodName];\r\n }\r\n }\r\n /** Registers a handler that will be invoked when the connection is closed.\r\n *\r\n * @param {Function} callback The handler that will be invoked when the connection is closed. Optionally receives a single argument containing the error that caused the connection to close (if any).\r\n */\r\n onclose(callback) {\r\n if (callback) {\r\n this._closedCallbacks.push(callback);\r\n }\r\n }\r\n /** Registers a handler that will be invoked when the connection starts reconnecting.\r\n *\r\n * @param {Function} callback The handler that will be invoked when the connection starts reconnecting. Optionally receives a single argument containing the error that caused the connection to start reconnecting (if any).\r\n */\r\n onreconnecting(callback) {\r\n if (callback) {\r\n this._reconnectingCallbacks.push(callback);\r\n }\r\n }\r\n /** Registers a handler that will be invoked when the connection successfully reconnects.\r\n *\r\n * @param {Function} callback The handler that will be invoked when the connection successfully reconnects.\r\n */\r\n onreconnected(callback) {\r\n if (callback) {\r\n this._reconnectedCallbacks.push(callback);\r\n }\r\n }\r\n _processIncomingData(data) {\r\n this._cleanupTimeout();\r\n if (!this._receivedHandshakeResponse) {\r\n data = this._processHandshakeResponse(data);\r\n this._receivedHandshakeResponse = true;\r\n }\r\n // Data may have all been read when processing handshake response\r\n if (data) {\r\n // Parse the messages\r\n const messages = this._protocol.parseMessages(data, this._logger);\r\n for (const message of messages) {\r\n if (this._messageBuffer && !this._messageBuffer._shouldProcessMessage(message)) {\r\n // Don't process the message, we are either waiting for a SequenceMessage or received a duplicate message\r\n continue;\r\n }\r\n switch (message.type) {\r\n case MessageType.Invocation:\r\n this._invokeClientMethod(message)\r\n .catch((e) => {\r\n this._logger.log(LogLevel.Error, `Invoke client method threw error: ${getErrorString(e)}`);\r\n });\r\n break;\r\n case MessageType.StreamItem:\r\n case MessageType.Completion: {\r\n const callback = this._callbacks[message.invocationId];\r\n if (callback) {\r\n if (message.type === MessageType.Completion) {\r\n delete this._callbacks[message.invocationId];\r\n }\r\n try {\r\n callback(message);\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `Stream callback threw error: ${getErrorString(e)}`);\r\n }\r\n }\r\n break;\r\n }\r\n case MessageType.Ping:\r\n // Don't care about pings\r\n break;\r\n case MessageType.Close: {\r\n this._logger.log(LogLevel.Information, \"Close message received from server.\");\r\n const error = message.error ? new Error(\"Server returned an error on close: \" + message.error) : undefined;\r\n if (message.allowReconnect === true) {\r\n // It feels wrong not to await connection.stop() here, but processIncomingData is called as part of an onreceive callback which is not async,\r\n // this is already the behavior for serverTimeout(), and HttpConnection.Stop() should catch and log all possible exceptions.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.connection.stop(error);\r\n }\r\n else {\r\n // We cannot await stopInternal() here, but subsequent calls to stop() will await this if stopInternal() is still ongoing.\r\n this._stopPromise = this._stopInternal(error);\r\n }\r\n break;\r\n }\r\n case MessageType.Ack:\r\n if (this._messageBuffer) {\r\n this._messageBuffer._ack(message);\r\n }\r\n break;\r\n case MessageType.Sequence:\r\n if (this._messageBuffer) {\r\n this._messageBuffer._resetSequence(message);\r\n }\r\n break;\r\n default:\r\n this._logger.log(LogLevel.Warning, `Invalid message type: ${message.type}.`);\r\n break;\r\n }\r\n }\r\n }\r\n this._resetTimeoutPeriod();\r\n }\r\n _processHandshakeResponse(data) {\r\n let responseMessage;\r\n let remainingData;\r\n try {\r\n [remainingData, responseMessage] = this._handshakeProtocol.parseHandshakeResponse(data);\r\n }\r\n catch (e) {\r\n const message = \"Error parsing handshake response: \" + e;\r\n this._logger.log(LogLevel.Error, message);\r\n const error = new Error(message);\r\n this._handshakeRejecter(error);\r\n throw error;\r\n }\r\n if (responseMessage.error) {\r\n const message = \"Server returned handshake error: \" + responseMessage.error;\r\n this._logger.log(LogLevel.Error, message);\r\n const error = new Error(message);\r\n this._handshakeRejecter(error);\r\n throw error;\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, \"Server handshake complete.\");\r\n }\r\n this._handshakeResolver();\r\n return remainingData;\r\n }\r\n _resetKeepAliveInterval() {\r\n if (this.connection.features.inherentKeepAlive) {\r\n return;\r\n }\r\n // Set the time we want the next keep alive to be sent\r\n // Timer will be setup on next message receive\r\n this._nextKeepAlive = new Date().getTime() + this.keepAliveIntervalInMilliseconds;\r\n this._cleanupPingTimer();\r\n }\r\n _resetTimeoutPeriod() {\r\n if (!this.connection.features || !this.connection.features.inherentKeepAlive) {\r\n // Set the timeout timer\r\n this._timeoutHandle = setTimeout(() => this.serverTimeout(), this.serverTimeoutInMilliseconds);\r\n // Set keepAlive timer if there isn't one\r\n if (this._pingServerHandle === undefined) {\r\n let nextPing = this._nextKeepAlive - new Date().getTime();\r\n if (nextPing < 0) {\r\n nextPing = 0;\r\n }\r\n // The timer needs to be set from a networking callback to avoid Chrome timer throttling from causing timers to run once a minute\r\n this._pingServerHandle = setTimeout(async () => {\r\n if (this._connectionState === HubConnectionState.Connected) {\r\n try {\r\n await this._sendMessage(this._cachedPingMessage);\r\n }\r\n catch {\r\n // We don't care about the error. It should be seen elsewhere in the client.\r\n // The connection is probably in a bad or closed state now, cleanup the timer so it stops triggering\r\n this._cleanupPingTimer();\r\n }\r\n }\r\n }, nextPing);\r\n }\r\n }\r\n }\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n serverTimeout() {\r\n // The server hasn't talked to us in a while. It doesn't like us anymore ... :(\r\n // Terminate the connection, but we don't need to wait on the promise. This could trigger reconnecting.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.connection.stop(new Error(\"Server timeout elapsed without receiving a message from the server.\"));\r\n }\r\n async _invokeClientMethod(invocationMessage) {\r\n const methodName = invocationMessage.target.toLowerCase();\r\n const methods = this._methods[methodName];\r\n if (!methods) {\r\n this._logger.log(LogLevel.Warning, `No client method with the name '${methodName}' found.`);\r\n // No handlers provided by client but the server is expecting a response still, so we send an error\r\n if (invocationMessage.invocationId) {\r\n this._logger.log(LogLevel.Warning, `No result given for '${methodName}' method and invocation ID '${invocationMessage.invocationId}'.`);\r\n await this._sendWithProtocol(this._createCompletionMessage(invocationMessage.invocationId, \"Client didn't provide a result.\", null));\r\n }\r\n return;\r\n }\r\n // Avoid issues with handlers removing themselves thus modifying the list while iterating through it\r\n const methodsCopy = methods.slice();\r\n // Server expects a response\r\n const expectsResponse = invocationMessage.invocationId ? true : false;\r\n // We preserve the last result or exception but still call all handlers\r\n let res;\r\n let exception;\r\n let completionMessage;\r\n for (const m of methodsCopy) {\r\n try {\r\n const prevRes = res;\r\n res = await m.apply(this, invocationMessage.arguments);\r\n if (expectsResponse && res && prevRes) {\r\n this._logger.log(LogLevel.Error, `Multiple results provided for '${methodName}'. Sending error to server.`);\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, `Client provided multiple results.`, null);\r\n }\r\n // Ignore exception if we got a result after, the exception will be logged\r\n exception = undefined;\r\n }\r\n catch (e) {\r\n exception = e;\r\n this._logger.log(LogLevel.Error, `A callback for the method '${methodName}' threw error '${e}'.`);\r\n }\r\n }\r\n if (completionMessage) {\r\n await this._sendWithProtocol(completionMessage);\r\n }\r\n else if (expectsResponse) {\r\n // If there is an exception that means either no result was given or a handler after a result threw\r\n if (exception) {\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, `${exception}`, null);\r\n }\r\n else if (res !== undefined) {\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, null, res);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Warning, `No result given for '${methodName}' method and invocation ID '${invocationMessage.invocationId}'.`);\r\n // Client didn't provide a result or throw from a handler, server expects a response so we send an error\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, \"Client didn't provide a result.\", null);\r\n }\r\n await this._sendWithProtocol(completionMessage);\r\n }\r\n else {\r\n if (res) {\r\n this._logger.log(LogLevel.Error, `Result given for '${methodName}' method but server is not expecting a result.`);\r\n }\r\n }\r\n }\r\n _connectionClosed(error) {\r\n this._logger.log(LogLevel.Debug, `HubConnection.connectionClosed(${error}) called while in state ${this._connectionState}.`);\r\n // Triggering this.handshakeRejecter is insufficient because it could already be resolved without the continuation having run yet.\r\n this._stopDuringStartError = this._stopDuringStartError || error || new AbortError(\"The underlying connection was closed before the hub handshake could complete.\");\r\n // If the handshake is in progress, start will be waiting for the handshake promise, so we complete it.\r\n // If it has already completed, this should just noop.\r\n if (this._handshakeResolver) {\r\n this._handshakeResolver();\r\n }\r\n this._cancelCallbacksWithError(error || new Error(\"Invocation canceled due to the underlying connection being closed.\"));\r\n this._cleanupTimeout();\r\n this._cleanupPingTimer();\r\n if (this._connectionState === HubConnectionState.Disconnecting) {\r\n this._completeClose(error);\r\n }\r\n else if (this._connectionState === HubConnectionState.Connected && this._reconnectPolicy) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._reconnect(error);\r\n }\r\n else if (this._connectionState === HubConnectionState.Connected) {\r\n this._completeClose(error);\r\n }\r\n // If none of the above if conditions were true were called the HubConnection must be in either:\r\n // 1. The Connecting state in which case the handshakeResolver will complete it and stopDuringStartError will fail it.\r\n // 2. The Reconnecting state in which case the handshakeResolver will complete it and stopDuringStartError will fail the current reconnect attempt\r\n // and potentially continue the reconnect() loop.\r\n // 3. The Disconnected state in which case we're already done.\r\n }\r\n _completeClose(error) {\r\n if (this._connectionStarted) {\r\n this._connectionState = HubConnectionState.Disconnected;\r\n this._connectionStarted = false;\r\n if (this._messageBuffer) {\r\n this._messageBuffer._dispose(error !== null && error !== void 0 ? error : new Error(\"Connection closed.\"));\r\n this._messageBuffer = undefined;\r\n }\r\n if (Platform.isBrowser) {\r\n window.document.removeEventListener(\"freeze\", this._freezeEventListener);\r\n }\r\n try {\r\n this._closedCallbacks.forEach((c) => c.apply(this, [error]));\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `An onclose callback called with error '${error}' threw error '${e}'.`);\r\n }\r\n }\r\n }\r\n async _reconnect(error) {\r\n const reconnectStartTime = Date.now();\r\n let previousReconnectAttempts = 0;\r\n let retryError = error !== undefined ? error : new Error(\"Attempting to reconnect due to a unknown error.\");\r\n let nextRetryDelay = this._getNextRetryDelay(previousReconnectAttempts++, 0, retryError);\r\n if (nextRetryDelay === null) {\r\n this._logger.log(LogLevel.Debug, \"Connection not reconnecting because the IRetryPolicy returned null on the first reconnect attempt.\");\r\n this._completeClose(error);\r\n return;\r\n }\r\n this._connectionState = HubConnectionState.Reconnecting;\r\n if (error) {\r\n this._logger.log(LogLevel.Information, `Connection reconnecting because of error '${error}'.`);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Information, \"Connection reconnecting.\");\r\n }\r\n if (this._reconnectingCallbacks.length !== 0) {\r\n try {\r\n this._reconnectingCallbacks.forEach((c) => c.apply(this, [error]));\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `An onreconnecting callback called with error '${error}' threw error '${e}'.`);\r\n }\r\n // Exit early if an onreconnecting callback called connection.stop().\r\n if (this._connectionState !== HubConnectionState.Reconnecting) {\r\n this._logger.log(LogLevel.Debug, \"Connection left the reconnecting state in onreconnecting callback. Done reconnecting.\");\r\n return;\r\n }\r\n }\r\n while (nextRetryDelay !== null) {\r\n this._logger.log(LogLevel.Information, `Reconnect attempt number ${previousReconnectAttempts} will start in ${nextRetryDelay} ms.`);\r\n await new Promise((resolve) => {\r\n this._reconnectDelayHandle = setTimeout(resolve, nextRetryDelay);\r\n });\r\n this._reconnectDelayHandle = undefined;\r\n if (this._connectionState !== HubConnectionState.Reconnecting) {\r\n this._logger.log(LogLevel.Debug, \"Connection left the reconnecting state during reconnect delay. Done reconnecting.\");\r\n return;\r\n }\r\n try {\r\n await this._startInternal();\r\n this._connectionState = HubConnectionState.Connected;\r\n this._logger.log(LogLevel.Information, \"HubConnection reconnected successfully.\");\r\n if (this._reconnectedCallbacks.length !== 0) {\r\n try {\r\n this._reconnectedCallbacks.forEach((c) => c.apply(this, [this.connection.connectionId]));\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `An onreconnected callback called with connectionId '${this.connection.connectionId}; threw error '${e}'.`);\r\n }\r\n }\r\n return;\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Information, `Reconnect attempt failed because of error '${e}'.`);\r\n if (this._connectionState !== HubConnectionState.Reconnecting) {\r\n this._logger.log(LogLevel.Debug, `Connection moved to the '${this._connectionState}' from the reconnecting state during reconnect attempt. Done reconnecting.`);\r\n // The TypeScript compiler thinks that connectionState must be Connected here. The TypeScript compiler is wrong.\r\n if (this._connectionState === HubConnectionState.Disconnecting) {\r\n this._completeClose();\r\n }\r\n return;\r\n }\r\n retryError = e instanceof Error ? e : new Error(e.toString());\r\n nextRetryDelay = this._getNextRetryDelay(previousReconnectAttempts++, Date.now() - reconnectStartTime, retryError);\r\n }\r\n }\r\n this._logger.log(LogLevel.Information, `Reconnect retries have been exhausted after ${Date.now() - reconnectStartTime} ms and ${previousReconnectAttempts} failed attempts. Connection disconnecting.`);\r\n this._completeClose();\r\n }\r\n _getNextRetryDelay(previousRetryCount, elapsedMilliseconds, retryReason) {\r\n try {\r\n return this._reconnectPolicy.nextRetryDelayInMilliseconds({\r\n elapsedMilliseconds,\r\n previousRetryCount,\r\n retryReason,\r\n });\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `IRetryPolicy.nextRetryDelayInMilliseconds(${previousRetryCount}, ${elapsedMilliseconds}) threw error '${e}'.`);\r\n return null;\r\n }\r\n }\r\n _cancelCallbacksWithError(error) {\r\n const callbacks = this._callbacks;\r\n this._callbacks = {};\r\n Object.keys(callbacks)\r\n .forEach((key) => {\r\n const callback = callbacks[key];\r\n try {\r\n callback(null, error);\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `Stream 'error' callback called with '${error}' threw error: ${getErrorString(e)}`);\r\n }\r\n });\r\n }\r\n _cleanupPingTimer() {\r\n if (this._pingServerHandle) {\r\n clearTimeout(this._pingServerHandle);\r\n this._pingServerHandle = undefined;\r\n }\r\n }\r\n _cleanupTimeout() {\r\n if (this._timeoutHandle) {\r\n clearTimeout(this._timeoutHandle);\r\n }\r\n }\r\n _createInvocation(methodName, args, nonblocking, streamIds) {\r\n if (nonblocking) {\r\n if (streamIds.length !== 0) {\r\n return {\r\n arguments: args,\r\n streamIds,\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n else {\r\n return {\r\n arguments: args,\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n }\r\n else {\r\n const invocationId = this._invocationId;\r\n this._invocationId++;\r\n if (streamIds.length !== 0) {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n streamIds,\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n else {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n }\r\n }\r\n _launchStreams(streams, promiseQueue) {\r\n if (streams.length === 0) {\r\n return;\r\n }\r\n // Synchronize stream data so they arrive in-order on the server\r\n if (!promiseQueue) {\r\n promiseQueue = Promise.resolve();\r\n }\r\n // We want to iterate over the keys, since the keys are the stream ids\r\n // eslint-disable-next-line guard-for-in\r\n for (const streamId in streams) {\r\n streams[streamId].subscribe({\r\n complete: () => {\r\n promiseQueue = promiseQueue.then(() => this._sendWithProtocol(this._createCompletionMessage(streamId)));\r\n },\r\n error: (err) => {\r\n let message;\r\n if (err instanceof Error) {\r\n message = err.message;\r\n }\r\n else if (err && err.toString) {\r\n message = err.toString();\r\n }\r\n else {\r\n message = \"Unknown error\";\r\n }\r\n promiseQueue = promiseQueue.then(() => this._sendWithProtocol(this._createCompletionMessage(streamId, message)));\r\n },\r\n next: (item) => {\r\n promiseQueue = promiseQueue.then(() => this._sendWithProtocol(this._createStreamItemMessage(streamId, item)));\r\n },\r\n });\r\n }\r\n }\r\n _replaceStreamingParams(args) {\r\n const streams = [];\r\n const streamIds = [];\r\n for (let i = 0; i < args.length; i++) {\r\n const argument = args[i];\r\n if (this._isObservable(argument)) {\r\n const streamId = this._invocationId;\r\n this._invocationId++;\r\n // Store the stream for later use\r\n streams[streamId] = argument;\r\n streamIds.push(streamId.toString());\r\n // remove stream from args\r\n args.splice(i, 1);\r\n }\r\n }\r\n return [streams, streamIds];\r\n }\r\n _isObservable(arg) {\r\n // This allows other stream implementations to just work (like rxjs)\r\n return arg && arg.subscribe && typeof arg.subscribe === \"function\";\r\n }\r\n _createStreamInvocation(methodName, args, streamIds) {\r\n const invocationId = this._invocationId;\r\n this._invocationId++;\r\n if (streamIds.length !== 0) {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n streamIds,\r\n target: methodName,\r\n type: MessageType.StreamInvocation,\r\n };\r\n }\r\n else {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n target: methodName,\r\n type: MessageType.StreamInvocation,\r\n };\r\n }\r\n }\r\n _createCancelInvocation(id) {\r\n return {\r\n invocationId: id,\r\n type: MessageType.CancelInvocation,\r\n };\r\n }\r\n _createStreamItemMessage(id, item) {\r\n return {\r\n invocationId: id,\r\n item,\r\n type: MessageType.StreamItem,\r\n };\r\n }\r\n _createCompletionMessage(id, error, result) {\r\n if (error) {\r\n return {\r\n error,\r\n invocationId: id,\r\n type: MessageType.Completion,\r\n };\r\n }\r\n return {\r\n invocationId: id,\r\n result,\r\n type: MessageType.Completion,\r\n };\r\n }\r\n _createCloseMessage() {\r\n return { type: MessageType.Close };\r\n }\r\n}\r\n//# sourceMappingURL=HubConnection.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// 0, 2, 10, 30 second delays before reconnect attempts.\r\nconst DEFAULT_RETRY_DELAYS_IN_MILLISECONDS = [0, 2000, 10000, 30000, null];\r\n/** @private */\r\nexport class DefaultReconnectPolicy {\r\n constructor(retryDelays) {\r\n this._retryDelays = retryDelays !== undefined ? [...retryDelays, null] : DEFAULT_RETRY_DELAYS_IN_MILLISECONDS;\r\n }\r\n nextRetryDelayInMilliseconds(retryContext) {\r\n return this._retryDelays[retryContext.previousRetryCount];\r\n }\r\n}\r\n//# sourceMappingURL=DefaultReconnectPolicy.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nexport class HeaderNames {\r\n}\r\nHeaderNames.Authorization = \"Authorization\";\r\nHeaderNames.Cookie = \"Cookie\";\r\n//# sourceMappingURL=HeaderNames.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { HeaderNames } from \"./HeaderNames\";\r\nimport { HttpClient } from \"./HttpClient\";\r\n/** @private */\r\nexport class AccessTokenHttpClient extends HttpClient {\r\n constructor(innerClient, accessTokenFactory) {\r\n super();\r\n this._innerClient = innerClient;\r\n this._accessTokenFactory = accessTokenFactory;\r\n }\r\n async send(request) {\r\n let allowRetry = true;\r\n if (this._accessTokenFactory && (!this._accessToken || (request.url && request.url.indexOf(\"/negotiate?\") > 0))) {\r\n // don't retry if the request is a negotiate or if we just got a potentially new token from the access token factory\r\n allowRetry = false;\r\n this._accessToken = await this._accessTokenFactory();\r\n }\r\n this._setAuthorizationHeader(request);\r\n const response = await this._innerClient.send(request);\r\n if (allowRetry && response.statusCode === 401 && this._accessTokenFactory) {\r\n this._accessToken = await this._accessTokenFactory();\r\n this._setAuthorizationHeader(request);\r\n return await this._innerClient.send(request);\r\n }\r\n return response;\r\n }\r\n _setAuthorizationHeader(request) {\r\n if (!request.headers) {\r\n request.headers = {};\r\n }\r\n if (this._accessToken) {\r\n request.headers[HeaderNames.Authorization] = `Bearer ${this._accessToken}`;\r\n }\r\n // don't remove the header if there isn't an access token factory, the user manually added the header in this case\r\n else if (this._accessTokenFactory) {\r\n if (request.headers[HeaderNames.Authorization]) {\r\n delete request.headers[HeaderNames.Authorization];\r\n }\r\n }\r\n }\r\n getCookieString(url) {\r\n return this._innerClient.getCookieString(url);\r\n }\r\n}\r\n//# sourceMappingURL=AccessTokenHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// This will be treated as a bit flag in the future, so we keep it using power-of-two values.\r\n/** Specifies a specific HTTP transport type. */\r\nexport var HttpTransportType;\r\n(function (HttpTransportType) {\r\n /** Specifies no transport preference. */\r\n HttpTransportType[HttpTransportType[\"None\"] = 0] = \"None\";\r\n /** Specifies the WebSockets transport. */\r\n HttpTransportType[HttpTransportType[\"WebSockets\"] = 1] = \"WebSockets\";\r\n /** Specifies the Server-Sent Events transport. */\r\n HttpTransportType[HttpTransportType[\"ServerSentEvents\"] = 2] = \"ServerSentEvents\";\r\n /** Specifies the Long Polling transport. */\r\n HttpTransportType[HttpTransportType[\"LongPolling\"] = 4] = \"LongPolling\";\r\n})(HttpTransportType || (HttpTransportType = {}));\r\n/** Specifies the transfer format for a connection. */\r\nexport var TransferFormat;\r\n(function (TransferFormat) {\r\n /** Specifies that only text data will be transmitted over the connection. */\r\n TransferFormat[TransferFormat[\"Text\"] = 1] = \"Text\";\r\n /** Specifies that binary data will be transmitted over the connection. */\r\n TransferFormat[TransferFormat[\"Binary\"] = 2] = \"Binary\";\r\n})(TransferFormat || (TransferFormat = {}));\r\n//# sourceMappingURL=ITransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// Rough polyfill of https://developer.mozilla.org/en-US/docs/Web/API/AbortController\r\n// We don't actually ever use the API being polyfilled, we always use the polyfill because\r\n// it's a very new API right now.\r\n// Not exported from index.\r\n/** @private */\r\nexport class AbortController {\r\n constructor() {\r\n this._isAborted = false;\r\n this.onabort = null;\r\n }\r\n abort() {\r\n if (!this._isAborted) {\r\n this._isAborted = true;\r\n if (this.onabort) {\r\n this.onabort();\r\n }\r\n }\r\n }\r\n get signal() {\r\n return this;\r\n }\r\n get aborted() {\r\n return this._isAborted;\r\n }\r\n}\r\n//# sourceMappingURL=AbortController.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortController } from \"./AbortController\";\r\nimport { HttpError, TimeoutError } from \"./Errors\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, sendMessage } from \"./Utils\";\r\n// Not exported from 'index', this type is internal.\r\n/** @private */\r\nexport class LongPollingTransport {\r\n // This is an internal type, not exported from 'index' so this is really just internal.\r\n get pollAborted() {\r\n return this._pollAbort.aborted;\r\n }\r\n constructor(httpClient, logger, options) {\r\n this._httpClient = httpClient;\r\n this._logger = logger;\r\n this._pollAbort = new AbortController();\r\n this._options = options;\r\n this._running = false;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n async connect(url, transferFormat) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._url = url;\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Connecting.\");\r\n // Allow binary format on Node and Browsers that support binary content (indicated by the presence of responseType property)\r\n if (transferFormat === TransferFormat.Binary &&\r\n (typeof XMLHttpRequest !== \"undefined\" && typeof new XMLHttpRequest().responseType !== \"string\")) {\r\n throw new Error(\"Binary protocols over XmlHttpRequest not implementing advanced features are not supported.\");\r\n }\r\n const [name, value] = getUserAgentHeader();\r\n const headers = { [name]: value, ...this._options.headers };\r\n const pollOptions = {\r\n abortSignal: this._pollAbort.signal,\r\n headers,\r\n timeout: 100000,\r\n withCredentials: this._options.withCredentials,\r\n };\r\n if (transferFormat === TransferFormat.Binary) {\r\n pollOptions.responseType = \"arraybuffer\";\r\n }\r\n // Make initial long polling request\r\n // Server uses first long polling request to finish initializing connection and it returns without data\r\n const pollUrl = `${url}&_=${Date.now()}`;\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) polling: ${pollUrl}.`);\r\n const response = await this._httpClient.get(pollUrl, pollOptions);\r\n if (response.statusCode !== 200) {\r\n this._logger.log(LogLevel.Error, `(LongPolling transport) Unexpected response code: ${response.statusCode}.`);\r\n // Mark running as false so that the poll immediately ends and runs the close logic\r\n this._closeError = new HttpError(response.statusText || \"\", response.statusCode);\r\n this._running = false;\r\n }\r\n else {\r\n this._running = true;\r\n }\r\n this._receiving = this._poll(this._url, pollOptions);\r\n }\r\n async _poll(url, pollOptions) {\r\n try {\r\n while (this._running) {\r\n try {\r\n const pollUrl = `${url}&_=${Date.now()}`;\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) polling: ${pollUrl}.`);\r\n const response = await this._httpClient.get(pollUrl, pollOptions);\r\n if (response.statusCode === 204) {\r\n this._logger.log(LogLevel.Information, \"(LongPolling transport) Poll terminated by server.\");\r\n this._running = false;\r\n }\r\n else if (response.statusCode !== 200) {\r\n this._logger.log(LogLevel.Error, `(LongPolling transport) Unexpected response code: ${response.statusCode}.`);\r\n // Unexpected status code\r\n this._closeError = new HttpError(response.statusText || \"\", response.statusCode);\r\n this._running = false;\r\n }\r\n else {\r\n // Process the response\r\n if (response.content) {\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) data received. ${getDataDetail(response.content, this._options.logMessageContent)}.`);\r\n if (this.onreceive) {\r\n this.onreceive(response.content);\r\n }\r\n }\r\n else {\r\n // This is another way timeout manifest.\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Poll timed out, reissuing.\");\r\n }\r\n }\r\n }\r\n catch (e) {\r\n if (!this._running) {\r\n // Log but disregard errors that occur after stopping\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) Poll errored after shutdown: ${e.message}`);\r\n }\r\n else {\r\n if (e instanceof TimeoutError) {\r\n // Ignore timeouts and reissue the poll.\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Poll timed out, reissuing.\");\r\n }\r\n else {\r\n // Close the connection with the error as the result.\r\n this._closeError = e;\r\n this._running = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n finally {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Polling complete.\");\r\n // We will reach here with pollAborted==false when the server returned a response causing the transport to stop.\r\n // If pollAborted==true then client initiated the stop and the stop method will raise the close event after DELETE is sent.\r\n if (!this.pollAborted) {\r\n this._raiseOnClose();\r\n }\r\n }\r\n }\r\n async send(data) {\r\n if (!this._running) {\r\n return Promise.reject(new Error(\"Cannot send until the transport is connected\"));\r\n }\r\n return sendMessage(this._logger, \"LongPolling\", this._httpClient, this._url, data, this._options);\r\n }\r\n async stop() {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Stopping polling.\");\r\n // Tell receiving loop to stop, abort any current request, and then wait for it to finish\r\n this._running = false;\r\n this._pollAbort.abort();\r\n try {\r\n await this._receiving;\r\n // Send DELETE to clean up long polling on the server\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) sending DELETE request to ${this._url}.`);\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n const deleteOptions = {\r\n headers: { ...headers, ...this._options.headers },\r\n timeout: this._options.timeout,\r\n withCredentials: this._options.withCredentials,\r\n };\r\n let error;\r\n try {\r\n await this._httpClient.delete(this._url, deleteOptions);\r\n }\r\n catch (err) {\r\n error = err;\r\n }\r\n if (error) {\r\n if (error instanceof HttpError) {\r\n if (error.statusCode === 404) {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) A 404 response was returned from sending a DELETE request.\");\r\n }\r\n else {\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) Error sending a DELETE request: ${error}`);\r\n }\r\n }\r\n }\r\n else {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) DELETE request accepted.\");\r\n }\r\n }\r\n finally {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Stop finished.\");\r\n // Raise close event here instead of in polling\r\n // It needs to happen after the DELETE request is sent\r\n this._raiseOnClose();\r\n }\r\n }\r\n _raiseOnClose() {\r\n if (this.onclose) {\r\n let logMessage = \"(LongPolling transport) Firing onclose event.\";\r\n if (this._closeError) {\r\n logMessage += \" Error: \" + this._closeError;\r\n }\r\n this._logger.log(LogLevel.Trace, logMessage);\r\n this.onclose(this._closeError);\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=LongPollingTransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, Platform, sendMessage } from \"./Utils\";\r\n/** @private */\r\nexport class ServerSentEventsTransport {\r\n constructor(httpClient, accessToken, logger, options) {\r\n this._httpClient = httpClient;\r\n this._accessToken = accessToken;\r\n this._logger = logger;\r\n this._options = options;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n async connect(url, transferFormat) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._logger.log(LogLevel.Trace, \"(SSE transport) Connecting.\");\r\n // set url before accessTokenFactory because this._url is only for send and we set the auth header instead of the query string for send\r\n this._url = url;\r\n if (this._accessToken) {\r\n url += (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + `access_token=${encodeURIComponent(this._accessToken)}`;\r\n }\r\n return new Promise((resolve, reject) => {\r\n let opened = false;\r\n if (transferFormat !== TransferFormat.Text) {\r\n reject(new Error(\"The Server-Sent Events transport only supports the 'Text' transfer format\"));\r\n return;\r\n }\r\n let eventSource;\r\n if (Platform.isBrowser || Platform.isWebWorker) {\r\n eventSource = new this._options.EventSource(url, { withCredentials: this._options.withCredentials });\r\n }\r\n else {\r\n // Non-browser passes cookies via the dictionary\r\n const cookies = this._httpClient.getCookieString(url);\r\n const headers = {};\r\n headers.Cookie = cookies;\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n eventSource = new this._options.EventSource(url, { withCredentials: this._options.withCredentials, headers: { ...headers, ...this._options.headers } });\r\n }\r\n try {\r\n eventSource.onmessage = (e) => {\r\n if (this.onreceive) {\r\n try {\r\n this._logger.log(LogLevel.Trace, `(SSE transport) data received. ${getDataDetail(e.data, this._options.logMessageContent)}.`);\r\n this.onreceive(e.data);\r\n }\r\n catch (error) {\r\n this._close(error);\r\n return;\r\n }\r\n }\r\n };\r\n // @ts-ignore: not using event on purpose\r\n eventSource.onerror = (e) => {\r\n // EventSource doesn't give any useful information about server side closes.\r\n if (opened) {\r\n this._close();\r\n }\r\n else {\r\n reject(new Error(\"EventSource failed to connect. The connection could not be found on the server,\"\r\n + \" either the connection ID is not present on the server, or a proxy is refusing/buffering the connection.\"\r\n + \" If you have multiple servers check that sticky sessions are enabled.\"));\r\n }\r\n };\r\n eventSource.onopen = () => {\r\n this._logger.log(LogLevel.Information, `SSE connected to ${this._url}`);\r\n this._eventSource = eventSource;\r\n opened = true;\r\n resolve();\r\n };\r\n }\r\n catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n });\r\n }\r\n async send(data) {\r\n if (!this._eventSource) {\r\n return Promise.reject(new Error(\"Cannot send until the transport is connected\"));\r\n }\r\n return sendMessage(this._logger, \"SSE\", this._httpClient, this._url, data, this._options);\r\n }\r\n stop() {\r\n this._close();\r\n return Promise.resolve();\r\n }\r\n _close(e) {\r\n if (this._eventSource) {\r\n this._eventSource.close();\r\n this._eventSource = undefined;\r\n if (this.onclose) {\r\n this.onclose(e);\r\n }\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=ServerSentEventsTransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { HeaderNames } from \"./HeaderNames\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, Platform } from \"./Utils\";\r\n/** @private */\r\nexport class WebSocketTransport {\r\n constructor(httpClient, accessTokenFactory, logger, logMessageContent, webSocketConstructor, headers) {\r\n this._logger = logger;\r\n this._accessTokenFactory = accessTokenFactory;\r\n this._logMessageContent = logMessageContent;\r\n this._webSocketConstructor = webSocketConstructor;\r\n this._httpClient = httpClient;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n this._headers = headers;\r\n }\r\n async connect(url, transferFormat) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._logger.log(LogLevel.Trace, \"(WebSockets transport) Connecting.\");\r\n let token;\r\n if (this._accessTokenFactory) {\r\n token = await this._accessTokenFactory();\r\n }\r\n return new Promise((resolve, reject) => {\r\n url = url.replace(/^http/, \"ws\");\r\n let webSocket;\r\n const cookies = this._httpClient.getCookieString(url);\r\n let opened = false;\r\n if (Platform.isNode || Platform.isReactNative) {\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n if (token) {\r\n headers[HeaderNames.Authorization] = `Bearer ${token}`;\r\n }\r\n if (cookies) {\r\n headers[HeaderNames.Cookie] = cookies;\r\n }\r\n // Only pass headers when in non-browser environments\r\n webSocket = new this._webSocketConstructor(url, undefined, {\r\n headers: { ...headers, ...this._headers },\r\n });\r\n }\r\n else {\r\n if (token) {\r\n url += (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + `access_token=${encodeURIComponent(token)}`;\r\n }\r\n }\r\n if (!webSocket) {\r\n // Chrome is not happy with passing 'undefined' as protocol\r\n webSocket = new this._webSocketConstructor(url);\r\n }\r\n if (transferFormat === TransferFormat.Binary) {\r\n webSocket.binaryType = \"arraybuffer\";\r\n }\r\n webSocket.onopen = (_event) => {\r\n this._logger.log(LogLevel.Information, `WebSocket connected to ${url}.`);\r\n this._webSocket = webSocket;\r\n opened = true;\r\n resolve();\r\n };\r\n webSocket.onerror = (event) => {\r\n let error = null;\r\n // ErrorEvent is a browser only type we need to check if the type exists before using it\r\n if (typeof ErrorEvent !== \"undefined\" && event instanceof ErrorEvent) {\r\n error = event.error;\r\n }\r\n else {\r\n error = \"There was an error with the transport\";\r\n }\r\n this._logger.log(LogLevel.Information, `(WebSockets transport) ${error}.`);\r\n };\r\n webSocket.onmessage = (message) => {\r\n this._logger.log(LogLevel.Trace, `(WebSockets transport) data received. ${getDataDetail(message.data, this._logMessageContent)}.`);\r\n if (this.onreceive) {\r\n try {\r\n this.onreceive(message.data);\r\n }\r\n catch (error) {\r\n this._close(error);\r\n return;\r\n }\r\n }\r\n };\r\n webSocket.onclose = (event) => {\r\n // Don't call close handler if connection was never established\r\n // We'll reject the connect call instead\r\n if (opened) {\r\n this._close(event);\r\n }\r\n else {\r\n let error = null;\r\n // ErrorEvent is a browser only type we need to check if the type exists before using it\r\n if (typeof ErrorEvent !== \"undefined\" && event instanceof ErrorEvent) {\r\n error = event.error;\r\n }\r\n else {\r\n error = \"WebSocket failed to connect. The connection could not be found on the server,\"\r\n + \" either the endpoint may not be a SignalR endpoint,\"\r\n + \" the connection ID is not present on the server, or there is a proxy blocking WebSockets.\"\r\n + \" If you have multiple servers check that sticky sessions are enabled.\";\r\n }\r\n reject(new Error(error));\r\n }\r\n };\r\n });\r\n }\r\n send(data) {\r\n if (this._webSocket && this._webSocket.readyState === this._webSocketConstructor.OPEN) {\r\n this._logger.log(LogLevel.Trace, `(WebSockets transport) sending data. ${getDataDetail(data, this._logMessageContent)}.`);\r\n this._webSocket.send(data);\r\n return Promise.resolve();\r\n }\r\n return Promise.reject(\"WebSocket is not in the OPEN state\");\r\n }\r\n stop() {\r\n if (this._webSocket) {\r\n // Manually invoke onclose callback inline so we know the HttpConnection was closed properly before returning\r\n // This also solves an issue where websocket.onclose could take 18+ seconds to trigger during network disconnects\r\n this._close(undefined);\r\n }\r\n return Promise.resolve();\r\n }\r\n _close(event) {\r\n // webSocket will be null if the transport did not start successfully\r\n if (this._webSocket) {\r\n // Clear websocket handlers because we are considering the socket closed now\r\n this._webSocket.onclose = () => { };\r\n this._webSocket.onmessage = () => { };\r\n this._webSocket.onerror = () => { };\r\n this._webSocket.close();\r\n this._webSocket = undefined;\r\n }\r\n this._logger.log(LogLevel.Trace, \"(WebSockets transport) socket closed.\");\r\n if (this.onclose) {\r\n if (this._isCloseEvent(event) && (event.wasClean === false || event.code !== 1000)) {\r\n this.onclose(new Error(`WebSocket closed with status code: ${event.code} (${event.reason || \"no reason given\"}).`));\r\n }\r\n else if (event instanceof Error) {\r\n this.onclose(event);\r\n }\r\n else {\r\n this.onclose();\r\n }\r\n }\r\n }\r\n _isCloseEvent(event) {\r\n return event && typeof event.wasClean === \"boolean\" && typeof event.code === \"number\";\r\n }\r\n}\r\n//# sourceMappingURL=WebSocketTransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AccessTokenHttpClient } from \"./AccessTokenHttpClient\";\r\nimport { DefaultHttpClient } from \"./DefaultHttpClient\";\r\nimport { AggregateErrors, DisabledTransportError, FailedToNegotiateWithServerError, FailedToStartTransportError, HttpError, UnsupportedTransportError, AbortError } from \"./Errors\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { HttpTransportType, TransferFormat } from \"./ITransport\";\r\nimport { LongPollingTransport } from \"./LongPollingTransport\";\r\nimport { ServerSentEventsTransport } from \"./ServerSentEventsTransport\";\r\nimport { Arg, createLogger, getUserAgentHeader, Platform } from \"./Utils\";\r\nimport { WebSocketTransport } from \"./WebSocketTransport\";\r\nconst MAX_REDIRECTS = 100;\r\n/** @private */\r\nexport class HttpConnection {\r\n constructor(url, options = {}) {\r\n this._stopPromiseResolver = () => { };\r\n this.features = {};\r\n this._negotiateVersion = 1;\r\n Arg.isRequired(url, \"url\");\r\n this._logger = createLogger(options.logger);\r\n this.baseUrl = this._resolveUrl(url);\r\n options = options || {};\r\n options.logMessageContent = options.logMessageContent === undefined ? false : options.logMessageContent;\r\n if (typeof options.withCredentials === \"boolean\" || options.withCredentials === undefined) {\r\n options.withCredentials = options.withCredentials === undefined ? true : options.withCredentials;\r\n }\r\n else {\r\n throw new Error(\"withCredentials option was not a 'boolean' or 'undefined' value\");\r\n }\r\n options.timeout = options.timeout === undefined ? 100 * 1000 : options.timeout;\r\n let webSocketModule = null;\r\n let eventSourceModule = null;\r\n if (Platform.isNode && typeof require !== \"undefined\") {\r\n // In order to ignore the dynamic require in webpack builds we need to do this magic\r\n // @ts-ignore: TS doesn't know about these names\r\n const requireFunc = typeof __webpack_require__ === \"function\" ? __non_webpack_require__ : require;\r\n webSocketModule = requireFunc(\"ws\");\r\n eventSourceModule = requireFunc(\"eventsource\");\r\n }\r\n if (!Platform.isNode && typeof WebSocket !== \"undefined\" && !options.WebSocket) {\r\n options.WebSocket = WebSocket;\r\n }\r\n else if (Platform.isNode && !options.WebSocket) {\r\n if (webSocketModule) {\r\n options.WebSocket = webSocketModule;\r\n }\r\n }\r\n if (!Platform.isNode && typeof EventSource !== \"undefined\" && !options.EventSource) {\r\n options.EventSource = EventSource;\r\n }\r\n else if (Platform.isNode && !options.EventSource) {\r\n if (typeof eventSourceModule !== \"undefined\") {\r\n options.EventSource = eventSourceModule;\r\n }\r\n }\r\n this._httpClient = new AccessTokenHttpClient(options.httpClient || new DefaultHttpClient(this._logger), options.accessTokenFactory);\r\n this._connectionState = \"Disconnected\" /* ConnectionState.Disconnected */;\r\n this._connectionStarted = false;\r\n this._options = options;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n async start(transferFormat) {\r\n transferFormat = transferFormat || TransferFormat.Binary;\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._logger.log(LogLevel.Debug, `Starting connection with transfer format '${TransferFormat[transferFormat]}'.`);\r\n if (this._connectionState !== \"Disconnected\" /* ConnectionState.Disconnected */) {\r\n return Promise.reject(new Error(\"Cannot start an HttpConnection that is not in the 'Disconnected' state.\"));\r\n }\r\n this._connectionState = \"Connecting\" /* ConnectionState.Connecting */;\r\n this._startInternalPromise = this._startInternal(transferFormat);\r\n await this._startInternalPromise;\r\n // The TypeScript compiler thinks that connectionState must be Connecting here. The TypeScript compiler is wrong.\r\n if (this._connectionState === \"Disconnecting\" /* ConnectionState.Disconnecting */) {\r\n // stop() was called and transitioned the client into the Disconnecting state.\r\n const message = \"Failed to start the HttpConnection before stop() was called.\";\r\n this._logger.log(LogLevel.Error, message);\r\n // We cannot await stopPromise inside startInternal since stopInternal awaits the startInternalPromise.\r\n await this._stopPromise;\r\n return Promise.reject(new AbortError(message));\r\n }\r\n else if (this._connectionState !== \"Connected\" /* ConnectionState.Connected */) {\r\n // stop() was called and transitioned the client into the Disconnecting state.\r\n const message = \"HttpConnection.startInternal completed gracefully but didn't enter the connection into the connected state!\";\r\n this._logger.log(LogLevel.Error, message);\r\n return Promise.reject(new AbortError(message));\r\n }\r\n this._connectionStarted = true;\r\n }\r\n send(data) {\r\n if (this._connectionState !== \"Connected\" /* ConnectionState.Connected */) {\r\n return Promise.reject(new Error(\"Cannot send data if the connection is not in the 'Connected' State.\"));\r\n }\r\n if (!this._sendQueue) {\r\n this._sendQueue = new TransportSendQueue(this.transport);\r\n }\r\n // Transport will not be null if state is connected\r\n return this._sendQueue.send(data);\r\n }\r\n async stop(error) {\r\n if (this._connectionState === \"Disconnected\" /* ConnectionState.Disconnected */) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stop(${error}) ignored because the connection is already in the disconnected state.`);\r\n return Promise.resolve();\r\n }\r\n if (this._connectionState === \"Disconnecting\" /* ConnectionState.Disconnecting */) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stop(${error}) ignored because the connection is already in the disconnecting state.`);\r\n return this._stopPromise;\r\n }\r\n this._connectionState = \"Disconnecting\" /* ConnectionState.Disconnecting */;\r\n this._stopPromise = new Promise((resolve) => {\r\n // Don't complete stop() until stopConnection() completes.\r\n this._stopPromiseResolver = resolve;\r\n });\r\n // stopInternal should never throw so just observe it.\r\n await this._stopInternal(error);\r\n await this._stopPromise;\r\n }\r\n async _stopInternal(error) {\r\n // Set error as soon as possible otherwise there is a race between\r\n // the transport closing and providing an error and the error from a close message\r\n // We would prefer the close message error.\r\n this._stopError = error;\r\n try {\r\n await this._startInternalPromise;\r\n }\r\n catch (e) {\r\n // This exception is returned to the user as a rejected Promise from the start method.\r\n }\r\n // The transport's onclose will trigger stopConnection which will run our onclose event.\r\n // The transport should always be set if currently connected. If it wasn't set, it's likely because\r\n // stop was called during start() and start() failed.\r\n if (this.transport) {\r\n try {\r\n await this.transport.stop();\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `HttpConnection.transport.stop() threw error '${e}'.`);\r\n this._stopConnection();\r\n }\r\n this.transport = undefined;\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, \"HttpConnection.transport is undefined in HttpConnection.stop() because start() failed.\");\r\n }\r\n }\r\n async _startInternal(transferFormat) {\r\n // Store the original base url and the access token factory since they may change\r\n // as part of negotiating\r\n let url = this.baseUrl;\r\n this._accessTokenFactory = this._options.accessTokenFactory;\r\n this._httpClient._accessTokenFactory = this._accessTokenFactory;\r\n try {\r\n if (this._options.skipNegotiation) {\r\n if (this._options.transport === HttpTransportType.WebSockets) {\r\n // No need to add a connection ID in this case\r\n this.transport = this._constructTransport(HttpTransportType.WebSockets);\r\n // We should just call connect directly in this case.\r\n // No fallback or negotiate in this case.\r\n await this._startTransport(url, transferFormat);\r\n }\r\n else {\r\n throw new Error(\"Negotiation can only be skipped when using the WebSocket transport directly.\");\r\n }\r\n }\r\n else {\r\n let negotiateResponse = null;\r\n let redirects = 0;\r\n do {\r\n negotiateResponse = await this._getNegotiationResponse(url);\r\n // the user tries to stop the connection when it is being started\r\n if (this._connectionState === \"Disconnecting\" /* ConnectionState.Disconnecting */ || this._connectionState === \"Disconnected\" /* ConnectionState.Disconnected */) {\r\n throw new AbortError(\"The connection was stopped during negotiation.\");\r\n }\r\n if (negotiateResponse.error) {\r\n throw new Error(negotiateResponse.error);\r\n }\r\n if (negotiateResponse.ProtocolVersion) {\r\n throw new Error(\"Detected a connection attempt to an ASP.NET SignalR Server. This client only supports connecting to an ASP.NET Core SignalR Server. See https://aka.ms/signalr-core-differences for details.\");\r\n }\r\n if (negotiateResponse.url) {\r\n url = negotiateResponse.url;\r\n }\r\n if (negotiateResponse.accessToken) {\r\n // Replace the current access token factory with one that uses\r\n // the returned access token\r\n const accessToken = negotiateResponse.accessToken;\r\n this._accessTokenFactory = () => accessToken;\r\n // set the factory to undefined so the AccessTokenHttpClient won't retry with the same token, since we know it won't change until a connection restart\r\n this._httpClient._accessToken = accessToken;\r\n this._httpClient._accessTokenFactory = undefined;\r\n }\r\n redirects++;\r\n } while (negotiateResponse.url && redirects < MAX_REDIRECTS);\r\n if (redirects === MAX_REDIRECTS && negotiateResponse.url) {\r\n throw new Error(\"Negotiate redirection limit exceeded.\");\r\n }\r\n await this._createTransport(url, this._options.transport, negotiateResponse, transferFormat);\r\n }\r\n if (this.transport instanceof LongPollingTransport) {\r\n this.features.inherentKeepAlive = true;\r\n }\r\n if (this._connectionState === \"Connecting\" /* ConnectionState.Connecting */) {\r\n // Ensure the connection transitions to the connected state prior to completing this.startInternalPromise.\r\n // start() will handle the case when stop was called and startInternal exits still in the disconnecting state.\r\n this._logger.log(LogLevel.Debug, \"The HttpConnection connected successfully.\");\r\n this._connectionState = \"Connected\" /* ConnectionState.Connected */;\r\n }\r\n // stop() is waiting on us via this.startInternalPromise so keep this.transport around so it can clean up.\r\n // This is the only case startInternal can exit in neither the connected nor disconnected state because stopConnection()\r\n // will transition to the disconnected state. start() will wait for the transition using the stopPromise.\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, \"Failed to start the connection: \" + e);\r\n this._connectionState = \"Disconnected\" /* ConnectionState.Disconnected */;\r\n this.transport = undefined;\r\n // if start fails, any active calls to stop assume that start will complete the stop promise\r\n this._stopPromiseResolver();\r\n return Promise.reject(e);\r\n }\r\n }\r\n async _getNegotiationResponse(url) {\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n const negotiateUrl = this._resolveNegotiateUrl(url);\r\n this._logger.log(LogLevel.Debug, `Sending negotiation request: ${negotiateUrl}.`);\r\n try {\r\n const response = await this._httpClient.post(negotiateUrl, {\r\n content: \"\",\r\n headers: { ...headers, ...this._options.headers },\r\n timeout: this._options.timeout,\r\n withCredentials: this._options.withCredentials,\r\n });\r\n if (response.statusCode !== 200) {\r\n return Promise.reject(new Error(`Unexpected status code returned from negotiate '${response.statusCode}'`));\r\n }\r\n const negotiateResponse = JSON.parse(response.content);\r\n if (!negotiateResponse.negotiateVersion || negotiateResponse.negotiateVersion < 1) {\r\n // Negotiate version 0 doesn't use connectionToken\r\n // So we set it equal to connectionId so all our logic can use connectionToken without being aware of the negotiate version\r\n negotiateResponse.connectionToken = negotiateResponse.connectionId;\r\n }\r\n if (negotiateResponse.useStatefulReconnect && this._options._useStatefulReconnect !== true) {\r\n return Promise.reject(new FailedToNegotiateWithServerError(\"Client didn't negotiate Stateful Reconnect but the server did.\"));\r\n }\r\n return negotiateResponse;\r\n }\r\n catch (e) {\r\n let errorMessage = \"Failed to complete negotiation with the server: \" + e;\r\n if (e instanceof HttpError) {\r\n if (e.statusCode === 404) {\r\n errorMessage = errorMessage + \" Either this is not a SignalR endpoint or there is a proxy blocking the connection.\";\r\n }\r\n }\r\n this._logger.log(LogLevel.Error, errorMessage);\r\n return Promise.reject(new FailedToNegotiateWithServerError(errorMessage));\r\n }\r\n }\r\n _createConnectUrl(url, connectionToken) {\r\n if (!connectionToken) {\r\n return url;\r\n }\r\n return url + (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + `id=${connectionToken}`;\r\n }\r\n async _createTransport(url, requestedTransport, negotiateResponse, requestedTransferFormat) {\r\n let connectUrl = this._createConnectUrl(url, negotiateResponse.connectionToken);\r\n if (this._isITransport(requestedTransport)) {\r\n this._logger.log(LogLevel.Debug, \"Connection was provided an instance of ITransport, using that directly.\");\r\n this.transport = requestedTransport;\r\n await this._startTransport(connectUrl, requestedTransferFormat);\r\n this.connectionId = negotiateResponse.connectionId;\r\n return;\r\n }\r\n const transportExceptions = [];\r\n const transports = negotiateResponse.availableTransports || [];\r\n let negotiate = negotiateResponse;\r\n for (const endpoint of transports) {\r\n const transportOrError = this._resolveTransportOrError(endpoint, requestedTransport, requestedTransferFormat, (negotiate === null || negotiate === void 0 ? void 0 : negotiate.useStatefulReconnect) === true);\r\n if (transportOrError instanceof Error) {\r\n // Store the error and continue, we don't want to cause a re-negotiate in these cases\r\n transportExceptions.push(`${endpoint.transport} failed:`);\r\n transportExceptions.push(transportOrError);\r\n }\r\n else if (this._isITransport(transportOrError)) {\r\n this.transport = transportOrError;\r\n if (!negotiate) {\r\n try {\r\n negotiate = await this._getNegotiationResponse(url);\r\n }\r\n catch (ex) {\r\n return Promise.reject(ex);\r\n }\r\n connectUrl = this._createConnectUrl(url, negotiate.connectionToken);\r\n }\r\n try {\r\n await this._startTransport(connectUrl, requestedTransferFormat);\r\n this.connectionId = negotiate.connectionId;\r\n return;\r\n }\r\n catch (ex) {\r\n this._logger.log(LogLevel.Error, `Failed to start the transport '${endpoint.transport}': ${ex}`);\r\n negotiate = undefined;\r\n transportExceptions.push(new FailedToStartTransportError(`${endpoint.transport} failed: ${ex}`, HttpTransportType[endpoint.transport]));\r\n if (this._connectionState !== \"Connecting\" /* ConnectionState.Connecting */) {\r\n const message = \"Failed to select transport before stop() was called.\";\r\n this._logger.log(LogLevel.Debug, message);\r\n return Promise.reject(new AbortError(message));\r\n }\r\n }\r\n }\r\n }\r\n if (transportExceptions.length > 0) {\r\n return Promise.reject(new AggregateErrors(`Unable to connect to the server with any of the available transports. ${transportExceptions.join(\" \")}`, transportExceptions));\r\n }\r\n return Promise.reject(new Error(\"None of the transports supported by the client are supported by the server.\"));\r\n }\r\n _constructTransport(transport) {\r\n switch (transport) {\r\n case HttpTransportType.WebSockets:\r\n if (!this._options.WebSocket) {\r\n throw new Error(\"'WebSocket' is not supported in your environment.\");\r\n }\r\n return new WebSocketTransport(this._httpClient, this._accessTokenFactory, this._logger, this._options.logMessageContent, this._options.WebSocket, this._options.headers || {});\r\n case HttpTransportType.ServerSentEvents:\r\n if (!this._options.EventSource) {\r\n throw new Error(\"'EventSource' is not supported in your environment.\");\r\n }\r\n return new ServerSentEventsTransport(this._httpClient, this._httpClient._accessToken, this._logger, this._options);\r\n case HttpTransportType.LongPolling:\r\n return new LongPollingTransport(this._httpClient, this._logger, this._options);\r\n default:\r\n throw new Error(`Unknown transport: ${transport}.`);\r\n }\r\n }\r\n _startTransport(url, transferFormat) {\r\n this.transport.onreceive = this.onreceive;\r\n if (this.features.reconnect) {\r\n this.transport.onclose = async (e) => {\r\n let callStop = false;\r\n if (this.features.reconnect) {\r\n try {\r\n this.features.disconnected();\r\n await this.transport.connect(url, transferFormat);\r\n await this.features.resend();\r\n }\r\n catch {\r\n callStop = true;\r\n }\r\n }\r\n else {\r\n this._stopConnection(e);\r\n return;\r\n }\r\n if (callStop) {\r\n this._stopConnection(e);\r\n }\r\n };\r\n }\r\n else {\r\n this.transport.onclose = (e) => this._stopConnection(e);\r\n }\r\n return this.transport.connect(url, transferFormat);\r\n }\r\n _resolveTransportOrError(endpoint, requestedTransport, requestedTransferFormat, useStatefulReconnect) {\r\n const transport = HttpTransportType[endpoint.transport];\r\n if (transport === null || transport === undefined) {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${endpoint.transport}' because it is not supported by this client.`);\r\n return new Error(`Skipping transport '${endpoint.transport}' because it is not supported by this client.`);\r\n }\r\n else {\r\n if (transportMatches(requestedTransport, transport)) {\r\n const transferFormats = endpoint.transferFormats.map((s) => TransferFormat[s]);\r\n if (transferFormats.indexOf(requestedTransferFormat) >= 0) {\r\n if ((transport === HttpTransportType.WebSockets && !this._options.WebSocket) ||\r\n (transport === HttpTransportType.ServerSentEvents && !this._options.EventSource)) {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it is not supported in your environment.'`);\r\n return new UnsupportedTransportError(`'${HttpTransportType[transport]}' is not supported in your environment.`, transport);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, `Selecting transport '${HttpTransportType[transport]}'.`);\r\n try {\r\n this.features.reconnect = transport === HttpTransportType.WebSockets ? useStatefulReconnect : undefined;\r\n return this._constructTransport(transport);\r\n }\r\n catch (ex) {\r\n return ex;\r\n }\r\n }\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it does not support the requested transfer format '${TransferFormat[requestedTransferFormat]}'.`);\r\n return new Error(`'${HttpTransportType[transport]}' does not support ${TransferFormat[requestedTransferFormat]}.`);\r\n }\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it was disabled by the client.`);\r\n return new DisabledTransportError(`'${HttpTransportType[transport]}' is disabled by the client.`, transport);\r\n }\r\n }\r\n }\r\n _isITransport(transport) {\r\n return transport && typeof (transport) === \"object\" && \"connect\" in transport;\r\n }\r\n _stopConnection(error) {\r\n this._logger.log(LogLevel.Debug, `HttpConnection.stopConnection(${error}) called while in state ${this._connectionState}.`);\r\n this.transport = undefined;\r\n // If we have a stopError, it takes precedence over the error from the transport\r\n error = this._stopError || error;\r\n this._stopError = undefined;\r\n if (this._connectionState === \"Disconnected\" /* ConnectionState.Disconnected */) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stopConnection(${error}) was ignored because the connection is already in the disconnected state.`);\r\n return;\r\n }\r\n if (this._connectionState === \"Connecting\" /* ConnectionState.Connecting */) {\r\n this._logger.log(LogLevel.Warning, `Call to HttpConnection.stopConnection(${error}) was ignored because the connection is still in the connecting state.`);\r\n throw new Error(`HttpConnection.stopConnection(${error}) was called while the connection is still in the connecting state.`);\r\n }\r\n if (this._connectionState === \"Disconnecting\" /* ConnectionState.Disconnecting */) {\r\n // A call to stop() induced this call to stopConnection and needs to be completed.\r\n // Any stop() awaiters will be scheduled to continue after the onclose callback fires.\r\n this._stopPromiseResolver();\r\n }\r\n if (error) {\r\n this._logger.log(LogLevel.Error, `Connection disconnected with error '${error}'.`);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Information, \"Connection disconnected.\");\r\n }\r\n if (this._sendQueue) {\r\n this._sendQueue.stop().catch((e) => {\r\n this._logger.log(LogLevel.Error, `TransportSendQueue.stop() threw error '${e}'.`);\r\n });\r\n this._sendQueue = undefined;\r\n }\r\n this.connectionId = undefined;\r\n this._connectionState = \"Disconnected\" /* ConnectionState.Disconnected */;\r\n if (this._connectionStarted) {\r\n this._connectionStarted = false;\r\n try {\r\n if (this.onclose) {\r\n this.onclose(error);\r\n }\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `HttpConnection.onclose(${error}) threw error '${e}'.`);\r\n }\r\n }\r\n }\r\n _resolveUrl(url) {\r\n // startsWith is not supported in IE\r\n if (url.lastIndexOf(\"https://\", 0) === 0 || url.lastIndexOf(\"http://\", 0) === 0) {\r\n return url;\r\n }\r\n if (!Platform.isBrowser) {\r\n throw new Error(`Cannot resolve '${url}'.`);\r\n }\r\n // Setting the url to the href propery of an anchor tag handles normalization\r\n // for us. There are 3 main cases.\r\n // 1. Relative path normalization e.g \"b\" -> \"http://localhost:5000/a/b\"\r\n // 2. Absolute path normalization e.g \"/a/b\" -> \"http://localhost:5000/a/b\"\r\n // 3. Networkpath reference normalization e.g \"//localhost:5000/a/b\" -> \"http://localhost:5000/a/b\"\r\n const aTag = window.document.createElement(\"a\");\r\n aTag.href = url;\r\n this._logger.log(LogLevel.Information, `Normalizing '${url}' to '${aTag.href}'.`);\r\n return aTag.href;\r\n }\r\n _resolveNegotiateUrl(url) {\r\n const negotiateUrl = new URL(url);\r\n if (negotiateUrl.pathname.endsWith('/')) {\r\n negotiateUrl.pathname += \"negotiate\";\r\n }\r\n else {\r\n negotiateUrl.pathname += \"/negotiate\";\r\n }\r\n const searchParams = new URLSearchParams(negotiateUrl.searchParams);\r\n if (!searchParams.has(\"negotiateVersion\")) {\r\n searchParams.append(\"negotiateVersion\", this._negotiateVersion.toString());\r\n }\r\n if (searchParams.has(\"useStatefulReconnect\")) {\r\n if (searchParams.get(\"useStatefulReconnect\") === \"true\") {\r\n this._options._useStatefulReconnect = true;\r\n }\r\n }\r\n else if (this._options._useStatefulReconnect === true) {\r\n searchParams.append(\"useStatefulReconnect\", \"true\");\r\n }\r\n negotiateUrl.search = searchParams.toString();\r\n return negotiateUrl.toString();\r\n }\r\n}\r\nfunction transportMatches(requestedTransport, actualTransport) {\r\n return !requestedTransport || ((actualTransport & requestedTransport) !== 0);\r\n}\r\n/** @private */\r\nexport class TransportSendQueue {\r\n constructor(_transport) {\r\n this._transport = _transport;\r\n this._buffer = [];\r\n this._executing = true;\r\n this._sendBufferedData = new PromiseSource();\r\n this._transportResult = new PromiseSource();\r\n this._sendLoopPromise = this._sendLoop();\r\n }\r\n send(data) {\r\n this._bufferData(data);\r\n if (!this._transportResult) {\r\n this._transportResult = new PromiseSource();\r\n }\r\n return this._transportResult.promise;\r\n }\r\n stop() {\r\n this._executing = false;\r\n this._sendBufferedData.resolve();\r\n return this._sendLoopPromise;\r\n }\r\n _bufferData(data) {\r\n if (this._buffer.length && typeof (this._buffer[0]) !== typeof (data)) {\r\n throw new Error(`Expected data to be of type ${typeof (this._buffer)} but was of type ${typeof (data)}`);\r\n }\r\n this._buffer.push(data);\r\n this._sendBufferedData.resolve();\r\n }\r\n async _sendLoop() {\r\n while (true) {\r\n await this._sendBufferedData.promise;\r\n if (!this._executing) {\r\n if (this._transportResult) {\r\n this._transportResult.reject(\"Connection stopped.\");\r\n }\r\n break;\r\n }\r\n this._sendBufferedData = new PromiseSource();\r\n const transportResult = this._transportResult;\r\n this._transportResult = undefined;\r\n const data = typeof (this._buffer[0]) === \"string\" ?\r\n this._buffer.join(\"\") :\r\n TransportSendQueue._concatBuffers(this._buffer);\r\n this._buffer.length = 0;\r\n try {\r\n await this._transport.send(data);\r\n transportResult.resolve();\r\n }\r\n catch (error) {\r\n transportResult.reject(error);\r\n }\r\n }\r\n }\r\n static _concatBuffers(arrayBuffers) {\r\n const totalLength = arrayBuffers.map((b) => b.byteLength).reduce((a, b) => a + b);\r\n const result = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const item of arrayBuffers) {\r\n result.set(new Uint8Array(item), offset);\r\n offset += item.byteLength;\r\n }\r\n return result.buffer;\r\n }\r\n}\r\nclass PromiseSource {\r\n constructor() {\r\n this.promise = new Promise((resolve, reject) => [this._resolver, this._rejecter] = [resolve, reject]);\r\n }\r\n resolve() {\r\n this._resolver();\r\n }\r\n reject(reason) {\r\n this._rejecter(reason);\r\n }\r\n}\r\n//# sourceMappingURL=HttpConnection.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { MessageType } from \"./IHubProtocol\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { TextMessageFormat } from \"./TextMessageFormat\";\r\nconst JSON_HUB_PROTOCOL_NAME = \"json\";\r\n/** Implements the JSON Hub Protocol. */\r\nexport class JsonHubProtocol {\r\n constructor() {\r\n /** @inheritDoc */\r\n this.name = JSON_HUB_PROTOCOL_NAME;\r\n /** @inheritDoc */\r\n this.version = 2;\r\n /** @inheritDoc */\r\n this.transferFormat = TransferFormat.Text;\r\n }\r\n /** Creates an array of {@link @microsoft/signalr.HubMessage} objects from the specified serialized representation.\r\n *\r\n * @param {string} input A string containing the serialized representation.\r\n * @param {ILogger} logger A logger that will be used to log messages that occur during parsing.\r\n */\r\n parseMessages(input, logger) {\r\n // The interface does allow \"ArrayBuffer\" to be passed in, but this implementation does not. So let's throw a useful error.\r\n if (typeof input !== \"string\") {\r\n throw new Error(\"Invalid input for JSON hub protocol. Expected a string.\");\r\n }\r\n if (!input) {\r\n return [];\r\n }\r\n if (logger === null) {\r\n logger = NullLogger.instance;\r\n }\r\n // Parse the messages\r\n const messages = TextMessageFormat.parse(input);\r\n const hubMessages = [];\r\n for (const message of messages) {\r\n const parsedMessage = JSON.parse(message);\r\n if (typeof parsedMessage.type !== \"number\") {\r\n throw new Error(\"Invalid payload.\");\r\n }\r\n switch (parsedMessage.type) {\r\n case MessageType.Invocation:\r\n this._isInvocationMessage(parsedMessage);\r\n break;\r\n case MessageType.StreamItem:\r\n this._isStreamItemMessage(parsedMessage);\r\n break;\r\n case MessageType.Completion:\r\n this._isCompletionMessage(parsedMessage);\r\n break;\r\n case MessageType.Ping:\r\n // Single value, no need to validate\r\n break;\r\n case MessageType.Close:\r\n // All optional values, no need to validate\r\n break;\r\n case MessageType.Ack:\r\n this._isAckMessage(parsedMessage);\r\n break;\r\n case MessageType.Sequence:\r\n this._isSequenceMessage(parsedMessage);\r\n break;\r\n default:\r\n // Future protocol changes can add message types, old clients can ignore them\r\n logger.log(LogLevel.Information, \"Unknown message type '\" + parsedMessage.type + \"' ignored.\");\r\n continue;\r\n }\r\n hubMessages.push(parsedMessage);\r\n }\r\n return hubMessages;\r\n }\r\n /** Writes the specified {@link @microsoft/signalr.HubMessage} to a string and returns it.\r\n *\r\n * @param {HubMessage} message The message to write.\r\n * @returns {string} A string containing the serialized representation of the message.\r\n */\r\n writeMessage(message) {\r\n return TextMessageFormat.write(JSON.stringify(message));\r\n }\r\n _isInvocationMessage(message) {\r\n this._assertNotEmptyString(message.target, \"Invalid payload for Invocation message.\");\r\n if (message.invocationId !== undefined) {\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for Invocation message.\");\r\n }\r\n }\r\n _isStreamItemMessage(message) {\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for StreamItem message.\");\r\n if (message.item === undefined) {\r\n throw new Error(\"Invalid payload for StreamItem message.\");\r\n }\r\n }\r\n _isCompletionMessage(message) {\r\n if (message.result && message.error) {\r\n throw new Error(\"Invalid payload for Completion message.\");\r\n }\r\n if (!message.result && message.error) {\r\n this._assertNotEmptyString(message.error, \"Invalid payload for Completion message.\");\r\n }\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for Completion message.\");\r\n }\r\n _isAckMessage(message) {\r\n if (typeof message.sequenceId !== 'number') {\r\n throw new Error(\"Invalid SequenceId for Ack message.\");\r\n }\r\n }\r\n _isSequenceMessage(message) {\r\n if (typeof message.sequenceId !== 'number') {\r\n throw new Error(\"Invalid SequenceId for Sequence message.\");\r\n }\r\n }\r\n _assertNotEmptyString(value, errorMessage) {\r\n if (typeof value !== \"string\" || value === \"\") {\r\n throw new Error(errorMessage);\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=JsonHubProtocol.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { DefaultReconnectPolicy } from \"./DefaultReconnectPolicy\";\r\nimport { HttpConnection } from \"./HttpConnection\";\r\nimport { HubConnection } from \"./HubConnection\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { JsonHubProtocol } from \"./JsonHubProtocol\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { Arg, ConsoleLogger } from \"./Utils\";\r\nconst LogLevelNameMapping = {\r\n trace: LogLevel.Trace,\r\n debug: LogLevel.Debug,\r\n info: LogLevel.Information,\r\n information: LogLevel.Information,\r\n warn: LogLevel.Warning,\r\n warning: LogLevel.Warning,\r\n error: LogLevel.Error,\r\n critical: LogLevel.Critical,\r\n none: LogLevel.None,\r\n};\r\nfunction parseLogLevel(name) {\r\n // Case-insensitive matching via lower-casing\r\n // Yes, I know case-folding is a complicated problem in Unicode, but we only support\r\n // the ASCII strings defined in LogLevelNameMapping anyway, so it's fine -anurse.\r\n const mapping = LogLevelNameMapping[name.toLowerCase()];\r\n if (typeof mapping !== \"undefined\") {\r\n return mapping;\r\n }\r\n else {\r\n throw new Error(`Unknown log level: ${name}`);\r\n }\r\n}\r\n/** A builder for configuring {@link @microsoft/signalr.HubConnection} instances. */\r\nexport class HubConnectionBuilder {\r\n configureLogging(logging) {\r\n Arg.isRequired(logging, \"logging\");\r\n if (isLogger(logging)) {\r\n this.logger = logging;\r\n }\r\n else if (typeof logging === \"string\") {\r\n const logLevel = parseLogLevel(logging);\r\n this.logger = new ConsoleLogger(logLevel);\r\n }\r\n else {\r\n this.logger = new ConsoleLogger(logging);\r\n }\r\n return this;\r\n }\r\n withUrl(url, transportTypeOrOptions) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isNotEmpty(url, \"url\");\r\n this.url = url;\r\n // Flow-typing knows where it's at. Since HttpTransportType is a number and IHttpConnectionOptions is guaranteed\r\n // to be an object, we know (as does TypeScript) this comparison is all we need to figure out which overload was called.\r\n if (typeof transportTypeOrOptions === \"object\") {\r\n this.httpConnectionOptions = { ...this.httpConnectionOptions, ...transportTypeOrOptions };\r\n }\r\n else {\r\n this.httpConnectionOptions = {\r\n ...this.httpConnectionOptions,\r\n transport: transportTypeOrOptions,\r\n };\r\n }\r\n return this;\r\n }\r\n /** Configures the {@link @microsoft/signalr.HubConnection} to use the specified Hub Protocol.\r\n *\r\n * @param {IHubProtocol} protocol The {@link @microsoft/signalr.IHubProtocol} implementation to use.\r\n */\r\n withHubProtocol(protocol) {\r\n Arg.isRequired(protocol, \"protocol\");\r\n this.protocol = protocol;\r\n return this;\r\n }\r\n withAutomaticReconnect(retryDelaysOrReconnectPolicy) {\r\n if (this.reconnectPolicy) {\r\n throw new Error(\"A reconnectPolicy has already been set.\");\r\n }\r\n if (!retryDelaysOrReconnectPolicy) {\r\n this.reconnectPolicy = new DefaultReconnectPolicy();\r\n }\r\n else if (Array.isArray(retryDelaysOrReconnectPolicy)) {\r\n this.reconnectPolicy = new DefaultReconnectPolicy(retryDelaysOrReconnectPolicy);\r\n }\r\n else {\r\n this.reconnectPolicy = retryDelaysOrReconnectPolicy;\r\n }\r\n return this;\r\n }\r\n /** Configures {@link @microsoft/signalr.HubConnection.serverTimeoutInMilliseconds} for the {@link @microsoft/signalr.HubConnection}.\r\n *\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n withServerTimeout(milliseconds) {\r\n Arg.isRequired(milliseconds, \"milliseconds\");\r\n this._serverTimeoutInMilliseconds = milliseconds;\r\n return this;\r\n }\r\n /** Configures {@link @microsoft/signalr.HubConnection.keepAliveIntervalInMilliseconds} for the {@link @microsoft/signalr.HubConnection}.\r\n *\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n withKeepAliveInterval(milliseconds) {\r\n Arg.isRequired(milliseconds, \"milliseconds\");\r\n this._keepAliveIntervalInMilliseconds = milliseconds;\r\n return this;\r\n }\r\n /** Enables and configures options for the Stateful Reconnect feature.\r\n *\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n withStatefulReconnect(options) {\r\n if (this.httpConnectionOptions === undefined) {\r\n this.httpConnectionOptions = {};\r\n }\r\n this.httpConnectionOptions._useStatefulReconnect = true;\r\n this._statefulReconnectBufferSize = options === null || options === void 0 ? void 0 : options.bufferSize;\r\n return this;\r\n }\r\n /** Creates a {@link @microsoft/signalr.HubConnection} from the configuration options specified in this builder.\r\n *\r\n * @returns {HubConnection} The configured {@link @microsoft/signalr.HubConnection}.\r\n */\r\n build() {\r\n // If httpConnectionOptions has a logger, use it. Otherwise, override it with the one\r\n // provided to configureLogger\r\n const httpConnectionOptions = this.httpConnectionOptions || {};\r\n // If it's 'null', the user **explicitly** asked for null, don't mess with it.\r\n if (httpConnectionOptions.logger === undefined) {\r\n // If our logger is undefined or null, that's OK, the HttpConnection constructor will handle it.\r\n httpConnectionOptions.logger = this.logger;\r\n }\r\n // Now create the connection\r\n if (!this.url) {\r\n throw new Error(\"The 'HubConnectionBuilder.withUrl' method must be called before building the connection.\");\r\n }\r\n const connection = new HttpConnection(this.url, httpConnectionOptions);\r\n return HubConnection.create(connection, this.logger || NullLogger.instance, this.protocol || new JsonHubProtocol(), this.reconnectPolicy, this._serverTimeoutInMilliseconds, this._keepAliveIntervalInMilliseconds, this._statefulReconnectBufferSize);\r\n }\r\n}\r\nfunction isLogger(logger) {\r\n return logger.log !== undefined;\r\n}\r\n//# sourceMappingURL=HubConnectionBuilder.js.map","import { buildRequestUrlForApi } from \"./utils\";\r\n\r\nexport function request(url: string, options: RequestInit = {}): Promise<any | undefined> {\r\n const { popupRequestInfo } = window as any;\r\n \r\n url = buildRequestUrlForApi(url);\r\n\r\n const credentialType: string | undefined = popupRequestInfo?.credentialType?.toUpperCase();\r\n\r\n const accessToken: string | undefined = popupRequestInfo?.accessToken;\r\n\r\n const defaultOptions: RequestInit = {\r\n method: 'GET',\r\n headers: {}\r\n };\r\n\r\n const mergedOptions = { ...defaultOptions, ...options };\r\n\r\n if (mergedOptions.body && typeof mergedOptions.body === 'object') {\r\n if (mergedOptions.body instanceof FormData) {\r\n mergedOptions.headers = {\r\n ...mergedOptions.headers,\r\n 'Content-Type': 'multipart/form-data'\r\n };\r\n } else {\r\n mergedOptions.headers = {\r\n ...mergedOptions.headers,\r\n 'Content-Type': 'application/json'\r\n };\r\n mergedOptions.body = JSON.stringify(mergedOptions.body);\r\n }\r\n }\r\n\r\n switch (credentialType) {\r\n case 'COOKIE':\r\n mergedOptions.credentials = 'include';\r\n break;\r\n case 'QUERY':\r\n break;\r\n default:\r\n if (accessToken) {\r\n mergedOptions.headers = {\r\n ...mergedOptions.headers,\r\n \"Authorization\": `Bearer ${accessToken}`\r\n }\r\n }\r\n break;\r\n }\r\n\r\n return fetch(url, mergedOptions).then((response) => {\r\n if (!response.ok) {\r\n console.error(`HTTP error! status: ${response.status}`);\r\n return undefined;\r\n }\r\n return response.json();\r\n }).then((responseBody) => {\r\n if (responseBody && responseBody.code) {\r\n if (responseBody.code !== \"0\") {\r\n console.error(`API error! code: ${responseBody.code}, message: ${responseBody.message}`);\r\n return undefined;\r\n }\r\n return responseBody.data;\r\n }\r\n return responseBody;\r\n }).catch((error) => {\r\n console.error('Error fetching data:', error);\r\n return undefined;\r\n });\r\n}\r\n\r\nexport function buildUrlWithQueryParams(url: string, params: Record<string, any>): string {\r\n if (!params) return url;\r\n let query = ''\r\n for (let key in params) {\r\n const value = params[key];\r\n if (value !== undefined && value !== null) {\r\n if (query.length > 0) {\r\n query += '&';\r\n }\r\n query += `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\r\n }\r\n }\r\n if (url.indexOf('?') === -1) {\r\n url += '?' + query;\r\n } else {\r\n url += '&' + query;\r\n }\r\n return url;\r\n}","import { request } from \"../http-client\";\r\n\r\nexport async function getUserFromApiAsync(userId: string) {\r\n const response = await request(`user/${userId}`);\r\n return {\r\n id: response.id,\r\n username: response.username,\r\n fullName: response.fullName,\r\n avatarUrl: response.avatarUrl\r\n }\r\n}\r\n\r\nexport async function batchGetUsersFromApiAsync(userIds: string[]) {\r\n if (!userIds || userIds.length === 0) return [];\r\n const url = 'user/batch/get';\r\n const body: any = { ids: userIds };\r\n const response = await request(url, {\r\n method: 'POST',\r\n body\r\n });\r\n if (!response || !Array.isArray(response)) return [];\r\n return response.map((user: any) => ({\r\n id: user.id,\r\n username: user.username,\r\n fullName: user.fullName,\r\n avatarUrl: user.avatarUrl\r\n }));\r\n}","const windowObj = window as any;\r\n\r\nconst indexedDb: IDBFactory = windowObj.indexedDB || windowObj.mozIndexedDB\r\n || windowObj.webkitIndexedDB || windowObj.msIndexedDB || windowObj.shimIndexedDB;\r\n\r\nconst databaseName = \"chatPopupDb\";\r\nconst databaseVersion = 1;\r\nconst userObjectStoreName = \"users\";\r\n\r\n/**\r\n * \r\n * @param {IDBDatabase} db \r\n */\r\nfunction createUserObjectStore(db: IDBDatabase): void {\r\n if (!db.objectStoreNames.contains(userObjectStoreName)) {\r\n const objectStore = db.createObjectStore(userObjectStoreName, { keyPath: \"id\", autoIncrement: false });\r\n [\"username\", \"fullName\", \"avatarUrl\"].forEach(index =>\r\n objectStore.createIndex(index, index, { unique: false })\r\n );\r\n }\r\n}\r\n\r\nlet db: IDBDatabase | undefined;\r\n\r\n/**\r\n * \r\n * @returns {Promise<IDBDatabase | undefined>}\r\n */\r\nfunction openIndexedDbAsync(): Promise<IDBDatabase | undefined> {\r\n return new Promise((resolve, reject) => {\r\n if (db) resolve(db);\r\n else {\r\n const request = indexedDb.open(databaseName, databaseVersion);\r\n\r\n request.onerror = evt => reject((evt.target as any).error);\r\n\r\n request.onsuccess = evt => {\r\n db = (evt.target as any).result;\r\n resolve(db);\r\n };\r\n\r\n request.onupgradeneeded = evt => {\r\n const db = (evt.target as any).result;\r\n createUserObjectStore(db);\r\n };\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * \r\n * @param {IDBTransactionMode} mode \r\n * @param {IDBTransactionOptions} options\r\n * @returns {Promise<IDBObjectStore | undefined>}\r\n */\r\nexport async function getUserObjectStoreAsync(mode?: IDBTransactionMode, options?: IDBTransactionOptions): Promise<IDBObjectStore | undefined> {\r\n const db = await openIndexedDbAsync();\r\n if (!db) return undefined;\r\n const transaction = db.transaction(userObjectStoreName, mode, options);\r\n return transaction.objectStore(userObjectStoreName);\r\n}\r\n","import { getUserObjectStoreAsync } from \"./index-db\";\r\n\r\nexport interface LocalUser {\r\n id: string\r\n username?: string\r\n avatarUrl?: string\r\n fullName?: string\r\n}\r\n\r\nexport function getUserFromLocalStoreAsync(userId: string): Promise<LocalUser | undefined> {\r\n return new Promise(async (resolve, reject) => {\r\n if (userId === \"SYSTEM\") {\r\n resolve({ id: \"SYSTEM\", username: \"system\", fullName: \"Hệ thống\" });\r\n return;\r\n }\r\n const objectStore = await getUserObjectStoreAsync(\"readonly\");\r\n if (!objectStore) {\r\n reject(new Error(\"User object store not found\"));\r\n return;\r\n }\r\n const request = objectStore.get(userId);\r\n request.onsuccess = async evt => {\r\n const item = (evt.target as any).result;\r\n resolve(item);\r\n };\r\n request.onerror = evt => reject((evt.target as any).error);\r\n });\r\n}\r\n\r\nexport async function addOrUpdateUserToLocalStoreAsync(user: LocalUser): Promise<string | undefined> {\r\n const objectStore = await getUserObjectStoreAsync(\"readwrite\");\r\n if (!objectStore) {\r\n throw new Error(\"User object store not found\");\r\n }\r\n return new Promise((resolve, reject) => {\r\n const request = objectStore.put(user);\r\n request.onsuccess = evt => resolve((evt.target as any).result);\r\n request.onerror = evt => reject((evt.target as any).error);\r\n });\r\n}\r\n\r\nexport async function batchGetUsersFromLocalStoreAsync(userIds: string[]): Promise<LocalUser[]> {\r\n const promises = userIds.map(userId => getUserFromLocalStoreAsync(userId));\r\n const users = await Promise.all(promises);\r\n return users.filter(user => user !== undefined);\r\n}","import { batchGetUsersFromApiAsync } from \"./apis-data-provider/user-apis\";\r\nimport { addOrUpdateUserToLocalStoreAsync, batchGetUsersFromLocalStoreAsync } from \"./user-local-store\";\r\n\r\nexport async function getUserMapAsync(senderIds: string[]): Promise<Map<string, any>> {\r\n const uniqueSenderIds = Array.from(new Set(senderIds.filter(id => typeof id == \"string\" && id.length > 0)));\r\n const localUsers = await batchGetUsersFromLocalStoreAsync(uniqueSenderIds);\r\n const missingSenderIds = uniqueSenderIds.filter(\r\n id => !localUsers.some(user => user.id === id)\r\n );\r\n const usersFromApi = await batchGetUsersFromApiAsync(missingSenderIds);\r\n await Promise.all(usersFromApi.map(user => addOrUpdateUserToLocalStoreAsync(user)));\r\n const allUsers = [...localUsers, ...usersFromApi];\r\n return new Map<string, any>(allUsers.map(user => [user.id, user]));\r\n}\r\n\r\nexport function convertToRawConversation(conversation: any) {\r\n return {\r\n id: conversation.id || conversation.conversationId,\r\n name: conversation.name,\r\n lastMessage: conversation.lastMessage,\r\n updatedAt: conversation.updatedAt || conversation.dateTime,\r\n type: conversation.type,\r\n membersCount: conversation.membersCount,\r\n status: conversation.status,\r\n isPinned: conversation.isPinned,\r\n isRead: conversation.isRead,\r\n traceId: conversation.traceId\r\n };\r\n}\r\n\r\nexport function convertToRawMessage(message: any, isQuotedMessage?: boolean) {\r\n if (!message) return undefined;\r\n let quotedMessage: any;\r\n if (!isQuotedMessage) {\r\n if (message.quotedMessage) {\r\n quotedMessage = convertToRawMessage(message.quotedMessage, true);\r\n }\r\n }\r\n const body = message.body;\r\n if (body && Array.isArray(body.files)) {\r\n body.files = body.files.map((file: any) => {\r\n const thumbUrl = file.thumbId ? buildRequestUrlForApi(`file/${file.thumbId}`) : undefined;\r\n const fileUrl = buildRequestUrlForApi(`file/${file.id || file.fileId}`);\r\n return {\r\n id: file.id || file.fileId,\r\n thumbId: file.thumbId,\r\n url: fileUrl,\r\n name: file.name,\r\n contentType: file.contentType,\r\n thumbUrl\r\n }\r\n });\r\n }\r\n return {\r\n id: message.id || message.messageId,\r\n conversationId: message.conversationId,\r\n senderId: message.senderId || message.editedBy,\r\n sender: message.sender,\r\n body,\r\n sentAt: message.sentAt,\r\n deleted: message.deleted,\r\n edited: message.edited,\r\n mentions: message.mentions,\r\n deletedFor: message.deletedFor,\r\n quotedMessage,\r\n traceId: message.traceId\r\n };\r\n}\r\n\r\nexport async function enrichConversationAsync(conversation: any) {\r\n const lastMessageSenderIds = conversation.lastMessage ? [conversation.lastMessage.senderId] : [];\r\n const userMap = await getUserMapAsync(lastMessageSenderIds);\r\n\r\n if (conversation.lastMessage) {\r\n const lastMessageSender = userMap.get(conversation.lastMessage.senderId);\r\n if (lastMessageSender) {\r\n conversation.lastMessage.sender = lastMessageSender;\r\n conversation.lastMessage.sentAt = conversation.lastMessage.sentAt ? new Date(conversation.lastMessage.sentAt) : new Date();\r\n }\r\n }\r\n\r\n return {\r\n id: conversation.id,\r\n name: conversation.name,\r\n lastMessage: conversation.lastMessage,\r\n updatedAt: new Date(conversation.updatedAt),\r\n type: conversation.type,\r\n membersCount: conversation.membersCount,\r\n status: conversation.status,\r\n isPinned: conversation.isPinned,\r\n isRead: conversation.isRead,\r\n traceId: conversation.traceId\r\n };\r\n}\r\n\r\nexport function collectSenderIds(message: any, senderIds: Set<string> = new Set()): Set<string> {\r\n if (message.senderId) {\r\n senderIds.add(message.senderId);\r\n }\r\n if (message.quotedMessage) {\r\n collectSenderIds(message.quotedMessage, senderIds);\r\n }\r\n return senderIds;\r\n}\r\n\r\nexport function enrichMessageWithUsers(message: any, userMap: Map<string, any>) {\r\n const sender = message.sender || userMap.get(message.senderId);\r\n const quotedMessage = message.quotedMessage\r\n ? enrichMessageWithUsers(message.quotedMessage, userMap)\r\n : undefined;\r\n message.sender = sender;\r\n if (quotedMessage) message.quotedMessage = quotedMessage;\r\n return message;\r\n}\r\n\r\nexport function convertToMessage(message: any) {\r\n if (!message) return undefined;\r\n const quotedMessage = message.quotedMessage\r\n ? convertToMessage(message.quotedMessage)\r\n : undefined;\r\n const msg: any = {\r\n id: message.id,\r\n conversationId: message.conversationId,\r\n sender: message.sender,\r\n body: message.body,\r\n sentAt: message.sentAt ? new Date(message.sentAt) : new Date(),\r\n deleted: message.deleted,\r\n edited: message.edited,\r\n mentions: message.mentions,\r\n deletedFor: message.deletedFor,\r\n traceId: message.traceId\r\n };\r\n if (quotedMessage) msg.quotedMessage = quotedMessage;\r\n return msg\r\n}\r\n\r\nfunction buildRequestUrl(baseUrl?: string, subUrl?: string) {\r\n if (!baseUrl) {\r\n console.error(\"URL base is not defined.\");\r\n return '';\r\n }\r\n subUrl = subUrl ? subUrl.startsWith('/') ? subUrl.slice(1) : subUrl : '';\r\n let url = baseUrl.endsWith('/') ? `${baseUrl}${subUrl}` : `${baseUrl}/${subUrl}`;\r\n if (url.endsWith('/')) {\r\n url = url.slice(0, -1);\r\n }\r\n const { popupRequestInfo } = window as any;\r\n const credentialType: string | undefined = popupRequestInfo?.credentialType?.toUpperCase();\r\n const credentialName: string | undefined = popupRequestInfo?.credentialName;\r\n const accessToken: string | undefined = popupRequestInfo?.accessToken;\r\n switch (credentialType) {\r\n case 'COOKIE':\r\n const urlObj = new URL(url);\r\n urlObj.searchParams.append(\"credentialType\", credentialType);\r\n urlObj.searchParams.append(\"credentialName\", credentialName || \"\");\r\n url = urlObj.toString();\r\n break;\r\n case 'QUERY':\r\n if (accessToken) {\r\n const urlObj = new URL(url);\r\n urlObj.searchParams.append(\"access_token\", accessToken);\r\n url = urlObj.toString();\r\n }\r\n break;\r\n }\r\n return url;\r\n}\r\n\r\nexport function buildRequestUrlForApi(subUrl?: string) {\r\n const { popupRequestInfo } = window as any;\r\n const apiUrlBase: string | undefined = popupRequestInfo?.apiUrlBase;\r\n return buildRequestUrl(apiUrlBase, subUrl);\r\n}\r\n\r\nexport function buildRequestUrlForHub(hubUrl?: string) {\r\n const { popupRequestInfo } = window as any;\r\n const hubUrlBase: string | undefined = hubUrl || popupRequestInfo?.hubUrlBase;\r\n return buildRequestUrl(hubUrlBase);\r\n}","import { HubConnectionBuilder, LogLevel } from \"@microsoft/signalr\";\r\nimport { buildRequestUrlForHub } from \"./utils\";\r\n\r\nexport function createHubConnection(hubUrl: string | undefined) {\r\n let url = buildRequestUrlForHub(hubUrl);\r\n const { popupRequestInfo } = window as any;\r\n const credentialType: string | undefined = popupRequestInfo?.credentialType?.toUpperCase();\r\n if (credentialType != 'COOKIE' && credentialType != 'QUERY') {\r\n const accessToken: string | undefined = popupRequestInfo?.accessToken;\r\n if (accessToken) {\r\n const urlObj = new URL(url);\r\n urlObj.searchParams.append(\"access_token\", accessToken);\r\n url = urlObj.toString();\r\n }\r\n }\r\n return new HubConnectionBuilder()\r\n .withUrl(url)\r\n .configureLogging(LogLevel.Information)\r\n .withAutomaticReconnect()\r\n .build();\r\n}","import { buildUrlWithQueryParams, request } from \"../http-client\";\r\nimport { convertToRawMessage } from \"../utils\";\r\n\r\nconst windowObject = window as any;\r\nwindowObject.messagesCache = {};\r\n\r\nexport async function listMessagesFromApiAsync(conversationId: string, direction?: string, fromMessageId?: string, top?: number) {\r\n const url = buildUrlWithQueryParams(`message/conversation/${conversationId}/user`, {\r\n direction,\r\n messageId: fromMessageId,\r\n top\r\n });\r\n const messagesFromApi = await request(url);\r\n if (!messagesFromApi || !Array.isArray(messagesFromApi)) return [];\r\n return messagesFromApi.filter(m => !!m).map((message: any) => convertToRawMessage(message)!);\r\n}\r\n\r\nexport async function sendMessageUseApiAsync(message: any) {\r\n const url = 'message';\r\n let quotedId: string | undefined;\r\n if (message.quotedMessage) {\r\n quotedId = message.quotedMessage.id;\r\n if (quotedId) windowObject.messagesCache[quotedId] = message.quotedMessage;\r\n }\r\n const body: any = {\r\n conversationId: message.conversationId,\r\n body: message.body,\r\n quotedId,\r\n traceId: message.traceId\r\n };\r\n const responseData = await request(url, {\r\n method: 'POST',\r\n body\r\n });\r\n responseData.quotedMessage = message.quotedMessage;\r\n return convertToRawMessage(responseData);\r\n}\r\n\r\nexport async function updateMessageUseApiAsync(message: any) {\r\n if (!message || !message.id) return undefined;\r\n const url = `message/${message.id}`;\r\n let quotedId: string | undefined;\r\n if (message.quotedMessage) {\r\n quotedId = message.quotedMessage.id;\r\n if (quotedId) windowObject.messagesCache[quotedId] = message.quotedMessage;\r\n }\r\n const body: any = {\r\n body: message.body,\r\n quotedId,\r\n mentions: message.mentions\r\n };\r\n const responseData = await request(url, {\r\n method: 'POST',\r\n body\r\n });\r\n responseData.quotedMessage = message.quotedMessage;\r\n return convertToRawMessage(responseData);\r\n}\r\n\r\nexport async function deleteMessageUseApiAsync(messageId: string, deleteType?: string) {\r\n if (!messageId) return false;\r\n if(!deleteType) deleteType = 'Recall';\r\n const url = `message/${messageId}/delete`;\r\n const body: any = {\r\n type: deleteType\r\n };\r\n const responseData = await request(url, {\r\n method: 'POST',\r\n body\r\n });\r\n if (responseData) return true;\r\n return false;\r\n}\r\n\r\nexport async function getMessageByIdFromApiAsync(messageId: string) {\r\n if (!messageId) return undefined;\r\n const url = `message/${messageId}`;\r\n const messageFromApi = await request(url);\r\n if (!messageFromApi) return undefined;\r\n return convertToRawMessage(messageFromApi);\r\n}\r\n\r\nexport async function batchGetMessagesFromApiAsync(messageIds: string[]) {\r\n if (!messageIds || messageIds.length === 0) return [];\r\n const url = 'message/batch/get';\r\n const body: any = { ids: messageIds };\r\n const response = await request(url, {\r\n method: 'POST',\r\n body\r\n });\r\n if (!response || !Array.isArray(response)) return [];\r\n return response.map((message: any) => convertToRawMessage(message));\r\n}\r\n\r\nexport async function searchMessagesUseApiAsync(conversationId: string, keyword: string, from?: string, top?: number) {\r\n const url = buildUrlWithQueryParams(\"aggregate/search\", { conversationId, keyword, from, top, type: \"MESSAGE\" });\r\n const searchResult = await request(url);\r\n const messagesFromApi = searchResult.filter((r: any) => r.type === 'MESSAGE').at(0)?.items;\r\n if (!messagesFromApi) return [];\r\n return messagesFromApi.map((message: any) => convertToRawMessage(message));\r\n}","import { getMessageByIdFromApiAsync } from \"../apis-data-provider/message-apis\";\r\nimport { collectSenderIds, convertToMessage, convertToRawConversation, convertToRawMessage, enrichConversationAsync, enrichMessageWithUsers, getUserMapAsync } from \"../utils\";\r\n\r\nconst windowObject = window as any;\r\n\r\nexport async function handleMessageSentAsync(payload: any, callback: any) {\r\n if (!callback || !payload) return;\r\n if(!payload.quotedMessage && payload.quotedId) {\r\n const cacheMessage = windowObject.messagesCache[payload.quotedId];\r\n if (cacheMessage) {\r\n payload.quotedMessage = cacheMessage;\r\n delete windowObject.messagesCache[payload.quotedId];\r\n } else {\r\n payload.quotedMessage = await getMessageByIdFromApiAsync(payload.quotedId);\r\n }\r\n }\r\n const rawMessage = convertToRawMessage(payload);\r\n if (!rawMessage) return;\r\n const allSenderIds = collectSenderIds(rawMessage);\r\n const userMap = await getUserMapAsync(Array.from(allSenderIds));\r\n const enrichedMessage = enrichMessageWithUsers(rawMessage, userMap);\r\n const message = convertToMessage(enrichedMessage);\r\n callback(message);\r\n}\r\n\r\nexport async function handleConversationCreatedAsync(payload: any, callback: any) {\r\n if (!callback || !payload) return;\r\n const rawConversation = convertToRawConversation(payload);\r\n if (!rawConversation) return;\r\n const conversation = await enrichConversationAsync(rawConversation);\r\n callback(conversation);\r\n}\r\n\r\nexport function handleConversationBasicInfoChanged(payload: any, callback: any) {\r\n if (!callback || !payload) return;\r\n const { conversationId, name } = payload;\r\n if (!conversationId || !name) return;\r\n callback(conversationId, name);\r\n}\r\n\r\nexport function handleConversationDeleted(payload: any, callback: any) {\r\n if (!callback || !payload) return;\r\n const { conversationId } = payload;\r\n if (!conversationId) return;\r\n callback(conversationId);\r\n}\r\n\r\nexport async function handleMessageEditedAsync(payload: any, callback: any) {\r\n if (!callback || !payload) return;\r\n if(!payload.quotedMessage && payload.quotedId) {\r\n const cacheMessage = windowObject.messagesCache[payload.quotedId];\r\n if (cacheMessage) {\r\n payload.quotedMessage = cacheMessage;\r\n delete windowObject.messagesCache[payload.quotedId];\r\n } else {\r\n payload.quotedMessage = await getMessageByIdFromApiAsync(payload.quotedId);\r\n }\r\n }\r\n const rawMessage = convertToRawMessage(payload);\r\n if (!rawMessage) return;\r\n const allSenderIds = collectSenderIds(rawMessage);\r\n const userMap = await getUserMapAsync(Array.from(allSenderIds));\r\n const enrichedMessage = enrichMessageWithUsers(rawMessage, userMap);\r\n const message = convertToMessage(enrichedMessage);\r\n callback(message);\r\n}\r\n\r\nexport function handleMessageDeleted(payload: any, callback: any) {\r\n if (!callback || !payload) return;\r\n const { messageId, conversationId, type, deletedBy } = payload;\r\n if (!messageId || !conversationId) return;\r\n callback({\r\n messageId,\r\n conversationId,\r\n deleteType: type || 'Recall',\r\n deletedBy: deletedBy || ''\r\n });\r\n}","import { HubConnection } from \"@microsoft/signalr\";\r\nimport { createHubConnection } from \"../hub-client\";\r\nimport { handleConversationBasicInfoChanged, handleConversationCreatedAsync, handleConversationDeleted, handleMessageDeleted, handleMessageEditedAsync, handleMessageSentAsync } from \"./event-handler\";\r\n\r\nexport interface HubConnectionObject {\r\n onMessageSent(callback: (message: any) => void): void;\r\n onMessageEdited(callback: (message: any) => void): void;\r\n onMessageDeleted(callback: (data: any) => void): void;\r\n onConversationCreated(callback: (conversation: any) => void): void;\r\n onConversationBasicInfoChanged(callback: (conversationId: string, name: string) => void): void;\r\n onConversationDeleted(callback: (conversationId: string) => void): void;\r\n onConnected(callback: (payload: any) => void): void;\r\n start(): Promise<void>;\r\n stop(): Promise<void>;\r\n}\r\n\r\nlet hubConnection: HubConnection | undefined\r\n\r\nexport function connectHub(hubUrl: string | undefined) {\r\n if (hubConnection) {\r\n hubConnection.stop();\r\n }\r\n hubConnection = createHubConnection(hubUrl);\r\n if (!hubConnection) return undefined;\r\n hubConnection.on(\"UserStatusChanged\", (payload: any) => console.log(\"UserStatusChanged\", payload));\r\n const hubConnectionObject: HubConnectionObject = {\r\n onConnected(callback) {\r\n hubConnection!.on(\"Connected\", callback);\r\n },\r\n onMessageSent(callback) {\r\n hubConnection!.on(\"MessageSent\", async (payload: any) => {\r\n await handleMessageSentAsync(payload, callback);\r\n });\r\n },\r\n onMessageEdited(callback) {\r\n hubConnection!.on(\"MessageEdited\", async (payload: any) => {\r\n await handleMessageEditedAsync(payload, callback);\r\n });\r\n },\r\n onMessageDeleted(callback) {\r\n hubConnection!.on(\"MessageDeleted\", (payload: any) => {\r\n handleMessageDeleted(payload, callback);\r\n });\r\n },\r\n onConversationCreated(callback) {\r\n hubConnection!.on(\"ConversationCreated\", async (payload: any) => {\r\n await handleConversationCreatedAsync(payload, callback);\r\n });\r\n },\r\n onConversationBasicInfoChanged(callback) {\r\n hubConnection!.on(\"ConversationBasicInfoChanged\", (payload: any) => {\r\n handleConversationBasicInfoChanged(payload, callback);\r\n });\r\n },\r\n onConversationDeleted(callback) {\r\n hubConnection!.on(\"ConversationDeleted\", (payload: any) => {\r\n handleConversationDeleted(payload, callback);\r\n });\r\n },\r\n start: () => hubConnection!.start(),\r\n stop: () => hubConnection!.stop()\r\n };\r\n return hubConnectionObject;\r\n}","export function listChatTypesAsync() {\r\n return new Promise((resolve) => {\r\n resolve([\r\n {\r\n name: \"Khiếu nại và hỗ trợ\", description: \"Tạo khiếu nại của khách hàng và được trợ giúp bởi hỗ trợ viên\", conversationType: \"HELP\",\r\n icon: \"data:image/png;base64,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\"\r\n },\r\n {\r\n name: \"Tư vấn đầu tư\", description: \"Tạo một cuộc hội thoại để bắt đầu nhận được các tư vấn đầu tư\", botId: \"BOT~rasaconnector\", isDefault: true,\r\n icon: \"data:image/png;base64,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\"\r\n }\r\n ]);\r\n });\r\n}","import { buildUrlWithQueryParams, request } from \"../http-client\";\r\nimport { convertToRawConversation } from \"../utils\";\r\nimport { batchGetMessagesFromApiAsync } from \"./message-apis\";\r\n\r\nexport async function listConversationsFromApiAsync(top?: number, type?: string) {\r\n const pinnedUrl = buildUrlWithQueryParams(\"conversation/user/pinned\", { top, type, ignoredFields: \"members\" });\r\n const unpinnedUrl = buildUrlWithQueryParams(\"conversation/user\", { top, type, ignoredFields: \"members\" });\r\n const conversationsFromRequests = await Promise.all([\r\n request(pinnedUrl),\r\n request(unpinnedUrl)\r\n ]);\r\n let pinnedConversations = conversationsFromRequests[0]?.items;\r\n let unpinnedConversations = conversationsFromRequests[1]?.items;\r\n if(!pinnedConversations) pinnedConversations = [];\r\n if(!unpinnedConversations) unpinnedConversations = [];\r\n const conversationsFromApi = [...pinnedConversations, ...unpinnedConversations];\r\n return conversationsFromApi.map((conversation: any) => convertToRawConversation(conversation));\r\n}\r\n\r\nexport async function getConversationFromApiAsync(conversationId: string) {\r\n const url = `conversation/${conversationId}?ignoredFields=members`;\r\n const conversationFromApi = await request(url);\r\n if (!conversationFromApi) return undefined;\r\n return convertToRawConversation(conversationFromApi);\r\n}\r\n\r\nexport async function createConversationUseApiAsync(conversation: any) {\r\n const conversationType = conversation.type ? conversation.type : 'BOT';\r\n let url = 'conversation';\r\n const body: any = {\r\n name: conversation.name,\r\n traceId: conversation.traceId\r\n }\r\n switch (conversationType) {\r\n case 'BOT':\r\n url += '/bot';\r\n body.botId = conversation.members \r\n ? conversation.members.filter((m: any) => m.userId?.startsWith(\"BOT~\")).map((m: any) => m.userId)[0]\r\n : null\r\n break;\r\n case 'SURVEY': \r\n url += '/survey';\r\n body.botId = conversation.members \r\n ? conversation.members.filter((m: any) => m.userId?.startsWith(\"BOT~\")).map((m: any) => m.userId)[0]\r\n : null\r\n break;\r\n case 'GROUP':\r\n url += '/group';\r\n body.memberIds = conversation.members ? conversation.members.filter((m: any) => m.id !== 'me').map((m: any) => m.userId) : []\r\n break;\r\n case 'HELP':\r\n url += '/help';\r\n break;\r\n }\r\n const responseData = await request(url, {\r\n method: 'POST',\r\n body\r\n });\r\n const { conversationId, name, type, membersCount, updatedAt, traceId } = responseData;\r\n return {\r\n id: conversationId,\r\n name,\r\n type,\r\n membersCount,\r\n updatedAt,\r\n traceId\r\n }\r\n}\r\n\r\nexport async function pinConversationUseApiAsync(conversationId: string, isPinned?: boolean) {\r\n let url = 'conversation';\r\n if (isPinned) {\r\n url += `/${conversationId}/pin`;\r\n } else {\r\n url += `/${conversationId}/unpin`;\r\n }\r\n const body: any = {};\r\n await request(url, {\r\n method: 'POST',\r\n body\r\n });\r\n return true;\r\n}\r\n\r\nexport async function updateConversationNameUseApiAsync(conversationId: string, newName: string) {\r\n const url = `conversation/${conversationId}`;\r\n const body: any = {\r\n name: newName\r\n }\r\n await request(url, {\r\n method: 'PATCH',\r\n body\r\n });\r\n return true;\r\n}\r\n\r\nexport async function deleteConversationUseApiAsync(conversationId: string) {\r\n const url = `conversation/${conversationId}/delete`;\r\n const body: any = {};\r\n await request(url, {\r\n method: 'POST',\r\n body\r\n });\r\n return true;\r\n}\r\n\r\nexport async function searchConversationsUseApiAsync(keyword: string, from?: string, top?: number) {\r\n const url = buildUrlWithQueryParams(\"aggregate/search\", { keyword, from, top, type: \"CONVERSATION\" });\r\n const searchResult = await request(url);\r\n const conversationsFromApi = searchResult.filter((r: any) => r.type === 'CONVERSATION').at(0)?.items;\r\n if (!conversationsFromApi) return [];\r\n const lastMessageIds: any = [...new Set(conversationsFromApi.map((c: any) => c.lastMessageId))];\r\n if (lastMessageIds.length > 0) {\r\n const lastMessages = await batchGetMessagesFromApiAsync(lastMessageIds);\r\n const lastMessageMap: any = {};\r\n lastMessages.forEach(m => {\r\n if(m) lastMessageMap[m.id] = m;\r\n });\r\n conversationsFromApi.forEach((c: any) => {\r\n if (c.lastMessageId) {\r\n c.lastMessage = lastMessageMap[c.lastMessageId];\r\n }\r\n });\r\n }\r\n return conversationsFromApi.map((conversation: any) => convertToRawConversation(conversation));\r\n}","import { createConversationUseApiAsync, deleteConversationUseApiAsync, getConversationFromApiAsync, listConversationsFromApiAsync, pinConversationUseApiAsync, searchConversationsUseApiAsync, updateConversationNameUseApiAsync } from \"../apis-data-provider/conversation-apis\";\r\nimport { enrichConversationAsync } from \"../utils\";\r\n\r\nexport async function listConversationsAsync(top?: number, type?: string) {\r\n const conversationsFromApi = await listConversationsFromApiAsync(top, type);\r\n const enrichedConversations = await Promise.all(conversationsFromApi.map(enrichConversationAsync));\r\n return enrichedConversations;\r\n}\r\n\r\nexport async function getConversationAsync(conversationId: string) {\r\n const conversationFromApi = await getConversationFromApiAsync(conversationId);\r\n if (!conversationFromApi) return undefined;\r\n const enrichedConversation = await enrichConversationAsync(conversationFromApi);\r\n return enrichedConversation;\r\n}\r\n\r\nexport async function searchConversationsAsync(keyword: string, from?: string, top?: number) {\r\n const conversationsFromApi = await searchConversationsUseApiAsync(keyword, from, top);\r\n const enrichedConversations = await Promise.all(conversationsFromApi.map(enrichConversationAsync));\r\n return enrichedConversations;\r\n}\r\n\r\nexport async function createConversationAsync(conversation: any) {\r\n const conversationCreated = await createConversationUseApiAsync(conversation);\r\n return {\r\n id: conversationCreated.id,\r\n name: conversationCreated.name,\r\n type: conversationCreated.type,\r\n membersCount: conversationCreated.membersCount,\r\n updatedAt: new Date(conversationCreated.updatedAt)\r\n };\r\n}\r\n\r\nexport function pinConversationAsync(conversationId: string, isPinned?: boolean) {\r\n return pinConversationUseApiAsync(conversationId, isPinned);\r\n}\r\n\r\nexport function updateConversationNameAsync(conversationId: string, newName: string) {\r\n return updateConversationNameUseApiAsync(conversationId, newName);\r\n}\r\n\r\nexport function deleteConversationAsync(conversationId: string) {\r\n return deleteConversationUseApiAsync(conversationId);\r\n}\r\n","import { buildRequestUrlForApi } from \"../utils\";\r\n\r\nexport function uploadFileUseApi(file: File, callback?: any) {\r\n if (!file) return undefined;\r\n const { popupRequestInfo } = window as any;\r\n const url = buildRequestUrlForApi('file');\r\n const xhr = new XMLHttpRequest();\r\n const credentialType: string | undefined = popupRequestInfo?.credentialType?.toUpperCase();\r\n const accessToken: string | undefined = popupRequestInfo?.accessToken;\r\n switch (credentialType) {\r\n case 'COOKIE':\r\n xhr.withCredentials = true;\r\n break;\r\n case 'QUERY':\r\n break;\r\n default:\r\n xhr.setRequestHeader('Authorization', `Bearer ${accessToken}`);\r\n break;\r\n }\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n if (callback) {\r\n xhr.upload.onprogress = function (e) {\r\n if (e.lengthComputable) {\r\n const percentComplete = (e.loaded / e.total) * 80;\r\n callback({\r\n loaded: e.loaded,\r\n total: e.total,\r\n percent: percentComplete,\r\n status: 'uploading'\r\n });\r\n }\r\n };\r\n }\r\n xhr.onload = function () {\r\n if (xhr.status === 200) {\r\n const response = JSON.parse(xhr.responseText);\r\n if (callback) {\r\n const thumbUrl = response.thumbId ? buildRequestUrlForApi(`file/${response.thumbId}`) : undefined;\r\n const fileUrl = buildRequestUrlForApi(`file/${response.fileId}`);\r\n callback({\r\n loaded: response.size,\r\n total: response.size,\r\n percent: 100,\r\n status: 'done',\r\n httpCode: xhr.status,\r\n fileItem: {\r\n id: response.fileId,\r\n name: response.fileName,\r\n contentType: response.contentType,\r\n thumbId: response.thumbId,\r\n thumbUrl: thumbUrl,\r\n url: fileUrl,\r\n }\r\n });\r\n }\r\n } else {\r\n if (callback) {\r\n callback({\r\n loaded: 0,\r\n total: 0,\r\n percent: 0,\r\n status: 'error',\r\n error: xhr.statusText,\r\n httpCode: xhr.status\r\n });\r\n }\r\n }\r\n };\r\n xhr.open('POST', url, true);\r\n xhr.send(formData);\r\n console.log(`------- Uploading file: ${file.name} to ${url}`);\r\n}","import { uploadFileUseApi } from \"../apis-data-provider/file-apis\";\r\n\r\nexport function uploadFile(file: File, callback?: (data: {\r\n loaded: number;\r\n total: number;\r\n percent: number;\r\n status: string;\r\n httpCode?: number;\r\n fileItem?: {\r\n id: string;\r\n name: string;\r\n contentType: string;\r\n thumbId?: string;\r\n thumbUrl?: string;\r\n url: string;\r\n };\r\n}) => void) {\r\n uploadFileUseApi(file, callback);\r\n}","import { updateMessageUseApiAsync, listMessagesFromApiAsync, searchMessagesUseApiAsync, sendMessageUseApiAsync, deleteMessageUseApiAsync } from \"../apis-data-provider/message-apis\";\r\nimport { collectSenderIds, convertToMessage, enrichMessageWithUsers, getUserMapAsync } from \"../utils\";\r\n\r\nexport async function listMessagesAsync(\r\n conversationId: string,\r\n direction?: string,\r\n fromMessageId?: string,\r\n top?: number\r\n) {\r\n const messagesFromApi = (await listMessagesFromApiAsync(conversationId, direction, fromMessageId, top))\r\n .filter(m => !!m);\r\n if (!messagesFromApi || !Array.isArray(messagesFromApi)) return [];\r\n\r\n const allSenderIds = new Set<string>();\r\n messagesFromApi.forEach(message => collectSenderIds(message, allSenderIds));\r\n const userMap = await getUserMapAsync(Array.from(allSenderIds));\r\n\r\n const enrichedMessages = messagesFromApi.map(message => enrichMessageWithUsers(message, userMap));\r\n\r\n return enrichedMessages.map(message => convertToMessage(message)!);\r\n}\r\n\r\nexport async function sendMessageAsync(message: any) {\r\n const messageFromApi = await sendMessageUseApiAsync(message);\r\n if (!messageFromApi) return undefined;\r\n\r\n const allSenderIds = collectSenderIds(messageFromApi);\r\n const userMap = await getUserMapAsync(Array.from(allSenderIds));\r\n\r\n const enrichedMessage = enrichMessageWithUsers(messageFromApi, userMap);\r\n return convertToMessage(enrichedMessage);\r\n}\r\n\r\nexport async function updateMessageAsync(message: any) {\r\n const messageFromApi = await updateMessageUseApiAsync(message);\r\n if (!messageFromApi) return false;\r\n return true;\r\n}\r\n\r\nexport function deleteMessageAsync(messageId: string, deleteType?: string) {\r\n return deleteMessageUseApiAsync(messageId, deleteType);\r\n}\r\n\r\nexport async function searchMessagesAsync(conversationId: string, keyword: string, from?: string, top?: number) {\r\n const messagesFromApi = await searchMessagesUseApiAsync(conversationId, keyword, from, top);\r\n if (!messagesFromApi || !Array.isArray(messagesFromApi)) return [];\r\n const allSenderIds = new Set<string>();\r\n messagesFromApi.forEach(message => collectSenderIds(message, allSenderIds));\r\n const userMap = await getUserMapAsync(Array.from(allSenderIds));\r\n\r\n const enrichedMessages = messagesFromApi.map(message => enrichMessageWithUsers(message, userMap));\r\n\r\n return enrichedMessages.map(message => convertToMessage(message)!);\r\n}","import { batchGetUsersFromApiAsync } from \"../apis-data-provider/user-apis\";\r\n\r\nexport function batchGetUsersAsync(userIds: string[]) {\r\n return batchGetUsersFromApiAsync(userIds);\r\n}","import {\r\n connectHub, getConversationAsync, listConversationsAsync,\r\n searchConversationsAsync, pinConversationAsync, createConversationAsync,\r\n updateConversationNameAsync, deleteConversationAsync, sendMessageAsync,\r\n listMessagesAsync, updateMessageAsync, batchGetUsersAsync, deleteMessageAsync,\r\n uploadFile, searchMessagesAsync, listChatTypesAsync\r\n} from \"./data-provider\";\r\nimport { HubConnectionObject } from \"./data-provider/hubs-data-provider\";\r\nimport { ChatType, Conversation, Message } from \"./utils/model\";\r\n\r\nexport default class RemoteRepository {\r\n private readonly hubConnection: HubConnectionObject;\r\n constructor(hubUrl?: string) {\r\n const hub = connectHub(hubUrl);\r\n if (!hub) throw new Error(\"Connect to hub error\");\r\n this.hubConnection = hub;\r\n this.hubConnection.start();\r\n }\r\n\r\n private get currentUserId(): string {\r\n return (window as any).currentUserId;\r\n }\r\n\r\n private normalizeConvId(id: string): string {\r\n if (id.startsWith(`${this.currentUserId}~`)) {\r\n return id.replace(new RegExp(`^${this.currentUserId}`), \"me\");\r\n }\r\n return id;\r\n }\r\n\r\n private denormalizeConvId(id: string): string {\r\n return id.replace(/^me/, this.currentUserId);\r\n }\r\n\r\n private normalizeSender(sender: { id: string } | undefined): void {\r\n if (sender && sender.id === this.currentUserId) {\r\n sender.id = \"me\";\r\n }\r\n }\r\n\r\n private normalizeConversation(conv: Conversation): void {\r\n conv.id = this.normalizeConvId(conv.id);\r\n if (conv.lastMessage) {\r\n this.normalizeSender(conv.lastMessage.sender);\r\n }\r\n }\r\n\r\n private normalizeMessages(msgs: Message[]): void {\r\n msgs.forEach(msg => this.normalizeSender(msg.sender));\r\n }\r\n\r\n onHubConnected = (callback: (data: any) => void) => {\r\n this.hubConnection.onConnected(data => {\r\n (window as any).currentUserId = data.userId;\r\n callback(data);\r\n });\r\n }\r\n\r\n onMessageSent = (callback: (data: any) => void) => {\r\n this.hubConnection.onMessageSent(data => {\r\n data.conversationId = this.normalizeConvId(data.conversationId);\r\n this.normalizeSender(data.sender);\r\n callback(data);\r\n });\r\n }\r\n\r\n onMessageEdited = (callback: (data: any) => void) => {\r\n this.hubConnection.onMessageEdited(data => {\r\n data.conversationId = this.normalizeConvId(data.conversationId);\r\n this.normalizeSender(data.sender);\r\n callback(data);\r\n });\r\n }\r\n\r\n onMessageDeleted = (callback: (data: any) => void) => {\r\n this.hubConnection.onMessageDeleted(callback);\r\n }\r\n\r\n onConversationCreated = (callback: (data: any) => void) => {\r\n this.hubConnection.onConversationCreated(data => {\r\n this.normalizeConversation(data as Conversation);\r\n callback(data);\r\n });\r\n }\r\n\r\n onConversationBasicInfoChanged = (callback: (conversationId: string, name: string) => void) => {\r\n this.hubConnection.onConversationBasicInfoChanged((conversationId: string, name: string) => {\r\n conversationId = this.normalizeConvId(conversationId);\r\n callback(conversationId, name);\r\n });\r\n }\r\n\r\n onConversationDeleted = (callback: (data: any) => void) => {\r\n this.hubConnection.onConversationDeleted(conversationId => {\r\n conversationId = this.normalizeConvId(conversationId);\r\n callback(conversationId);\r\n });\r\n }\r\n\r\n getConversationAsync = async (conversationId: string) => {\r\n const serverId = this.denormalizeConvId(conversationId);\r\n const conv = await getConversationAsync(serverId);\r\n if (!conv) return;\r\n this.normalizeConversation(conv);\r\n return conv;\r\n }\r\n\r\n listConversationAsync = async (top?: number, type?: string) => {\r\n const convs = await listConversationsAsync(top, type);\r\n convs.forEach(conv => this.normalizeConversation(conv));\r\n return convs;\r\n }\r\n\r\n searchConversationsAsync = async (keyword: string, from?: string, top?: number) => {\r\n const convs = await searchConversationsAsync(keyword, from, top);\r\n convs.forEach(conv => this.normalizeConversation(conv));\r\n return convs;\r\n }\r\n\r\n pinConversationAsync = (conversationId: string, isPinned?: boolean) => {\r\n const serverId = this.denormalizeConvId(conversationId);\r\n return pinConversationAsync(serverId, isPinned);\r\n }\r\n\r\n createConversationAsync = (conv: Conversation) => {\r\n return createConversationAsync(conv);\r\n }\r\n\r\n updateConversationNameAsync = (conversationId: string, newName: string) => {\r\n const serverId = this.denormalizeConvId(conversationId);\r\n return updateConversationNameAsync(serverId, newName);\r\n }\r\n\r\n deleteConversationAsync = (conversationId: string) => {\r\n const serverId = this.denormalizeConvId(conversationId);\r\n return deleteConversationAsync(serverId);\r\n }\r\n\r\n sendMessageAsync = async (message: Message) => {\r\n const clonedMessage = { ...message };\r\n clonedMessage.conversationId = this.denormalizeConvId(clonedMessage.conversationId);\r\n const msg = await sendMessageAsync(clonedMessage);\r\n this.normalizeSender(msg.sender);\r\n return msg as Message;\r\n }\r\n\r\n listMessagesAsync = async (conversationId: string, direction?: string, fromMessageId?: string, top?: number) => {\r\n const serverId = this.denormalizeConvId(conversationId);\r\n const msgs = await listMessagesAsync(serverId, direction, fromMessageId, top);\r\n this.normalizeMessages(msgs);\r\n return msgs as Message[];\r\n }\r\n\r\n searchMessagesAsync = async (conversationId: string, keyword: string, from?: string, top?: number) => {\r\n const serverId = this.denormalizeConvId(conversationId);\r\n const msgs = await searchMessagesAsync(serverId, keyword, from, top);\r\n this.normalizeMessages(msgs);\r\n return msgs as Message[];\r\n }\r\n\r\n updateMessageAsync = (message: Message) => {\r\n return updateMessageAsync(message);\r\n }\r\n\r\n batchGetUsersAsync = (userIds: string[]) => {\r\n return batchGetUsersAsync(userIds);\r\n }\r\n\r\n deleteMessageAsync = (messageId: string, deleteType?: string) => {\r\n return deleteMessageAsync(messageId, deleteType);\r\n }\r\n\r\n uploadFile = (file: File, callback?: (data: {\r\n loaded: number;\r\n total: number;\r\n percent: number;\r\n status: string;\r\n httpCode?: number;\r\n fileItem?: {\r\n id: string;\r\n name: string;\r\n contentType: string;\r\n thumbId?: string;\r\n thumbUrl?: string;\r\n url: string;\r\n };\r\n }) => void) => {\r\n uploadFile(file, callback);\r\n }\r\n\r\n listChatTypesAsync = async () => {\r\n const chatTypes = await listChatTypesAsync();\r\n return chatTypes as ChatType[];\r\n }\r\n}\r\n","import { render } from \"solid-js/web\";\r\nimport { createSignal, Show } from \"solid-js\";\r\nimport App from \"./App\";\r\nimport RemoteRepository from \"./RemoteRepository\";\r\nimport { PopupProvider } from \"./context/PopupProvider\";\r\nimport { PopupExport } from \"./context/context-types\";\r\n\r\nconst [getRemoteRepo, setRemoteRepo] = createSignal<RemoteRepository | null>(null);\r\nconst [getOptions, setOptions] = createSignal<any>(null);\r\nconst exportMethods: PopupExport = {};\r\n\r\nconst popupRequestInfo = {\r\n apiUrlBase: import.meta.env.VITE_HOST_API_URL,\r\n hubUrlBase: import.meta.env.VITE_HOST_HUB_URL,\r\n credentialType: \"cookie\",\r\n credentialName: \"aspfpt_sessiontoken\"\r\n};\r\n(window as any).popupRequestInfo = popupRequestInfo;\r\n\r\nconst HUB_URL = popupRequestInfo.hubUrlBase;\r\nconst initBackend = () => {\r\n const popupInfo = (window as any).popupRequestInfo;\r\n if (!HUB_URL) {\r\n throw new Error(\"VITE_PUBLIC_HUB_URL is not defined\");\r\n }\r\n const credentialType = popupInfo?.credentialType?.toLowerCase();\r\n if (credentialType !== 'cookie' && !popupInfo?.accessToken) {\r\n throw new Error(\"Missing JWT token: accessToken chưa được gán vào popupRequestInfo\");\r\n }\r\n if (credentialType !== 'cookie' && !(window as any).currentUserId) {\r\n throw new Error(\"Missing currentUserId: chưa chọn user\");\r\n }\r\n const repo = new RemoteRepository(HUB_URL);\r\n setRemoteRepo(repo);\r\n repo.onHubConnected((data) => {\r\n console.log(\"SignalR: Hub connected\", data);\r\n });\r\n repo.onMessageSent((message: any) => {\r\n console.log(\"SignalR: Message sent event received\", message);\r\n exportMethods.appendMessage?.(message);\r\n });\r\n repo.onMessageEdited((message: any) => {\r\n console.log(\"SignalR: Message edited event received\", message);\r\n exportMethods.updateMessage?.(message);\r\n });\r\n repo.onMessageDeleted((message: any) => {\r\n console.log(\"SignalR: Message deleted event received\", message);\r\n exportMethods.deleteMessage?.(message);\r\n });\r\n repo.onConversationCreated((conversation: any) => {\r\n console.log(\"SignalR: Conversation created event received\", conversation);\r\n exportMethods.appendConversation?.(conversation);\r\n });\r\n repo.onConversationBasicInfoChanged((conversationId: string, name: string) => {\r\n console.log(\"SignalR: Conversation name changed\", conversationId, name);\r\n exportMethods.updateConversationName?.(conversationId, name);\r\n });\r\n repo.onConversationDeleted((conversationId: string) => {\r\n console.log(\"SignalR: Conversation deleted\", conversationId);\r\n exportMethods.deleteConversation?.(conversationId);\r\n });\r\n};\r\n\r\nexport function createPopup(\r\n selector: string | Element,\r\n options?: {\r\n onMaximize?: (maximize: boolean) => void;\r\n onMinimize?: (minimize: boolean) => void;\r\n onMobile?: (isMobile: boolean) => void;\r\n onFullScreen?: (isFullScreen: boolean) => void;\r\n onClose?: (close: boolean) => void;\r\n onShrink?: (shrink: boolean) => void;\r\n onOpen?: (open: boolean) => void;\r\n onlyMobile?: boolean;\r\n accessToken?: string;\r\n currentUserId?: string;\r\n credentialType?: string;\r\n }\r\n) {\r\n const container = typeof selector === \"string\"\r\n ? document.querySelector(selector)\r\n : selector;\r\n\r\n if (!container) throw new Error(`Element \"${selector}\" not found.`);\r\n if (options?.credentialType) {\r\n (window as any).popupRequestInfo.credentialType = options.credentialType;\r\n }\r\n if (options?.accessToken) {\r\n (window as any).popupRequestInfo.accessToken = options.accessToken;\r\n }\r\n if (options?.currentUserId) {\r\n (window as any).currentUserId = options.currentUserId;\r\n }\r\n\r\n setOptions(options);\r\n initBackend();\r\n\r\n render(() => (\r\n <Show when={getRemoteRepo()} fallback={<div>Loading...</div>}>\r\n <PopupProvider remoteRepository={getRemoteRepo()!} exportMethods={exportMethods}>\r\n <App remoteRepo={getRemoteRepo()} options={getOptions()} />\r\n </PopupProvider>\r\n </Show>\r\n ), container);\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n EzChat: {\r\n createPopup: typeof createPopup;\r\n };\r\n }\r\n}\r\n\r\nif (typeof window !== 'undefined') {\r\n window.EzChat = { createPopup };\r\n}\r\n\r\nwindow.addEventListener('startChat', () => {\r\n initBackend();\r\n});"],"names":["equalFn","a","b","$PROXY","$TRACK","signalOptions","runEffects","runQueue","STALE","PENDING","UNOWNED","Owner","Transition","ExternalSourceConfig","Listener","Updates","Effects","ExecCount","createRoot","fn","detachedOwner","listener","owner","unowned","current","root","updateFn","untrack","cleanNode","runUpdates","createSignal","value","options","s","setter","writeSignal","readSignal","createRenderEffect","c","createComputation","updateComputation","createEffect","runUserEffects","createMemo","batch","on","deps","isArray","prevInput","prevValue","input","i","result","onMount","onCleanup","getListener","createContext","defaultValue","id","createProvider","useContext","context","children","memo","resolveChildren","updates","lookUpstream","sSlot","node","isComp","TransitionRunning","markDownstream","time","runComputation","nextValue","err","handleError","init","pure","state","runTop","ancestors","wait","res","completeUpdates","queue","userLength","e","ignore","source","o","index","obs","n","castError","results","props","__spreadProps","__spreadValues","FALLBACK","dispose","d","mapArray","list","mapFn","items","mapped","disposers","len","indexes","newItems","newLen","j","newIndices","newIndicesNext","temp","tempdisposers","tempIndexes","start","end","newEnd","item","disposer","mapper","set","createComponent","Comp","narrowedError","name","For","fallback","Show","keyed","conditionValue","condition","child","reconcileArrays","parentNode","bLength","aEnd","bEnd","aStart","bStart","after","map","sequence","t","$$EVENTS","render","code","element","insert","template","html","isImportNode","isSVG","isMathML","create","delegateEvents","eventNames","document","l","eventHandler","setAttribute","className","addEventListener","handler","delegate","style","prev","nodeStyle","v","setStyleProperty","use","arg","parent","accessor","marker","initial","insertExpression","key","oriTarget","oriCurrentTarget","retarget","handleNode","data","walkUpTree","path","unwrapArray","multi","cleanChildren","array","currentArray","normalizeIncomingArray","appendNodes","normalized","unwrap","dynamic","replacement","inserted","el","isParent","chatIcon","inforIcon","iconExpand","iconShrink","iconMinimize","iconClose","iconAddItem","iconSend","iconSideActive","iconUser","iconTrending","iconNewConversation","iconSearch","iconMenudot","iconMicrophone","iconEdit","iconDelete","iconSendActive","iconLike","iconDislike","iconLikeActive","iconDislikeActive","iconCheck","iconTooltip","iconHamburger","SurveyMessage","draggedIndex","setDraggedIndex","hoveredIndex","setHoveredIndex","selectedIndexes","setSelectedIndexes","answers","setAnswers","Array","length","fill","setOptions","showTooltip","setShowTooltip","description","contents","find","metadata","multiSelect","isInputMode","messageType","type","containerRef","handleMouseDown","isEditing","canSubmit","button","isDragDrop","preventDefault","handleMouseMove","containerRect","getBoundingClientRect","clientX","left","right","clientY","top","bottom","buttons","querySelectorAll","rect","handleMouseUp","newOptions","handleOptionClick","idx","includes","filter","handleAnswerChange","next","handleSubmit","onSubmit","msgId","filledAnswers","trim","selectedOptions","_","selectedOption","removeEventListener","fields","undefined","_el$","_tmpl$","_$insert","_$createComponent","each","_el$2","_tmpl$2","_el$3","firstChild","_$setStyleProperty","content","_c$","_$memo","_el$4","_tmpl$3","_el$5","_tmpl$4","_el$6","_el$7","_tmpl$7","_el$8","_el$9","_el$0","_el$12","nextSibling","_el$13","_c$2","question","when","_el$1","_tmpl$6","_el$10","_$setAttribute","_el$11","_tmpl$5","split","line","_el$14","_tmpl$8","_c$7","_tmpl$9","_c$3","_c$4","_el$16","_tmpl$0","option","_el$17","_tmpl$1","_el$18","_el$19","$$input","currentTarget","_$effect","_p$","_v$","placeholders","_v$2","disabled","_el$20","_tmpl$10","_ref$","_$use","_el$21","_tmpl$11","_el$22","$$click","$$mousedown","_c$8","_el$23","_tmpl$12","_c$9","_el$24","_tmpl$13","_v$3","_v$4","display","width","cursor","_$className","_$style","_c$5","_el$25","_tmpl$14","_$addEventListener","onCancelEdit","_c$6","_el$26","_tmpl$15","_$delegateEvents","ChatMessages","messagesContainerRef","hoveredId","setHoveredId","feedbackState","setFeedbackState","timeoutId","setTimeoutId","scrollTimeoutId","setScrollTimeoutId","selectedMsgId","setSelectedMsgId","hoveredMsgId","setHoveredMsgId","editInputValue","setEditInputValue","canEditMessage","lastMsg","messages","isLastInteractive","submittedMessages","has","handleMouseEnter","clearTimeout","Number","handleMouseLeave","setTimeout","getPadBottom","isFullScreen","inputHeight","isMobile","handleScroll","scrollTop","onLoadMoreMessages","_$p","msg","isLastMessage","sender","background","stopPropagation","userIdx","prevMsg","alert","setEditingMsgIdUser","setEditingMsgIdBot","console","log","editingMsgIdUser","editingMsgIdBot","onUpdateSurvey","sentAt","Date","toLocaleString","hour","minute","_v$5","_v$6","_v$7","_v$8","_el$15","surveyOptions","isFormType","isNormalType","text","_v$11","_v$12","_v$13","_v$14","_v$15","_v$9","_v$0","_v$1","_v$10","isLoadingMessages","ChatInput","textareaRef","isMaxed","setIsMaxed","resizeTextarea","height","overflowY","onHeightChange","fullHeight","scrollHeight","usedHeight","Math","min","MAX_HEIGHT","handleInput","setInput","handleKeyPress","shiftKey","sendMessage","classList","toggle","Sidebar","popoverOpen","popoverOpenFor","setPopoverOpenFor","conversations","setConversations","searchKeyword","setSearchKeyword","editingConvId","setEditingConvId","editName","setEditName","popoverRef","conversationPopoverRefs","normalizeText","toLowerCase","normalize","replace","handleCloseSidebar","onClose","reloadConversations","__async","remoteRepo","convs","listConversationAsync","error","onReloadConversations","filteredConversations","keyword","conv","conversationListMaxHeight","fullScreen","handleMouseDownOutside","contains","target","open","_el$27","onShrink","onNewConversation","_el$28","_el$29","_el$30","_el$31","onLoadMessages","_el$32","$$keydown","updateConversationNameAsync","_el$33","_el$34","_el$35","_el$36","_el$37","_el$38","_el$39","onDeleteConversation","ChatActionButton","onClick","HeaderSteps","currentStep","totalSteps","title","isSurveyConversation","from","$RAW","$NODE","$HAS","$SELF","wrap$1","p","proxyTraps$1","keys","desc","prop","isWrappable","obj","proto","unwrapped","getNodes","symbol","nodes","getNode","property","proxyDescriptor$1","trackSelf","ownKeys","receiver","tracked","setProperty","deleting","mergeStoreNode","updateArray","updatePath","traversed","part","partType","to","by","createStore","store","unwrappedStore","wrappedStore","setStore","args","producers","setterTraps","proxy","produce","DEFAULT_TOP","USER_SURVEY_ID","generateGuid","r","PopupContext","PopupProvider","getPopupState","setPopupState","getFullscreenState","setFullscreenState","getSidebarState","setSidebarState","getFooterSendBoxState","setFooterSendBoxState","getCurrentConversation","setCurrentConversation","getLastMessage","setLastMessage","getPanelElement","setPanelElement","setMessages","getCurrentMessage","setCurrentMessage","getCurrentQuotedMessage","setCurrentQuotedMessage","getMessageLoadingStatus","setMessageLoadingStatus","getCurrentChatType","setCurrentChatType","getTitle","setTitle","globalToggler","Map","remoteRepository","exportMethods","appendConversation","conversation","traceId","unshift","currentConversation","hasNewer","hasOlder","findIndex","creating","appendMessage","message","conversationId","msgs","mentions","sending","push","currentMessage","messageId","highlight","convIndex","updatedAt","lastMessage","splice","getConversationAsync","then","updateMessage","m","oldMsg","deleteMessage","deleted","body","toggleEl","isClose","get","toggleLoader","loaderId","registerLoader","toggleDrawer","drawerId","registerDrawer","deleteConversation","deleteConversationFromLocal","updateConversationName","updateConversationNameFromLocal","newName","setCurrentConversationState","isNew","listConversationsAsync","pinConversationAsync","isPinned","createConversationAsync","beforeCreateRemoteConversation","deleteConversationAsync","listMessagesAsync","direction","fromMessageId","convId","toUpperCase","topRs","remoteMsgs","initMessagesAsync","gotoMessageAsync","sendMessageAsync","Error","draftId","getSurveyStatusAsync","status","Provider","getCurrentMessages","listChatTypesAsync","updateMessageAsync","deleteMessageAsync","batchGetUsersAsync","searchConversationsAsync","searchMessagesAsync","uploadFile","usePopup","convertMessages","_a","baseMessage","_b","_d","_c","_e","_f","_g","_h","_i","_j","field","_k","_l","_m","_n","choiceChild","rankingChild","formChild","normalMessages","questionNormal","messagesToReturn","_o","selectedItems","_q","_p","_r","_s","_t","_u","normalChild","updateStepFromLastMessage","setCurrentStep","setTotalSteps","lastBotMsg","section","totalSections","hasIncompleteSurveyConversation","meta","ensureSurveyConversation","popup","setCurrentConversationId","setConversationName","setHasOlder","setSubmittedMessages","setIsLoadingMessages","reloadSidebarConversations","onSurveyCreated","surveyConv","allowInput","currentConversationId","handleCreateConversation","newConvName","setNameError","setShowNameModal","conversationName","handleSurveySubmitUtil","dependencies","formattedMessages","botMsg","botMetadata","messageBody","handleSurveyUpdateUtil","userMsgId","ChatPopup","isOpen","setIsOpen","isSidebarOpen","setIsSidebarOpen","setIsFullScreen","setIsMobile","setInputHeight","Set","showNameModal","setNewConvName","nameError","deletingConv","setDeletingConv","showSurveyAlert","setShowSurveyAlert","onlyMobile","onCreateConversation","warn","endsWith","newConversation","handleResize","isMobileNow","window","innerWidth","onFullScreen","onMobile","onOpen","canInput","handleSurveySubmit","handleSurveyUpdate","botId","autoName","slice","members","userId","role","botMsgs","loadMoreMessage","firstMsgId","firstMsgIndex","container","querySelector","firstMsgElement","Y","offsetTop","S","requestAnimationFrame","newFirstMsgElement","YPrime","onMinimize","_el$40","onMaximize","messagesData","_el$41","_el$42","_el$43","_el$44","App","HttpError","errorMessage","statusCode","trueProto","TimeoutError","AbortError","UnsupportedTransportError","transport","DisabledTransportError","FailedToStartTransportError","FailedToNegotiateWithServerError","AggregateErrors","innerErrors","HttpResponse","statusText","HttpClient","url","LogLevel","NullLogger","_logLevel","_message","VERSION","Arg","val","values","Platform","getDataDetail","includeContent","detail","isArrayBuffer","formatArrayBuffer","view","str","num","pad","logger","transportName","httpClient","headers","getUserAgentHeader","responseType","response","createLogger","ConsoleLogger","SubjectSubscription","subject","observer","minimumLogLevel","logLevel","userAgentHeaderName","constructUserAgent","getOsName","getRuntime","getRuntimeVersion","version","os","runtime","runtimeVersion","userAgent","majorAndMinor","getErrorString","getGlobalThis","FetchHttpClient","requireFunc","request","abortController","msTimeout","deserializeContent","payload","cookies","XhrHttpClient","resolve","reject","xhr","header","DefaultHttpClient","TextMessageFormat","output","HandshakeProtocol","handshakeRequest","messageData","remainingData","binaryData","separatorIndex","responseLength","textData","MessageType","Subject","MessageBuffer","protocol","connection","bufferSize","serializedMessage","backpressurePromise","backpressurePromiseResolver","backpressurePromiseRejector","BufferedItem","ackMessage","newestAckedMessage","currentId","sequenceId","resolver","rejector","DEFAULT_TIMEOUT_IN_MS","DEFAULT_PING_INTERVAL_IN_MS","DEFAULT_STATEFUL_RECONNECT_BUFFER_SIZE","HubConnectionState","HubConnection","reconnectPolicy","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","statefulReconnectBufferSize","handshakePromise","startPromise","methodName","streams","streamIds","invocationDescriptor","promiseQueue","cancelInvocation","invocationEvent","sendPromise","newMethod","method","handlers","removeIdx","callback","responseMessage","nextPing","invocationMessage","methods","methodsCopy","expectsResponse","exception","completionMessage","prevRes","reconnectStartTime","previousReconnectAttempts","retryError","nextRetryDelay","previousRetryCount","elapsedMilliseconds","retryReason","callbacks","nonblocking","invocationId","streamId","argument","DEFAULT_RETRY_DELAYS_IN_MILLISECONDS","DefaultReconnectPolicy","retryDelays","retryContext","HeaderNames","AccessTokenHttpClient","innerClient","accessTokenFactory","allowRetry","HttpTransportType","TransferFormat","AbortController$1","LongPollingTransport","AbortController","transferFormat","pollOptions","pollUrl","deleteOptions","logMessage","ServerSentEventsTransport","accessToken","opened","eventSource","WebSocketTransport","logMessageContent","webSocketConstructor","token","webSocket","_event","event","MAX_REDIRECTS","HttpConnection","webSocketModule","eventSourceModule","TransportSendQueue","negotiateResponse","redirects","negotiateUrl","connectionToken","requestedTransport","requestedTransferFormat","connectUrl","transportExceptions","transports","negotiate","endpoint","transportOrError","ex","callStop","useStatefulReconnect","transportMatches","aTag","searchParams","actualTransport","_transport","PromiseSource","transportResult","arrayBuffers","totalLength","offset","reason","JSON_HUB_PROTOCOL_NAME","JsonHubProtocol","hubMessages","parsedMessage","LogLevelNameMapping","parseLogLevel","mapping","HubConnectionBuilder","logging","isLogger","transportTypeOrOptions","retryDelaysOrReconnectPolicy","milliseconds","httpConnectionOptions","popupRequestInfo","buildRequestUrlForApi","credentialType","mergedOptions","responseBody","buildUrlWithQueryParams","params","query","batchGetUsersFromApiAsync","userIds","user","windowObj","indexedDb","databaseName","databaseVersion","userObjectStoreName","createUserObjectStore","db","objectStore","openIndexedDbAsync","evt","getUserObjectStoreAsync","mode","getUserFromLocalStoreAsync","addOrUpdateUserToLocalStoreAsync","batchGetUsersFromLocalStoreAsync","promises","getUserMapAsync","senderIds","uniqueSenderIds","localUsers","missingSenderIds","usersFromApi","allUsers","convertToRawConversation","convertToRawMessage","isQuotedMessage","quotedMessage","file","thumbUrl","fileUrl","enrichConversationAsync","lastMessageSenderIds","userMap","lastMessageSender","collectSenderIds","enrichMessageWithUsers","convertToMessage","buildRequestUrl","baseUrl","subUrl","credentialName","urlObj","apiUrlBase","buildRequestUrlForHub","hubUrl","hubUrlBase","createHubConnection","windowObject","listMessagesFromApiAsync","messagesFromApi","sendMessageUseApiAsync","quotedId","responseData","updateMessageUseApiAsync","deleteMessageUseApiAsync","deleteType","getMessageByIdFromApiAsync","messageFromApi","batchGetMessagesFromApiAsync","messageIds","searchMessagesUseApiAsync","handleMessageSentAsync","cacheMessage","rawMessage","allSenderIds","enrichedMessage","handleConversationCreatedAsync","rawConversation","handleConversationBasicInfoChanged","handleConversationDeleted","handleMessageEditedAsync","handleMessageDeleted","deletedBy","hubConnection","connectHub","listConversationsFromApiAsync","pinnedUrl","unpinnedUrl","conversationsFromRequests","pinnedConversations","unpinnedConversations","getConversationFromApiAsync","conversationFromApi","createConversationUseApiAsync","conversationType","membersCount","pinConversationUseApiAsync","updateConversationNameUseApiAsync","deleteConversationUseApiAsync","searchConversationsUseApiAsync","conversationsFromApi","lastMessageIds","lastMessages","lastMessageMap","conversationCreated","uploadFileUseApi","formData","percentComplete","RemoteRepository","__publicField","serverId","clonedMessage","hub","getRemoteRepo","setRemoteRepo","getOptions","import","HUB_URL","initBackend","popupInfo","currentUserId","repo","onHubConnected","onMessageSent","onMessageEdited","onMessageDeleted","onConversationCreated","onConversationBasicInfoChanged","onConversationDeleted","createPopup","selector","EzChat"],"mappings":"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","x_google_ignoreList":[0,1,33,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64]}