diff --git a/src/components/navigation/ArrivalPanel.vue b/src/components/navigation/ArrivalPanel.vue index 26c6473..674de60 100644 --- a/src/components/navigation/ArrivalPanel.vue +++ b/src/components/navigation/ArrivalPanel.vue @@ -124,6 +124,11 @@ import { THIRD_PARTY_MAP_PROVIDERS, type ThirdPartyMapProviderOption } from '@/services/ThirdPartyMapSearchService' +import { isNativeWechatMiniProgram } from '@/utils/hostEnvironment' +import { + getArrivalNavigationActionText, + resolveArrivalNavigationMode +} from '@/components/navigation/arrivalNavigationPolicy' const props = withDefaults(defineProps<{ visible?: boolean @@ -147,8 +152,9 @@ const emit = defineEmits<{ const typeOptions = computed(() => ARRIVAL_TARGET_TYPES) const mapProviders = computed(() => THIRD_PARTY_MAP_PROVIDERS) +const navigationMode = resolveArrivalNavigationMode(isNativeWechatMiniProgram()) const primaryActionText = computed(() => ( - isOpeningNavigation.value ? '正在打开...' : '打开地图导航' + getArrivalNavigationActionText(navigationMode, isOpeningNavigation.value) )) const arrivalPanelRef = ref(null) const isCollapsed = ref(false) @@ -248,6 +254,12 @@ const handleNavigateTap = async () => { return } + // H5(含小程序 web-view)统一由用户选择第三方地图。 + if (navigationMode === 'third-party-providers') { + providerSheetVisible.value = true + return + } + const target = { latitude: props.selectedTarget.latitude, longitude: props.selectedTarget.longitude, @@ -256,10 +268,7 @@ const handleNavigateTap = async () => { } isOpeningNavigation.value = true try { - const result = await openWechatMiniProgramLocation(target) - if (result.status === 'not-embedded') { - providerSheetVisible.value = true - } + await openWechatMiniProgramLocation(target) } finally { isOpeningNavigation.value = false } diff --git a/src/components/navigation/arrivalNavigationPolicy.ts b/src/components/navigation/arrivalNavigationPolicy.ts new file mode 100644 index 0000000..aab5e79 --- /dev/null +++ b/src/components/navigation/arrivalNavigationPolicy.ts @@ -0,0 +1,15 @@ +export type ArrivalNavigationMode = 'third-party-providers' | 'native-location' + +export const resolveArrivalNavigationMode = ( + isNativeWechatMiniProgram: boolean +): ArrivalNavigationMode => ( + isNativeWechatMiniProgram ? 'native-location' : 'third-party-providers' +) + +export const getArrivalNavigationActionText = ( + mode: ArrivalNavigationMode, + isOpening: boolean +) => { + if (isOpening) return '正在打开...' + return mode === 'native-location' ? '打开地图导航' : '第三方导航' +} diff --git a/tests/unit/arrivalNavigationPolicy.spec.ts b/tests/unit/arrivalNavigationPolicy.spec.ts new file mode 100644 index 0000000..9ccfe99 --- /dev/null +++ b/tests/unit/arrivalNavigationPolicy.spec.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from 'vitest' +import { + getArrivalNavigationActionText, + resolveArrivalNavigationMode +} from '@/components/navigation/arrivalNavigationPolicy' + +describe('来馆导航入口策略', () => { + it('普通 H5 与小程序 web-view 都使用第三方地图选择层', () => { + const mode = resolveArrivalNavigationMode(false) + + expect(mode).toBe('third-party-providers') + expect(getArrivalNavigationActionText(mode, false)).toBe('第三方导航') + }) + + it('只有原生微信小程序使用微信位置能力', () => { + const mode = resolveArrivalNavigationMode(true) + + expect(mode).toBe('native-location') + expect(getArrivalNavigationActionText(mode, false)).toBe('打开地图导航') + expect(getArrivalNavigationActionText(mode, true)).toBe('正在打开...') + }) +})