@metamask/design-system-react-native
Version:
1 lines • 13.9 kB
Source Map (JSON)
{"version":3,"file":"Maskicon.utilities.cjs","sourceRoot":"","sources":["../../../../src/components/temp-components/Maskicon/Maskicon.utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n extractAccountAddress,\n generateIconSeed,\n} from '@metamask/design-system-shared';\n\n// /////////////////////////////////////////////////////\n// Shared utilities have been moved to @metamask/design-system-shared\n// /////////////////////////////////////////////////////\n\n// /////////////////////////////////////////////////////\n// Maskicon SVG Creation\n// /////////////////////////////////////////////////////\n// Color Palettes\nconst neutralPairs = [\n ['#FF5C16', '#FCFCFC'],\n ['#FF5C16', '#131416'],\n ['#D075FF', '#FCFCFC'],\n ['#D075FF', '#131416'],\n ['#BAF24A', '#FCFCFC'],\n ['#BAF24A', '#131416'],\n ['#89B0FF', '#FCFCFC'],\n ['#89B0FF', '#131416'],\n ['#FCFCFC', '#FF5C16'],\n ['#131416', '#FF5C16'],\n ['#FCFCFC', '#D075FF'],\n ['#131416', '#D075FF'],\n ['#FCFCFC', '#BAF24A'],\n ['#131416', '#BAF24A'],\n ['#FCFCFC', '#89B0FF'],\n ['#131416', '#89B0FF'],\n];\n\nconst tonalPairs = [\n ['#FFA680', '#FF5C16'],\n ['#661800', '#FF5C16'],\n ['#EAC2FF', '#D075FF'],\n ['#3D065F', '#D075FF'],\n ['#E5FFC3', '#BAF24A'],\n ['#013330', '#BAF24A'],\n ['#CCE7FF', '#89B0FF'],\n ['#190066', '#89B0FF'],\n ['#FF5C16', '#FFA680'],\n ['#FF5C16', '#661800'],\n ['#D075FF', '#EAC2FF'],\n ['#D075FF', '#3D065F'],\n ['#BAF24A', '#E5FFC3'],\n ['#BAF24A', '#013330'],\n ['#89B0FF', '#CCE7FF'],\n ['#89B0FF', '#190066'],\n ['#661800', '#FFA680'],\n ['#FFA680', '#661800'],\n ['#3D065F', '#EAC2FF'],\n ['#EAC2FF', '#3D065F'],\n ['#013330', '#E5FFC3'],\n ['#E5FFC3', '#013330'],\n ['#190066', '#CCE7FF'],\n ['#CCE7FF', '#190066'],\n];\n\nconst complementaryPairs = [\n ['#EAC2FF', '#013330'],\n ['#013330', '#EAC2FF'],\n ['#CCE7FF', '#661800'],\n ['#661800', '#CCE7FF'],\n ['#E5FFC3', '#3D065F'],\n ['#3D065F', '#E5FFC3'],\n ['#FFA680', '#190066'],\n ['#190066', '#FFA680'],\n ['#CCE7FF', '#013330'],\n ['#013330', '#CCE7FF'],\n];\n\nconst colorPairs = neutralPairs.concat(tonalPairs).concat(complementaryPairs);\n\n/**\n * SDBM hash function\n *\n * @param str The string to hash\n * @returns A numeric hash value\n */\nexport function sdbmHash(str: string): number {\n let hash = 0;\n\n for (let i = 0; i < str.length; i++) {\n // eslint-disable-next-line no-bitwise\n hash = str.charCodeAt(i) + (hash << 6) + (hash << 16) - hash;\n }\n return hash;\n}\n\n/**\n * Convert numeric/byte-array seed to a 6+ length string\n *\n * @param seed The seed value to convert (either a number or array of numbers)\n * @returns A string representation of the seed (minimum 6 characters)\n */\nexport function seedToString(seed: number | number[]): string {\n if (typeof seed === 'number') {\n let hex = seed.toString(16);\n if (hex.length < 6) {\n hex = hex.padEnd(6, '0');\n }\n return hex;\n }\n if (Array.isArray(seed)) {\n let hex = seed.map((b) => b.toString(16).padStart(2, '0')).join('');\n if (hex.length < 6) {\n hex = hex.padEnd(6, '0');\n }\n return hex;\n }\n return 'seed000';\n}\n\n/**\n * Builds a full <svg> string containing the Maskicon shapes.\n *\n * @param seed The seed value used to generate the icon\n * @param size The size of the SVG icon in pixels\n * @returns An SVG string representing the Maskicon\n */\nexport function createMaskiconSVG(seed: number | number[], size = 100): string {\n // 1) Convert seed to string, then hash\n const str = seedToString(seed);\n const hashVal = sdbmHash(str);\n\n // 2) Pick color pair based on the hash\n const colorPairIndex = Math.abs(hashVal) % colorPairs.length;\n const [bgColor, fgColor] = colorPairs[colorPairIndex];\n\n // 3) Geometry setup\n const grid = 2;\n const margin = size * 0.25;\n const innerSize = size - 2 * margin;\n const cellSize = innerSize / grid;\n\n let pathData = '';\n const filledGrid: boolean[][] = Array.from({ length: grid }, () =>\n Array(grid).fill(false),\n );\n\n const startX = Math.floor(grid / 2);\n const startY = Math.floor(grid / 2);\n const stack = [[startX, startY]];\n filledGrid[startX][startY] = true;\n\n while (stack.length > 0) {\n // Using destructuring assignment with a non-null assertion is safe here because we've verified stack.length > 0\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [x, y] = stack.pop()!;\n // eslint-disable-next-line no-bitwise\n const cellHash = Math.abs(hashVal >> (x * 3 + y * 5)) & 15;\n\n const neighbors: [number, number][] = [];\n const directions: [number, number][] = [\n [0, 1],\n [1, 0],\n [0, -1],\n [-1, 0],\n ];\n for (const [dx, dy] of directions) {\n const nx = x + dx;\n const ny = y + dy;\n if (nx >= 0 && nx < grid && ny >= 0 && ny < grid && !filledGrid[nx][ny]) {\n neighbors.push([nx, ny]);\n }\n }\n while (neighbors.length > 0) {\n const idx = Math.abs(cellHash + neighbors.length) % neighbors.length;\n const [nx, ny] = neighbors.splice(idx, 1)[0];\n stack.push([nx, ny]);\n filledGrid[nx][ny] = true;\n }\n\n // Determine shape: square or right triangle (with rotation)\n const rotation = (cellHash % 4) * 90;\n const isSquare = cellHash % 5 === 0; // ~20% chance\n const cx = margin + x * cellSize;\n const cy = margin + y * cellSize;\n\n if (isSquare) {\n pathData += `M${cx},${cy} h${cellSize} v${cellSize} h-${cellSize}z `;\n } else if (rotation === 0) {\n pathData += `M${cx},${cy} h${cellSize} v${cellSize}z `;\n } else if (rotation === 90) {\n pathData += `M${cx + cellSize},${cy} v${cellSize} h-${cellSize}z `;\n } else if (rotation === 180) {\n pathData += `M${cx + cellSize},${cy + cellSize} h-${cellSize} v-${cellSize}z `;\n } else {\n pathData += `M${cx},${cy + cellSize} v-${cellSize} h${cellSize}z `;\n }\n }\n\n // 4) Construct final SVG string (always rectangular)\n let svgString = `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\" xmlns=\"http://www.w3.org/2000/svg\">`;\n svgString += `<rect width=\"${size}\" height=\"${size}\" fill=\"${bgColor}\" />`;\n svgString += `<path d=\"${pathData}\" fill=\"${fgColor}\" />`;\n svgString += `</svg>`;\n return svgString;\n}\n\n// /////////////////////////////////////////////////////\n// Maskicon SVG Creation and Caching\n// /////////////////////////////////////////////////////\ntype CacheKey = string;\nconst svgCache: Record<CacheKey, string> = {};\n\n/**\n * Returns a Promise that resolves to the final <svg> string for the given address.\n *\n * @param address The address to generate the Maskicon for\n * @param size The size of the icon in pixels\n * @returns A promise that resolves to an SVG string\n */\nexport async function getMaskiconSVG(\n address: string,\n size: number,\n): Promise<string> {\n const cacheKey = `${address.toLowerCase()}:${size}`;\n if (svgCache[cacheKey]) {\n return svgCache[cacheKey];\n }\n\n // Extract the account address from CAIP-10 format if needed\n const accountAddress = extractAccountAddress(address);\n\n // Generate appropriate seed based on address format\n const seed = generateIconSeed(accountAddress);\n\n const svgString = createMaskiconSVG(seed, size);\n svgCache[cacheKey] = svgString;\n return svgString;\n}\n"]}