This commit is contained in:
oneao committed 2025-12-01 17:28:59 +08:00
1 parent d51eacb8ad
commit 44b3ef27d2
50 files changed
+3141 -9734

No files matched your search

@@ -42,10 +42,15 @@ export const useMoneyCategoryStore = create<MoneyCategoryStore>()(
}
try {
const res = await queryMoneyCategoryApi()
if (res.isSuccess) {
set({ categories: res.data.categories || [] })
}
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)
@@ -61,41 +66,39 @@ export const useMoneyCategoryStore = create<MoneyCategoryStore>()(
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,
}))
// 打印调试
console.log('更新顺序:', payload)
// 调用后端接口更新排序
updateMoneyCategorySortApi({
data: payload,
}).then(res => {
}).then((res) => {
console.log('后端返回:', res)
}).catch((err) => {
console.log(err)
})
// 更新前端 state
set({ categories: finalCategories })
}
,
},
deleteCategoryById: (id: number, type: number) => {
deleteCategoryById: async (id: number, type: number) => {
const allCategories = get().categories
// 删除指定 id,同时只处理同类型的数据
@@ -112,7 +115,9 @@ export const useMoneyCategoryStore = create<MoneyCategoryStore>()(
set({ categories: finalCategories })
// 调用删除接口
deleteMoneyCategoryApi({ id })
await deleteMoneyCategoryApi({ id }).catch((err) => {
console.log(err)
})
// 同步更新排序给后端,仅同类型
const payload = finalCategories
@@ -121,7 +126,7 @@ export const useMoneyCategoryStore = create<MoneyCategoryStore>()(
id: item.id,
sort_number: item.sort_number,
}))
updateMoneyCategorySortApi({ data: payload })
await updateMoneyCategorySortApi({ data: payload })
},
}),
@@ -3,6 +3,7 @@ import { create } from 'zustand'
import { deleteMoneyRecordApi } from '@/request/api/money/record'
import { add, sub } from '@/utils/math'
import { isInMonth } from '@/utils/time'
import { useMoneyCategoryStore } from './moneyCategory'
interface MoneyRecordStore {
records: MoneyRecordGroup[]
@@ -39,15 +40,16 @@ 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 records = [...prev.records]
const groupIndex = records.findIndex(g => g.record_time === data.record_time)
const amount = data.amount
if (groupIndex !== -1) {
const group = { ...records[groupIndex], records: [data, ...records[groupIndex].records] }
if (data.category_type === 0)
if (category?.type === 0)
group.expense = add(group.expense, amount)
if (data.category_type === 1)
if (category?.type === 1)
group.income = add(group.income, amount)
records[groupIndex] = group
}
@@ -55,8 +57,8 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
const newGroup: MoneyRecordGroup = {
record_time: data.record_time,
records: [data],
expense: data.category_type === 0 ? amount : '0.00',
income: data.category_type === 1 ? amount : '0.00',
expense: category?.type === 0 ? amount : '0.00',
income: category?.type === 1 ? amount : '0.00',
}
const insertIndex = records.findIndex(g => g.record_time < data.record_time)
if (insertIndex === -1)
@@ -67,8 +69,8 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
return {
...prev,
records,
total_expense: data.category_type === 0 ? add(prev.total_expense, amount) : prev.total_expense,
total_income: data.category_type === 1 ? add(prev.total_income, amount) : prev.total_income,
total_expense: category?.type === 0 ? add(prev.total_expense, amount) : prev.total_expense,
total_income: category?.type === 1 ? add(prev.total_income, amount) : prev.total_income,
}
})
},
@@ -80,9 +82,12 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
if (oldGroupIndex === -1)
return prev
const updateRecordCategory = useMoneyCategoryStore.getState().getCategoryById((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 oldAmount = oldRecord.amount
const newAmount = updated.amount
@@ -91,9 +96,9 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
oldGroup.records.splice(oldRecordIndex, 1)
let total_expense = prev.total_expense
let total_income = prev.total_income
if (oldRecord.category_type === 0)
if (oldRecordCategory?.type === 0)
total_expense = sub(total_expense, oldAmount)
if (oldRecord.category_type === 1)
if (oldRecordCategory?.type === 1)
total_income = sub(total_income, oldAmount)
if (oldGroup.records.length === 0)
records.splice(oldGroupIndex, 1)
@@ -107,9 +112,9 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
const newGroupIndex = records.findIndex(g => g.record_time === updated.record_time)
if (newGroupIndex !== -1) {
const group = { ...records[newGroupIndex], records: [updated, ...records[newGroupIndex].records] }
if (updated.category_type === 0)
if (updateRecordCategory?.type === 0)
group.expense = add(group.expense, newAmount)
if (updated.category_type === 1)
if (updateRecordCategory?.type === 1)
group.income = add(group.income, newAmount)
records[newGroupIndex] = group
}
@@ -117,8 +122,8 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
const newGroup: MoneyRecordGroup = {
record_time: updated.record_time,
records: [updated],
expense: updated.category_type === 0 ? newAmount : '0.00',
income: updated.category_type === 1 ? newAmount : '0.00',
expense: updateRecordCategory?.type === 0 ? newAmount : '0.00',
income: updateRecordCategory?.type === 1 ? newAmount : '0.00',
}
const insertIndex = records.findIndex(g => g.record_time < updated.record_time)
if (insertIndex === -1)
@@ -126,9 +131,9 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
else records.splice(insertIndex, 0, newGroup)
}
if (updated.category_type === 0)
if (updateRecordCategory?.type === 0)
total_expense = add(total_expense, newAmount)
if (updated.category_type === 1)
if (updateRecordCategory?.type === 1)
total_income = add(total_income, newAmount)
return { ...prev, records, total_expense, total_income }
@@ -145,9 +150,11 @@ export const useMoneyRecordStore = create<MoneyRecordStore>((set, get) => ({
const index = group.records.findIndex(r => r.id === id)
if (index !== -1) {
const record = group.records[index]
if (record.category_type === 0)
const category = useMoneyCategoryStore.getState().getCategoryById(record.category_id)
if (category?.id === 0)
total_expense = sub(total_expense, record.amount)
if (record.category_type === 1)
if (category?.id === 1)
total_income = sub(total_income, record.amount)
group.records.splice(index, 1)
}
@@ -0,0 +1,21 @@
import { router } from 'expo-router'
// store/navigation.ts
import { create } from 'zustand'
interface NavState {
pathname: string
setPathname: (p: string) => void
navigateToAuth: () => void
}
export const useNavStore = create<NavState>(set => ({
pathname: '/',
setPathname: (p: string) => set({ pathname: p }),
navigateToAuth: () => {
const pathname = useNavStore.getState().pathname
if (!pathname.startsWith('/auth')) {
router.replace('/auth')
}
},
}))