170 lines
4.6 KiB
TypeScript
170 lines
4.6 KiB
TypeScript
import Taro from '@tarojs/taro'
|
||
import type { DesignItem, OrderItem, AddressItem } from '../types'
|
||
|
||
const THEME_KEY = 'smart_theme'
|
||
const USER_KEY = 'smart_user_info'
|
||
const ACTIVE_USER_KEY = 'smart_active_openid'
|
||
|
||
// ---------- 当前用户 openid 管理 ----------
|
||
|
||
function getActiveOpenid(): string {
|
||
const user = getUserInfoRaw()
|
||
const openid = user?.openid || Taro.getStorageSync(ACTIVE_USER_KEY) || '_guest_'
|
||
Taro.setStorageSync(ACTIVE_USER_KEY, openid)
|
||
return openid
|
||
}
|
||
|
||
function key(scope: string): string {
|
||
const prefix = getActiveOpenid()
|
||
return `${scope}_${prefix}`
|
||
}
|
||
|
||
// ---------- 用户数据 ----------
|
||
|
||
export function getUserInfoRaw(): any {
|
||
try { return Taro.getStorageSync(USER_KEY) } catch { return null }
|
||
}
|
||
|
||
export function setUserInfoRaw(info: any) {
|
||
Taro.setStorageSync(USER_KEY, info)
|
||
if (info?.openid) {
|
||
Taro.setStorageSync(ACTIVE_USER_KEY, info.openid)
|
||
}
|
||
}
|
||
|
||
export function clearUserInfo() {
|
||
Taro.removeStorageSync(USER_KEY)
|
||
Taro.removeStorageSync(ACTIVE_USER_KEY)
|
||
}
|
||
|
||
export function setUserInfo(info: any) {
|
||
setUserInfoRaw(info)
|
||
}
|
||
|
||
export function getUserInfo() {
|
||
return getUserInfoRaw()
|
||
}
|
||
|
||
// ---------- 设计清单 ----------
|
||
|
||
export function getDesignList(): DesignItem[] {
|
||
try { return Taro.getStorageSync(key('design_list')) || [] } catch { return [] }
|
||
}
|
||
|
||
export function setDesignList(list: DesignItem[]) {
|
||
Taro.setStorageSync(key('design_list'), list)
|
||
}
|
||
|
||
export function addDesign(product: any, count: number): DesignItem {
|
||
const list = getDesignList()
|
||
const item: DesignItem = {
|
||
id: 'DSG' + Date.now(),
|
||
productId: product.id,
|
||
productName: product.name,
|
||
productIcon: product.icon,
|
||
unitPrice: product.price,
|
||
count,
|
||
status: 'undesigned',
|
||
createdAt: new Date().toISOString().slice(0, 10)
|
||
}
|
||
setDesignList([...list, item])
|
||
return item
|
||
}
|
||
|
||
export function updateDesign(id: string, patch: Partial<DesignItem>) {
|
||
const list = getDesignList()
|
||
const idx = list.findIndex(d => d.id === id)
|
||
if (idx === -1) return
|
||
list[idx] = { ...list[idx], ...patch }
|
||
setDesignList(list)
|
||
}
|
||
|
||
// ---------- 订单 ----------
|
||
|
||
export function getOrderList(): OrderItem[] {
|
||
try { return Taro.getStorageSync(key('order_list')) || [] } catch { return [] }
|
||
}
|
||
|
||
export function setOrderList(list: OrderItem[]) {
|
||
Taro.setStorageSync(key('order_list'), list)
|
||
}
|
||
|
||
export function designToOrder(designId: string): OrderItem | null {
|
||
const dList = getDesignList()
|
||
const oList = getOrderList()
|
||
const design = dList.find(d => d.id === designId)
|
||
if (!design) return null
|
||
|
||
const order: OrderItem = {
|
||
id: 'ORD' + Date.now().toString().slice(-9),
|
||
productName: design.productName,
|
||
productIcon: design.productIcon,
|
||
statusCode: 'pending',
|
||
date: new Date().toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }).replace(/\//g, '-'),
|
||
price: '¥' + (design.unitPrice * design.count).toFixed(2),
|
||
count: design.count,
|
||
sku: `${design.productName} × ${design.count}`
|
||
}
|
||
|
||
const dIdx = dList.findIndex(d => d.id === designId)
|
||
if (dIdx !== -1) {
|
||
dList[dIdx].status = 'ordered'
|
||
dList[dIdx].orderId = order.id
|
||
}
|
||
|
||
setDesignList(dList)
|
||
setOrderList([order, ...oList])
|
||
return order
|
||
}
|
||
|
||
// ---------- 主题 ----------
|
||
|
||
export type ThemeMode = 'light' | 'dark'
|
||
|
||
export function getTheme(): ThemeMode {
|
||
try { return Taro.getStorageSync(THEME_KEY) || 'light' } catch { return 'light' }
|
||
}
|
||
|
||
export function setTheme(theme: ThemeMode) {
|
||
Taro.setStorageSync(THEME_KEY, theme)
|
||
}
|
||
|
||
// ---------- 收货地址 ----------
|
||
|
||
export function getAddressList(): AddressItem[] {
|
||
try { return Taro.getStorageSync(key('address_list')) || [] } catch { return [] }
|
||
}
|
||
|
||
export function setAddressList(list: AddressItem[]) {
|
||
Taro.setStorageSync(key('address_list'), list)
|
||
}
|
||
|
||
export function addAddress(addr: Omit<AddressItem, 'id'>): AddressItem {
|
||
const list = getAddressList()
|
||
const item: AddressItem = { ...addr, id: 'ADR' + Date.now() }
|
||
// 若设为默认,取消其他默认
|
||
if (item.isDefault) {
|
||
list.forEach(a => { a.isDefault = false })
|
||
}
|
||
setAddressList([item, ...list])
|
||
return item
|
||
}
|
||
|
||
export function updateAddress(id: string, patch: Partial<AddressItem>) {
|
||
const list = getAddressList()
|
||
const idx = list.findIndex(a => a.id === id)
|
||
if (idx === -1) return
|
||
if (patch.isDefault) list.forEach(a => { a.isDefault = false })
|
||
list[idx] = { ...list[idx], ...patch }
|
||
setAddressList(list)
|
||
}
|
||
|
||
export function deleteAddress(id: string) {
|
||
const list = getAddressList().filter(a => a.id !== id)
|
||
setAddressList(list)
|
||
}
|
||
|
||
export function getDefaultAddress(): AddressItem | undefined {
|
||
return getAddressList().find(a => a.isDefault)
|
||
}
|