55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import type { Ref } from 'vue'
|
|
import type { AddressData } from '~/services/dto/address-data'
|
|
|
|
interface AddressOwner {
|
|
id: number
|
|
addresses?: AddressData[]
|
|
}
|
|
|
|
export const useAddressSync = (
|
|
form: { addressId: string },
|
|
ownerId: Ref<string>,
|
|
owners: Ref<AddressOwner[]>
|
|
) => {
|
|
const ownerAddresses = computed<AddressData[]>(() => {
|
|
const id = Number(ownerId.value)
|
|
if (!Number.isFinite(id)) return []
|
|
return owners.value.find((owner) => owner.id === id)?.addresses ?? []
|
|
})
|
|
|
|
const addressOptions = computed(() =>
|
|
ownerAddresses.value.map((address) => ({
|
|
value: String(address.id),
|
|
label: address.fullAddress
|
|
}))
|
|
)
|
|
|
|
watch(
|
|
() => [ownerId.value, form.addressId, owners.value],
|
|
() => {
|
|
if (!ownerId.value) {
|
|
form.addressId = ''
|
|
return
|
|
}
|
|
if (!form.addressId && ownerAddresses.value.length === 1) {
|
|
form.addressId = String(ownerAddresses.value[0].id)
|
|
return
|
|
}
|
|
if (!form.addressId) return
|
|
const matches = ownerAddresses.value.some(
|
|
(address) => String(address.id) === form.addressId
|
|
)
|
|
if (!matches) {
|
|
if (ownerAddresses.value.length === 1) {
|
|
form.addressId = String(ownerAddresses.value[0].id)
|
|
} else {
|
|
form.addressId = ''
|
|
}
|
|
}
|
|
},
|
|
{ immediate: true }
|
|
)
|
|
|
|
return { ownerAddresses, addressOptions }
|
|
}
|