1 changed files with 86 additions and 0 deletions
@ -0,0 +1,86 @@ |
|||
import { defineStore } from 'pinia' |
|||
import { ref, computed } from 'vue' |
|||
import { getCharacterBag, getBagItems, type CharacterBag, type BagItem } from '@/api/bag' |
|||
import { useCharacterStore } from './character' |
|||
|
|||
const PAGE_SIZE = 16 |
|||
|
|||
export const useBagStore = defineStore('bag', () => { |
|||
const characterStore = useCharacterStore() |
|||
|
|||
const characterBag = ref<CharacterBag | null>(null) |
|||
const bagItems = ref<BagItem[]>([]) |
|||
const currentPage = ref(1) |
|||
const loading = ref(false) |
|||
const error = ref<string | null>(null) |
|||
|
|||
const currentCharacterId = computed(() => characterStore.currentCharacter?.id) |
|||
|
|||
const totalItems = computed(() => bagItems.value.length) |
|||
|
|||
const totalPages = computed(() => Math.ceil(totalItems.value / PAGE_SIZE)) |
|||
|
|||
const paginatedItems = computed(() => { |
|||
const start = (currentPage.value - 1) * PAGE_SIZE |
|||
const end = start + PAGE_SIZE |
|||
return bagItems.value.slice(start, end) |
|||
}) |
|||
|
|||
const usedCapacity = computed(() => { |
|||
return bagItems.value.reduce((sum, item) => sum + item.quantity, 0) |
|||
}) |
|||
|
|||
const loadBag = async () => { |
|||
if (!currentCharacterId.value) { |
|||
error.value = '请先选择角色' |
|||
return |
|||
} |
|||
|
|||
try { |
|||
loading.value = true |
|||
error.value = null |
|||
|
|||
characterBag.value = await getCharacterBag(currentCharacterId.value) |
|||
|
|||
if (characterBag.value) { |
|||
bagItems.value = await getBagItems(characterBag.value.id) |
|||
} else { |
|||
bagItems.value = [] |
|||
} |
|||
|
|||
currentPage.value = 1 |
|||
} catch (e: any) { |
|||
error.value = e.message || '加载背包失败' |
|||
console.error('Load bag error:', e) |
|||
} finally { |
|||
loading.value = false |
|||
} |
|||
} |
|||
|
|||
const nextPage = () => { |
|||
if (currentPage.value < totalPages.value) { |
|||
currentPage.value++ |
|||
} |
|||
} |
|||
|
|||
const prevPage = () => { |
|||
if (currentPage.value > 1) { |
|||
currentPage.value-- |
|||
} |
|||
} |
|||
|
|||
return { |
|||
characterBag, |
|||
bagItems, |
|||
currentPage, |
|||
totalPages, |
|||
totalItems, |
|||
paginatedItems, |
|||
usedCapacity, |
|||
loading, |
|||
error, |
|||
loadBag, |
|||
nextPage, |
|||
prevPage |
|||
} |
|||
}) |
|||
Loading…
Reference in new issue