Skip to content

Commit

Permalink
feat: add refreshOnResize option
Browse files Browse the repository at this point in the history
  • Loading branch information
dotneet committed Mar 25, 2021
1 parent 8e415af commit 3d2e0d1
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 25 deletions.
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,17 @@ export default function ({ $device }) {
}
```

`refreshOnResize` refresh flags when the window resized.(default: false)

```js
{
buildModules: ['@nuxtjs/device'],
device: {
refreshOnResize: true
}
}
```

Note that the default user agent value is set to `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.39 Safari/537.36`.
## CloudFront Support

Expand Down
3 changes: 2 additions & 1 deletion lib/module.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ const defu = require('defu')

module.exports = function (moduleOptions) {
const options = defu(moduleOptions, this.options.device, {
defaultUserAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.39 Safari/537.36'
defaultUserAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.39 Safari/537.36',
refreshOnResize: false
})
// Register plugin
this.addPlugin({
Expand Down
63 changes: 40 additions & 23 deletions lib/plugin.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import Vue from 'vue'

// eslint-disable-next-line
const REGEX_MOBILE1 = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|FBAN|FBAV|fennec|hiptop|iemobile|ip(hone|od)|Instagram|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i

Expand Down Expand Up @@ -34,6 +36,7 @@ function isMacOS (a) {
}

const DEFAULT_USER_AGENT = '<%= options.defaultUserAgent %>'
const REFRESH_ON_RESIZE = <%= options.refreshOnResize %>

function extractDevices (ctx, userAgent = DEFAULT_USER_AGENT) {
let mobile = null
Expand Down Expand Up @@ -80,28 +83,42 @@ function extractDevices (ctx, userAgent = DEFAULT_USER_AGENT) {
}

export default async function (ctx, inject) {
let userAgent = ''
if (typeof ctx.req !== 'undefined') {
userAgent = ctx.req.headers['user-agent']
} else if (typeof navigator !== 'undefined') {
userAgent = navigator.userAgent
const makeFlags = () => {
let userAgent = ''
if (typeof ctx.req !== 'undefined') {
userAgent = ctx.req.headers['user-agent']
} else if (typeof navigator !== 'undefined') {
userAgent = navigator.userAgent
}
const { mobile, mobileOrTablet, ios, android, windows, macOS } = extractDevices(ctx, userAgent)
return {
<% if (options.test) { %>
extractDevices,
<% } %>
userAgent,
isMobile: mobile,
isMobileOrTablet: mobileOrTablet,
isTablet: !mobile && mobileOrTablet,
isDesktop: !mobileOrTablet,
isIos: ios,
isAndroid: android,
isWindows: windows,
isMacOS: macOS,
isDesktopOrTablet: !mobile
}
}
const flags = makeFlags(ctx)
if (REFRESH_ON_RESIZE && typeof window !== 'undefined') {
inject('device', Vue.observable(flags))
window.addEventListener('resize', () => {
setTimeout(() => {
const newFlags = makeFlags(ctx)
for (let key in newFlags) {
ctx.$device[key] = newFlags[key]
}
}, 50)
})
} else {
inject('device', flags)
}

const { mobile, mobileOrTablet, ios, android, windows, macOS } = extractDevices(ctx, userAgent)

inject('device', {
<% if (options.test) { %>
extractDevices,
<% } %>
userAgent,
isMobile: mobile,
isMobileOrTablet: mobileOrTablet,
isTablet: !mobile && mobileOrTablet,
isDesktop: !mobileOrTablet,
isIos: ios,
isAndroid: android,
isWindows: windows,
isMacOS: macOS,
isDesktopOrTablet: !mobile
})
}
3 changes: 2 additions & 1 deletion test/fixture/nuxt.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ module.exports = {
},
buildModules: [require('../../')],
device: {
test: true
test: true,
refreshOnResize: true
},
plugins: ['~/plugins/custom-flag.js']
}

0 comments on commit 3d2e0d1

Please sign in to comment.