Skip to content

Commit 6e70840

Browse files
committed
[useImageDimensions] refactoring
1 parent 3aac61c commit 6e70840

File tree

1 file changed

+22
-26
lines changed

1 file changed

+22
-26
lines changed

src/useImageDimensions.ts

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,56 +5,52 @@ export interface URISource {
55
uri: string
66
}
77

8+
class Dimensions {
9+
width: number
10+
height: number
11+
constructor(width: number, height: number) {
12+
this.width = width
13+
this.height = height
14+
}
15+
/**
16+
* width to height ratio
17+
*/
18+
get aspectRatio() {
19+
return this.width / this.height
20+
}
21+
}
22+
823
/**
924
* @param source either a remote URL or a local file resource.
1025
* @returns original image dimensions (width, height and aspect ratio).
1126
*/
1227
function useImageDimensions(source: ImageRequireSource | URISource) {
13-
const [[dimensions, error], setState] = useState<
14-
[{width: number; height: number}?, Error?]
15-
>([])
28+
const [[dimensions, error], setState] = useState<[Dimensions?, Error?]>([])
1629

1730
useEffect(() => {
1831
try {
1932
if (typeof source === 'number') {
2033
const {width, height} = Image.resolveAssetSource(source)
21-
setState([{width, height}])
34+
setState([new Dimensions(width, height)])
2235
} else if (typeof source === 'object' && source.uri) {
2336
setState([])
2437
Image.getSize(
2538
source.uri,
26-
(width, height) => setState([{width, height}]),
27-
e => setState([dimensions, e]),
39+
(width, height) => setState([new Dimensions(width, height)]),
40+
e => setState([undefined, e]),
2841
)
2942
} else {
3043
throw new Error('not implemented')
3144
}
3245
} catch (e) {
33-
setState([dimensions, e])
46+
setState([undefined, e])
3447
}
35-
// eslint-disable-next-line react-hooks/exhaustive-deps
3648
}, [source])
3749

3850
return {
39-
dimensions:
40-
dimensions &&
41-
(Object.setPrototypeOf(dimensions, {
42-
get aspectRatio(): number {
43-
const _this = this as any
44-
return _this.width / _this.height
45-
},
46-
}) as {
47-
/**
48-
* width to height ratio
49-
*/
50-
readonly aspectRatio: number
51-
width: number
52-
height: number
53-
}),
51+
dimensions,
5452
error,
55-
get loading() {
56-
return !this.dimensions && !this.error
57-
},
53+
loading: !dimensions && !error,
5854
}
5955
}
6056

0 commit comments

Comments
 (0)