@ -197,6 +197,7 @@ export class GristDoc extends DisposableWithEvents {
private _isRickRowing : Observable < boolean > = Observable . create ( this , false ) ;
private _showBackgroundVideoPlayer : Observable < boolean > = Observable . create ( this , false ) ;
private _backgroundVideoPlayerHolder : Holder < YouTubePlayer > = Holder . create ( this ) ;
private _disableAutoStartingTours : boolean = false ;
constructor (
@ -278,7 +279,8 @@ export class GristDoc extends DisposableWithEvents {
// Subscribe to URL state, and navigate to anchor or open a popup if necessary.
this . autoDispose ( subscribe ( urlState ( ) . state , async ( use , state ) = > {
if ( state . hash ) {
if ( ! state . hash ) { return ; }
try {
if ( state . hash . popup ) {
await this . openPopup ( state . hash ) ;
@ -287,7 +289,9 @@ export class GristDoc extends DisposableWithEvents {
const cursorPos = this . _getCursorPosFromHash ( state . hash ) ;
await this . recursiveMoveToCursorPos ( cursorPos , true ) ;
}
if ( state . hash . rickRow && ! this . _isRickRowing . get ( ) ) {
const isTourOrTutorialActive = isTourActive ( ) || this . docModel . isTutorial ( ) ;
if ( state . hash . rickRow && ! this . _isRickRowing . get ( ) && ! isTourOrTutorialActive ) {
YouTubePlayer . create ( this . _backgroundVideoPlayerHolder , RICK_ROLL_YOUTUBE_EMBED_ID , {
height : '100%' ,
width : '100%' ,
@ -309,7 +313,8 @@ export class GristDoc extends DisposableWithEvents {
this . _waitForView ( )
. then ( ( ) = > {
const cursor = document . querySelector ( '.selected_cursor.active_cursor' ) ;
if ( cursor ) {
if ( ! cursor ) { return ; }
this . behavioralPromptsManager . showTip ( cursor , 'rickRow' , {
forceShow : true ,
hideDontShowTips : true ,
@ -317,7 +322,6 @@ export class GristDoc extends DisposableWithEvents {
showOnMobile : true ,
onDispose : ( ) = > this . playRickRollVideo ( ) ,
} ) ;
}
} )
. catch ( reportError ) ;
}
@ -326,7 +330,6 @@ export class GristDoc extends DisposableWithEvents {
} finally {
setTimeout ( finalizeAnchor , 0 ) ;
}
}
} ) ) ;
let isStartingTourOrTutorial = false ;
@ -337,12 +340,17 @@ export class GristDoc extends DisposableWithEvents {
return ;
}
const shouldStart Tutorial = this . docModel . isTutorial ( ) ;
const i sTutorial = this . docModel . isTutorial ( ) ;
// Onboarding tours were not designed with mobile support in mind. Disable until fixed.
if ( isNarrowScreen ( ) && ! shouldStart Tutorial) {
if ( isNarrowScreen ( ) && ! i sTutorial) {
return ;
}
// Onboarding tours can conflict with rick rowing.
if ( state . hash ? . rickRow ) {
this . _disableAutoStartingTours = true ;
}
// If we have an active tour or tutorial (or are in the process of starting one), don't start
// a new one.
const hasActiveTourOrTutorial = isTourActive ( ) || ! this . _docTutorialHolder . isEmpty ( ) ;
@ -350,6 +358,7 @@ export class GristDoc extends DisposableWithEvents {
return ;
}
const shouldStartTutorial = isTutorial ;
const shouldStartDocTour = state . docTour || this . _shouldAutoStartDocTour ( ) ;
const shouldStartWelcomeTour = state . welcomeTour || this . _shouldAutoStartWelcomeTour ( ) ;
if ( shouldStartTutorial || shouldStartDocTour || shouldStartWelcomeTour ) {
@ -1438,7 +1447,7 @@ export class GristDoc extends DisposableWithEvents {
* seen the tour before .
* /
private _shouldAutoStartDocTour ( ) : boolean {
if ( this . docModel. isTutorial ( ) ) {
if ( this . _disableAutoStartingTours || this . docModel. isTutorial ( ) ) {
return false ;
}
@ -1454,7 +1463,7 @@ export class GristDoc extends DisposableWithEvents {
private _shouldAutoStartWelcomeTour ( ) : boolean {
// If a doc tutorial or tour are available, leave the welcome tour for another
// doc (e.g. a new one).
if ( this . docModel. isTutorial ( ) || this . docModel . hasDocTour ( ) ) {
if ( this . _disableAutoStartingTours || this . docModel. isTutorial ( ) || this . docModel . hasDocTour ( ) ) {
return false ;
}