Skip to content

Commit 0f0ba03

Browse files
committed
♻️ Use reduceObj in CurrentMediaProvider
Insted of not widely supported `Object.entries`
1 parent 9aecd3b commit 0f0ba03

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

src/current-media-provider/index.js

+17-14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
import PropTypes from 'prop-types'
22
import React, { createContext, Component } from 'react'
33
import { withTheme } from 'emotion-theming'
4+
import { reduceObj } from '@exah/utils'
5+
6+
const listenForChanges = (target, fn) => {
7+
fn()
8+
9+
target.addListener(fn)
10+
return () => target.removeListener(fn)
11+
}
412

513
const INITIAL_STATE = {
614
currentMediaKey: []
@@ -19,14 +27,14 @@ class CurrentMediaProvider extends Component {
1927
}
2028
state = INITIAL_STATE
2129
listeners = []
22-
setCurrentMedia = (mediaKey, mediaQueryList) => {
30+
setCurrentMedia = (key, mediaQueryList) => {
2331
this.setState((prevState) => {
2432
const nextMediaKey = prevState.currentMediaKey.slice(0)
2533

2634
if (mediaQueryList.matches) {
27-
nextMediaKey.push(mediaKey)
35+
nextMediaKey.push(key)
2836
} else {
29-
const index = nextMediaKey.indexOf(mediaKey)
37+
const index = nextMediaKey.indexOf(key)
3038
if (index === -1) return
3139
nextMediaKey.splice(index, 1)
3240
}
@@ -37,19 +45,14 @@ class CurrentMediaProvider extends Component {
3745
})
3846
}
3947
componentDidMount () {
40-
const { media, theme } = this.props
48+
const media = this.props.media || this.props.theme.media || {}
4149

42-
const mediaList = Object.entries(media || theme.media || {}).map(
43-
([ mediaKey, mediaQuery ]) => [ mediaKey, window.matchMedia(mediaQuery) ]
44-
)
45-
46-
this.listeners = mediaList.map(([ mediaKey, mediaQueryList ]) => {
47-
this.setCurrentMedia(mediaKey, mediaQueryList)
48-
const listener = () => this.setCurrentMedia(mediaKey, mediaQueryList)
50+
this.listeners = reduceObj((acc, key, query) => {
51+
const mediaQueryList = window.matchMedia(query)
52+
const listener = () => this.setCurrentMedia(key, mediaQueryList)
4953

50-
mediaQueryList.addListener(listener)
51-
return () => mediaQueryList.removeListener(listener)
52-
})
54+
return [ ...acc, listenForChanges(mediaQueryList, listener) ]
55+
}, [], media)
5356
}
5457
componentWillUnmount () {
5558
this.listeners.map((fn) => fn())

0 commit comments

Comments
 (0)