This commit is contained in:
oneao committed 2026-01-14 17:31:20 +08:00
1 parent d4082a54d5
commit cb4562361a
8 files changed
+281 -144

No files matched your search

+1 -2
View File
@@ -18,7 +18,6 @@ export const useAppStore = create<AppState>((set, get) => ({
setReady: (v: boolean) => set({ ready: v }),
init: async () => {
// 如果已经初始化过就不重复执行(除非你手动 setReady(false) 再 init)
if (get().ready)
return
@@ -40,7 +39,7 @@ export const useAppStore = create<AppState>((set, get) => ({
await moneyCategoryStore.init()
// 获取空间信息
const res = await getUserSpaceApi({})
const res = await getUserSpaceApi()
spaceStore.setUserSpace(res.data)
}
catch (err) {
+151 -118
View File
@@ -1,147 +1,180 @@
import type { MoneyCategoryItem, UpdateMoneyCategorySortItem } from '@/types/money/category'
import AsyncStorage from '@react-native-async-storage/async-storage'
import { create } from 'zustand'
import { createJSONStorage, persist } from 'zustand/middleware'
import { deleteMoneyCategoryApi, queryMoneyCategoryApi, updateMoneyCategorySortApi } from '@/request/api/money/category'
interface MoneyCategoryStore {
ICON_GROUPS: Record<string, string[]>
categories: MoneyCategoryItem[]
init: () => Promise<void>
setCategories: (categories: MoneyCategoryItem[]) => void
addCategory: (category: MoneyCategoryItem) => void
removeCategory: (id: number) => void
init: () => Promise<void>
getExpenseCategories: () => MoneyCategoryItem[]
getIncomeCategories: () => MoneyCategoryItem[]
getCategoryById: (id: number) => MoneyCategoryItem | null
updateCategories: (data: MoneyCategoryItem[], type: number) => void
deleteCategoryById: (id: number, type: number) => void
sysCategories: MoneyCategoryItem[]
setSysCategories: (categories: MoneyCategoryItem[]) => void
updateSortNumbers: (data: MoneyCategoryItem[], type: number) => void
deleteCategoryById: (id: number) => void
clear: () => void
}
export const useMoneyCategoryStore = create<MoneyCategoryStore>()(
persist(
(set, get) => ({
categories: [],
sysCategories: [],
(set, get) => ({
ICON_GROUPS: {
餐饮: [
'money_canyin',
'money_yinpin',
'money_lingshi',
'money_xiaoye',
],
娱乐: [
'money_yule',
'money_youxi',
'money_dianying',
],
交通: [
'money_jiaotong',
'money_tingchefei',
'money_jiayou',
],
生活消费: [
'money_lijin',
'money_jiadian',
'money_riyongpin',
'money_shucai',
'money_meifa',
'money_shuidian',
'money_wenju',
'money_zhufang',
'money_baoxian',
'money_baojianpin',
'money_huafei',
'money_lvyou',
'money_gouwu',
'money_shuben',
'money_chongwu',
'money_ruanjian',
],
健康: [
'money_tijian',
'money_yao',
'money_jiuyi',
],
公益: [
'money_gongyi',
],
兼职与收入: [
'money_gongzi',
'money_jianzhi',
],
鲜花与水果: [
'money_shuiguo',
'money_xianhua',
],
转账与转移: [
'money_zhuanzhang',
],
家庭与家电: [
'money_kuaidi',
'money_weixiu',
'money_jiaju',
'money_muying',
'money_liwu',
],
运动与娱乐: [
'money_yundong',
'money_peixun',
],
},
setCategories: categories => set({ categories }),
setSysCategories: categories => set({ categories }),
categories: [],
addCategory: category =>
set({ categories: [...get().categories, category] }),
setCategories: categories => set({ categories }),
removeCategory: id =>
set({ categories: get().categories.filter(c => c.id !== id) }),
addCategory: category =>
set({ categories: [...get().categories, category] }),
init: async () => {
try {
await queryMoneyCategoryApi().then((res) => {
if (res.isSuccess) {
set({ categories: res.data.categories || [] })
}
}).catch((err) => {
console.log(err)
}).finally(() => {
})
}
catch (e) {
console.error('Fetch category failed:', e)
}
},
clear: () => {
set({ categories: [] })
},
getExpenseCategories: () => (get().categories || []).filter(c => c.type === 0),
getIncomeCategories: () => (get().categories || []).filter(c => c.type === 1),
getCategoryById: (id: number) => {
return get().categories.find(c => c.id === id) || null
},
getSysCategoryById: (id: number) => {
return get().sysCategories.find(c => c.id === id) || null
},
updateCategories: (data, type) => {
// 获取当前所有分类
const allCategories = get().categories
// 保留另一类分类
const otherCategories = allCategories.filter(c => c.type !== type)
// 给当前类型的数据重新计算 sort_number
const updatedData = data.map((item, index) => ({
...item,
sort_number: index, // 按顺序重新赋值
}))
// 合并另一类分类
const finalCategories = [...otherCategories, ...updatedData]
// 构造后端请求 payload,只需要 id 和 sort_number
const payload: UpdateMoneyCategorySortItem[] = updatedData.map(item => ({
id: item.id,
sort_number: item.sort_number,
}))
// 调用后端接口更新排序
updateMoneyCategorySortApi({
data: payload,
}).then((res) => {
console.log('后端返回:', res)
init: async () => {
try {
await queryMoneyCategoryApi().then((res) => {
if (res.isSuccess) {
set({ categories: res.data.categories || [] })
}
}).catch((err) => {
console.log(err)
}).finally(() => {
})
// 更新前端 state
set({ categories: finalCategories })
},
deleteCategoryById: async (id: number, type: number) => {
const allCategories = get().categories
// 删除指定 id,同时只处理同类型的数据
const finalCategories = allCategories
.filter(c => c.id !== id)
.map((item, index) => {
if (item.type === type) {
return { ...item, sort_number: index }
}
return item
})
// 更新 state
set({ categories: finalCategories })
// 调用删除接口
await deleteMoneyCategoryApi({ id }).catch((err) => {
console.log(err)
})
// 同步更新排序给后端,仅同类型
const payload = finalCategories
.filter(c => c.type === type)
.map(item => ({
id: item.id,
sort_number: item.sort_number,
}))
await updateMoneyCategorySortApi({ data: payload })
},
}),
{
name: 'money-category-storage',
storage: createJSONStorage(() => AsyncStorage),
}
catch (e) {
console.error('Fetch category failed:', e)
}
},
),
clear: () => {
set({ categories: [] })
},
getExpenseCategories: () => (get().categories || []).filter(c => c.type === 0),
getIncomeCategories: () => (get().categories || []).filter(c => c.type === 1),
getCategoryById: (id: number) => {
return get().categories.find(c => c.id === id) || null
},
updateSortNumbers: (data, type) => {
// 获取当前所有分类
const allCategories = get().categories
// 保留另一类分类
const otherCategories = allCategories.filter(c => c.type !== type)
// 给当前类型的数据重新计算 sort_number
const updatedData = data.map((item, index) => ({
...item,
sort_number: index, // 按顺序重新赋值
}))
// 合并另一类分类
const finalCategories = [...otherCategories, ...updatedData]
// 构造后端请求 payload,只需要 id 和 sort_number
const payload: UpdateMoneyCategorySortItem[] = updatedData.map(item => ({
id: item.id,
sort_number: item.sort_number,
}))
// 调用后端接口更新排序
updateMoneyCategorySortApi({
data: payload,
}).then((res) => {
console.log('后端返回:', res)
}).catch((err) => {
console.log(err)
})
// 更新前端 state
set({ categories: finalCategories })
},
deleteCategoryById: async (id: number) => {
const allCategories = get().categories
// 删除指定 id,同时只处理同类型的数据
const finalCategories = allCategories
.filter(c => c.id !== id)
// 更新 state
set({ categories: finalCategories })
// 调用删除接口
await deleteMoneyCategoryApi({ id }).catch((err) => {
console.log(err)
})
},
}),
)
@@ -42,7 +42,7 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
if (!isInMonth(data.record_time, prev.currentMonth))
return prev
const category = useMoneyCategoryStore.getState().getCategoryById(data.category_id)
const category = useMoneyCategoryStore.getState().getById(data.category_id)
const records = [...prev.records]
const groupIndex = records.findIndex(g => g.record_time === data.record_time)
const amount = data.amount
@@ -88,12 +88,12 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
if (oldGroupIndex === -1)
return prev
const updateRecordCategory = useMoneyCategoryStore.getState().getCategoryById((updated.category_id))
const updateRecordCategory = useMoneyCategoryStore.getState().getById((updated.category_id))
const oldGroup = { ...records[oldGroupIndex], records: [...records[oldGroupIndex].records] }
const oldRecordIndex = oldGroup.records.findIndex(r => r.id === updated.id)
const oldRecord = oldGroup.records[oldRecordIndex]
const oldRecordCategory = useMoneyCategoryStore.getState().getCategoryById((oldRecord.category_id))
const oldRecordCategory = useMoneyCategoryStore.getState().getById((oldRecord.category_id))
const oldAmount = oldRecord.amount
const newAmount = updated.amount
@@ -158,7 +158,7 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
const index = group.records.findIndex(r => r.id === id)
if (index !== -1) {
const record = group.records[index]
const category = useMoneyCategoryStore.getState().getCategoryById(record.category_id)
const category = useMoneyCategoryStore.getState().getById(record.category_id)
if (category?.id === 0)
total_expense = sub(total_expense, record.amount)