import { computed, ref } from 'vue'
|
import { listTodos, createTodo as createTodoApi, handleTodo as handleTodoApi, removeTodo as removeTodoApi, type TodoDto } from '@/api/todos'
|
import { getAuthToken } from '@/api/request'
|
import { formatBusinessTime } from '@/utils/businessTime'
|
|
export type TodoStatus = '待处理' | '已处理'
|
export interface TodoRecord extends Omit<TodoDto, 'createdAt' | 'operatedAt' | 'handleRemark'> { createdAt: string; operatedAt: string; handleRemark: string }
|
const cache = ref<TodoRecord[]>([])
|
const session = ref<string | null>(null)
|
let requestNo = 0
|
// 缓存仅属于当前登录会话;切换账号及退出登录后不能重用其他负责人的记录。
|
const records = computed(() => session.value === getAuthToken() ? cache.value : [])
|
function map(item: TodoDto): TodoRecord { return { ...item, createdAt: formatBusinessTime(item.createdAt), operatedAt: formatBusinessTime(item.operatedAt), handleRemark: item.handleRemark ?? '' } }
|
export function clearTodos() { requestNo++; cache.value = []; session.value = '' }
|
export function useTodos() {
|
async function load() {
|
const token = getAuthToken(); const current = ++requestNo
|
if (session.value !== token) { cache.value = []; session.value = token }
|
try { const rows = await listTodos(); if (current === requestNo && token === getAuthToken()) cache.value = rows.map(map) }
|
catch (error) { if (current === requestNo) cache.value = []; throw error }
|
}
|
async function createTodo(payload: { content: string; ownerId: number }) { await createTodoApi(payload); await load() }
|
async function handleTodo(id: number, remark: string) { await handleTodoApi(id, remark); await load() }
|
async function removeTodo(id: number) { await removeTodoApi(id); cache.value = cache.value.filter(item => item.id !== id) }
|
return { records, load, createTodo, handleTodo, removeTodo }
|
}
|