Skip to content

Commit 2417848

Browse files
committed
fix(nuxt): use addEventListener to register cookie store listener (#28193)
1 parent a6af09e commit 2417848

File tree

4 files changed

+29
-12
lines changed

4 files changed

+29
-12
lines changed

packages/nuxt/index.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ declare global {
1414

1515
interface Window {
1616
cookieStore?: {
17-
onchange: (event: any) => void
17+
addEventListener: (type: 'change', listener: (event: any) => void) => void
18+
removeEventListener: (type: 'change', listener: (event: any) => void) => void
1819
}
1920
}
2021
}

packages/nuxt/src/app/composables/cookie.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,16 @@ export function useCookie<T = string | null | undefined> (name: string, _opts?:
8383
const handleChange = (data: { value?: any, refresh?: boolean }) => {
8484
const value = data.refresh ? readRawCookies(opts)?.[name] : opts.decode(data.value)
8585
watchPaused = true
86-
cookies[name] = cookie.value = value
86+
cookie.value = value
87+
cookies[name] = klona(value)
8788
nextTick(() => { watchPaused = false })
8889
}
8990

9091
let watchPaused = false
9192

92-
if (getCurrentScope()) {
93+
const hasScope = !!getCurrentScope()
94+
95+
if (hasScope) {
9396
onScopeDispose(() => {
9497
watchPaused = true
9598
callback()
@@ -98,10 +101,14 @@ export function useCookie<T = string | null | undefined> (name: string, _opts?:
98101
}
99102

100103
if (store) {
101-
store.onchange = (event) => {
104+
const changeHandler = (event: any) => {
102105
const cookie = event.changed.find((c: any) => c.name === name)
103106
if (cookie) { handleChange({ value: cookie.value }) }
104107
}
108+
store.addEventListener('change', changeHandler)
109+
if (hasScope) {
110+
onScopeDispose(() => store.removeEventListener('change', changeHandler))
111+
}
105112
} else if (channel) {
106113
channel.onmessage = ({ data }) => handleChange(data)
107114
}

test/basic.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,7 @@ describe('nuxt composables', () => {
589589
},
590590
})
591591
const cookies = res.headers.get('set-cookie')
592-
expect(cookies).toMatchInlineSnapshot('"set-in-plugin=true; Path=/, set=set; Path=/, browser-set=set; Path=/, browser-set-to-null=; Max-Age=0; Path=/, browser-set-to-null-with-default=; Max-Age=0; Path=/, browser-object-default=%7B%22foo%22%3A%22bar%22%7D; Path=/"')
592+
expect(cookies).toMatchInlineSnapshot('"set-in-plugin=true; Path=/, accessed-with-default-value=default; Path=/, set=set; Path=/, browser-set=set; Path=/, browser-set-to-null=; Max-Age=0; Path=/, browser-set-to-null-with-default=; Max-Age=0; Path=/, browser-object-default=%7B%22foo%22%3A%22bar%22%7D; Path=/"')
593593
})
594594
it('updates cookies when they are changed', async () => {
595595
const { page } = await renderPage('/cookies')

test/fixtures/basic/pages/cookies.vue

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,37 @@
1-
<script setup>
1+
<script setup lang="ts">
22
useCookie('accessed-but-not-used')
3-
useCookie('accessed-with-default-value', () => 'default')
3+
useCookie('accessed-with-default-value', { default: () => 'default' })
44
useCookie('set').value = 'set'
55
useCookie('set-to-null').value = null
6-
useCookie('set-to-null-with-default', () => 'default').value = null
6+
useCookie<string | null>('set-to-null-with-default', { default: () => 'default' }).value = null
77
88
// the next set are all sent by browser
99
useCookie('browser-accessed-but-not-used')
10-
useCookie('browser-accessed-with-default-value', () => 'default')
10+
useCookie('browser-accessed-with-default-value', { default: () => 'default' })
1111
useCookie('browser-set').value = 'set'
1212
useCookie('browser-set-to-null').value = null
13-
useCookie('browser-set-to-null-with-default', () => 'default').value = null
13+
useCookie<string | null>('browser-set-to-null-with-default', { default: () => 'default' }).value = null
1414
15-
const objectCookie = useCookie('browser-object-default')
15+
const objectCookie = useCookie<{ foo: string } | undefined>('browser-object-default')
1616
const objectCookieSecond = useCookie('browser-object-default', {
1717
default: () => ({ foo: 'bar' }),
1818
})
19+
function changeCookie () {
20+
console.log(objectCookie.value, objectCookieSecond.value)
21+
if (objectCookie.value!.foo === 'baz') {
22+
objectCookie.value!.foo = 'bar'
23+
} else {
24+
objectCookie.value!.foo = 'baz'
25+
}
26+
}
1927
</script>
2028

2129
<template>
2230
<div>
2331
<div>cookies testing page</div>
32+
<pre>{{ objectCookie?.foo }}</pre>
2433
<pre>{{ objectCookieSecond.foo }}</pre>
25-
<button @click="objectCookie.foo === 'baz' ? objectCookie.foo = 'bar' : objectCookie.foo = 'baz'">
34+
<button @click="changeCookie">
2635
Change cookie
2736
</button>
2837
<button @click="refreshCookie('browser-object-default')">

0 commit comments

Comments
 (0)