From a5d486bd3bf2e7570318e8dc08340baf4a112b18 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 22 May 2019 16:39:45 +0100 Subject: [PATCH 1/5] remove uri from failed purchase uris for a new purchase --- flow-typed/File.js | 8 ++++++++ src/redux/reducers/file.js | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/flow-typed/File.js b/flow-typed/File.js index 4384d3f..80cc437 100644 --- a/flow-typed/File.js +++ b/flow-typed/File.js @@ -55,3 +55,11 @@ declare type PurchaseUriFailed = { uri: string }, }; + +declare type PurchaseUriStarted = { + type: ACTIONS.PURCHASE_URI_STARTED, + data: { + uri: string, + streamingUrl: string, + }, +}; \ No newline at end of file diff --git a/src/redux/reducers/file.js b/src/redux/reducers/file.js index 2e593fa..8eaca17 100644 --- a/src/redux/reducers/file.js +++ b/src/redux/reducers/file.js @@ -8,6 +8,22 @@ const defaultState = { purchasedStreamingUrls: {}, }; +reducers[ACTIONS.PURCHASE_URI_STARTED] = ( + state: FileState, + action: PurchaseUriStarted +): FileState => { + const { uri } = action.data; + const newFailedPurchaseUris = state.failedPurchaseUris.slice(); + if (newFailedPurchaseUris.includes(uri)) { + newFailedPurchaseUris.splice(newFailedPurchaseUris.indexOf(uri), 1); + } + + return { + ...state, + failedPurchaseUris: newFailedPurchaseUris, + }; +}; + reducers[ACTIONS.PURCHASE_URI_COMPLETED] = ( state: FileState, action: PurchaseUriCompleted -- 2.45.3 From 5cff70a26b05b40f2693bbae6bf50100a6781e50 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 22 May 2019 17:37:25 +0100 Subject: [PATCH 2/5] update bundle and type --- dist/bundle.es.js | 12 ++++++++++++ dist/flow-typed/File.js | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/dist/bundle.es.js b/dist/bundle.es.js index 4bbe81d..b55ae23 100644 --- a/dist/bundle.es.js +++ b/dist/bundle.es.js @@ -2917,6 +2917,18 @@ const defaultState$1 = { purchasedStreamingUrls: {} }; +reducers$1[PURCHASE_URI_STARTED] = (state, action) => { + const { uri } = action.data; + const newFailedPurchaseUris = state.failedPurchaseUris.slice(); + if (newFailedPurchaseUris.includes(uri)) { + newFailedPurchaseUris.splice(newFailedPurchaseUris.indexOf(uri), 1); + } + + return _extends$4({}, state, { + failedPurchaseUris: newFailedPurchaseUris + }); +}; + reducers$1[PURCHASE_URI_COMPLETED] = (state, action) => { const { uri, streamingUrl } = action.data; const newPurchasedUris = state.purchasedUris.slice(); diff --git a/dist/flow-typed/File.js b/dist/flow-typed/File.js index 4384d3f..80cc437 100644 --- a/dist/flow-typed/File.js +++ b/dist/flow-typed/File.js @@ -55,3 +55,11 @@ declare type PurchaseUriFailed = { uri: string }, }; + +declare type PurchaseUriStarted = { + type: ACTIONS.PURCHASE_URI_STARTED, + data: { + uri: string, + streamingUrl: string, + }, +}; \ No newline at end of file -- 2.45.3 From 071bfe9eacd1853cee28228caa54c1caadacbbd6 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 24 May 2019 14:13:21 +0100 Subject: [PATCH 3/5] add doDeletePurchasedUri action --- dist/bundle.es.js | 22 ++++++++++++++++++++++ dist/flow-typed/File.js | 9 ++++++++- flow-typed/File.js | 9 ++++++++- src/constants/action_types.js | 1 + src/index.js | 2 +- src/redux/actions/file.js | 7 +++++++ src/redux/reducers/file.js | 16 ++++++++++++++++ 7 files changed, 63 insertions(+), 3 deletions(-) diff --git a/dist/bundle.es.js b/dist/bundle.es.js index b55ae23..51655f4 100644 --- a/dist/bundle.es.js +++ b/dist/bundle.es.js @@ -119,6 +119,7 @@ const SET_FILE_LIST_SORT = 'SET_FILE_LIST_SORT'; const PURCHASE_URI_STARTED = 'PURCHASE_URI_STARTED'; const PURCHASE_URI_COMPLETED = 'PURCHASE_URI_COMPLETED'; const PURCHASE_URI_FAILED = 'PURCHASE_URI_FAILED'; +const DELETE_PURCHASED_URI = 'DELETE_PURCHASED_URI'; const LOADING_FILE_STARTED = 'LOADING_FILE_STARTED'; const LOADING_FILE_COMPLETED = 'LOADING_FILE_COMPLETED'; const LOADING_FILE_FAILED = 'LOADING_FILE_FAILED'; @@ -341,6 +342,7 @@ var action_types = /*#__PURE__*/Object.freeze({ PURCHASE_URI_STARTED: PURCHASE_URI_STARTED, PURCHASE_URI_COMPLETED: PURCHASE_URI_COMPLETED, PURCHASE_URI_FAILED: PURCHASE_URI_FAILED, + DELETE_PURCHASED_URI: DELETE_PURCHASED_URI, LOADING_FILE_STARTED: LOADING_FILE_STARTED, LOADING_FILE_COMPLETED: LOADING_FILE_COMPLETED, LOADING_FILE_FAILED: LOADING_FILE_FAILED, @@ -2417,6 +2419,13 @@ function doPurchaseUri(uri, costInfo, saveFile = true) { }; } +function doDeletePurchasedUri(uri) { + return { + type: DELETE_PURCHASED_URI, + data: { uri } + }; +} + function doFetchFileInfo(uri) { return (dispatch, getState) => { const state = getState(); @@ -2964,6 +2973,18 @@ reducers$1[PURCHASE_URI_FAILED] = (state, action) => { }); }; +reducers$1[DELETE_PURCHASED_URI] = (state, action) => { + const { uri } = action.data; + const newPurchasedUris = state.purchasedUris.slice(); + if (newPurchasedUris.includes(uri)) { + newPurchasedUris.splice(newPurchasedUris.indexOf(uri), 1); + } + + return _extends$4({}, state, { + purchasedUris: newPurchasedUris + }); +}; + function fileReducer(state = defaultState$1, action) { const handler = reducers$1[action.type]; if (handler) return handler(state, action); @@ -3663,6 +3684,7 @@ exports.doBalanceSubscribe = doBalanceSubscribe; exports.doBlurSearchInput = doBlurSearchInput; exports.doCheckAddressIsMine = doCheckAddressIsMine; exports.doCreateChannel = doCreateChannel; +exports.doDeletePurchasedUri = doDeletePurchasedUri; exports.doDismissError = doDismissError; exports.doDismissToast = doDismissToast; exports.doError = doError; diff --git a/dist/flow-typed/File.js b/dist/flow-typed/File.js index 80cc437..46eea47 100644 --- a/dist/flow-typed/File.js +++ b/dist/flow-typed/File.js @@ -62,4 +62,11 @@ declare type PurchaseUriStarted = { uri: string, streamingUrl: string, }, -}; \ No newline at end of file +}; + +declare type DeletePurchasedUri = { + type: ACTIONS.DELETE_PURCHASED_URI, + data: { + uri: string + }, +}; diff --git a/flow-typed/File.js b/flow-typed/File.js index 80cc437..46eea47 100644 --- a/flow-typed/File.js +++ b/flow-typed/File.js @@ -62,4 +62,11 @@ declare type PurchaseUriStarted = { uri: string, streamingUrl: string, }, -}; \ No newline at end of file +}; + +declare type DeletePurchasedUri = { + type: ACTIONS.DELETE_PURCHASED_URI, + data: { + uri: string + }, +}; diff --git a/src/constants/action_types.js b/src/constants/action_types.js index 9582f77..cb1cdd0 100644 --- a/src/constants/action_types.js +++ b/src/constants/action_types.js @@ -109,6 +109,7 @@ export const SET_FILE_LIST_SORT = 'SET_FILE_LIST_SORT'; export const PURCHASE_URI_STARTED = 'PURCHASE_URI_STARTED'; export const PURCHASE_URI_COMPLETED = 'PURCHASE_URI_COMPLETED'; export const PURCHASE_URI_FAILED = 'PURCHASE_URI_FAILED'; +export const DELETE_PURCHASED_URI = 'DELETE_PURCHASED_URI'; export const LOADING_FILE_STARTED = 'LOADING_FILE_STARTED'; export const LOADING_FILE_COMPLETED = 'LOADING_FILE_COMPLETED'; export const LOADING_FILE_FAILED = 'LOADING_FILE_FAILED'; diff --git a/src/index.js b/src/index.js index 9265f41..a7735ca 100644 --- a/src/index.js +++ b/src/index.js @@ -47,7 +47,7 @@ export { doCreateChannel, } from 'redux/actions/claims'; -export { doPurchaseUri, doFileGet } from 'redux/actions/file'; +export { doDeletePurchasedUri, doPurchaseUri, doFileGet } from 'redux/actions/file'; export { doFetchFileInfo, diff --git a/src/redux/actions/file.js b/src/redux/actions/file.js index 6d7bb37..28ccf39 100644 --- a/src/redux/actions/file.js +++ b/src/redux/actions/file.js @@ -102,3 +102,10 @@ export function doPurchaseUri(uri: string, costInfo: { cost: number }, saveFile: dispatch(doFileGet(uri, saveFile)); }; } + +export function doDeletePurchasedUri(uri: string) { + return { + type: ACTIONS.DELETE_PURCHASED_URI, + data: { uri }, + }; +} diff --git a/src/redux/reducers/file.js b/src/redux/reducers/file.js index 8eaca17..8dc6231 100644 --- a/src/redux/reducers/file.js +++ b/src/redux/reducers/file.js @@ -67,6 +67,22 @@ reducers[ACTIONS.PURCHASE_URI_FAILED] = ( }; }; +reducers[ACTIONS.DELETE_PURCHASED_URI] = ( + state: FileState, + action: DeletePurchasedUri +): FileState => { + const { uri } = action.data; + const newPurchasedUris = state.purchasedUris.slice(); + if (newPurchasedUris.includes(uri)) { + newPurchasedUris.splice(newPurchasedUris.indexOf(uri), 1); + } + + return { + ...state, + purchasedUris: newPurchasedUris, + }; +}; + export function fileReducer(state: FileState = defaultState, action: any) { const handler = reducers[action.type]; if (handler) return handler(state, action); -- 2.45.3 From 95cc2bb14db91350be267de6136d4902d74c5d30 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 26 May 2019 09:45:56 +0100 Subject: [PATCH 4/5] add parseFloat for costInfo.cost --- src/redux/actions/file.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/redux/actions/file.js b/src/redux/actions/file.js index 28ccf39..50f318f 100644 --- a/src/redux/actions/file.js +++ b/src/redux/actions/file.js @@ -89,7 +89,7 @@ export function doPurchaseUri(uri: string, costInfo: { cost: number }, saveFile: const { cost } = costInfo; - if (cost > balance) { + if (parseFloat(cost) > balance) { dispatch({ type: ACTIONS.PURCHASE_URI_FAILED, data: { uri, error: 'Insufficient credits' }, -- 2.45.3 From 152065b6c99a00ed813783d18c24f19cc1b6d20e Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 26 May 2019 11:01:46 +0100 Subject: [PATCH 5/5] add purhcaseUriErrorMessage and more failure handling --- dist/bundle.es.js | 21 ++++++++++++++------- dist/flow-typed/File.js | 3 ++- flow-typed/File.js | 3 ++- src/index.js | 1 + src/redux/actions/file.js | 1 - src/redux/reducers/file.js | 7 ++++++- src/redux/selectors/file.js | 5 +++++ 7 files changed, 30 insertions(+), 11 deletions(-) diff --git a/dist/bundle.es.js b/dist/bundle.es.js index 51655f4..e4694f3 100644 --- a/dist/bundle.es.js +++ b/dist/bundle.es.js @@ -2321,6 +2321,8 @@ const selectFileListDownloadedSort = reselect.createSelector(selectState$3, stat const selectState$4 = state => state.file || {}; +const selectPurchaseUriErrorMessage = reselect.createSelector(selectState$4, state => state.purchaseUriErrorMessage); + const selectFailedPurchaseUris = reselect.createSelector(selectState$4, state => state.failedPurchaseUris); const selectPurchasedUris = reselect.createSelector(selectState$4, state => state.purchasedUris); @@ -2406,8 +2408,7 @@ function doPurchaseUri(uri, costInfo, saveFile = true) { } const { cost } = costInfo; - - if (cost > balance) { + if (parseFloat(cost) > balance) { dispatch({ type: PURCHASE_URI_FAILED, data: { uri, error: 'Insufficient credits' } @@ -2923,7 +2924,8 @@ const reducers$1 = {}; const defaultState$1 = { failedPurchaseUris: [], purchasedUris: [], - purchasedStreamingUrls: {} + purchasedStreamingUrls: {}, + purchaseUriErrorMessage: '' }; reducers$1[PURCHASE_URI_STARTED] = (state, action) => { @@ -2934,7 +2936,8 @@ reducers$1[PURCHASE_URI_STARTED] = (state, action) => { } return _extends$4({}, state, { - failedPurchaseUris: newFailedPurchaseUris + failedPurchaseUris: newFailedPurchaseUris, + purchaseUriErrorMessage: '' }); }; @@ -2957,19 +2960,22 @@ reducers$1[PURCHASE_URI_COMPLETED] = (state, action) => { return _extends$4({}, state, { failedPurchaseUris: newFailedPurchaseUris, purchasedUris: newPurchasedUris, - purchasedStreamingUrls: newPurchasedStreamingUrls + purchasedStreamingUrls: newPurchasedStreamingUrls, + purchaseUriErrorMessage: '' }); }; reducers$1[PURCHASE_URI_FAILED] = (state, action) => { - const { uri } = action.data; + const { uri, error } = action.data; const newFailedPurchaseUris = state.failedPurchaseUris.slice(); + if (!newFailedPurchaseUris.includes(uri)) { newFailedPurchaseUris.push(uri); } return _extends$4({}, state, { - failedPurchaseUris: newFailedPurchaseUris + failedPurchaseUris: newFailedPurchaseUris, + purchaseUriErrorMessage: error }); }; @@ -3806,6 +3812,7 @@ exports.selectMyClaimsWithoutChannels = selectMyClaimsWithoutChannels; exports.selectPendingById = selectPendingById; exports.selectPendingClaims = selectPendingClaims; exports.selectPlayingUri = selectPlayingUri; +exports.selectPurchaseUriErrorMessage = selectPurchaseUriErrorMessage; exports.selectPurchasedStreamingUrls = selectPurchasedStreamingUrls; exports.selectPurchasedUris = selectPurchasedUris; exports.selectReceiveAddress = selectReceiveAddress; diff --git a/dist/flow-typed/File.js b/dist/flow-typed/File.js index 46eea47..42c9b16 100644 --- a/dist/flow-typed/File.js +++ b/dist/flow-typed/File.js @@ -52,7 +52,8 @@ declare type PurchaseUriCompleted = { declare type PurchaseUriFailed = { type: ACTIONS.PURCHASE_URI_FAILED, data: { - uri: string + uri: string, + error: any }, }; diff --git a/flow-typed/File.js b/flow-typed/File.js index 46eea47..42c9b16 100644 --- a/flow-typed/File.js +++ b/flow-typed/File.js @@ -52,7 +52,8 @@ declare type PurchaseUriCompleted = { declare type PurchaseUriFailed = { type: ACTIONS.PURCHASE_URI_FAILED, data: { - uri: string + uri: string, + error: any }, }; diff --git a/src/index.js b/src/index.js index a7735ca..848d0e5 100644 --- a/src/index.js +++ b/src/index.js @@ -111,6 +111,7 @@ export { selectFailedPurchaseUris, selectPurchasedUris, selectPurchasedStreamingUrls, + selectPurchaseUriErrorMessage, selectLastPurchasedUri, makeSelectStreamingUrlForUri, } from 'redux/selectors/file'; diff --git a/src/redux/actions/file.js b/src/redux/actions/file.js index 50f318f..337f85f 100644 --- a/src/redux/actions/file.js +++ b/src/redux/actions/file.js @@ -88,7 +88,6 @@ export function doPurchaseUri(uri: string, costInfo: { cost: number }, saveFile: } const { cost } = costInfo; - if (parseFloat(cost) > balance) { dispatch({ type: ACTIONS.PURCHASE_URI_FAILED, diff --git a/src/redux/reducers/file.js b/src/redux/reducers/file.js index 8dc6231..95a3b7e 100644 --- a/src/redux/reducers/file.js +++ b/src/redux/reducers/file.js @@ -6,6 +6,7 @@ const defaultState = { failedPurchaseUris: [], purchasedUris: [], purchasedStreamingUrls: {}, + purchaseUriErrorMessage: '', }; reducers[ACTIONS.PURCHASE_URI_STARTED] = ( @@ -21,6 +22,7 @@ reducers[ACTIONS.PURCHASE_URI_STARTED] = ( return { ...state, failedPurchaseUris: newFailedPurchaseUris, + purchaseUriErrorMessage: '', }; }; @@ -48,6 +50,7 @@ reducers[ACTIONS.PURCHASE_URI_COMPLETED] = ( failedPurchaseUris: newFailedPurchaseUris, purchasedUris: newPurchasedUris, purchasedStreamingUrls: newPurchasedStreamingUrls, + purchaseUriErrorMessage: '', }; }; @@ -55,8 +58,9 @@ reducers[ACTIONS.PURCHASE_URI_FAILED] = ( state: FileState, action: PurchaseUriFailed ): FileState => { - const { uri } = action.data; + const { uri, error } = action.data; const newFailedPurchaseUris = state.failedPurchaseUris.slice(); + if (!newFailedPurchaseUris.includes(uri)) { newFailedPurchaseUris.push(uri); } @@ -64,6 +68,7 @@ reducers[ACTIONS.PURCHASE_URI_FAILED] = ( return { ...state, failedPurchaseUris: newFailedPurchaseUris, + purchaseUriErrorMessage: error, }; }; diff --git a/src/redux/selectors/file.js b/src/redux/selectors/file.js index 11caee5..7e0a1a1 100644 --- a/src/redux/selectors/file.js +++ b/src/redux/selectors/file.js @@ -5,6 +5,11 @@ type State = { file: FileState }; export const selectState = (state: State): FileState => state.file || {}; +export const selectPurchaseUriErrorMessage: (state: State) => string = createSelector( + selectState, + state => state.purchaseUriErrorMessage +); + export const selectFailedPurchaseUris: (state: State) => Array = createSelector( selectState, state => state.failedPurchaseUris -- 2.45.3