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