-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Nasr Galal
committed
Jan 10, 2020
1 parent
8300be0
commit 065266e
Showing
38 changed files
with
23,845 additions
and
14,506 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,183 @@ | ||
import Vue from 'vue' | ||
|
||
import { | ||
getMatchedComponentsInstances, | ||
promisify, | ||
globalHandleError | ||
} from './utils' | ||
|
||
import NuxtLoading from './components/nuxt-loading.vue' | ||
import NuxtBuildIndicator from './components/nuxt-build-indicator' | ||
|
||
import _6f6c098b from './layouts/default.vue' | ||
|
||
const layouts = { "_default": _6f6c098b } | ||
|
||
export default { | ||
head: {"meta":[],"link":[],"style":[],"script":[]}, | ||
|
||
render (h, props) { | ||
const loadingEl = h('NuxtLoading', { ref: 'loading' }) | ||
|
||
const layoutEl = h(this.layout || 'nuxt') | ||
const templateEl = h('div', { | ||
domProps: { | ||
id: '__layout' | ||
}, | ||
key: this.layoutName | ||
}, [ layoutEl ]) | ||
|
||
const transitionEl = h('transition', { | ||
props: { | ||
name: 'layout', | ||
mode: 'out-in' | ||
}, | ||
on: { | ||
beforeEnter (el) { | ||
// Ensure to trigger scroll event after calling scrollBehavior | ||
window.$nuxt.$nextTick(() => { | ||
window.$nuxt.$emit('triggerScroll') | ||
}) | ||
} | ||
} | ||
}, [ templateEl ]) | ||
|
||
return h('div', { | ||
domProps: { | ||
id: '__nuxt' | ||
} | ||
}, [ | ||
loadingEl, | ||
h(NuxtBuildIndicator), | ||
transitionEl | ||
]) | ||
}, | ||
|
||
data: () => ({ | ||
isOnline: true, | ||
|
||
layout: null, | ||
layoutName: '' | ||
}), | ||
|
||
beforeCreate () { | ||
Vue.util.defineReactive(this, 'nuxt', this.$options.nuxt) | ||
}, | ||
created () { | ||
// Add this.$nuxt in child instances | ||
Vue.prototype.$nuxt = this | ||
// add to window so we can listen when ready | ||
if (process.client) { | ||
window.$nuxt = this | ||
|
||
this.refreshOnlineStatus() | ||
// Setup the listeners | ||
window.addEventListener('online', this.refreshOnlineStatus) | ||
window.addEventListener('offline', this.refreshOnlineStatus) | ||
} | ||
// Add $nuxt.error() | ||
this.error = this.nuxt.error | ||
// Add $nuxt.context | ||
this.context = this.$options.context | ||
}, | ||
|
||
mounted () { | ||
this.$loading = this.$refs.loading | ||
}, | ||
watch: { | ||
'nuxt.err': 'errorChanged' | ||
}, | ||
|
||
computed: { | ||
isOffline () { | ||
return !this.isOnline | ||
} | ||
}, | ||
|
||
methods: { | ||
refreshOnlineStatus () { | ||
if (process.client) { | ||
if (typeof window.navigator.onLine === 'undefined') { | ||
// If the browser doesn't support connection status reports | ||
// assume that we are online because most apps' only react | ||
// when they now that the connection has been interrupted | ||
this.isOnline = true | ||
} else { | ||
this.isOnline = window.navigator.onLine | ||
} | ||
} | ||
}, | ||
|
||
async refresh () { | ||
const pages = getMatchedComponentsInstances(this.$route) | ||
|
||
if (!pages.length) { | ||
return | ||
} | ||
this.$loading.start() | ||
|
||
const promises = pages.map((page) => { | ||
const p = [] | ||
|
||
if (page.$options.fetch) { | ||
p.push(promisify(page.$options.fetch, this.context)) | ||
} | ||
|
||
if (page.$options.asyncData) { | ||
p.push( | ||
promisify(page.$options.asyncData, this.context) | ||
.then((newData) => { | ||
for (const key in newData) { | ||
Vue.set(page.$data, key, newData[key]) | ||
} | ||
}) | ||
) | ||
} | ||
|
||
return Promise.all(p) | ||
}) | ||
try { | ||
await Promise.all(promises) | ||
} catch (error) { | ||
this.$loading.fail() | ||
globalHandleError(error) | ||
this.error(error) | ||
} | ||
this.$loading.finish() | ||
}, | ||
|
||
errorChanged () { | ||
if (this.nuxt.err && this.$loading) { | ||
if (this.$loading.fail) { | ||
this.$loading.fail() | ||
} | ||
if (this.$loading.finish) { | ||
this.$loading.finish() | ||
} | ||
} | ||
}, | ||
|
||
setLayout (layout) { | ||
if(layout && typeof layout !== 'string') { | ||
throw new Error('[nuxt] Avoid using non-string value as layout property.') | ||
} | ||
|
||
if (!layout || !layouts['_' + layout]) { | ||
layout = 'default' | ||
} | ||
this.layoutName = layout | ||
this.layout = layouts['_' + layout] | ||
return this.layout | ||
}, | ||
loadLayout (layout) { | ||
if (!layout || !layouts['_' + layout]) { | ||
layout = 'default' | ||
} | ||
return Promise.resolve(layouts['_' + layout]) | ||
} | ||
}, | ||
|
||
components: { | ||
NuxtLoading | ||
} | ||
} |
Oops, something went wrong.