@suiware/kit
Version:
Opinionated React components and hooks for building Sui dApps.
1 lines • 5.41 kB
Source Map (JSON)
{"version":3,"sources":["../src/helpers/suins.ts","../src/components/AddressInput.tsx"],"names":[],"mappings":"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","file":"chunk-Q7UZRD3B.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"]}