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

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 }
}