uptick/react-keyed-file-browser

Controling the sorting direction (asc/desc)

Opened this issue · 0 comments

I'm looking for a way to specify the sort direction when sorting by name/modified. Can we do something like this?

import { compareAsc, compareDesc } from 'date-fns';

function lastModifiedSort(allFiles, direction = 'asc') {
  const folders = [];
  let files = [];
  for (let fileIndex = 0; fileIndex < allFiles.length; fileIndex++) {
    const file = allFiles[fileIndex];
    const keyFolders = (file.newKey || file.key).split('/');
    if (file.children) {
      folders.push(file);
    } else {
      file.name = keyFolders[keyFolders.length - 1];
      files.push(file);
    }
  }

  // Sort files based on direction
  if (direction === 'asc') {
    files = files.sort(compareAsc);
  } else {
    files = files.sort(compareDesc);
  }

  for (let folderIndex = 0; folderIndex < folders.length; folderIndex++) {
    const folder = folders[folderIndex];
    folder.children = lastModifiedSort(folder.children, direction);
  }

  let sortedFiles = [];
  sortedFiles = sortedFiles.concat(folders);
  sortedFiles = sortedFiles.concat(files);
  return sortedFiles;
}

export default function(files, direction) {
  return lastModifiedSort(files, direction);
}

Typescript equivalent:

import { compareAsc, compareDesc } from 'date-fns';

// Define an enum for sorting direction
enum SortDirection {
  ASCENDING = 'asc',
  DESCENDING = 'desc'
}

function sortByLastModified(payload, direction: SortDirection = SortDirection.ASCENDING) {
  const folders = [];
  let files = [];
  for (let fileIndex = 0; fileIndex < payload.length; fileIndex++) {
    const file = payload[fileIndex];
    const keyFolders = (file.newKey || file.key).split('/');
    if (file.children) {
      folders.push(file);
    } else {
      file.name = keyFolders[keyFolders.length - 1];
      files.push(file);
    }
  }

  // Sort files based on direction
  if (direction === SortDirection.ASCENDING) {
    files = files.sort(compareAsc);
  } else {
    files = files.sort(compareDesc);
  }

  for (let folderIndex = 0; folderIndex < folders.length; folderIndex++) {
    const folder = folders[folderIndex];
    folder.children = sortByLastModified(folder.children, direction);
  }

  let sortedFiles = [];
  sortedFiles = sortedFiles.concat(folders);
  sortedFiles = sortedFiles.concat(files);
  return sortedFiles;
}

export { sortByLastModified, SortDirection };