Skip to content

Commit 2424139

Browse files
committed
[useImageDimensions] refactoring
1 parent d0f7e0a commit 2424139

File tree

2 files changed

+36
-33
lines changed

2 files changed

+36
-33
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,12 @@ const source = require('./assets/yourImage.png')
114114
// or
115115
const source = {uri: 'https://your.image.URI'}
116116

117-
const {width, height, loading, error} = useImageDimensions(source)
117+
const {dimensions, loading, error} = useImageDimensions(source)
118+
119+
if(loading || error || !dimensions) {
120+
return null
121+
}
122+
const {width, height, aspectRatio} = dimensions
118123
```
119124

120125
### `useKeyboard`

src/useImageDimensions.ts

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,45 @@ export interface URISource {
77

88
/**
99
* @param source either a remote URL or a local file resource.
10-
* @returns original image dimensions (width and height).
10+
* @returns original image dimensions (width, height and aspect ratio).
1111
*/
1212
function useImageDimensions(source: ImageRequireSource | URISource) {
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>()
13+
const [[dimensions, error], setState] = useState<
14+
[{width: number; height: number}?, Error?]
15+
>([])
16+
2217
useEffect(() => {
23-
if (localAsset) {
24-
return
25-
}
2618
try {
27-
Image.getSize(
28-
(source as URISource).uri,
29-
(width, height) => setDimensions({width, height}),
30-
e => {
31-
throw e
32-
},
33-
)
19+
if (typeof source === 'number') {
20+
const {width, height} = Image.resolveAssetSource(source)
21+
setState([{width, height}])
22+
} else if (typeof source === 'object' && source.uri) {
23+
setState([])
24+
Image.getSize(
25+
source.uri,
26+
(width, height) => setState([{width, height}]),
27+
e => setState([dimensions, e]),
28+
)
29+
} else {
30+
throw new Error('not implemented')
31+
}
3432
} catch (e) {
35-
setError(e)
33+
setState([dimensions, e])
3634
}
37-
}, [source, localAsset])
35+
// eslint-disable-next-line react-hooks/exhaustive-deps
36+
}, [source])
3837

3938
return {
40-
dimensions,
41-
error,
42-
/**
43-
* width to height ratio
44-
*/
45-
get aspectRatio() {
46-
return dimensions && dimensions.width / dimensions.height
39+
dimensions: dimensions && {
40+
...dimensions,
41+
/**
42+
* width to height ratio
43+
*/
44+
get aspectRatio(): number {
45+
return this.width / this.height
46+
},
4747
},
48-
/**
49-
* loading indicator for remote image
50-
*/
48+
error,
5149
get loading() {
5250
return !dimensions && !error
5351
},

0 commit comments

Comments
 (0)