From c3dd7f34496dd0cf7c9ad352edecee853d9ff00f Mon Sep 17 00:00:00 2001 From: liamcardenas Date: Mon, 5 Mar 2018 23:44:36 -0800 Subject: [PATCH] Added notifications and downloading upon detecting to subscription items --- src/renderer/constants/action_types.js | 3 ++ src/renderer/redux/actions/app.js | 2 + src/renderer/redux/actions/content.js | 8 +-- src/renderer/redux/actions/subscriptions.js | 52 +++++++++++++++++++- src/renderer/redux/reducers/subscriptions.js | 10 +++- 5 files changed, 69 insertions(+), 6 deletions(-) diff --git a/src/renderer/constants/action_types.js b/src/renderer/constants/action_types.js index ffc20b6bb..584fa7a47 100644 --- a/src/renderer/constants/action_types.js +++ b/src/renderer/constants/action_types.js @@ -165,6 +165,9 @@ export const CHANNEL_SUBSCRIBE = 'CHANNEL_SUBSCRIBE'; export const CHANNEL_UNSUBSCRIBE = 'CHANNEL_UNSUBSCRIBE'; export const HAS_FETCHED_SUBSCRIPTIONS = 'HAS_FETCHED_SUBSCRIPTIONS'; export const SET_SUBSCRIPTION_LATEST = 'SET_SUBSCRIPTION_LATEST'; +export const CHECK_SUBSCRIPTION_STARTED = 'CHECK_SUBSCRIPTION_STARTED'; +export const CHECK_SUBSCRIPTION_COMPLETED = 'CHECK_SUBSCRIPTION_COMPLETED'; +export const CHECK_SUBSCRIPTIONS_SUBSCRIBE = 'CHECK_SUBSCRIPTIONS_SUBSCRIBE'; // Video controls export const SET_VIDEO_PAUSE = 'SET_VIDEO_PAUSE'; diff --git a/src/renderer/redux/actions/app.js b/src/renderer/redux/actions/app.js index 08009c896..f8f6cecdc 100644 --- a/src/renderer/redux/actions/app.js +++ b/src/renderer/redux/actions/app.js @@ -11,6 +11,7 @@ import { doFetchDaemonSettings } from 'redux/actions/settings'; import { doAuthenticate } from 'redux/actions/user'; import { doBalanceSubscribe } from 'redux/actions/wallet'; import { doPause } from 'redux/actions/media'; +import { doCheckSubscriptions } from 'redux/actions/subscriptions'; import { selectCurrentModal, @@ -298,6 +299,7 @@ export function doDaemonReady() { dispatch(doCheckUpgradeAvailable()); } dispatch(doCheckUpgradeSubscribe()); + dispatch(doCheckSubscriptions()); }; } diff --git a/src/renderer/redux/actions/content.js b/src/renderer/redux/actions/content.js index 263470103..d665828d6 100644 --- a/src/renderer/redux/actions/content.js +++ b/src/renderer/redux/actions/content.js @@ -289,7 +289,7 @@ export function doLoadVideo(uri) { }; } -export function doPurchaseUri(uri) { +export function doPurchaseUri(uri, specificCostInfo) { return (dispatch, getState) => { const state = getState(); const balance = selectBalance(state); @@ -322,7 +322,7 @@ export function doPurchaseUri(uri) { return; } - const costInfo = makeSelectCostInfoForUri(uri)(state); + const costInfo = makeSelectCostInfoForUri(uri)(state) || specificCostInfo; const { cost } = costInfo; if (cost > balance) { @@ -359,8 +359,8 @@ export function doFetchClaimsByChannel(uri, page) { const claimResult = result[uri] || {}; const { claims_in_channel: claimsInChannel, returned_page: returnedPage } = claimResult; - if(claimResult && claimResult.claims_in_channel && claimResult.claims_in_channel.length) { - let latest = claimResult.claims_in_channel[0]; + if(claimsInChannel && claimsInChannel.length) { + let latest = claimsInChannel[0]; dispatch(setSubscriptionLatest({ channelName: latest.channel_name, uri: `${latest.channel_name}#${latest.value.publisherSignature.certificateId}` diff --git a/src/renderer/redux/actions/subscriptions.js b/src/renderer/redux/actions/subscriptions.js index 55632c785..5121648e0 100644 --- a/src/renderer/redux/actions/subscriptions.js +++ b/src/renderer/redux/actions/subscriptions.js @@ -1,6 +1,12 @@ // @flow import * as ACTIONS from 'constants/action_types'; -import type { Subscription, Dispatch } from 'redux/reducers/subscriptions'; +import type { Subscription, Dispatch, SubscriptionState } from 'redux/reducers/subscriptions'; +import { selectSubscriptions } from 'redux/selectors/subscriptions'; +import Lbry from 'lbry'; +import { doPurchaseUri } from 'redux/actions/content'; +import { doNavigate } from 'redux/actions/navigation'; + +const CHECK_SUBSCRIPTIONS_INTERVAL = 10 * 60 * 1000; export const doChannelSubscribe = (subscription: Subscription) => (dispatch: Dispatch) => dispatch({ @@ -14,6 +20,50 @@ export const doChannelUnsubscribe = (subscription: Subscription) => (dispatch: D data: subscription, }); +export const doCheckSubscriptions = () => (dispatch: Dispatch, getState: () => SubscriptionState) => { + const checkSubscriptionsTimer = setInterval( + () => selectSubscriptions(getState()).map((subscription: Subscription) => dispatch(doCheckSubscription(subscription))), + CHECK_SUBSCRIPTIONS_INTERVAL + ); + dispatch({ + type: ACTIONS.CHECK_SUBSCRIPTIONS_SUBSCRIBE, + data: { checkSubscriptionsTimer }, + }); +}; + +export const doCheckSubscription = (subscription: Subscription) => (dispatch: Dispatch) => { + dispatch({ + type: ACTIONS.CHECK_SUBSCRIPTION_STARTED, + data: subscription, + }); + + Lbry.claim_list_by_channel({ uri: subscription.uri, page: 1 }).then(result => { + const claimResult = result[subscription.uri] || {}; + const { claims_in_channel: claimsInChannel } = claimResult; + + let count = claimsInChannel.reduce((prev, cur, index) => `${cur.name}#${cur.claim_id}` === subscription.latest ? index : prev, -1) + + if(count !== 0) { + if(!claimsInChannel[0].value.stream.metadata.fee) { + dispatch(doPurchaseUri(`${claimsInChannel[0].name}#${claimsInChannel[0].claim_id}`, {cost: 0})); + } + + const notif = new window.Notification(subscription.channelName, { + body: `Posted ${claimsInChannel[0].value.stream.metadata.title}${count > 1 ? ` and ${count-1} other new items` : '' }${count < 0 ? ' and 9+ other new items' : ''}`, + silent: false, + }); + notif.onclick = () => { + dispatch(doNavigate('/show', { uri: `lbry://${claimsInChannel[0].name}#${claimsInChannel[0].claim_id}` })) + }; + } + + dispatch({ + type: ACTIONS.CHECK_SUBSCRIPTION_COMPLETED, + data: subscription + }); + }); +} + export const setSubscriptionLatest = (subscription: Subscription, uri: string) => (dispatch: Dispatch) => { return dispatch({ diff --git a/src/renderer/redux/reducers/subscriptions.js b/src/renderer/redux/reducers/subscriptions.js index e821b5854..2ef3b17cc 100644 --- a/src/renderer/redux/reducers/subscriptions.js +++ b/src/renderer/redux/reducers/subscriptions.js @@ -37,7 +37,15 @@ type setSubscriptionLatest = { } } -export type Action = doChannelSubscribe | doChannelUnsubscribe | HasFetchedSubscriptions | setSubscriptionLatest; +type CheckSubscriptionStarted = { + type: ACTIONS.CHECK_SUBSCRIPTION_STARTED +} + +type CheckSubscriptionCompleted = { + type: ACTIONS.CHECK_SUBSCRIPTION_COMPLETED +} + +export type Action = doChannelSubscribe | doChannelUnsubscribe | HasFetchedSubscriptions | setSubscriptionLatest | CheckSubscriptionStarted | CheckSubscriptionCompleted | Function; export type Dispatch = (action: Action) => any; const defaultState = {