/
githubmirror
/
client
Обзор
Документация
Войти
/
githubmirror
/
client
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
shared/util/zoom-toolkit/useImageResolution.ts
48 строк
2 KB
chrisnojima
perf: fix chat re-render hotspots, drop react-compiler bailouts (#29299)
10 июн 2026, 16:14
Не верифицирован
10 июн 2026, 16:14
78d1745
Код
Авторство
О чём код?
import {useEffect, useState} from 'react' import {Image} from 'react-native' import type {SizeVector} from './types' type Source = {uri: string; headers?: Record<string, string>} export type FetchImageResolutionResult = { isFetching: boolean resolution: SizeVector<number> | undefined error: Error | undefined } export default function useImageResolution(source: Source | number): FetchImageResolutionResult { // vendored code with an eslint suppression the compiler refuses to optimize past 'use no memo' const deps = JSON.stringify(source) const [resolvedDeps, setResolvedDeps] = useState('') const [resolution, setResolution] = useState<SizeVector<number> | undefined>(undefined) const [error, setError] = useState<Error | undefined>(undefined) const isFetching = resolvedDeps !== deps const onSuccess = (width: number, height: number) => { setResolution({width, height}) setResolvedDeps(deps) } const onFailure = (e: Error) => { setError(e) setResolvedDeps(deps) } useEffect(() => { if (typeof source === 'number') { const {width, height} = Image.resolveAssetSource(source) // eslint-disable-next-line react-hooks/set-state-in-effect onSuccess(width, height) return } if (source.headers === undefined) { Image.getSize(source.uri, onSuccess, onFailure) return } Image.getSizeWithHeaders(source.uri, source.headers, onSuccess, onFailure) // eslint-disable-next-line react-hooks/exhaustive-deps }, [deps]) return {isFetching, resolution, error} }