From 7f3e70614440b6c03ec5afc82cf6d542027f33ea Mon Sep 17 00:00:00 2001
From: Sean Yesmunt <sean@lbry.io>
Date: Mon, 22 Oct 2018 16:46:03 -0400
Subject: [PATCH 1/4] add video to contributing doc

---
 CONTRIBUTING.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 881248880..29bb39afc 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -14,6 +14,7 @@ However, for those individuals who want a bit more guidance on the best way to c
   someone reserved less than 3 days ago
 * Submit a pull request and get paid in LBC
 * Don't hesitate to contact us with any questions or comments
+* [Check out this video for a quickstart guide to running and developing the desktop app](https://spee.ch/7da73fc508ffc4ff8b2711e3c3950110430b0c5f/LBRYAppDesign.mp4).
 
 ## Choose an Issue
 
-- 
2.45.3


From 490e9beed32b2b2add690f04b6c023a85bbf578d Mon Sep 17 00:00:00 2001
From: Jessop Breth <jessopb@gmail.com>
Date: Mon, 22 Oct 2018 22:02:19 -0400
Subject: [PATCH 2/4] persist fileList sorting

---
 CHANGELOG.md                                  |  1 +
 src/renderer/component/fileList/index.js      | 12 ++++---
 src/renderer/component/fileList/view.jsx      | 36 +++++++------------
 src/renderer/page/fileListDownloaded/index.js |  2 ++
 src/renderer/page/fileListDownloaded/view.jsx |  6 ++--
 src/renderer/page/fileListPublished/index.js  |  3 +-
 src/renderer/page/fileListPublished/view.jsx  | 12 +++++--
 src/renderer/page/subscriptions/index.js      |  2 ++
 src/renderer/page/subscriptions/view.jsx      | 13 +++++--
 9 files changed, 52 insertions(+), 35 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 356c1bfd7..be36182d8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
  * Content loading placeholder styles on FileCard/FileTile ([#2022](https://github.com/lbryio/lbry-desktop/pull/2022))
  * Persistence to Transaction List Filter Selection ([#2048](https://github.com/lbryio/lbry-desktop/pull/2048))
  * Subscription improvements ([#2031](https://github.com/lbryio/lbry-desktop/pull/2031))
+ * Adds Persistence to File List Filter Selections ([#2050](https://github.com/lbryio/lbry-desktop/pull/2050))
 
 ### Changed
  * Make tooltip smarter ([#1979](https://github.com/lbryio/lbry-desktop/pull/1979))
diff --git a/src/renderer/component/fileList/index.js b/src/renderer/component/fileList/index.js
index 0bcb519e5..b6c075cf9 100644
--- a/src/renderer/component/fileList/index.js
+++ b/src/renderer/component/fileList/index.js
@@ -1,12 +1,16 @@
-import React from 'react';
 import { connect } from 'react-redux';
+import { selectClaimsById, doSetFileListSort } from 'lbry-redux';
 import FileList from './view';
-import { selectClaimsById } from 'lbry-redux';
 
 const select = state => ({
   claimsById: selectClaimsById(state),
 });
 
-const perform = dispatch => ({});
+const perform = dispatch => ({
+  setFileListSort: (page, value) => dispatch(doSetFileListSort(page, value)),
+});
 
-export default connect(select, perform)(FileList);
+export default connect(
+  select,
+  perform
+)(FileList);
diff --git a/src/renderer/component/fileList/view.jsx b/src/renderer/component/fileList/view.jsx
index 182461a48..b2b1eaa45 100644
--- a/src/renderer/component/fileList/view.jsx
+++ b/src/renderer/component/fileList/view.jsx
@@ -1,6 +1,6 @@
 // @flow
 import * as React from 'react';
-import { buildURI } from 'lbry-redux';
+import { buildURI, SORT_OPTIONS } from 'lbry-redux';
 import { FormField } from 'component/common/form';
 import FileCard from 'component/fileCard';
 import type { FileInfo } from 'types/file_info';
@@ -11,28 +11,22 @@ type Props = {
   claimsById: Array<{}>,
   fileInfos: Array<FileInfo>,
   checkPending?: boolean,
-};
-
-type State = {
   sortBy: string,
+  page: string,
+  setFileListSort: (string, string) => void,
 };
 
-class FileList extends React.PureComponent<Props, State> {
+class FileList extends React.PureComponent<Props> {
   static defaultProps = {
     hideFilter: false,
   };
 
   constructor(props: Props) {
     super(props);
-
-    this.state = {
-      sortBy: 'dateNew',
-    };
-
     (this: any).handleSortChanged = this.handleSortChanged.bind(this);
 
     this.sortFunctions = {
-      dateNew: fileInfos =>
+      [SORT_OPTIONS.DATE_NEW]: fileInfos =>
         this.props.sortByHeight
           ? fileInfos.sort((fileInfo1, fileInfo2) => {
               if (fileInfo1.pending) {
@@ -57,7 +51,7 @@ class FileList extends React.PureComponent<Props, State> {
               return 0;
             })
           : [...fileInfos].reverse(),
-      dateOld: fileInfos =>
+      [SORT_OPTIONS.DATE_OLD]: fileInfos =>
         this.props.sortByHeight
           ? fileInfos.slice().sort((fileInfo1, fileInfo2) => {
               const height1 = this.props.claimsById[fileInfo1.claim_id]
@@ -74,7 +68,7 @@ class FileList extends React.PureComponent<Props, State> {
               return 0;
             })
           : fileInfos,
-      title: fileInfos =>
+      [SORT_OPTIONS.TITLE]: fileInfos =>
         fileInfos.slice().sort((fileInfo1, fileInfo2) => {
           const getFileTitle = fileInfo => {
             const { value, metadata, name, claim_name: claimName } = fileInfo;
@@ -98,7 +92,7 @@ class FileList extends React.PureComponent<Props, State> {
           }
           return 0;
         }),
-      filename: fileInfos =>
+      [SORT_OPTIONS.FILENAME]: fileInfos =>
         fileInfos.slice().sort(({ file_name: fileName1 }, { file_name: fileName2 }) => {
           const fileName1Lower = fileName1.toLowerCase();
           const fileName2Lower = fileName2.toLowerCase();
@@ -124,18 +118,14 @@ class FileList extends React.PureComponent<Props, State> {
   };
 
   handleSortChanged(event: SyntheticInputEvent<*>) {
-    this.setState({
-      sortBy: event.target.value,
-    });
+    this.props.setFileListSort(this.props.page, event.target.value);
   }
 
   sortFunctions: {};
 
   render() {
-    const { fileInfos, hideFilter, checkPending } = this.props;
-    const { sortBy } = this.state;
+    const { fileInfos, hideFilter, checkPending, sortBy } = this.props;
     const content = [];
-
     if (!fileInfos) {
       return null;
     }
@@ -174,9 +164,9 @@ class FileList extends React.PureComponent<Props, State> {
               value={sortBy}
               onChange={this.handleSortChanged}
             >
-              <option value="dateNew">{__('Newest First')}</option>
-              <option value="dateOld">{__('Oldest First')}</option>
-              <option value="title">{__('Title')}</option>
+              <option value={SORT_OPTIONS.DATE_NEW}>{__('Newest First')}</option>
+              <option value={SORT_OPTIONS.DATE_OLD}>{__('Oldest First')}</option>
+              <option value={SORT_OPTIONS.TITLE}>{__('Title')}</option>
             </FormField>
           </div>
         )}
diff --git a/src/renderer/page/fileListDownloaded/index.js b/src/renderer/page/fileListDownloaded/index.js
index 3542431c7..cfc3e4588 100644
--- a/src/renderer/page/fileListDownloaded/index.js
+++ b/src/renderer/page/fileListDownloaded/index.js
@@ -3,6 +3,7 @@ import {
   selectFileInfosDownloaded,
   selectMyClaimsWithoutChannels,
   selectIsFetchingFileList,
+  selectFileListDownloadedSort,
 } from 'lbry-redux';
 import { doNavigate } from 'redux/actions/navigation';
 import FileListDownloaded from './view';
@@ -11,6 +12,7 @@ const select = state => ({
   fileInfos: selectFileInfosDownloaded(state),
   fetching: selectIsFetchingFileList(state),
   claims: selectMyClaimsWithoutChannels(state),
+  sortBy: selectFileListDownloadedSort(state),
 });
 
 const perform = dispatch => ({
diff --git a/src/renderer/page/fileListDownloaded/view.jsx b/src/renderer/page/fileListDownloaded/view.jsx
index 79e8e80fb..65045154d 100644
--- a/src/renderer/page/fileListDownloaded/view.jsx
+++ b/src/renderer/page/fileListDownloaded/view.jsx
@@ -3,22 +3,24 @@ import React from 'react';
 import Button from 'component/button';
 import FileList from 'component/fileList';
 import Page from 'component/page';
+import { PAGES } from 'lbry-redux';
 
 type Props = {
   fetching: boolean,
   fileInfos: {},
   navigate: (string, ?{}) => void,
+  sortBy: string,
 };
 
 class FileListDownloaded extends React.PureComponent<Props> {
   render() {
-    const { fetching, fileInfos, navigate } = this.props;
+    const { fetching, fileInfos, navigate, sortBy } = this.props;
     const hasDownloads = fileInfos && Object.values(fileInfos).length > 0;
 
     return (
       <Page notContained loading={fetching}>
         {hasDownloads ? (
-          <FileList fileInfos={fileInfos} />
+          <FileList fileInfos={fileInfos} sortBy={sortBy} page={PAGES.DOWNLOADED} />
         ) : (
           <div className="page__empty">
             <h3 className="card__title">{__("You haven't downloaded anything from LBRY yet.")}</h3>
diff --git a/src/renderer/page/fileListPublished/index.js b/src/renderer/page/fileListPublished/index.js
index 81ce5cc47..871c44ed5 100644
--- a/src/renderer/page/fileListPublished/index.js
+++ b/src/renderer/page/fileListPublished/index.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
 import { selectPendingPublishes, selectClaimsWithPendingPublishes } from 'redux/selectors/publish';
-import { selectIsFetchingClaimListMine } from 'lbry-redux';
+import { selectIsFetchingClaimListMine, selectFileListPublishedSort } from 'lbry-redux';
 import { doNavigate } from 'redux/actions/navigation';
 import { doCheckPendingPublishes } from 'redux/actions/publish';
 import FileListPublished from './view';
@@ -9,6 +9,7 @@ const select = state => ({
   claims: selectClaimsWithPendingPublishes(state),
   fetching: selectIsFetchingClaimListMine(state),
   pendingPublishes: selectPendingPublishes(state),
+  sortBy: selectFileListPublishedSort(state),
 });
 
 const perform = dispatch => ({
diff --git a/src/renderer/page/fileListPublished/view.jsx b/src/renderer/page/fileListPublished/view.jsx
index 8b9b1b84c..d25fb8c9b 100644
--- a/src/renderer/page/fileListPublished/view.jsx
+++ b/src/renderer/page/fileListPublished/view.jsx
@@ -3,6 +3,7 @@ import React from 'react';
 import Button from 'component/button';
 import FileList from 'component/fileList';
 import Page from 'component/page';
+import { PAGES } from 'lbry-redux';
 
 type Props = {
   pendingPublishes: Array<{}>,
@@ -10,6 +11,7 @@ type Props = {
   checkIfPublishesConfirmed: (Array<{}>) => void,
   navigate: (string, ?{}) => void,
   fetching: boolean,
+  sortBy: string,
 };
 
 class FileListPublished extends React.PureComponent<Props> {
@@ -21,12 +23,18 @@ class FileListPublished extends React.PureComponent<Props> {
   }
 
   render() {
-    const { fetching, claims, navigate } = this.props;
+    const { fetching, claims, navigate, sortBy } = this.props;
 
     return (
       <Page notContained loading={fetching}>
         {claims && claims.length ? (
-          <FileList checkPending fileInfos={claims} sortByHeight />
+          <FileList
+            checkPending
+            fileInfos={claims}
+            sortByHeight
+            sortBy={sortBy}
+            page={PAGES.PUBLISHED}
+          />
         ) : (
           <div className="page__empty">
             <h3 className="card__title">
diff --git a/src/renderer/page/subscriptions/index.js b/src/renderer/page/subscriptions/index.js
index a62734e5d..70fb57fc3 100644
--- a/src/renderer/page/subscriptions/index.js
+++ b/src/renderer/page/subscriptions/index.js
@@ -15,6 +15,7 @@ import {
 } from 'redux/actions/subscriptions';
 import { doSetClientSetting } from 'redux/actions/settings';
 import { makeSelectClientSetting } from 'redux/selectors/settings';
+import { selectFileListSubscriptionSort } from 'lbry-redux';
 import SubscriptionsPage from './view';
 
 const select = state => ({
@@ -25,6 +26,7 @@ const select = state => ({
   autoDownload: makeSelectClientSetting(settings.AUTO_DOWNLOAD)(state),
   allSubscriptions: selectSubscriptionClaims(state),
   unreadSubscriptions: selectUnreadSubscriptions(state),
+  sortBy: selectFileListSubscriptionSort(state),
   viewMode: selectViewMode(state),
 });
 
diff --git a/src/renderer/page/subscriptions/view.jsx b/src/renderer/page/subscriptions/view.jsx
index 5b7b80578..fa039d318 100644
--- a/src/renderer/page/subscriptions/view.jsx
+++ b/src/renderer/page/subscriptions/view.jsx
@@ -10,7 +10,7 @@ import FileList from 'component/fileList';
 import HiddenNsfwClaims from 'component/hiddenNsfwClaims';
 import { FormField } from 'component/common/form';
 import FileCard from 'component/fileCard';
-import { parseURI } from 'lbry-redux';
+import { parseURI, PAGES } from 'lbry-redux';
 
 type Props = {
   subscribedChannels: Array<string>, // The channels a user is subscribed to
@@ -25,6 +25,7 @@ type Props = {
   doSetViewMode: ViewMode => void,
   doFetchMySubscriptions: () => void,
   doSetClientSetting: (string, boolean) => void,
+  sortBy: string,
 };
 
 export default class extends React.PureComponent<Props> {
@@ -44,13 +45,19 @@ export default class extends React.PureComponent<Props> {
   }
 
   renderSubscriptions() {
-    const { viewMode, unreadSubscriptions, allSubscriptions } = this.props;
+    const { viewMode, unreadSubscriptions, allSubscriptions, sortBy } = this.props;
 
     if (viewMode === VIEW_ALL) {
       return (
         <React.Fragment>
           <div className="card__title">{__('Your subscriptions')}</div>
-          <FileList hideFilter sortByHeight fileInfos={allSubscriptions} />
+          <FileList
+            hideFilter
+            sortByHeight
+            fileInfos={allSubscriptions}
+            sortBy={sortBy}
+            page={PAGES.SUBSCRIPTIONS}
+          />
         </React.Fragment>
       );
     }
-- 
2.45.3


From 50264c3ab2e2c991a76df656f07b420a72bf9a7b Mon Sep 17 00:00:00 2001
From: Sean Yesmunt <sean@lbry.io>
Date: Thu, 25 Oct 2018 01:44:41 -0400
Subject: [PATCH 3/4] update lbry-redux

---
 package.json | 2 +-
 yarn.lock    | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package.json b/package.json
index db3484c92..0dce4c7e0 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,7 @@
     "formik": "^0.10.4",
     "hast-util-sanitize": "^1.1.2",
     "keytar": "^4.2.1",
-    "lbry-redux": "lbryio/lbry-redux#957d221c1830ecbb7a9e74fad78e711fb14539f4",
+    "lbry-redux": "lbryio/lbry-redux#03aea43da5f12bc01546a92bdf460ebd08681013",
     "lbryinc": "lbryio/lbryinc#3f34af546ee73ff2ee7d8ad05e540b3b0aa658fb",
     "localforage": "^1.7.1",
     "mammoth": "^1.4.6",
diff --git a/yarn.lock b/yarn.lock
index dc58dee33..208228689 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5670,9 +5670,9 @@ lbry-redux@lbryio/lbry-redux:
     proxy-polyfill "0.1.6"
     reselect "^3.0.0"
 
-lbry-redux@lbryio/lbry-redux#957d221c1830ecbb7a9e74fad78e711fb14539f4:
+lbry-redux@lbryio/lbry-redux#03aea43da5f12bc01546a92bdf460ebd08681013:
   version "0.0.1"
-  resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/957d221c1830ecbb7a9e74fad78e711fb14539f4"
+  resolved "https://codeload.github.com/lbryio/lbry-redux/tar.gz/03aea43da5f12bc01546a92bdf460ebd08681013"
   dependencies:
     proxy-polyfill "0.1.6"
     reselect "^3.0.0"
-- 
2.45.3


From 78fe88eed77b352fa4fdc06e7ebd9a8d441a4d7a Mon Sep 17 00:00:00 2001
From: Sean Yesmunt <sean@lbry.io>
Date: Thu, 25 Oct 2018 02:01:32 -0400
Subject: [PATCH 4/4] persist fileSort options when the app is closed

---
 src/renderer/store.js | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/renderer/store.js b/src/renderer/store.js
index 1bedc273b..b6e191885 100644
--- a/src/renderer/store.js
+++ b/src/renderer/store.js
@@ -103,15 +103,19 @@ const compressor = createCompressor();
 // const saveClaimsFilter = createFilter('claims', ['byId', 'claimsByUri']);
 const subscriptionsFilter = createFilter('subscriptions', ['subscriptions', 'unread', 'viewMode']);
 const contentFilter = createFilter('content', ['positions', 'history']);
-
+const fileInfoFilter = createFilter('fileInfo', [
+  'fileListPublishedSort',
+  'fileListDownloadedSort',
+  'fileListSubscriptionSort',
+]);
 // We only need to persist the receiveAddress for the wallet
 const walletFilter = createFilter('wallet', ['receiveAddress']);
 
 const persistOptions = {
-  whitelist: ['subscriptions', 'publish', 'wallet', 'content'],
+  whitelist: ['subscriptions', 'publish', 'wallet', 'content', 'fileInfo'],
   // Order is important. Needs to be compressed last or other transforms can't
   // read the data
-  transforms: [subscriptionsFilter, walletFilter, contentFilter, compressor],
+  transforms: [subscriptionsFilter, walletFilter, contentFilter, fileInfoFilter, compressor],
   debounce: 10000,
   storage: localForage,
 };
-- 
2.45.3