24
24
<p
25
25
v-for =" (content, i) in tour.steps[tour.currentStep].content"
26
26
:key =" i"
27
- v-html =" content"
27
+ v-html =" $t( content) "
28
28
></p >
29
29
<!-- TODO REMOVE ME -->
30
30
<div class =" remove_me" v-if =" currentStep === 1" @click =" simulate()" >
47
47
</v-tour >
48
48
<transition name =" fade" >
49
49
<div class =" tour-control-bar" >
50
- <button disabled >
50
+ <button @click = " endTour() " >
51
51
{{ $t("End Tour") }}
52
52
</button >
53
53
<span class =" progress" >
82
82
</template >
83
83
84
84
<script lang="ts">
85
+ import { useAccountStore } from ' @/stores/Account' ;
85
86
import { useNetworkStore } from ' @/stores/Network' ;
86
87
import { useTransactionsStore } from ' @/stores/Transactions' ;
87
88
import { CircleSpinner } from ' @nimiq/vue-components' ;
@@ -91,10 +92,11 @@ import {
91
92
onMounted ,
92
93
Ref ,
93
94
ref ,
95
+ watch ,
94
96
} from ' @vue/composition-api' ;
95
97
import Vue from ' vue' ;
96
98
import VueTour from ' vue-tour' ;
97
- import { TourName , TourStep , TourStepIndex , TourSteps , useFakeTx , useTour } from ' ../composables/useTour' ;
99
+ import { TourStep , TourStepIndex , TourSteps , useFakeTx , useTour } from ' ../composables/useTour' ;
98
100
import { useWindowSize } from ' ../composables/useWindowSize' ;
99
101
import CaretRightIcon from ' ./icons/CaretRightIcon.vue' ;
100
102
@@ -104,13 +106,6 @@ require('vue-tour/dist/vue-tour.css');
104
106
105
107
export default defineComponent ({
106
108
name: ' tour' ,
107
- props: {
108
- tourName: {
109
- type: String ,
110
- required: true ,
111
- validator : (tour : TourName ) => ([' onboarding' , ' network' ] as TourName []).indexOf (tour ) !== - 1 ,
112
- },
113
- },
114
109
setup(props , context ) {
115
110
// TODO Use isMobile
116
111
const { width } = useWindowSize ();
@@ -120,8 +115,10 @@ export default defineComponent({
120
115
() => $network .consensus !== ' established' ,
121
116
);
122
117
118
+ const { state : tourStore, removeTour } = useAccountStore ();
119
+
123
120
let tour: VueTour .Tour | null = null ;
124
- const steps: TourSteps <any > = useTour (props . tourName as TourName , context ) || {};
121
+ const steps: TourSteps <any > = useTour (tourStore . tour , context ) || {};
125
122
126
123
// Initial state
127
124
const loading = ref (true );
@@ -142,17 +139,36 @@ export default defineComponent({
142
139
nSteps .value = Object .keys (steps ).length ;
143
140
disableNextStep .value = currentStep .value >= nSteps .value - 1
144
141
|| !! steps [currentStep .value ].ui .disabledNextStep ;
142
+
145
143
_addAttributes (steps [currentStep .value ].ui , currentStep .value );
146
144
// eslint-disable-next-line no-unused-expressions
147
145
steps [currentStep .value ].lifecycle ?.onMountedStep ?.(goToNextStep );
148
146
147
+ if (context .root .$route .path !== steps [currentStep .value ].path ) {
148
+ context .root .$router .push (steps [currentStep .value ].path );
149
+ }
150
+
149
151
await sleep (500 );
150
152
151
153
tour = context .root .$tours [' nimiq-tour' ];
152
154
tour ! .start (` ${currentStep .value } ` );
153
155
loading .value = false ;
154
156
}
155
157
158
+ // Dont allow user to interact with the page while it is loading
159
+ // But allow to end it
160
+ watch ([loading , disconnected ], () => {
161
+ const app = document .querySelector (' #app main' ) as HTMLDivElement ;
162
+
163
+ if (loading .value || disconnected .value ) {
164
+ // eslint-disable-next-line no-unused-expressions
165
+ app ?.setAttribute (' data-non-interactable' , ' ' );
166
+ } else {
167
+ // eslint-disable-next-line no-unused-expressions
168
+ app ?.removeAttribute (' data-non-interactable' );
169
+ }
170
+ });
171
+
156
172
function goToPrevStep() {
157
173
if (currentStep .value <= 0 ) return ;
158
174
_moveToFutureStep (currentStep .value , currentStep .value - 1 );
@@ -171,8 +187,8 @@ export default defineComponent({
171
187
) {
172
188
const goingForward = futureStepIndex > currentStepIndex ;
173
189
174
- const { page : currentPage, lifecycle : currentLifecycle } = steps [currentStepIndex ];
175
- const { page : futurePage, ui : futureUI, lifecycle : futureLifecycle } = steps [futureStepIndex ];
190
+ const { path : currentPage, lifecycle : currentLifecycle } = steps [currentStepIndex ];
191
+ const { path : futurePage, ui : futureUI, lifecycle : futureLifecycle } = steps [futureStepIndex ];
176
192
177
193
loading .value = true ;
178
194
tour ! .stop ();
@@ -183,10 +199,14 @@ export default defineComponent({
183
199
await currentLifecycle .prepareDOMPrevPage ();
184
200
} else if (goingForward && currentLifecycle && currentLifecycle .prepareDOMNextPage ) {
185
201
await currentLifecycle .prepareDOMNextPage ();
186
- } else if (futurePage !== currentPage && currentPage .startsWith (context .root .$route .path )) {
187
- // Default prepare DOM
188
- context .root .$router .push (futurePage );
189
- await context .root .$nextTick ();
202
+ } else if (futurePage !== currentPage ) {
203
+ try {
204
+ // Default prepare DOM
205
+ context .root .$router .push (futurePage );
206
+ await context .root .$nextTick ();
207
+ } catch {
208
+ // Ignore error
209
+ }
190
210
}
191
211
192
212
_addAttributes (futureUI , futureStepIndex );
@@ -243,6 +263,16 @@ export default defineComponent({
243
263
});
244
264
}
245
265
266
+ function endTour() {
267
+ _removeAttributes (currentStep .value );
268
+
269
+ // If user finalizes tour while it is loading, allow then interaction
270
+ const app = document .querySelector (' #app main' ) as HTMLDivElement ;
271
+ app .removeAttribute (' data-non-interactable' );
272
+
273
+ removeTour ();
274
+ }
275
+
246
276
// TODO REMOVE ME - Simulate tx
247
277
function simulate() {
248
278
const { addTransactions } = useTransactionsStore ();
@@ -263,6 +293,7 @@ export default defineComponent({
263
293
// actions
264
294
goToPrevStep ,
265
295
goToNextStep ,
296
+ endTour ,
266
297
267
298
// TODO REMOVE ME
268
299
simulate ,
@@ -359,6 +390,7 @@ export default defineComponent({
359
390
border : none ;
360
391
outline : var (--nimiq - );
361
392
border-radius : 9999px ;
393
+ font-weight : 700 ;
362
394
363
395
& :disabled {
364
396
opacity : 0.5 ;
0 commit comments