diff --git a/src/renderer/stores/spark.js b/src/renderer/stores/spark.js new file mode 100644 index 0000000..ebad1c5 --- /dev/null +++ b/src/renderer/stores/spark.js @@ -0,0 +1,55 @@ +import { defineStore } from 'pinia'; +import { ref, computed } from 'vue'; + +const STORAGE_KEY = 'selected_spark_device'; + +export const useSparkStore = defineStore('spark', () => { + // 运行时发现的设备列表(动态,不持久化) + const devices = ref([]); + + // 当前选中的设备,启动时从 localStorage 恢复 + const selectedDevice = ref(JSON.parse(localStorage.getItem(STORAGE_KEY) || 'null')); + + // 选中设备的完整 URL,优先取 IPv4 地址 + const selectedDeviceUrl = computed(() => { + if (!selectedDevice.value) return null; + const { addresses, port, referer } = selectedDevice.value; + // 优先找 IPv4(不含冒号的地址) + const ipv4 = addresses?.find((a) => !a.includes(':')); + // 兜底用 referer.address(mDNS 响应来源 IP) + const ip = ipv4 || referer?.address; + return ip ? `http://${ip}:${port}` : null; + }); + + // 更新设备列表(由 BonjourView 调用) + function setDevices(list) { + devices.value = list; + + // 如果之前选中的设备还在列表里,用最新数据刷新它 + if (selectedDevice.value) { + const fresh = list.find((d) => d.name === selectedDevice.value.name); + if (fresh) selectDevice(fresh); + } + } + + // 选中某台设备,并持久化到 localStorage + function selectDevice(device) { + selectedDevice.value = device; + localStorage.setItem(STORAGE_KEY, JSON.stringify(device)); + } + + // 清除选中 + function clearSelectedDevice() { + selectedDevice.value = null; + localStorage.removeItem(STORAGE_KEY); + } + + return { + devices, + selectedDevice, + selectedDeviceUrl, + setDevices, + selectDevice, + clearSelectedDevice, + }; +}); diff --git a/src/renderer/views/bonjour/BonjourView.vue b/src/renderer/views/bonjour/BonjourView.vue index 244c283..14f1d6e 100644 --- a/src/renderer/views/bonjour/BonjourView.vue +++ b/src/renderer/views/bonjour/BonjourView.vue @@ -1,15 +1,22 @@