Skip to content

Commit

Permalink
feat: add sensor/useMedia hook
Browse files Browse the repository at this point in the history
  • Loading branch information
jo0ger committed Oct 30, 2019
1 parent 97ec0a9 commit 203715c
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 9 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ and then:
* [ ] `useIdle`: tracks whether user is being inactive
* [ ] `useIntersection`: tracks an HTML element's intersection
* [ ] `useEvent`: subscribe to events
* [ ] `useMedia`: tracks state of a CSS media query
* [x] [`useMedia`](./src/hooks/sensor/useMedia/doc.md): tracks state of a CSS media query
* [ ] `useMediaDevices`: tracks connected hardware devices
* [ ] `useMotion`: tracks state of device's motion sensor
* [x] [`useMouse`](./src/hooks/sensor/useMouse/doc.md): tracks state of mouse position
Expand Down
21 changes: 21 additions & 0 deletions src/hooks/sensor/useMedia/demo.story.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { storiesOf } from '@storybook/vue'
import { createComponent } from '@vue/composition-api'
import Doc from '../../../__stories__/components/Doc'
import { useMedia } from '../../..'

const Demo = createComponent({
setup() {
const isWide = useMedia('(min-width: 480px)')
return { isWide }
},
render() {
const { isWide } = this
return <div>Screen is wide(min-width: 480px): {isWide ? 'Yes' : 'No'}</div>
}
})

const Docs = () => <Doc md={require('./doc.md')}></Doc>

storiesOf('Sensor|useMedia', module)
.add('Docs', () => Docs as any)
.add('Demo', () => Demo)
29 changes: 29 additions & 0 deletions src/hooks/sensor/useMedia/doc.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# useMedia

Vue hook that tracks state of a CSS media query.

> Browser environment is required
## Usage

```jsx
import { createComponent } from '@vue/composition-api'
import { useMouse } from 'vuses'

const Demo = createComponent({
setup() {
const isWide = useMedia('(min-width: 480px)')
return { isWide }
},
render() {
const { isWide } = this
return <div>Screen is wide(min-width: 480px): {isWide ? 'Yes' : 'No'}</div>
}
})
```

## Reference

```typescript
function useMedia(query: string): Ref<boolean>
```
31 changes: 31 additions & 0 deletions src/hooks/sensor/useMedia/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { ref, onMounted, onUnmounted, Ref } from '@vue/composition-api'
import {
checkBrowser,
addEventListener,
removeEventListener
} from '../../../utils'

export default function useMedia(query: string): Ref<boolean> {
checkBrowser(useMedia.name)

const state = ref(window.matchMedia(query).matches)
let mounted = true
let mql: MediaQueryList = window.matchMedia(query)

const update = () => {
if (!mounted) return
state.value = !!mql.matches
}

onMounted(() => {
update()
addEventListener(mql, 'change', update)
})

onUnmounted(() => {
mounted = false
removeEventListener(mql, 'change', update)
})

return state
}
7 changes: 1 addition & 6 deletions src/hooks/sensor/useMouse/demo.story.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
import { storiesOf } from '@storybook/vue'
import {
createComponent,
reactive,
computed,
onMounted
} from '@vue/composition-api'
import { createComponent } from '@vue/composition-api'
import Doc from '../../../__stories__/components/Doc'
import { useMouse } from '../../..'

Expand Down
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export { default as useWindowScroll } from './hooks/sensor/useWindowScroll'
export { default as useGeolocation } from './hooks/sensor/useGeolocation'
export { default as useMouse } from './hooks/sensor/useMouse'
export { default as useBattery } from './hooks/sensor/useBattery'
export { default as useMedia } from './hooks/sensor/useMedia'

// Side Effect Hooks
export { default as useTitle } from './hooks/sideEffect/useTitle'
Expand Down
4 changes: 2 additions & 2 deletions src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export const checkBrowser = (ctx = '') => {
}

export const addEventListener = (
el: Element | Window | PermissionStatus | Document | BatteryManager,
el: EventTarget,
event: string,
handler: EventListener,
options?: AddEventListenerOptions
Expand All @@ -44,7 +44,7 @@ export const addEventListener = (
}

export const removeEventListener = (
el: Element | Window | PermissionStatus | Document | BatteryManager,
el: EventTarget,
event: string,
handler: EventListener,
options?: EventListenerOptions
Expand Down

0 comments on commit 203715c

Please sign in to comment.