UNPKG

@suiware/kit

Version:

Opinionated React components and hooks for building Sui dApps.

1 lines 5.34 kB
{"version":3,"sources":["../src/helpers/suins.ts","../src/components/AddressInput.tsx"],"names":[],"mappings":"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","file":"chunk-FKRC7PI3.mjs","sourcesContent":["import type { SuinsClient } from '@mysten/suins'\n\nexport const resolveSuinsName = async (\n suinsClient: SuinsClient,\n name: string\n): Promise<string | null> => {\n const nameRecord = await suinsClient.getNameRecord(name)\n return nameRecord?.targetAddress || null\n}\n","import { isValidSuiAddress } from '@mysten/sui/utils'\nimport type { SuinsClient } from '@mysten/suins'\nimport debounce from 'lodash.debounce'\nimport { ChangeEvent, FC, useCallback, useEffect, useState } from 'react'\nimport { resolveSuinsName } from '~~/helpers/suins'\n\nconst DEBOUNCE_DELAY = 500\n\nexport interface IAddressInput {\n value: string\n onChange: (value: string) => void\n placeholder?: string\n className?: string\n disabled?: boolean\n suinsClient?: SuinsClient\n}\n\nconst AddressInput: FC<IAddressInput> = ({\n value,\n onChange,\n placeholder,\n className = '',\n disabled = false,\n suinsClient,\n}) => {\n const [inputValue, setInputValue] = useState(value)\n const [error, setError] = useState<string | null>(null)\n\n // Debounced SuiNS resolution\n const debouncedResolve = useCallback(\n debounce(async (name: string) => {\n if (!suinsClient) {\n setError(\n 'SuinsClient is not available. Pass it through component props to make SuiNS name resolving work.'\n )\n return\n }\n\n try {\n const resolvedAddress = await resolveSuinsName(suinsClient, name)\n if (resolvedAddress) {\n setError(null)\n onChange(resolvedAddress)\n } else {\n setError('Invalid SuiNS name')\n }\n } catch (err) {\n setError('Failed to resolve SuiNS name')\n }\n }, DEBOUNCE_DELAY),\n [suinsClient, onChange]\n )\n\n const handleChange = async (e: ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value.trim()\n setInputValue(newValue)\n\n // Handle SuiNS names.\n if (newValue.endsWith('.sui') || newValue.startsWith('@')) {\n debouncedResolve(newValue)\n return\n }\n\n // Handle regular Sui addresses.\n if (newValue && !isValidSuiAddress(newValue)) {\n setError('Invalid Sui address')\n onChange(newValue)\n return\n }\n\n setError(null)\n onChange(newValue)\n }\n\n useEffect(() => {\n setInputValue(value)\n }, [value])\n\n // Cleanup debounce on unmount\n useEffect(() => {\n return () => {\n debouncedResolve.cancel()\n }\n }, [debouncedResolve])\n\n return (\n <div className={`sk-address-input ${className}`}>\n <input\n type=\"text\"\n value={inputValue}\n onChange={handleChange}\n placeholder={\n placeholder ||\n 'Enter Sui address' + (suinsClient != null ? ' or SuiNS name' : '')\n }\n disabled={disabled}\n className={error ? 'error' : ''}\n />\n {error && <span>{error}</span>}\n </div>\n )\n}\n\nexport default AddressInput\n"]}