56 lines
1.7 KiB
JavaScript
56 lines
1.7 KiB
JavaScript
import cloneDeep from 'lodash.clonedeep'
|
|
import { Inertia } from '@inertiajs/inertia'
|
|
|
|
export default {
|
|
created() {
|
|
if (!this.$options.remember) {
|
|
return
|
|
}
|
|
|
|
if (Array.isArray(this.$options.remember)) {
|
|
this.$options.remember = { data: this.$options.remember }
|
|
}
|
|
|
|
if (typeof this.$options.remember === 'string') {
|
|
this.$options.remember = { data: [this.$options.remember] }
|
|
}
|
|
|
|
if (typeof this.$options.remember.data === 'string') {
|
|
this.$options.remember = { data: [this.$options.remember.data] }
|
|
}
|
|
|
|
const rememberKey = this.$options.remember.key instanceof Function
|
|
? this.$options.remember.key.call(this)
|
|
: this.$options.remember.key
|
|
|
|
const restored = Inertia.restore(rememberKey)
|
|
|
|
const rememberable = this.$options.remember.data.filter(key => {
|
|
return !(this[key] !== null && typeof this[key] === 'object' && this[key].__rememberable === false)
|
|
})
|
|
|
|
const hasCallbacks = (key) => {
|
|
return this[key] !== null
|
|
&& typeof this[key] === 'object'
|
|
&& typeof this[key].__remember === 'function'
|
|
&& typeof this[key].__restore === 'function'
|
|
}
|
|
|
|
rememberable.forEach(key => {
|
|
if (this[key] !== undefined && restored !== undefined && restored[key] !== undefined) {
|
|
hasCallbacks(key) ? this[key].__restore(restored[key]) : (this[key] = restored[key])
|
|
}
|
|
|
|
this.$watch(key, () => {
|
|
Inertia.remember(
|
|
rememberable.reduce((data, key) => ({
|
|
...data,
|
|
[key]: cloneDeep(hasCallbacks(key) ? this[key].__remember(): this[key]),
|
|
}), {}),
|
|
rememberKey,
|
|
)
|
|
}, { immediate: true, deep: true })
|
|
})
|
|
},
|
|
}
|