Alternative inbox visuals
							
								
								
									
										1
									
								
								images/logo-parts/base.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M64 12a52 52 0 0 0-44 79.67L15 113l21.33-5A52 52 0 1 0 64 12Z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 144 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p1.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M20.39 117.11 8 120l2.89-12.39-5.84-1.37-2.89 12.39a6 6 0 0 0 7.21 7.21L21.75 123Z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 165 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p10.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M118.8 30.92 113.66 34a57.84 57.84 0 0 1 6.65 16.06l5.82-1.44a63.76 63.76 0 0 0-7.33-17.7z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 173 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p11.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M122 64a57.9 57.9 0 0 1-.65 8.69l5.93.9a64.23 64.23 0 0 0 0-19.18l-5.93.9A57.9 57.9 0 0 1 122 64Z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 180 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p12.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="m126.13 79.36-5.82-1.44A57.84 57.84 0 0 1 113.66 94l5.14 3.1a63.76 63.76 0 0 0 7.33-17.74z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 173 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p13.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M110.69 98.41a58.21 58.21 0 0 1-12.29 12.28l3.56 4.83A64.1 64.1 0 0 0 115.52 102Z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 164 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p14.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M97.08 118.8 94 113.66a57.84 57.84 0 0 1-16.06 6.65l1.44 5.82a63.76 63.76 0 0 0 17.7-7.33z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 173 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p15.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M72.69 121.36a58.41 58.41 0 0 1-17.38 0l-.9 5.93a64.23 64.23 0 0 0 19.18 0z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 158 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p16.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="m34.3 113.89-8.59 2 1.36 5.84 6.32-1.47a63.52 63.52 0 0 0 15.21 5.9l1.44-5.82a57.75 57.75 0 0 1-15.7-6.49z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 189 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p2.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="m6.3 100.89 5.84 1.36 2-8.59a57.75 57.75 0 0 1-6.45-15.74l-5.82 1.44a63.52 63.52 0 0 0 5.9 15.21z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 180 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p3.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M6 64a57.9 57.9 0 0 1 .65-8.69l-5.93-.9a64.23 64.23 0 0 0 0 19.18l5.93-.9A57.9 57.9 0 0 1 6 64Z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 178 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p4.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M9.2 30.92a63.76 63.76 0 0 0-7.33 17.72l5.82 1.44A57.84 57.84 0 0 1 14.34 34Z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 160 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p5.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M17.31 29.6A58.21 58.21 0 0 1 29.6 17.31L26 12.48A64.1 64.1 0 0 0 12.48 26Z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 158 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p6.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="m48.64 1.87 1.44 5.82A57.84 57.84 0 0 0 34 14.34L30.92 9.2a63.76 63.76 0 0 1 17.72-7.33Z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 171 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p7.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M55.31 6.65a58.41 58.41 0 0 1 17.38 0l.9-5.93a64.23 64.23 0 0 0-19.18 0z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 155 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p8.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="m79.36 1.87-1.44 5.82A57.84 57.84 0 0 1 94 14.34l3.1-5.14a63.76 63.76 0 0 0-17.74-7.33Z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 170 B  | 
							
								
								
									
										1
									
								
								images/logo-parts/p9.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M98.4 17.31a58.21 58.21 0 0 1 12.29 12.29l4.83-3.6A64.1 64.1 0 0 0 102 12.48Z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 160 B  | 
| 
						 | 
				
			
			@ -34,3 +34,45 @@
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.Inbox__logo {
 | 
			
		||||
  flex-shrink: 0;
 | 
			
		||||
 | 
			
		||||
  display: block;
 | 
			
		||||
  width: 150px;
 | 
			
		||||
  height: 150px;
 | 
			
		||||
  margin-block: 24px;
 | 
			
		||||
  position: relative;
 | 
			
		||||
 | 
			
		||||
  .Inbox__logo__part {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 100%;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .Inbox__logo__part--base {
 | 
			
		||||
    @include color-svg('../images/logo-parts/base.svg', $color-white);
 | 
			
		||||
    z-index: 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .Inbox__logo__part--segment {
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
    z-index: 2;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .Inbox__logo__part--animated {
 | 
			
		||||
    transition: opacity 250ms, transform 250ms;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @for $i from 1 through 16 {
 | 
			
		||||
    .Inbox__logo__part--segment:nth-child(#{$i + 1}) {
 | 
			
		||||
      @include color-svg('../images/logo-parts/p#{$i}.svg', $color-white);
 | 
			
		||||
      transform: rotate(#{(16 - $i) * 22.5}deg);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .Inbox__logo__part--segment:nth-child(n).Inbox__logo__part--visible {
 | 
			
		||||
    transform: rotate(0deg);
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,10 +19,12 @@ export default {
 | 
			
		|||
  args: {
 | 
			
		||||
    i18n,
 | 
			
		||||
    hasInitialLoadCompleted: false,
 | 
			
		||||
    isAlpha: false,
 | 
			
		||||
    isCustomizingPreferredReactions: false,
 | 
			
		||||
  },
 | 
			
		||||
  argTypes: {
 | 
			
		||||
    daysAgo: { control: { type: 'number' } },
 | 
			
		||||
    isAlpha: { control: { type: 'boolean' } },
 | 
			
		||||
  },
 | 
			
		||||
} satisfies Meta<PropsType & { daysAgo?: number }>;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@
 | 
			
		|||
 | 
			
		||||
import type { ReactNode } from 'react';
 | 
			
		||||
import React, { useEffect, useState, useMemo } from 'react';
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
import type { LocalizerType } from '../types/Util';
 | 
			
		||||
import * as log from '../logging/log';
 | 
			
		||||
import { SECOND, DAY } from '../util/durations';
 | 
			
		||||
| 
						 | 
				
			
			@ -13,6 +14,7 @@ export type PropsType = {
 | 
			
		|||
  envelopeTimestamp: number | undefined;
 | 
			
		||||
  hasInitialLoadCompleted: boolean;
 | 
			
		||||
  i18n: LocalizerType;
 | 
			
		||||
  isAlpha: boolean;
 | 
			
		||||
  isCustomizingPreferredReactions: boolean;
 | 
			
		||||
  navTabsCollapsed: boolean;
 | 
			
		||||
  onToggleNavTabsCollapse: (navTabsCollapsed: boolean) => unknown;
 | 
			
		||||
| 
						 | 
				
			
			@ -23,11 +25,14 @@ export type PropsType = {
 | 
			
		|||
  renderStoriesTab: () => JSX.Element;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const PART_COUNT = 16;
 | 
			
		||||
 | 
			
		||||
export function Inbox({
 | 
			
		||||
  firstEnvelopeTimestamp,
 | 
			
		||||
  envelopeTimestamp,
 | 
			
		||||
  hasInitialLoadCompleted,
 | 
			
		||||
  i18n,
 | 
			
		||||
  isAlpha,
 | 
			
		||||
  isCustomizingPreferredReactions,
 | 
			
		||||
  navTabsCollapsed,
 | 
			
		||||
  onToggleNavTabsCollapse,
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +94,7 @@ export function Inbox({
 | 
			
		|||
  }, [hasInitialLoadCompleted]);
 | 
			
		||||
 | 
			
		||||
  if (!internalHasInitialLoadCompleted) {
 | 
			
		||||
    let loadingProgress = 0;
 | 
			
		||||
    let loadingProgress = 100;
 | 
			
		||||
    if (
 | 
			
		||||
      firstEnvelopeTimestamp !== undefined &&
 | 
			
		||||
      envelopeTimestamp !== undefined
 | 
			
		||||
| 
						 | 
				
			
			@ -122,11 +127,38 @@ export function Inbox({
 | 
			
		|||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let logo: JSX.Element;
 | 
			
		||||
    if (isAlpha) {
 | 
			
		||||
      const parts = new Array<JSX.Element>();
 | 
			
		||||
      parts.push(
 | 
			
		||||
        <i key="base" className="Inbox__logo__part Inbox__logo__part--base" />
 | 
			
		||||
      );
 | 
			
		||||
      for (let i = 0; i < PART_COUNT; i += 1) {
 | 
			
		||||
        const isVisible = i <= (loadingProgress * PART_COUNT) / 100;
 | 
			
		||||
        parts.push(
 | 
			
		||||
          <i
 | 
			
		||||
            key={i}
 | 
			
		||||
            className={classNames({
 | 
			
		||||
              Inbox__logo__part: true,
 | 
			
		||||
              'Inbox__logo__part--animated':
 | 
			
		||||
                firstEnvelopeTimestamp !== undefined && loadingProgress !== 0,
 | 
			
		||||
              'Inbox__logo__part--segment': true,
 | 
			
		||||
              'Inbox__logo__part--visible': isVisible,
 | 
			
		||||
            })}
 | 
			
		||||
          />
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
      logo = <div className="Inbox__logo">{parts}</div>;
 | 
			
		||||
    } else {
 | 
			
		||||
      logo = <div className="module-splash-screen__logo module-img--150" />;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      <div className="app-loading-screen">
 | 
			
		||||
        <div className="module-title-bar-drag-area" />
 | 
			
		||||
 | 
			
		||||
        <div className="module-splash-screen__logo module-img--150" />
 | 
			
		||||
        {logo}
 | 
			
		||||
 | 
			
		||||
        {envelopeTimestamp === undefined ? (
 | 
			
		||||
          <div className="dot-container">
 | 
			
		||||
            <span className="dot" />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
import React, { memo } from 'react';
 | 
			
		||||
import { useSelector } from 'react-redux';
 | 
			
		||||
import { Inbox } from '../../components/Inbox';
 | 
			
		||||
import { isAlpha } from '../../util/version';
 | 
			
		||||
import { getIntl } from '../selectors/user';
 | 
			
		||||
import { SmartCustomizingPreferredReactionsModal } from './CustomizingPreferredReactionsModal';
 | 
			
		||||
import { getIsCustomizingPreferredReactions } from '../selectors/preferredReactions';
 | 
			
		||||
| 
						 | 
				
			
			@ -58,6 +59,7 @@ export const SmartInbox = memo(function SmartInbox(): JSX.Element {
 | 
			
		|||
      firstEnvelopeTimestamp={firstEnvelopeTimestamp}
 | 
			
		||||
      hasInitialLoadCompleted={hasInitialLoadCompleted}
 | 
			
		||||
      i18n={i18n}
 | 
			
		||||
      isAlpha={isAlpha(window.getVersion())}
 | 
			
		||||
      isCustomizingPreferredReactions={isCustomizingPreferredReactions}
 | 
			
		||||
      navTabsCollapsed={navTabsCollapsed}
 | 
			
		||||
      onToggleNavTabsCollapse={toggleNavTabsCollapse}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||