Equipment ViewModels Reference
Consolidated reference for all equipment configuration ViewModels.
Overview
Equipment ViewModels follow a consistent pattern for managing bow, arrow, and component configurations.
Total Equipment ViewModels: 12
- BowSetupViewModel
- ArrowSetupViewModel
- SightConfigurationViewModel
- RestConfigurationViewModel
- StabilizerConfigurationViewModel
- PlungerConfigurationViewModel
- TabConfigurationViewModel
- ReleaseAidConfigurationViewModel
- ClkrConfigurationViewModel
- StringConfigurationViewModel
- LimbsConfigurationViewModel
- RiserConfigurationViewModel
Common Pattern
All equipment ViewModels share this structure:
class EquipmentViewModel(
private val repository: EquipmentRepository
) : ViewModel() {
// State
private val _uiState = MutableStateFlow(EquipmentUiState())
val uiState: StateFlow<EquipmentUiState> = _uiState.asStateFlow()
// List all setups
fun loadSetups()
// Get active setup
fun loadActiveSetup()
// Create new setup
fun createSetup(setup: Setup)
// Update existing
fun updateSetup(setup: Setup)
// Set as active
fun setActive(id: Long)
// Delete setup
fun deleteSetup(id: Long)
}BowSetupViewModel
File: ui/equipment/viewmodels/BowSetupViewModel.kt
UI State:
data class BowSetupUiState(
val setups: List<BowSetup> = emptyList(),
val activeSetup: BowSetup? = null,
val isLoading: Boolean = false,
val error: String? = null
)Key Methods:
fun loadBowSetups()
fun loadActiveSetup()
fun createBowSetup(name: String, manufacturer: String, model: String)
fun setActiveBow(setupId: Long)
fun deleteBowSetup(setupId: Long)ArrowSetupViewModel
File: ui/equipment/viewmodels/ArrowSetupViewModel.kt
UI State:
data class ArrowSetupUiState(
val setups: List<ArrowSetup> = emptyList(),
val activeSetup: ArrowSetup? = null,
val isLoading: Boolean = false
)Key Methods:
fun loadArrowSetups()
fun createArrowSetup(
name: String,
spine: String,
length: Double,
pointWeight: Int
)
fun setActiveArrows(setupId: Long)Component Configuration ViewModels
SightConfigurationViewModel
Manages: Sight settings and distance marks
data class SightConfigurationUiState(
val configuration: SightConfiguration? = null,
val distanceMarks: Map<Int, Double> = emptyMap()
)
fun loadSightConfiguration(bowSetupId: Long)
fun updateSightMarks(distance: Int, markValue: Double)
fun saveSightConfiguration(config: SightConfiguration)StabilizerConfigurationViewModel
Manages: Stabilizer rod lengths and weights
data class StabilizerConfigurationUiState(
val configuration: StabilizerConfiguration? = null
)
fun updateFrontRod(length: Double, weight: Double)
fun updateSideRods(length: Double, weight: Double)
fun saveConfiguration()RestConfigurationViewModel
Manages: Arrow rest position
fun updateRestPosition(vertical: Double, horizontal: Double)PlungerConfigurationViewModel
Manages: Plunger/button tension
fun updatePlungerTension(tension: Double)
fun updatePlungerPosition(position: Double)Usage Example
@Composable
fun BowSetupScreen(
viewModel: BowSetupViewModel = viewModel()
) {
val state by viewModel.uiState.collectAsState()
LaunchedEffect(Unit) {
viewModel.loadBowSetups()
}
LazyColumn {
items(state.setups) { setup ->
BowSetupCard(
setup = setup,
isActive = setup.id == state.activeSetup?.id,
onSetActive = { viewModel.setActiveBow(setup.id) },
onDelete = { viewModel.deleteBowSetup(setup.id) }
)
}
}
FloatingActionButton(
onClick = { /* Show create dialog */ }
) {
Icon(Icons.Default.Add, "Add")
}
}Related Documentation
Status: ✅ All 12 equipment ViewModels in production Pattern: Consistent CRUD + Active management Last Updated: 2025-11-01