Skip to content

Commit cee39fd

Browse files
[fix] improved useMediaCapabilities hook (#48)
* doc: improved code styling in readme * infra: uninstalled react-dom * chore: cleaned up * infra: extracted supported from hook in useMediaCapabilities * doc: cleaned code snippet for useMediaCapabilities in README
1 parent b2af95b commit cee39fd

File tree

6 files changed

+10801
-10800
lines changed

6 files changed

+10801
-10800
lines changed

README.md

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -170,35 +170,31 @@ import React from 'react';
170170
import { useMediaCapabilities } from 'react-adaptive-hooks/media-capabilities';
171171

172172
const webmMediaConfig = {
173-
type : 'file', // 'record', 'transmission', or 'media-source'
174-
video : {
175-
contentType : 'video/webm;codecs=vp8', // valid content type
176-
width : 800, // width of the video
177-
height : 600, // height of the video
178-
bitrate : 10000, // number of bits used to encode 1s of video
179-
framerate : 30 // number of frames making up that 1s.
173+
type: 'file', // 'record', 'transmission', or 'media-source'
174+
video: {
175+
contentType: 'video/webm;codecs=vp8', // valid content type
176+
width: 800, // width of the video
177+
height: 600, // height of the video
178+
bitrate: 10000, // number of bits used to encode 1s of video
179+
framerate: 30 // number of frames making up that 1s.
180180
}
181181
};
182182

183-
const initialDecodingInfo = { showWarning: true }
183+
const initialMediaCapabilities = {showWarning: true};
184184

185185
const MyComponent = ({ videoSources }) => {
186-
const { mediaCapabilities } = useMediaCapabilities(webmMediaConfig, initialDecodingInfo);
186+
const { mediaCapabilities } = useMediaCapabilities(webmMediaConfig, initialMediaCapabilities);
187187

188188
return (
189189
<div>
190-
{
191-
mediaCapabilities.supported
192-
? <video src={videoSources.webm} controls>...</video>
193-
: <video src={videoSources.mp4} controls>...</video>
194-
}
195-
{
196-
mediaCapabilities.showWarning &&
197-
<div class="muted">
198-
Defaulted to mp4.
199-
Couldn't test webm support, either the media capabilities api is unavailable or no media configuration was given.
200-
</div>
201-
}
190+
<video src={mediaCapabilities.supported ? videoSources.webm : videoSources.mp4} controls>...</video>
191+
{ mediaCapabilities.showWarning && (
192+
<div class='muted'>
193+
Defaulted to mp4.
194+
Couldn't test webm support,
195+
either the media capabilities api is unavailable or no media configuration was given.
196+
</div>
197+
) }
202198
</div>
203199
);
204200
};
@@ -304,7 +300,12 @@ The built version of this package uses ESM (native JS modules) by default, but i
304300

305301
* Use a UMD build as in the following code-snippet: ([example project](https://glitch.com/edit/#!/anton-karlovskiy-next-show-adaptive-loading?path=utils/hooks.js:19:91))
306302
```
307-
import { useNetworkStatus, useSaveData, useHardwareConcurrency, useMemoryStatus } from 'react-adaptive-hooks/dist/index.umd.js';
303+
import {
304+
useNetworkStatus,
305+
useSaveData,
306+
useHardwareConcurrency,
307+
useMemoryStatus
308+
} from 'react-adaptive-hooks/dist/index.umd.js';
308309
```
309310

310311
## Browser Support

index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ export { useNetworkStatus } from './network';
22
export { useSaveData } from './save-data';
33
export { useMemoryStatus } from './memory';
44
export { useHardwareConcurrency } from './hardware-concurrency';
5-
export { useMediaCapabilities } from './media-capabilities'
5+
export { useMediaCapabilities } from './media-capabilities';

media-capabilities/index.js

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,24 @@
1414
* limitations under the License.
1515
*/
1616

17+
const supported = typeof window !== 'undefined' && 'mediaCapabilities' in navigator;
18+
1719
const useMediaCapabilities = (mediaConfig, initialMediaCapabilities = {}) => {
18-
let mediaCapabilities = {
19-
supported: typeof window !== 'undefined' && 'mediaCapabilities' in navigator,
20-
hasMediaConfig: !!mediaConfig
21-
}
20+
let mediaCapabilities = {
21+
supported,
22+
hasMediaConfig: !!mediaConfig
23+
};
2224

23-
mediaCapabilities = (mediaCapabilities.supported && mediaCapabilities.hasMediaConfig) ?
24-
navigator.mediaCapabilities.decodingInfo(mediaConfig) :
25-
{
26-
...mediaCapabilities,
27-
...initialMediaCapabilities
28-
}
25+
mediaCapabilities = (mediaCapabilities.supported && mediaCapabilities.hasMediaConfig)
26+
? navigator.mediaCapabilities.decodingInfo(mediaConfig)
27+
: {
28+
...mediaCapabilities,
29+
...initialMediaCapabilities
30+
};
2931

30-
return { mediaCapabilities };
32+
return {mediaCapabilities};
3133
};
3234

3335
export {
34-
useMediaCapabilities
35-
};
36+
useMediaCapabilities
37+
};

media-capabilities/media-capabilities.test.js

Lines changed: 71 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -16,80 +16,91 @@
1616

1717
import { renderHook } from '@testing-library/react-hooks';
1818

19-
import { useMediaCapabilities } from './';
20-
2119
const mediaConfig = {
22-
type: 'file',
23-
audio: {
24-
contentType: 'audio/mp3',
25-
channels: 2,
26-
bitrate: 132700,
27-
samplerate: 5200
28-
}
20+
type: 'file',
21+
audio: {
22+
contentType: 'audio/mp3',
23+
channels: 2,
24+
bitrate: 132700,
25+
samplerate: 5200
26+
}
2927
};
3028

3129
const mediaCapabilitiesMapper = {
32-
'audio/mp3': {
33-
powerEfficient: true,
34-
smooth: true,
35-
supported: true
36-
}
37-
}
30+
'audio/mp3': {
31+
powerEfficient: true,
32+
smooth: true,
33+
supported: true
34+
}
35+
};
36+
37+
afterEach(function() {
38+
// Reload hook for every test
39+
jest.resetModules();
40+
});
3841

3942
describe('useMediaCapabilities', () => {
40-
test('should return supported flag on unsupported platforms', () => {
41-
const { result } = renderHook(() => useMediaCapabilities(mediaConfig));
43+
const navigator = window.navigator;
4244

43-
expect(result.current.mediaCapabilities).toEqual({ hasMediaConfig: true, supported: false });
44-
});
45+
afterEach(() => {
46+
if (!window.navigator) window.navigator = navigator;
47+
});
4548

46-
test('should return supported and hasMediaConfig flags on unsupported platforms and no config given', () => {
47-
const { result } = renderHook(() => useMediaCapabilities());
48-
49-
expect(result.current.mediaCapabilities).toEqual({ hasMediaConfig: false, supported: false });
50-
});
49+
test('should return supported flag on unsupported platforms', () => {
50+
const { useMediaCapabilities } = require('./');
51+
const { result } = renderHook(() => useMediaCapabilities(mediaConfig));
5152

52-
test('should return initialMediaCapabilities for unsupported', () => {
53-
const initialMediaCapabilities = {
54-
supported: true,
55-
smooth: false,
56-
powerEfficient: true
57-
};
53+
expect(result.current.mediaCapabilities).toEqual({hasMediaConfig: true, supported: false});
54+
});
5855

59-
const { result } = renderHook(() => useMediaCapabilities(mediaConfig, initialMediaCapabilities));
56+
test('should return supported and hasMediaConfig flags on unsupported platforms and no config given', () => {
57+
const { useMediaCapabilities } = require('./');
58+
const { result } = renderHook(() => useMediaCapabilities());
59+
60+
expect(result.current.mediaCapabilities).toEqual({hasMediaConfig: false, supported: false});
61+
});
6062

61-
expect(result.current.mediaCapabilities.supported).toBe(true);
62-
expect(result.current.mediaCapabilities.smooth).toEqual(false);
63-
expect(result.current.mediaCapabilities.powerEfficient).toEqual(true);
64-
});
63+
test('should return initialMediaCapabilities for unsupported', () => {
64+
const initialMediaCapabilities = {
65+
supported: true,
66+
smooth: false,
67+
powerEfficient: true
68+
};
69+
const { useMediaCapabilities } = require('./');
70+
const { result } = renderHook(() => useMediaCapabilities(mediaConfig, initialMediaCapabilities));
71+
72+
expect(result.current.mediaCapabilities.supported).toBe(true);
73+
expect(result.current.mediaCapabilities.smooth).toEqual(false);
74+
expect(result.current.mediaCapabilities.powerEfficient).toEqual(true);
75+
});
6576

66-
test('should return hasMediaConfig flag when no config given', () => {
67-
Object.defineProperty(window.navigator, 'mediaCapabilities', {
68-
value: true,
69-
configurable: true,
70-
writable: true
71-
});
72-
73-
const { result } = renderHook(() => useMediaCapabilities());
74-
75-
expect(result.current.mediaCapabilities).toEqual({ hasMediaConfig: false, supported: true });
77+
test('should return hasMediaConfig flag when no config given', () => {
78+
Object.defineProperty(window.navigator, 'mediaCapabilities', {
79+
value: true,
80+
configurable: true,
81+
writable: true
7682
});
83+
const { useMediaCapabilities } = require('./');
84+
const { result } = renderHook(() => useMediaCapabilities());
7785

78-
test('should return MediaDecodingConfiguration for given media configuration', () => {
79-
Object.defineProperty(window.navigator, 'mediaCapabilities', {
80-
value: {
81-
decodingInfo: (mediaConfig) => mediaCapabilitiesMapper[mediaConfig.audio.contentType]
82-
},
83-
configurable: true,
84-
writable: true
85-
});
86-
87-
const { result } = renderHook(() => useMediaCapabilities(mediaConfig));
86+
expect(result.current.mediaCapabilities).toEqual({hasMediaConfig: false, supported: true});
87+
});
88+
89+
test('should return MediaDecodingConfiguration for given media configuration', () => {
90+
Object.defineProperty(window.navigator, 'mediaCapabilities', {
91+
value: {
92+
decodingInfo: mediaConfig => mediaCapabilitiesMapper[mediaConfig.audio.contentType]
93+
},
94+
configurable: true,
95+
writable: true
96+
});
97+
const { useMediaCapabilities } = require('./');
98+
const { result } = renderHook(() => useMediaCapabilities(mediaConfig));
8899

89-
expect(result.current.mediaCapabilities).toEqual({
90-
powerEfficient: true,
91-
smooth: true,
92-
supported: true
93-
});
100+
expect(result.current.mediaCapabilities).toEqual({
101+
powerEfficient: true,
102+
smooth: true,
103+
supported: true
94104
});
105+
});
95106
});

0 commit comments

Comments
 (0)