Adds equity eligibility check for expenses
Improves the expense tracking component by fetching user information to determine equity eligibility. This allows displaying the "Convert to equity" checkbox only to eligible users, enhancing the user experience and ensuring accurate expense categorization. Also includes error handling to prevent the form from breaking if user information cannot be loaded.
This commit is contained in:
parent
53c14044ef
commit
fff42d170e
3 changed files with 60 additions and 7 deletions
|
|
@ -138,8 +138,8 @@
|
|||
</FormItem>
|
||||
</FormField>
|
||||
|
||||
<!-- Convert to equity checkbox -->
|
||||
<FormField v-slot="{ value, handleChange }" name="isEquity">
|
||||
<!-- Convert to equity checkbox (only show if user is equity eligible) -->
|
||||
<FormField v-if="userInfo?.is_equity_eligible" v-slot="{ value, handleChange }" name="isEquity">
|
||||
<FormItem>
|
||||
<div class="flex items-center space-x-2">
|
||||
<FormControl>
|
||||
|
|
@ -239,7 +239,7 @@ import { injectService, SERVICE_TOKENS } from '@/core/di-container'
|
|||
import { useAuth } from '@/composables/useAuthService'
|
||||
import { useToast } from '@/core/composables/useToast'
|
||||
import type { ExpensesAPI } from '../services/ExpensesAPI'
|
||||
import type { Account } from '../types'
|
||||
import type { Account, UserInfo } from '../types'
|
||||
import AccountSelector from './AccountSelector.vue'
|
||||
|
||||
interface Emits {
|
||||
|
|
@ -261,6 +261,7 @@ const selectedAccount = ref<Account | null>(null)
|
|||
const isSubmitting = ref(false)
|
||||
const availableCurrencies = ref<string[]>([])
|
||||
const loadingCurrencies = ref(true)
|
||||
const userInfo = ref<UserInfo | null>(null)
|
||||
|
||||
// Form schema
|
||||
const formSchema = toTypedSchema(
|
||||
|
|
@ -289,12 +290,19 @@ const { resetForm, meta } = form
|
|||
const isFormValid = computed(() => meta.value.valid)
|
||||
|
||||
/**
|
||||
* Fetch available currencies and default currency on component mount
|
||||
* Fetch available currencies, default currency, and user info on component mount
|
||||
*/
|
||||
onMounted(async () => {
|
||||
try {
|
||||
loadingCurrencies.value = true
|
||||
|
||||
// Get wallet key
|
||||
const wallet = user.value?.wallets?.[0]
|
||||
if (!wallet || !wallet.inkey) {
|
||||
console.warn('[AddExpense] No wallet available for loading data')
|
||||
return
|
||||
}
|
||||
|
||||
// Fetch available currencies
|
||||
const currencies = await expensesAPI.getCurrencies()
|
||||
availableCurrencies.value = currencies
|
||||
|
|
@ -307,9 +315,16 @@ onMounted(async () => {
|
|||
const initialCurrency = defaultCurrency || currencies[0] || 'EUR'
|
||||
form.setFieldValue('currency', initialCurrency)
|
||||
console.log('[AddExpense] Default currency set to:', initialCurrency)
|
||||
|
||||
// Fetch user info to check equity eligibility
|
||||
userInfo.value = await expensesAPI.getUserInfo(wallet.inkey)
|
||||
console.log('[AddExpense] User info loaded:', {
|
||||
is_equity_eligible: userInfo.value.is_equity_eligible,
|
||||
equity_account: userInfo.value.equity_account_name
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('[AddExpense] Failed to load currencies:', error)
|
||||
toast.error('Failed to load currencies', { description: 'Please check your connection and try again' })
|
||||
console.error('[AddExpense] Failed to load data:', error)
|
||||
toast.error('Failed to load form data', { description: 'Please check your connection and try again' })
|
||||
availableCurrencies.value = []
|
||||
} finally {
|
||||
loadingCurrencies.value = false
|
||||
|
|
|
|||
|
|
@ -7,7 +7,8 @@ import type {
|
|||
Account,
|
||||
ExpenseEntryRequest,
|
||||
ExpenseEntry,
|
||||
AccountNode
|
||||
AccountNode,
|
||||
UserInfo
|
||||
} from '../types'
|
||||
import { appConfig } from '@/app.config'
|
||||
|
||||
|
|
@ -263,4 +264,32 @@ export class ExpensesAPI extends BaseService {
|
|||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user information including equity eligibility
|
||||
*
|
||||
* @param walletKey - Wallet key for authentication (invoice key)
|
||||
*/
|
||||
async getUserInfo(walletKey: string): Promise<UserInfo> {
|
||||
try {
|
||||
const response = await fetch(`${this.baseUrl}/castle/api/v1/user/info`, {
|
||||
method: 'GET',
|
||||
headers: this.getHeaders(walletKey),
|
||||
signal: AbortSignal.timeout(this.config?.apiConfig?.timeout || 30000)
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to fetch user info: ${response.statusText}`)
|
||||
}
|
||||
|
||||
return await response.json()
|
||||
} catch (error) {
|
||||
console.error('[ExpensesAPI] Error fetching user info:', error)
|
||||
// Return default non-eligible user on error
|
||||
return {
|
||||
user_id: '',
|
||||
is_equity_eligible: false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,6 +86,15 @@ export interface AccountNode {
|
|||
children: AccountNode[]
|
||||
}
|
||||
|
||||
/**
|
||||
* User information including equity eligibility
|
||||
*/
|
||||
export interface UserInfo {
|
||||
user_id: string
|
||||
is_equity_eligible: boolean
|
||||
equity_account_name?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Module configuration
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue