@@ -21,6 +21,9 @@ const {getSetting} = require('../settings')
21
21
const { isIntermediateAboutPage} = require ( '../lib/appUrlUtil' )
22
22
const urlParse = require ( '../../app/common/urlParse' )
23
23
24
+ let tabPageHoverTimeout
25
+ let tabHoverTimeout = null
26
+
24
27
const comparatorByKeyAsc = ( a , b ) => a . get ( 'key' ) > b . get ( 'key' )
25
28
? 1 : b . get ( 'key' ) > a . get ( 'key' ) ? - 1 : 0
26
29
@@ -391,15 +394,13 @@ function removeFrame (state, frameProps, framePropsIndex) {
391
394
}
392
395
393
396
return {
394
- previewFrameKey : null ,
395
397
closedFrames,
396
398
frames : newFrames
397
399
}
398
400
}
399
401
400
- function getFrameTabPageIndex ( state , frameProps , tabsPerTabPage ) {
401
- frameProps = makeImmutable ( frameProps )
402
- const index = findNonPinnedDisplayIndexForFrameKey ( state , frameProps . get ( 'key' ) )
402
+ function getFrameTabPageIndex ( state , frameKey , tabsPerTabPage = getSetting ( settings . TABS_PER_PAGE ) ) {
403
+ const index = findNonPinnedDisplayIndexForFrameKey ( state , frameKey )
403
404
if ( index === - 1 ) {
404
405
return - 1
405
406
}
@@ -451,7 +452,8 @@ function isPinned (state, frameKey) {
451
452
* @param frameProps Any frame belonging to the page
452
453
*/
453
454
function updateTabPageIndex ( state , frameProps ) {
454
- const index = getFrameTabPageIndex ( state , frameProps , getSetting ( settings . TABS_PER_PAGE ) )
455
+ frameProps = makeImmutable ( frameProps )
456
+ const index = getFrameTabPageIndex ( state , frameProps . get ( 'key' ) )
455
457
456
458
if ( index === - 1 ) {
457
459
return state
@@ -525,7 +527,118 @@ const isValidClosedFrame = (frame) => {
525
527
return ! frame . get ( 'isPrivate' )
526
528
}
527
529
530
+ const getTabPageCount = ( state ) => {
531
+ const frames = getNonPinnedFrames ( state ) || Immutable . List ( )
532
+ const tabsPerPage = Number ( getSetting ( settings . TABS_PER_PAGE ) )
533
+
534
+ return Math . ceil ( frames . size / tabsPerPage )
535
+ }
536
+
537
+ const getPreviewFrameKey = ( state ) => {
538
+ return state . get ( 'previewFrameKey' )
539
+ }
540
+
541
+ const setPreviewTabPageIndex = ( state , index , immediate = false ) => {
542
+ clearTimeout ( tabPageHoverTimeout )
543
+ const previewTabs = getSetting ( settings . SHOW_TAB_PREVIEWS )
544
+ const isActive = state . getIn ( [ 'ui' , 'tabs' , 'tabPageIndex' ] ) === index
545
+ let newTabPageIndex = index
546
+
547
+ if ( ! previewTabs || state . getIn ( [ 'ui' , 'tabs' , 'hoverTabPageIndex' ] ) !== index || isActive ) {
548
+ newTabPageIndex = null
549
+ }
550
+
551
+ if ( ! immediate ) {
552
+ // if there is an existing preview tab page index then we're already in preview mode
553
+ // we use actions here because that is the only way to delay updating the state
554
+ const previewMode = state . getIn ( [ 'ui' , 'tabs' , 'previewTabPageIndex' ] ) != null
555
+ if ( previewMode && newTabPageIndex == null ) {
556
+ // add a small delay when we are clearing the preview frame key so we don't lose
557
+ // previewMode if the user mouses over another tab - see below
558
+ tabPageHoverTimeout = setTimeout ( windowActions . setPreviewTabPageIndex . bind ( null , null ) , 200 )
559
+ return state
560
+ }
561
+
562
+ if ( ! previewMode ) {
563
+ // If user isn't in previewMode so we add a bit of delay to avoid tab from flashing out
564
+ // as reported here: https://github.com/brave/browser-laptop/issues/1434
565
+ // using an action here because that is the only way we can do a delayed state update
566
+ tabPageHoverTimeout = setTimeout ( windowActions . setPreviewTabPageIndex . bind ( null , newTabPageIndex ) , 200 )
567
+ return state
568
+ }
569
+ }
570
+
571
+ return state . setIn ( [ 'ui' , 'tabs' , 'previewTabPageIndex' ] , newTabPageIndex )
572
+ }
573
+
574
+ const setPreviewFrameKey = ( state , frameKey , immediate = false ) => {
575
+ clearTimeout ( tabHoverTimeout )
576
+ const frame = getFrameByKey ( state , frameKey )
577
+ const isActive = isFrameKeyActive ( state , frameKey )
578
+ const previewTabs = getSetting ( settings . SHOW_TAB_PREVIEWS )
579
+ let newPreviewFrameKey = frameKey
580
+
581
+ if ( ! previewTabs || frame == null || ! frame . get ( 'hoverState' ) || isActive ) {
582
+ newPreviewFrameKey = null
583
+ }
584
+
585
+ if ( ! immediate ) {
586
+ // if there is an existing preview frame key then we're already in preview mode
587
+ // we use actions here because that is the only way to delay updating the state
588
+ const previewMode = getPreviewFrameKey ( state ) != null
589
+ if ( previewMode && newPreviewFrameKey == null ) {
590
+ // add a small delay when we are clearing the preview frame key so we don't lose
591
+ // previewMode if the user mouses over another tab - see below
592
+ tabHoverTimeout = setTimeout ( windowActions . setPreviewFrame . bind ( null , null ) , 200 )
593
+ return state
594
+ }
595
+
596
+ if ( ! previewMode ) {
597
+ // If user isn't in previewMode so we add a bit of delay to avoid tab from flashing out
598
+ // as reported here: https://github.com/brave/browser-laptop/issues/1434
599
+ // using an action here because that is the only way we can do a delayed state update
600
+ tabHoverTimeout = setTimeout ( windowActions . setPreviewFrame . bind ( null , newPreviewFrameKey ) , 200 )
601
+ return state
602
+ }
603
+ }
604
+
605
+ const index = getFrameTabPageIndex ( state , frame )
606
+ if ( index !== - 1 ) {
607
+ if ( index !== state . getIn ( [ 'ui' , 'tabs' , 'tabPageIndex' ] ) ) {
608
+ state = state . setIn ( [ 'ui' , 'tabs' , 'previewTabPageIndex' ] , index )
609
+ } else {
610
+ state = state . deleteIn ( [ 'ui' , 'tabs' , 'previewTabPageIndex' ] )
611
+ }
612
+ }
613
+ return state . set ( 'previewFrameKey' , newPreviewFrameKey )
614
+ }
615
+
616
+ const setTabPageHoverState = ( state , tabPageIndex , hoverState ) => {
617
+ const currentHoverIndex = state . getIn ( [ 'ui' , 'tabs' , 'hoverTabPageIndex' ] )
618
+ if ( ! hoverState && currentHoverIndex === tabPageIndex ) {
619
+ state = state . setIn ( [ 'ui' , 'tabs' , 'hoverTabPageIndex' ] , null )
620
+ } else if ( hoverState ) {
621
+ state = state . setIn ( [ 'ui' , 'tabs' , 'hoverTabPageIndex' ] , tabPageIndex )
622
+ }
623
+ state = setPreviewTabPageIndex ( state , tabPageIndex )
624
+ return state
625
+ }
626
+
627
+ const setTabHoverState = ( state , frameKey , hoverState ) => {
628
+ const frameIndex = getFrameIndex ( state , frameKey )
629
+ if ( frameIndex !== - 1 ) {
630
+ state = state . setIn ( [ 'frames' , frameIndex , 'hoverState' ] , hoverState )
631
+ state = setPreviewFrameKey ( state , frameKey )
632
+ }
633
+ return state
634
+ }
635
+
528
636
module . exports = {
637
+ setTabPageHoverState,
638
+ setPreviewTabPageIndex,
639
+ setTabHoverState,
640
+ setPreviewFrameKey,
641
+ getPreviewFrameKey,
529
642
deleteTabInternalIndex,
530
643
deleteFrameInternalIndex,
531
644
updateFramesInternalIndex,
0 commit comments