2
2
import ThemePreviewListItem from " ./ThemePreviewListItem.vue" ;
3
3
import { useSettingFormConvert } from " @console/composables/use-setting-form" ;
4
4
import { useThemeStore } from " @console/stores/theme" ;
5
- import { apiClient } from " @/utils/api-client" ;
5
+ import { apiClient , axiosInstance } from " @/utils/api-client" ;
6
6
import type {
7
7
ConfigMap ,
8
8
Setting ,
@@ -22,28 +22,27 @@ import {
22
22
IconTablet ,
23
23
IconRefreshLine ,
24
24
Toast ,
25
+ VLoading ,
25
26
} from " @halo-dev/components" ;
26
27
import { storeToRefs } from " pinia" ;
27
- import { computed , markRaw , ref , toRaw , watch } from " vue" ;
28
+ import { computed , markRaw , ref , toRaw } from " vue" ;
28
29
import { useI18n } from " vue-i18n" ;
29
30
import { OverlayScrollbarsComponent } from " overlayscrollbars-vue" ;
30
31
import { useQuery } from " @tanstack/vue-query" ;
32
+ import { onMounted } from " vue" ;
31
33
32
34
const props = withDefaults (
33
35
defineProps <{
34
- visible: boolean ;
35
36
title? : string ;
36
37
theme? : Theme ;
37
38
}>(),
38
39
{
39
- visible: false ,
40
40
title: undefined ,
41
41
theme: undefined ,
42
42
}
43
43
);
44
44
45
45
const emit = defineEmits <{
46
- (event : " update:visible" , visible : boolean ): void ;
47
46
(event : " close" ): void ;
48
47
}>();
49
48
@@ -56,7 +55,6 @@ interface SettingTab {
56
55
57
56
const { activatedTheme } = storeToRefs (useThemeStore ());
58
57
59
- const previewFrame = ref <HTMLIFrameElement | null >(null );
60
58
const themesVisible = ref (false );
61
59
const switching = ref (false );
62
60
const selectedTheme = ref <Theme >();
@@ -71,29 +69,11 @@ const { data: themes } = useQuery<Theme[]>({
71
69
});
72
70
return data .items ;
73
71
},
74
- enabled: computed (() => props .visible ),
75
72
});
76
73
77
- watch (
78
- () => props .visible ,
79
- (visible ) => {
80
- if (visible ) {
81
- selectedTheme .value = props .theme || activatedTheme ?.value ;
82
- } else {
83
- setTimeout (() => {
84
- themesVisible .value = false ;
85
- settingsVisible .value = false ;
86
- }, 200 );
87
- }
88
- }
89
- );
90
-
91
- const onVisibleChange = (visible : boolean ) => {
92
- emit (" update:visible" , visible );
93
- if (! visible ) {
94
- emit (" close" );
95
- }
96
- };
74
+ onMounted (() => {
75
+ selectedTheme .value = toRaw (props .theme ) || toRaw (activatedTheme ?.value );
76
+ });
97
77
98
78
const handleOpenThemes = () => {
99
79
settingsVisible .value = false ;
@@ -122,6 +102,26 @@ const modalTitle = computed(() => {
122
102
});
123
103
});
124
104
105
+ const {
106
+ data : previewHTML,
107
+ isLoading,
108
+ refetch : refetchPreviewHTML,
109
+ } = useQuery ({
110
+ queryKey: [" site-preview" , previewUrl ],
111
+ queryFn : async () => {
112
+ const { data } = await axiosInstance .get (previewUrl .value , {
113
+ headers: {
114
+ Accept: " text/html" ,
115
+ " Cache-Control" : " no-cache" ,
116
+ Pragma: " no-cache" ,
117
+ Expires: " 0" ,
118
+ },
119
+ });
120
+ return data ;
121
+ },
122
+ enabled: computed (() => !! previewUrl .value ),
123
+ });
124
+
125
125
// theme settings
126
126
const saving = ref (false );
127
127
const settingTabs = ref <SettingTab []>([] as SettingTab []);
@@ -150,9 +150,7 @@ const { data: setting } = useQuery<Setting>({
150
150
151
151
activeSettingTab .value = settingTabs .value [0 ].id ;
152
152
},
153
- enabled: computed (
154
- () => props .visible && !! selectedTheme .value ?.spec .settingName
155
- ),
153
+ enabled: computed (() => !! selectedTheme .value ?.spec .settingName ),
156
154
});
157
155
158
156
const { data : configMap, refetch : handleFetchConfigMap } = useQuery <ConfigMap >({
@@ -195,7 +193,7 @@ const handleSaveConfigMap = async () => {
195
193
196
194
saving .value = false ;
197
195
198
- handleRefresh ();
196
+ refetchPreviewHTML ();
199
197
};
200
198
201
199
const handleOpenSettings = (theme ? : Theme ) => {
@@ -206,10 +204,6 @@ const handleOpenSettings = (theme?: Theme) => {
206
204
settingsVisible .value = ! settingsVisible .value ;
207
205
};
208
206
209
- const handleRefresh = () => {
210
- previewFrame .value ?.contentWindow ?.location .reload ();
211
- };
212
-
213
207
// mock devices
214
208
const mockDevices = [
215
209
{
@@ -241,11 +235,10 @@ const iframeClasses = computed(() => {
241
235
<template >
242
236
<VModal
243
237
:body-class =" ['!p-0']"
244
- :visible =" visible"
245
238
fullscreen
246
239
:title =" modalTitle"
247
240
:mount-to-body =" true"
248
- @update:visible = " onVisibleChange "
241
+ @close = " emit('close') "
249
242
>
250
243
<template #center >
251
244
<!-- TODO: Reactor VTabbar component to support icon prop -->
@@ -281,7 +274,7 @@ const iframeClasses = computed(() => {
281
274
content: $t('core.common.buttons.refresh'),
282
275
delay: 300,
283
276
}"
284
- @click =" handleRefresh "
277
+ @click =" refetchPreviewHTML() "
285
278
>
286
279
<IconRefreshLine />
287
280
</span >
@@ -432,12 +425,12 @@ const iframeClasses = computed(() => {
432
425
<div
433
426
class =" flex h-full flex-1 items-center justify-center transition-all duration-300"
434
427
>
428
+ <VLoading v-if =" isLoading" />
435
429
<iframe
436
- v-if =" visible"
437
- ref =" previewFrame"
430
+ v-else
438
431
class =" border-none transition-all duration-500"
439
432
:class =" iframeClasses"
440
- :src = " previewUrl "
433
+ :srcdoc = " previewHTML "
441
434
></iframe >
442
435
</div >
443
436
</div >
0 commit comments