113 lines
		
	
	
	
		
			3.1 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
	
		
			3.1 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
// Copyright 2021 Signal Messenger, LLC
 | 
						|
// SPDX-License-Identifier: AGPL-3.0-only
 | 
						|
 | 
						|
import React, { ReactChild } from 'react';
 | 
						|
import { last } from 'lodash';
 | 
						|
 | 
						|
import { LeftPaneHelper, ToFindType } from './LeftPaneHelper';
 | 
						|
import { getConversationInDirection } from './getConversationInDirection';
 | 
						|
import { Row, RowType } from '../ConversationList';
 | 
						|
import { PropsData as ConversationListItemPropsType } from '../conversationList/ConversationListItem';
 | 
						|
import { LocalizerType } from '../../types/Util';
 | 
						|
 | 
						|
export type LeftPaneArchivePropsType = {
 | 
						|
  archivedConversations: ReadonlyArray<ConversationListItemPropsType>;
 | 
						|
};
 | 
						|
 | 
						|
/* eslint-disable class-methods-use-this */
 | 
						|
 | 
						|
export class LeftPaneArchiveHelper extends LeftPaneHelper<
 | 
						|
  LeftPaneArchivePropsType
 | 
						|
> {
 | 
						|
  private readonly archivedConversations: ReadonlyArray<
 | 
						|
    ConversationListItemPropsType
 | 
						|
  >;
 | 
						|
 | 
						|
  constructor({ archivedConversations }: Readonly<LeftPaneArchivePropsType>) {
 | 
						|
    super();
 | 
						|
 | 
						|
    this.archivedConversations = archivedConversations;
 | 
						|
  }
 | 
						|
 | 
						|
  getHeaderContents({
 | 
						|
    i18n,
 | 
						|
    showInbox,
 | 
						|
  }: Readonly<{
 | 
						|
    i18n: LocalizerType;
 | 
						|
    showInbox: () => void;
 | 
						|
  }>): ReactChild {
 | 
						|
    return (
 | 
						|
      <div className="module-left-pane__header__contents">
 | 
						|
        <button
 | 
						|
          onClick={showInbox}
 | 
						|
          className="module-left-pane__header__contents__back-button"
 | 
						|
          title={i18n('backToInbox')}
 | 
						|
          aria-label={i18n('backToInbox')}
 | 
						|
          type="button"
 | 
						|
        />
 | 
						|
        <div className="module-left-pane__header__contents__text">
 | 
						|
          {i18n('archivedConversations')}
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  getPreRowsNode({ i18n }: Readonly<{ i18n: LocalizerType }>): ReactChild {
 | 
						|
    return (
 | 
						|
      <div className="module-left-pane__archive-helper-text">
 | 
						|
        {i18n('archiveHelperText')}
 | 
						|
      </div>
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  getRowCount(): number {
 | 
						|
    return this.archivedConversations.length;
 | 
						|
  }
 | 
						|
 | 
						|
  getRow(rowIndex: number): undefined | Row {
 | 
						|
    const conversation = this.archivedConversations[rowIndex];
 | 
						|
    return conversation
 | 
						|
      ? {
 | 
						|
          type: RowType.Conversation,
 | 
						|
          conversation,
 | 
						|
        }
 | 
						|
      : undefined;
 | 
						|
  }
 | 
						|
 | 
						|
  getRowIndexToScrollTo(
 | 
						|
    selectedConversationId: undefined | string
 | 
						|
  ): undefined | number {
 | 
						|
    if (!selectedConversationId) {
 | 
						|
      return undefined;
 | 
						|
    }
 | 
						|
    const result = this.archivedConversations.findIndex(
 | 
						|
      conversation => conversation.id === selectedConversationId
 | 
						|
    );
 | 
						|
    return result === -1 ? undefined : result;
 | 
						|
  }
 | 
						|
 | 
						|
  getConversationAndMessageAtIndex(
 | 
						|
    conversationIndex: number
 | 
						|
  ): undefined | { conversationId: string } {
 | 
						|
    const { archivedConversations } = this;
 | 
						|
    const conversation =
 | 
						|
      archivedConversations[conversationIndex] || last(archivedConversations);
 | 
						|
    return conversation ? { conversationId: conversation.id } : undefined;
 | 
						|
  }
 | 
						|
 | 
						|
  getConversationAndMessageInDirection(
 | 
						|
    toFind: Readonly<ToFindType>,
 | 
						|
    selectedConversationId: undefined | string,
 | 
						|
    _selectedMessageId: unknown
 | 
						|
  ): undefined | { conversationId: string } {
 | 
						|
    return getConversationInDirection(
 | 
						|
      this.archivedConversations,
 | 
						|
      toFind,
 | 
						|
      selectedConversationId
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  shouldRecomputeRowHeights(_old: unknown): boolean {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
}
 |