-
Notifications
You must be signed in to change notification settings - Fork 486
/
Copy pathremember.ts
executable file
·68 lines (57 loc) · 1.88 KB
/
remember.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import { router } from '@inertiajs/core'
import { cloneDeep } from 'es-toolkit'
import { ComponentOptions } from 'vue'
const remember: ComponentOptions = {
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 = router.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,
() => {
router.remember(
rememberable.reduce(
(data, key) => ({
...data,
[key]: cloneDeep(hasCallbacks(key) ? this[key].__remember() : this[key]),
}),
{},
),
rememberKey,
)
},
{ immediate: true, deep: true },
)
})
},
}
export default remember