useBaiduMapSDK.ts
2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { onMounted, onUnmounted, ref } from 'vue';
import { useInjectScript } from '/@/hooks/web/useInjectScript';
import { BAI_DU_MAP_GL_LIB, BAI_DU_MAP_TRACK_ANIMATION } from '/@/utils/fnUtils';
export enum LoadStatusEnum {
LOADING = 'LOADING',
SUCCESS = 'SUCCESS',
ERROR = 'ERROR',
}
export const useBaiduMapSDK = (completeCallback: Fn) => {
const loadGLKey = 'loadBaiMapGL';
const loadGLLibKey = 'loadBaiMapGLLib';
const BaiduMapGLGlobalName = 'BMapGL';
const BaiduMapGLLibGlobalName = 'BMapGLLib';
const hasBMapGLFlag = Reflect.has(window, BaiduMapGLGlobalName);
const hasBMapGLLibFlag = Reflect.has(window, BaiduMapGLLibGlobalName);
const BMapGLRepeatLoadFlag = hasBMapGLFlag || Reflect.has(window, loadGLKey);
const BMapGLLibRepeatLoadFlag = hasBMapGLLibFlag || Reflect.has(window, loadGLLibKey);
if (!BMapGLRepeatLoadFlag) {
Reflect.set(window, loadGLKey, true);
const { toInject } = useInjectScript({ src: BAI_DU_MAP_GL_LIB });
toInject();
}
if (!BMapGLLibRepeatLoadFlag) {
Reflect.set(window, loadGLLibKey, true);
const { toInject } = useInjectScript({ src: BAI_DU_MAP_TRACK_ANIMATION });
toInject();
}
const waitFn = async () => {
return new Promise((resolve) => {
let interval: Nullable<NodeJS.Timer> = setInterval(() => {
const hasBMapGLFlag = Reflect.has(window, BaiduMapGLGlobalName);
const hasBMapGLLibFlag = Reflect.has(window, BaiduMapGLLibGlobalName);
if (hasBMapGLFlag && hasBMapGLLibFlag) {
resolve('success');
status.value = LoadStatusEnum.SUCCESS;
loading.value = false;
clearInterval(interval!);
interval = null;
clearTimeout(timeout!);
timeout = null;
}
}, 300);
let timeout: Nullable<NodeJS.Timeout> = setTimeout(() => {
status.value = LoadStatusEnum.ERROR;
clearTimeout(timeout!);
timeout = null;
resolve('error');
}, 10000);
});
};
const loading = ref(true);
const status = ref(LoadStatusEnum.LOADING);
onMounted(async () => {
await waitFn();
completeCallback?.();
loading.value = false;
});
onUnmounted(() => {
Reflect.deleteProperty(window, loadGLKey);
Reflect.deleteProperty(window, loadGLLibKey);
});
return {
loading,
status,
};
};