app/composables/useSetupState.ts

79 lines
No EOL
2.2 KiB
TypeScript

/**
* Setup State Management
*
* Provides utilities to determine setup completion status and manage
* field locking based on setup state
*/
export const useSetupState = () => {
const coopStore = useCoopBuilderStore()
const membersStore = useMembersStore()
const policiesStore = usePoliciesStore()
const streamsStore = useStreamsStore()
// Check if setup is complete using the same logic as middleware
const isSetupComplete = computed(() => {
// Legacy stores OR new coop builder store (either is enough)
const legacyComplete =
membersStore.isValid &&
policiesStore.isValid &&
streamsStore.hasValidStreams
const coopComplete = Boolean(
coopStore &&
Array.isArray(coopStore.members) &&
coopStore.members.length > 0 &&
Array.isArray(coopStore.streams) &&
coopStore.streams.length > 0
)
return legacyComplete || coopComplete
})
// Determine if revenue and expense fields should be locked
const areRevenueFieldsLocked = computed(() => {
return isSetupComplete.value
})
const areExpenseFieldsLocked = computed(() => {
return isSetupComplete.value
})
// Determine if member management should be in separate interface
const shouldUseSeparateMemberInterface = computed(() => {
return isSetupComplete.value
})
// Get setup completion percentage for progress display
const setupProgress = computed(() => {
let completed = 0
let total = 4 // policies, members, revenue, costs
if (policiesStore.isValid || (coopStore.equalHourlyWage > 0)) completed++
if (membersStore.members.length > 0 || coopStore.members.length > 0) completed++
if (streamsStore.hasValidStreams || coopStore.streams.length > 0) completed++
if (coopStore.overheadCosts.length > 0) completed++
return Math.round((completed / total) * 100)
})
// Navigation helpers
const goToSetup = () => {
navigateTo('/coop-planner')
}
const goToMemberManagement = () => {
navigateTo('/settings#members')
}
return {
isSetupComplete,
areRevenueFieldsLocked,
areExpenseFieldsLocked,
shouldUseSeparateMemberInterface,
setupProgress,
goToSetup,
goToMemberManagement,
}
}