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);
}
/**
@@ -29,19 +57,19 @@ export async function getSettings(): Promise<UserSettings> {
*/
export async function updateSettings(data: Partial<UserSettings>): Promise<UserSettings> {
const payload: Record<string, unknown> = {};
if (data.preciseTimeEnabled !== undefined) payload.precise_time_enabled = data.preciseTimeEnabled;
if (data.iconLayout !== undefined) payload.icon_layout = data.iconLayout;
if (data.imageCompression !== undefined) payload.image_compression = data.imageCompression;
if (data.showReimbursementBtn !== undefined) payload.show_reimbursement_btn = data.showReimbursementBtn;
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);
}
/**
@@ -64,22 +92,22 @@ export async function updateDefaultAccounts(
data: UpdateDefaultAccountsInput
): Promise<DefaultAccountsSettings> {
const payload: Record<string, unknown> = {};
if (data.defaultExpenseAccountId !== undefined) {
payload.default_expense_account_id = data.defaultExpenseAccountId;
}
if (data.defaultIncomeAccountId !== undefined) {
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);
}
/**
@@ -90,7 +118,7 @@ export async function getSettingsWithDefaults(): Promise<UserSettingsWithDefault
getSettings(),
getDefaultAccounts(),
]);
return {
...settings,
defaultExpenseAccountId: defaultAccounts.defaultExpenseAccountId,