Skip to content

Commit d0f7e0a

Browse files
committed
[useImageDimensions] refactoring
1 parent 45887f4 commit d0f7e0a

File tree

1 file changed

+39
-18
lines changed

1 file changed

+39
-18
lines changed

src/useImageDimensions.ts

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,51 @@ export interface URISource {
77

88
/**
99
* @param source either a remote URL or a local file resource.
10-
* @returns original image width and height.
10+
* @returns original image dimensions (width and height).
1111
*/
1212
function useImageDimensions(source: ImageRequireSource | URISource) {
13-
const [state, setState] = useState<{
14-
width?: number
15-
height?: number
16-
loading?: boolean
17-
error?: any
18-
}>({})
13+
const localAsset = typeof source === 'number'
14+
const [dimensions, setDimensions] = useState<
15+
| {
16+
width: number
17+
height: number
18+
}
19+
| undefined
20+
>(localAsset ? Image.resolveAssetSource(source) : undefined)
21+
const [error, setError] = useState<Error>()
1922
useEffect(() => {
20-
if (typeof source === 'object' && typeof source.uri === 'string') {
21-
setState({loading: true})
23+
if (localAsset) {
24+
return
25+
}
26+
try {
2227
Image.getSize(
23-
source.uri,
24-
(width, height) => setState({width, height}),
25-
error => setState({error}),
28+
(source as URISource).uri,
29+
(width, height) => setDimensions({width, height}),
30+
e => {
31+
throw e
32+
},
2633
)
27-
} else if (typeof source === 'number') {
28-
setState(Image.resolveAssetSource(source))
29-
} else {
30-
setState({error: 'not implemented'})
34+
} catch (e) {
35+
setError(e)
3136
}
32-
}, [source])
33-
return state
37+
}, [source, localAsset])
38+
39+
return {
40+
dimensions,
41+
error,
42+
/**
43+
* width to height ratio
44+
*/
45+
get aspectRatio() {
46+
return dimensions && dimensions.width / dimensions.height
47+
},
48+
/**
49+
* loading indicator for remote image
50+
*/
51+
get loading() {
52+
return !dimensions && !error
53+
},
54+
}
3455
}
3556

3657
export default useImageDimensions

0 commit comments

Comments
 (0)