You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.2 KiB
43 lines
1.2 KiB
import { getCurrentInstance } from 'vue'
|
|
import { serializeCookie, parseDocumentCookies } from './cookieUtils'
|
|
import type { CookieOptions } from './cookieUtils'
|
|
import { resolveSSRContext } from './ssrContext'
|
|
|
|
export function useCookie(name: string, options: CookieOptions = {}) {
|
|
const instance = getCurrentInstance()
|
|
|
|
const getSSRContext = () => resolveSSRContext(instance)
|
|
|
|
const getAll = (): Record<string, string> => {
|
|
const ssr = getSSRContext()
|
|
if (ssr && ssr.cookies) return ssr.cookies as Record<string, string>
|
|
return parseDocumentCookies()
|
|
}
|
|
|
|
const get = (): string | undefined => {
|
|
const all = getAll()
|
|
return all[name]
|
|
}
|
|
|
|
const set = (value: string, opt: CookieOptions = {}) => {
|
|
const o = { path: '/', ...options, ...opt }
|
|
const str = serializeCookie(name, value, o)
|
|
const ssr = getSSRContext()
|
|
if (ssr) {
|
|
ssr.cookies = ssr.cookies || {}
|
|
ssr.cookies[name] = value
|
|
ssr.setCookies = ssr.setCookies || []
|
|
ssr.setCookies.push(str)
|
|
} else if (typeof document !== 'undefined') {
|
|
document.cookie = str
|
|
}
|
|
}
|
|
|
|
const remove = (opt: CookieOptions = {}) => {
|
|
set('', { ...opt, maxAge: 0, expires: new Date(0) })
|
|
}
|
|
|
|
return { get, set, remove }
|
|
}
|
|
|
|
|
|
|