feat: 新增会计应用核心TypeScript类型定义和设置服务

This commit is contained in:
2026-01-29 23:13:34 +08:00
parent bc3b21ebd6
commit b28798a0fc
2 changed files with 46 additions and 13 deletions

View File

@@ -13,15 +13,43 @@ import type {
UpdateDefaultAccountsInput,
} from '../types';
// Helper to map backend snake_case to frontend camelCase
function mapSettingsResponse(data: any): UserSettings {
return {
id: data.id,
userId: data.user_id,
preciseTimeEnabled: data.precise_time_enabled,
iconLayout: data.icon_layout,
imageCompression: data.image_compression,
showReimbursementBtn: data.show_reimbursement_btn,
showRefundBtn: data.show_refund_btn,
currentLedgerId: data.current_ledger_id,
createdAt: data.created_at,
updatedAt: data.updated_at,
// Add these just in case they are returned in the main object
defaultExpenseAccountId: data.default_expense_account_id,
defaultIncomeAccountId: data.default_income_account_id,
};
}
function mapDefaultAccountsResponse(data: any): DefaultAccountsSettings {
return {
defaultExpenseAccountId: data.default_expense_account_id,
defaultIncomeAccountId: data.default_income_account_id,
defaultExpenseAccount: data.default_expense_account,
defaultIncomeAccount: data.default_income_account,
};
}
/**
* Get user settings
*/
export async function getSettings(): Promise<UserSettings> {
const response = await api.get<ApiResponse<UserSettings>>('/settings');
const response = await api.get<ApiResponse<any>>('/settings');
if (!response.data) {
throw new Error(response.error || 'Failed to get settings');
}
return response.data;
return mapSettingsResponse(response.data);
}
/**
@@ -37,11 +65,11 @@ export async function updateSettings(data: Partial<UserSettings>): Promise<UserS
if (data.showRefundBtn !== undefined) payload.show_refund_btn = data.showRefundBtn;
if (data.currentLedgerId !== undefined) payload.current_ledger_id = data.currentLedgerId;
const response = await api.put<ApiResponse<UserSettings>>('/settings', payload);
const response = await api.put<ApiResponse<any>>('/settings', payload);
if (!response.data) {
throw new Error(response.error || 'Failed to update settings');
}
return response.data;
return mapSettingsResponse(response.data);
}
/**
@@ -49,11 +77,11 @@ export async function updateSettings(data: Partial<UserSettings>): Promise<UserS
* Validates: Requirements 11.1, 11.3
*/
export async function getDefaultAccounts(): Promise<DefaultAccountsSettings> {
const response = await api.get<ApiResponse<DefaultAccountsSettings>>('/settings/default-accounts');
const response = await api.get<ApiResponse<any>>('/settings/default-accounts');
if (!response.data) {
throw new Error(response.error || 'Failed to get default accounts');
}
return response.data;
return mapDefaultAccountsResponse(response.data);
}
/**
@@ -72,14 +100,14 @@ export async function updateDefaultAccounts(
payload.default_income_account_id = data.defaultIncomeAccountId;
}
const response = await api.put<ApiResponse<DefaultAccountsSettings>>(
const response = await api.put<ApiResponse<any>>(
'/settings/default-accounts',
payload
);
if (!response.data) {
throw new Error(response.error || 'Failed to update default accounts');
}
return response.data;
return mapDefaultAccountsResponse(response.data);
}
/**

View File

@@ -72,6 +72,11 @@ export interface UserSettings {
currentLedgerId?: number;
createdAt: string;
updatedAt: string;
// Default accounts
defaultExpenseAccountId?: number | null;
defaultIncomeAccountId?: number | null;
defaultExpenseAccount?: Account | null;
defaultIncomeAccount?: Account | null;
}
// Tag Interface