cobrowse-agent-ui 1.4.0 → 1.4.2

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.
@@ -30,7 +30,7 @@ import * as T from "react";
30
30
  import { useState as M, useRef as z, useImperativeHandle as J, useCallback as m, useEffect as Q } from "react";
31
31
  import { useTranslation as X } from "react-i18next";
32
32
  import $ from "clsx";
33
- import { P as tt, D as et, S as nt, a as ot, R as rt, L as st, i as ct } from "./index-CB-5iZZ3.js";
33
+ import { P as tt, D as et, S as nt, a as ot, R as rt, L as st, i as ct } from "./index-CvPSmCSB.js";
34
34
  const it = "CodeEntry-module__root__CEZCb", at = "CodeEntry-module__legend__GN0ge", lt = "CodeEntry-module__digits__aob60", ut = "CodeEntry-module__input__Mp3LR", dt = "CodeEntry-module__invalid__0fo6R", I = {
35
35
  root: it,
36
36
  legend: at,
@@ -93,7 +93,7 @@ const it = "CodeEntry-module__root__CEZCb", at = "CodeEntry-module__legend__GN0g
93
93
  var y, C;
94
94
  if (a)
95
95
  return;
96
- const { clipboardData: e } = r, s = e.getData("Text");
96
+ const { clipboardData: e } = r, s = e.getData("Text").trim();
97
97
  if (!/^[0-9]+$/.test(s)) {
98
98
  r.preventDefault();
99
99
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"cobrowse-agent-ui.js","sources":["../lib/components/CodeEntry/index.tsx","../lib/icons/external-link.svg?react","../lib/components/ExternalLink/index.tsx","../lib/components/UserIcon/index.tsx","../lib/main.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ForwardedRef,\n type ReactNode,\n type ClipboardEvent,\n type ChangeEvent,\n type KeyboardEvent\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport clsx from 'clsx'\nimport styles from './CodeEntry.module.css'\n\nexport interface CodeEntryHandle {\n clear: () => void\n focus: (index: number) => void\n}\n\nexport interface CodeEntryProps {\n ref?: ForwardedRef<CodeEntryHandle>\n className?: string\n inputClassName?: string\n focusOnRender?: boolean\n onCode?: (code: string) => Promise<boolean> | boolean\n label?: ReactNode | false\n children?: ReactNode\n}\n\nconst CODE_LENGTH = 6\nconst EMTPY_STATE = Array<string>(CODE_LENGTH).fill('')\nconst KEY_BACKSPACE = 'Backspace'\nconst KEY_ARROW_LEFT = 'ArrowLeft'\nconst KEY_ARROW_RIGHT = 'ArrowRight'\n\nconst getElementIndex = (refsArr: Array<HTMLInputElement | null>, elem: HTMLInputElement) =>\n refsArr.findIndex((el) => el === elem)\n\nconst focusPreviousInput = (refsArr: Array<HTMLInputElement | null>, elem: HTMLInputElement) => {\n refsArr[Math.max(getElementIndex(refsArr, elem) - 1, 0)]?.focus()\n}\n\nconst focusNextInput = (refsArr: Array<HTMLInputElement | null>, elem: HTMLInputElement) => {\n refsArr[Math.min(getElementIndex(refsArr, elem) + 1, CODE_LENGTH - 1)]?.focus()\n}\n\nconst moveFocusForArrowKey = (\n refsArr: Array<HTMLInputElement | null>,\n elem: HTMLInputElement,\n key: typeof KEY_ARROW_LEFT | typeof KEY_ARROW_RIGHT\n) => {\n const isRTL = getComputedStyle(elem).direction === 'rtl'\n const movesToPrevious = key === KEY_ARROW_LEFT ? !isRTL : isRTL\n\n if (movesToPrevious) {\n focusPreviousInput(refsArr, elem)\n } else {\n focusNextInput(refsArr, elem)\n }\n}\n\nconst CodeEntry = ({ ref, className, inputClassName, focusOnRender = false, onCode, label, children }: CodeEntryProps) => {\n const { t } = useTranslation()\n const [validating, setValidating] = useState(false)\n const [code, setCode] = useState(EMTPY_STATE)\n const refs = useRef<Array<HTMLInputElement | null>>([])\n\n useImperativeHandle(ref, () => ({\n clear () {\n setCode(EMTPY_STATE)\n },\n focus (index) {\n refs.current[index]?.focus()\n }\n }), [])\n\n const getCode = useCallback(() => code.join('').substring(0, CODE_LENGTH), [code])\n\n const focusFirstEmptyInput = useCallback(() => {\n const firstEmptyIndex = code.findIndex((digit) => digit === '')\n const targetIndex = firstEmptyIndex === -1 ? CODE_LENGTH - 1 : firstEmptyIndex\n\n refs.current[targetIndex]?.focus()\n }, [code])\n\n const tryComplete = useCallback(async (codeValue: string) => {\n setValidating(true)\n\n try {\n const isValid = await onCode?.(codeValue)\n\n if (isValid) {\n setCode(EMTPY_STATE)\n\n if (refs.current[0]) {\n setTimeout(() => refs.current[0]?.focus(), 0)\n }\n } else {\n setTimeout(() => refs.current[CODE_LENGTH - 1]?.focus(), 0)\n }\n } catch (e) {\n if (refs.current[CODE_LENGTH - 1]) {\n setTimeout(() => refs.current[CODE_LENGTH - 1]?.focus(), 0)\n }\n\n throw e\n } finally {\n setValidating(false)\n }\n }, [onCode])\n\n // Run the tryComplete function when the code state changes\n useEffect(() => {\n const code = getCode()\n\n if (code.length !== CODE_LENGTH) {\n return\n }\n\n void tryComplete(code)\n }, [getCode, tryComplete])\n\n const setDigit = useCallback((digit: number, value: string) => {\n if (digit > (CODE_LENGTH - 1)) {\n return\n }\n\n setCode((code) => {\n const updatedCode = [...code]\n\n updatedCode[digit] = value\n\n return updatedCode\n })\n }, [])\n\n const handlePaste = useCallback((event: ClipboardEvent<HTMLInputElement>) => {\n if (validating) {\n return\n }\n\n const { clipboardData } = event\n const pastedData = clipboardData.getData('Text')\n\n // Exit early if the pasted data contains anything other than just digits\n if (!/^[0-9]+$/.test(pastedData)) {\n event.preventDefault()\n\n return\n }\n\n const digits = pastedData.split('')\n // Start pasting from the first digit if the clipboard holds a full code,\n // otherwise just paste from the currently selected input onwards\n let digit = pastedData.length === CODE_LENGTH\n ? 0\n : parseInt(event.currentTarget.getAttribute('data-digit') ?? '0', 10)\n\n digits.forEach((value) => {\n setDigit(digit, value)\n\n digit += 1\n })\n\n refs.current[Math.min(digit, CODE_LENGTH - 1)]?.focus()\n\n event.preventDefault()\n }, [setDigit, validating])\n\n const handleOnChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n const { target, target: { value } } = event\n const digit = parseInt(target.getAttribute('data-digit') ?? '0', 10)\n const digits = value.match(/[0-9]/g) ?? []\n\n if (digits.length === 0) {\n setDigit(digit, '')\n\n return\n }\n\n if (digits.length === 1) {\n setDigit(digit, digits[0])\n focusNextInput(refs.current, target)\n }\n }, [setDigit])\n\n const handleKeyDown = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n const { key, currentTarget, metaKey, ctrlKey } = event\n\n // On backspace on empty node go back to previous\n if (currentTarget.value.length === 0 && key === KEY_BACKSPACE) {\n focusPreviousInput(refs.current, currentTarget)\n } else if (key === KEY_ARROW_LEFT || key === KEY_ARROW_RIGHT) {\n // Move focus according to visual direction\n moveFocusForArrowKey(refs.current, currentTarget, key)\n event.preventDefault()\n } else if (!metaKey && !ctrlKey && key.length === 1 && !/^[0-9]$/.test(key)) {\n // Prevent non-numeric characters that might appear in numbers (e.g 'e')\n // but allow backspaces too\n event.preventDefault()\n }\n }, [])\n\n const handleKeyUp = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n const { currentTarget, repeat } = event\n const { value } = currentTarget\n\n if (!repeat && /[0-9]/.test(value)) {\n focusNextInput(refs.current, currentTarget)\n }\n }, [])\n\n const invalid = !validating && getCode().length === CODE_LENGTH\n\n return (\n <fieldset\n className={clsx(styles.root, className)}\n >\n {label !== false && (\n <legend\n className={styles.legend}\n onClick={focusFirstEmptyInput}\n >\n <span>{label ?? t('Support code')}</span>\n </legend>\n )}\n <div className={clsx(styles.digits, invalid && styles.invalid)} role='group'>\n {code.map((value, index) => (\n <input\n key={index}\n inputMode='numeric'\n className={clsx(styles.input, inputClassName)}\n disabled={validating}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onChange={handleOnChange}\n onPaste={handlePaste}\n value={value}\n data-digit={index}\n ref={(el) => { refs.current[index] = el }}\n autoFocus={focusOnRender && index === 0}\n aria-label={t('Digit {{digit}}', { digit: index + 1 })}\n />\n ))}\n {children}\n </div>\n </fieldset>\n )\n}\n\nexport default CodeEntry\n","import * as React from \"react\";\nconst SvgExternalLink = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\", strokeLinejoin: \"round\", width: 14, height: 14, \"aria-hidden\": \"true\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M15 3h6v6\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M10 14 21 3\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" }));\nexport default SvgExternalLink;\n","import type { ReactNode } from 'react'\nimport IconExternalLink from '@/icons/external-link.svg?react'\nimport styles from './ExternalLink.module.css'\n\nexport interface ExternalLinkProps {\n href: string\n children?: ReactNode\n}\n\nconst ExternalLink = ({ href, children }: ExternalLinkProps) => (\n <a className={styles.root} href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n <IconExternalLink />\n </a>\n)\n\nexport default ExternalLink\n","import clsx from 'clsx'\nimport styles from './UserIcon.module.css'\n\nexport interface UserIconUser {\n name?: string\n picture?: string\n colour?: string\n}\n\nexport interface UserIconProps {\n user?: UserIconUser\n className?: string\n}\n\nconst UserIcon = ({ user, className }: UserIconProps) => {\n const initials = (): string => {\n if (!user?.name || user.picture) return ''\n\n return user.name\n .trim()\n .split(/\\s+/)\n .map(part => part.toUpperCase().charAt(0))\n .join('')\n .slice(0, 2)\n }\n\n if (!user) return null\n\n return (\n <div\n className={clsx(styles.root, className)}\n title={user.name}\n style={{\n backgroundImage: user.picture ? `url(${user.picture || ''})` : undefined,\n backgroundColor: user.colour\n }}\n >\n <span>{initials()}</span>\n </div>\n )\n}\n\nexport default UserIcon\n","import CodeEntryComponent from '@/components/CodeEntry'\nimport ExternalLinkComponent from '@/components/ExternalLink'\nimport PlatformIconComponent from '@/components/PlatformIcon'\nimport DeviceComponent from '@/components/Device'\nimport SessionComponent from '@/components/Session'\nimport SmartConnectButtonComponent from '@/components/SmartConnectButton'\nimport UserIconComponent from '@/components/UserIcon'\nimport RefreshButtonComponent from '@/components/RefreshButton'\nimport LoaderComponent from '@/components/Loader'\nimport i18nInstance from '@/i18n'\n\nexport type { CodeEntryProps } from '@/components/CodeEntry'\nexport type { ExternalLinkProps } from '@/components/ExternalLink'\nexport type { DeviceData, DeviceProps } from '@/components/Device'\nexport type { SessionData, SessionProps } from '@/components/Session'\nexport type { SmartConnectButtonProps } from '@/components/SmartConnectButton'\nexport type { RefreshButtonProps } from '@/components/RefreshButton'\nexport type { LoaderProps } from '@/components/Loader'\n\nexport const CodeEntry = CodeEntryComponent\nexport const ExternalLink = ExternalLinkComponent\nexport const PlatformIcon = PlatformIconComponent\nexport const Device = DeviceComponent\nexport const Session = SessionComponent\nexport const SmartConnectButton = SmartConnectButtonComponent\nexport const UserIcon = UserIconComponent\nexport const RefreshButton = RefreshButtonComponent\nexport const Loader = LoaderComponent\nexport const i18n = i18nInstance\n"],"names":["CODE_LENGTH","EMTPY_STATE","KEY_BACKSPACE","KEY_ARROW_LEFT","KEY_ARROW_RIGHT","getElementIndex","refsArr","elem","el","focusPreviousInput","_a","focusNextInput","moveFocusForArrowKey","key","isRTL","CodeEntry","ref","className","inputClassName","focusOnRender","onCode","label","children","t","useTranslation","validating","setValidating","useState","code","setCode","refs","useRef","useImperativeHandle","index","getCode","useCallback","focusFirstEmptyInput","firstEmptyIndex","digit","targetIndex","tryComplete","codeValue","__async","useEffect","setDigit","value","updatedCode","handlePaste","event","clipboardData","pastedData","digits","_b","handleOnChange","target","handleKeyDown","currentTarget","metaKey","ctrlKey","handleKeyUp","repeat","invalid","jsxs","clsx","styles","jsx","SvgExternalLink","props","React","__spreadValues","ExternalLink","href","IconExternalLink","UserIcon","user","initials","part","CodeEntryComponent","ExternalLinkComponent","PlatformIcon","PlatformIconComponent","Device","DeviceComponent","Session","SessionComponent","SmartConnectButton","SmartConnectButtonComponent","UserIconComponent","RefreshButton","RefreshButtonComponent","Loader","LoaderComponent","i18n","i18nInstance"],"mappings":"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"}
1
+ {"version":3,"file":"cobrowse-agent-ui.js","sources":["../lib/components/CodeEntry/index.tsx","../lib/icons/external-link.svg?react","../lib/components/ExternalLink/index.tsx","../lib/components/UserIcon/index.tsx","../lib/main.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ForwardedRef,\n type ReactNode,\n type ClipboardEvent,\n type ChangeEvent,\n type KeyboardEvent\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport clsx from 'clsx'\nimport styles from './CodeEntry.module.css'\n\nexport interface CodeEntryHandle {\n clear: () => void\n focus: (index: number) => void\n}\n\nexport interface CodeEntryProps {\n ref?: ForwardedRef<CodeEntryHandle>\n className?: string\n inputClassName?: string\n focusOnRender?: boolean\n onCode?: (code: string) => Promise<boolean> | boolean\n label?: ReactNode | false\n children?: ReactNode\n}\n\nconst CODE_LENGTH = 6\nconst EMTPY_STATE = Array<string>(CODE_LENGTH).fill('')\nconst KEY_BACKSPACE = 'Backspace'\nconst KEY_ARROW_LEFT = 'ArrowLeft'\nconst KEY_ARROW_RIGHT = 'ArrowRight'\n\nconst getElementIndex = (refsArr: Array<HTMLInputElement | null>, elem: HTMLInputElement) =>\n refsArr.findIndex((el) => el === elem)\n\nconst focusPreviousInput = (refsArr: Array<HTMLInputElement | null>, elem: HTMLInputElement) => {\n refsArr[Math.max(getElementIndex(refsArr, elem) - 1, 0)]?.focus()\n}\n\nconst focusNextInput = (refsArr: Array<HTMLInputElement | null>, elem: HTMLInputElement) => {\n refsArr[Math.min(getElementIndex(refsArr, elem) + 1, CODE_LENGTH - 1)]?.focus()\n}\n\nconst moveFocusForArrowKey = (\n refsArr: Array<HTMLInputElement | null>,\n elem: HTMLInputElement,\n key: typeof KEY_ARROW_LEFT | typeof KEY_ARROW_RIGHT\n) => {\n const isRTL = getComputedStyle(elem).direction === 'rtl'\n const movesToPrevious = key === KEY_ARROW_LEFT ? !isRTL : isRTL\n\n if (movesToPrevious) {\n focusPreviousInput(refsArr, elem)\n } else {\n focusNextInput(refsArr, elem)\n }\n}\n\nconst CodeEntry = ({ ref, className, inputClassName, focusOnRender = false, onCode, label, children }: CodeEntryProps) => {\n const { t } = useTranslation()\n const [validating, setValidating] = useState(false)\n const [code, setCode] = useState(EMTPY_STATE)\n const refs = useRef<Array<HTMLInputElement | null>>([])\n\n useImperativeHandle(ref, () => ({\n clear () {\n setCode(EMTPY_STATE)\n },\n focus (index) {\n refs.current[index]?.focus()\n }\n }), [])\n\n const getCode = useCallback(() => code.join('').substring(0, CODE_LENGTH), [code])\n\n const focusFirstEmptyInput = useCallback(() => {\n const firstEmptyIndex = code.findIndex((digit) => digit === '')\n const targetIndex = firstEmptyIndex === -1 ? CODE_LENGTH - 1 : firstEmptyIndex\n\n refs.current[targetIndex]?.focus()\n }, [code])\n\n const tryComplete = useCallback(async (codeValue: string) => {\n setValidating(true)\n\n try {\n const isValid = await onCode?.(codeValue)\n\n if (isValid) {\n setCode(EMTPY_STATE)\n\n if (refs.current[0]) {\n setTimeout(() => refs.current[0]?.focus(), 0)\n }\n } else {\n setTimeout(() => refs.current[CODE_LENGTH - 1]?.focus(), 0)\n }\n } catch (e) {\n if (refs.current[CODE_LENGTH - 1]) {\n setTimeout(() => refs.current[CODE_LENGTH - 1]?.focus(), 0)\n }\n\n throw e\n } finally {\n setValidating(false)\n }\n }, [onCode])\n\n // Run the tryComplete function when the code state changes\n useEffect(() => {\n const code = getCode()\n\n if (code.length !== CODE_LENGTH) {\n return\n }\n\n void tryComplete(code)\n }, [getCode, tryComplete])\n\n const setDigit = useCallback((digit: number, value: string) => {\n if (digit > (CODE_LENGTH - 1)) {\n return\n }\n\n setCode((code) => {\n const updatedCode = [...code]\n\n updatedCode[digit] = value\n\n return updatedCode\n })\n }, [])\n\n const handlePaste = useCallback((event: ClipboardEvent<HTMLInputElement>) => {\n if (validating) {\n return\n }\n\n const { clipboardData } = event\n const pastedData = clipboardData.getData('Text').trim()\n\n // Exit early if the pasted data contains anything other than just digits\n if (!/^[0-9]+$/.test(pastedData)) {\n event.preventDefault()\n\n return\n }\n\n const digits = pastedData.split('')\n // Start pasting from the first digit if the clipboard holds a full code,\n // otherwise just paste from the currently selected input onwards\n let digit = pastedData.length === CODE_LENGTH\n ? 0\n : parseInt(event.currentTarget.getAttribute('data-digit') ?? '0', 10)\n\n digits.forEach((value) => {\n setDigit(digit, value)\n\n digit += 1\n })\n\n refs.current[Math.min(digit, CODE_LENGTH - 1)]?.focus()\n\n event.preventDefault()\n }, [setDigit, validating])\n\n const handleOnChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n const { target, target: { value } } = event\n const digit = parseInt(target.getAttribute('data-digit') ?? '0', 10)\n const digits = value.match(/[0-9]/g) ?? []\n\n if (digits.length === 0) {\n setDigit(digit, '')\n\n return\n }\n\n if (digits.length === 1) {\n setDigit(digit, digits[0])\n focusNextInput(refs.current, target)\n }\n }, [setDigit])\n\n const handleKeyDown = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n const { key, currentTarget, metaKey, ctrlKey } = event\n\n // On backspace on empty node go back to previous\n if (currentTarget.value.length === 0 && key === KEY_BACKSPACE) {\n focusPreviousInput(refs.current, currentTarget)\n } else if (key === KEY_ARROW_LEFT || key === KEY_ARROW_RIGHT) {\n // Move focus according to visual direction\n moveFocusForArrowKey(refs.current, currentTarget, key)\n event.preventDefault()\n } else if (!metaKey && !ctrlKey && key.length === 1 && !/^[0-9]$/.test(key)) {\n // Prevent non-numeric characters that might appear in numbers (e.g 'e')\n // but allow backspaces too\n event.preventDefault()\n }\n }, [])\n\n const handleKeyUp = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n const { currentTarget, repeat } = event\n const { value } = currentTarget\n\n if (!repeat && /[0-9]/.test(value)) {\n focusNextInput(refs.current, currentTarget)\n }\n }, [])\n\n const invalid = !validating && getCode().length === CODE_LENGTH\n\n return (\n <fieldset\n className={clsx(styles.root, className)}\n >\n {label !== false && (\n <legend\n className={styles.legend}\n onClick={focusFirstEmptyInput}\n >\n <span>{label ?? t('Support code')}</span>\n </legend>\n )}\n <div className={clsx(styles.digits, invalid && styles.invalid)} role='group'>\n {code.map((value, index) => (\n <input\n key={index}\n inputMode='numeric'\n className={clsx(styles.input, inputClassName)}\n disabled={validating}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onChange={handleOnChange}\n onPaste={handlePaste}\n value={value}\n data-digit={index}\n ref={(el) => { refs.current[index] = el }}\n autoFocus={focusOnRender && index === 0}\n aria-label={t('Digit {{digit}}', { digit: index + 1 })}\n />\n ))}\n {children}\n </div>\n </fieldset>\n )\n}\n\nexport default CodeEntry\n","import * as React from \"react\";\nconst SvgExternalLink = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\", strokeLinejoin: \"round\", width: 14, height: 14, \"aria-hidden\": \"true\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M15 3h6v6\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M10 14 21 3\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" }));\nexport default SvgExternalLink;\n","import type { ReactNode } from 'react'\nimport IconExternalLink from '@/icons/external-link.svg?react'\nimport styles from './ExternalLink.module.css'\n\nexport interface ExternalLinkProps {\n href: string\n children?: ReactNode\n}\n\nconst ExternalLink = ({ href, children }: ExternalLinkProps) => (\n <a className={styles.root} href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {children}\n <IconExternalLink />\n </a>\n)\n\nexport default ExternalLink\n","import clsx from 'clsx'\nimport styles from './UserIcon.module.css'\n\nexport interface UserIconUser {\n name?: string\n picture?: string\n colour?: string\n}\n\nexport interface UserIconProps {\n user?: UserIconUser\n className?: string\n}\n\nconst UserIcon = ({ user, className }: UserIconProps) => {\n const initials = (): string => {\n if (!user?.name || user.picture) return ''\n\n return user.name\n .trim()\n .split(/\\s+/)\n .map(part => part.toUpperCase().charAt(0))\n .join('')\n .slice(0, 2)\n }\n\n if (!user) return null\n\n return (\n <div\n className={clsx(styles.root, className)}\n title={user.name}\n style={{\n backgroundImage: user.picture ? `url(${user.picture || ''})` : undefined,\n backgroundColor: user.colour\n }}\n >\n <span>{initials()}</span>\n </div>\n )\n}\n\nexport default UserIcon\n","import CodeEntryComponent from '@/components/CodeEntry'\nimport ExternalLinkComponent from '@/components/ExternalLink'\nimport PlatformIconComponent from '@/components/PlatformIcon'\nimport DeviceComponent from '@/components/Device'\nimport SessionComponent from '@/components/Session'\nimport SmartConnectButtonComponent from '@/components/SmartConnectButton'\nimport UserIconComponent from '@/components/UserIcon'\nimport RefreshButtonComponent from '@/components/RefreshButton'\nimport LoaderComponent from '@/components/Loader'\nimport i18nInstance from '@/i18n'\n\nexport type { CodeEntryProps } from '@/components/CodeEntry'\nexport type { ExternalLinkProps } from '@/components/ExternalLink'\nexport type { DeviceData, DeviceProps } from '@/components/Device'\nexport type { SessionData, SessionProps } from '@/components/Session'\nexport type { SmartConnectButtonProps } from '@/components/SmartConnectButton'\nexport type { RefreshButtonProps } from '@/components/RefreshButton'\nexport type { LoaderProps } from '@/components/Loader'\n\nexport const CodeEntry = CodeEntryComponent\nexport const ExternalLink = ExternalLinkComponent\nexport const PlatformIcon = PlatformIconComponent\nexport const Device = DeviceComponent\nexport const Session = SessionComponent\nexport const SmartConnectButton = SmartConnectButtonComponent\nexport const UserIcon = UserIconComponent\nexport const RefreshButton = RefreshButtonComponent\nexport const Loader = LoaderComponent\nexport const i18n = i18nInstance\n"],"names":["CODE_LENGTH","EMTPY_STATE","KEY_BACKSPACE","KEY_ARROW_LEFT","KEY_ARROW_RIGHT","getElementIndex","refsArr","elem","el","focusPreviousInput","_a","focusNextInput","moveFocusForArrowKey","key","isRTL","CodeEntry","ref","className","inputClassName","focusOnRender","onCode","label","children","t","useTranslation","validating","setValidating","useState","code","setCode","refs","useRef","useImperativeHandle","index","getCode","useCallback","focusFirstEmptyInput","firstEmptyIndex","digit","targetIndex","tryComplete","codeValue","__async","useEffect","setDigit","value","updatedCode","handlePaste","event","clipboardData","pastedData","digits","_b","handleOnChange","target","handleKeyDown","currentTarget","metaKey","ctrlKey","handleKeyUp","repeat","invalid","jsxs","clsx","styles","jsx","SvgExternalLink","props","React","__spreadValues","ExternalLink","href","IconExternalLink","UserIcon","user","initials","part","CodeEntryComponent","ExternalLinkComponent","PlatformIcon","PlatformIconComponent","Device","DeviceComponent","Session","SessionComponent","SmartConnectButton","SmartConnectButtonComponent","UserIconComponent","RefreshButton","RefreshButtonComponent","Loader","LoaderComponent","i18n","i18nInstance"],"mappings":"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"}