import JSCookie from 'js-cookie' import { useState } from '../hooks/hook-state' import * as env from '../types/instance.resolver' /**本地存储枚举Key**/ export enum APP_HOST { /**token存储key**/ APP_TOKEN = 'APP_SKYLINE_KUNLUN_TOKEN', /**刷新token存储key**/ APP_REFRESH_TOKEN = 'APP_SKYLINE_KUNLUN_REFRESH_TOKEN', /**token过期时间存储key**/ APP_TOKEN_EXPIRES = 'APP_SKYLINE_KUNLUN_TOKEN_EXPIRES', /**语言存储key**/ APP_LOCALE = 'APP_SKYLINE_KUNLUN_LOCALE' } const { state, setState } = useState({ APP_NODE_ENV: '', DINGTALK_REDIRECT_URL: '', DINGTALK_CLIENT_ID: '' }) /**设置钉钉授权应用ID**/ export async function setDingTalkClientID(DINGTALK_CLIENT_ID: string) { return await setState({ DINGTALK_CLIENT_ID }) } /**设置钉钉授权重定向地址**/ export async function setDingTalkRedirect(DINGTALK_REDIRECT_URL: string) { return await setState({ DINGTALK_REDIRECT_URL }) } /**设置环境命名空间**/ export async function setAppNodeENV(APP_NODE_ENV: string) { return await setState({ APP_NODE_ENV }) } /**获取钉钉授权地址**/ export function getDingTalkAuthRedirect(option: env.DingTalkAuthRedirect) { return ( `https://login.dingtalk.com/oauth2/challenge.htm` + `?redirect_uri=${encodeURIComponent(option?.DINGTALK_REDIRECT_URL ?? state.DINGTALK_REDIRECT_URL)}` + `&client_id=${option?.DINGTALK_CLIENT_ID ?? state.DINGTALK_CLIENT_ID}` + `&state=${encodeURIComponent(JSON.stringify({ referer: option.referer }))}` + `&response_type=code&scope=openid&prompt=consent&FEForceLogin=true` ) } /**获取顶级域名**/ export function getSkyHostname() { const hostname = window.location.hostname return hostname.slice(hostname.indexOf('.') + 1) } /**命名空间键组合**/ export function fetchNamespaceCompose(namespace: string, key: string): string { if ([undefined, null, ''].includes(namespace)) { return key } return `${namespace.toUpperCase()}__${key}` } /**读取token**/ export function getSkyToken(defaultValue?: string): string { const APP_TOKEN_KEY = fetchNamespaceCompose(state.APP_NODE_ENV, APP_HOST.APP_TOKEN) return JSCookie.get(APP_TOKEN_KEY) ?? (defaultValue as string) } /**存储token**/ export async function setSkyToken(token: string, expires: number) { const APP_TOKEN_KEY = fetchNamespaceCompose(state.APP_NODE_ENV, APP_HOST.APP_TOKEN) return JSCookie.set(APP_TOKEN_KEY, token, { expires, domain: getSkyHostname() }) } /**移除token**/ export async function delSkyToken() { const APP_TOKEN_KEY = fetchNamespaceCompose(state.APP_NODE_ENV, APP_HOST.APP_TOKEN) return JSCookie.remove(APP_TOKEN_KEY, { domain: getSkyHostname() }) } /**清除token、refreshToken、expiresIn**/ export async function fetchSkySignout() { await delSkyToken() await delSkyStore(APP_HOST.APP_REFRESH_TOKEN) await delSkyStore(APP_HOST.APP_TOKEN_EXPIRES) } /**钉钉重定向登录**/ export async function fetchSkySignin(option: env.DingTalkAuthRedirect) { const href = await getDingTalkAuthRedirect(option) return (window.location.href = href) } /**存储cookie**/ export async function setSkyStore(key: string, data: any, expires: number = 0) { const APP_STORE_KEY = fetchNamespaceCompose(state.APP_NODE_ENV, key) if (expires && expires > 0) { return JSCookie.set(APP_STORE_KEY, JSON.stringify(data), { expires, domain: getSkyHostname() }) } return JSCookie.set(APP_STORE_KEY, JSON.stringify(data), { domain: getSkyHostname() }) } /**读取cookie**/ export function getSkyStore(key: string, defaultValue?: T): T { try { const APP_STORE_KEY = fetchNamespaceCompose(state.APP_NODE_ENV, key) const jsonStr = JSCookie.get(APP_STORE_KEY) return jsonStr ? JSON.parse(jsonStr) : (defaultValue as T) } catch (err) { return defaultValue as T } } /**移除cookie**/ export async function delSkyStore(key: string) { const APP_STORE_KEY = fetchNamespaceCompose(state.APP_NODE_ENV, key) return JSCookie.remove(APP_STORE_KEY, { domain: getSkyHostname() }) }