lbry-desktop/src/renderer/redux/actions/subscriptions.js

124 lines
3.6 KiB
JavaScript
Raw Normal View History

2017-12-08 21:14:35 +01:00
// @flow
import * as ACTIONS from 'constants/action_types';
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';
import { buildURI } from 'lbryURI';
2018-03-12 06:34:16 +01:00
const CHECK_SUBSCRIPTIONS_INTERVAL = 60 * 60 * 1000;
2017-12-08 21:14:35 +01:00
export const doChannelSubscribe = (subscription: Subscription) => (dispatch: Dispatch) =>
2017-12-13 22:36:30 +01:00
dispatch({
type: ACTIONS.CHANNEL_SUBSCRIBE,
2017-12-08 21:14:35 +01:00
data: subscription,
});
export const doChannelUnsubscribe = (subscription: Subscription) => (dispatch: Dispatch) =>
2017-12-13 22:36:30 +01:00
dispatch({
type: ACTIONS.CHANNEL_UNSUBSCRIBE,
2017-12-08 21:14:35 +01:00
data: subscription,
});
2018-03-06 09:36:04 +01:00
export const doCheckSubscriptions = () => (
dispatch: Dispatch,
getState: () => SubscriptionState
) => {
const checkSubscriptionsTimer = setInterval(
2018-03-06 09:36:04 +01:00
() =>
selectSubscriptions(getState()).map((subscription: Subscription) =>
dispatch(doCheckSubscription(subscription, true))
2018-03-06 09:36:04 +01:00
),
CHECK_SUBSCRIPTIONS_INTERVAL
);
dispatch({
type: ACTIONS.CHECK_SUBSCRIPTIONS_SUBSCRIBE,
data: { checkSubscriptionsTimer },
});
};
export const doCheckSubscription = (subscription: Subscription, notify?: boolean) => (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;
2018-03-07 20:41:14 +01:00
const count = subscription.latest
2018-03-06 09:36:04 +01:00
? claimsInChannel.reduce(
(prev, cur, index) =>
2018-03-07 20:19:45 +01:00
buildURI({ contentName: cur.name, claimId: cur.claim_id }, false) ===
subscription.latest
? index
: prev,
2018-03-06 09:36:04 +01:00
-1
)
: 1;
if (count !== 0 && notify) {
2018-03-06 09:36:04 +01:00
if (!claimsInChannel[0].value.stream.metadata.fee) {
dispatch(
2018-03-07 20:19:45 +01:00
doPurchaseUri(
buildURI(
{ contentName: claimsInChannel[0].name, claimId: claimsInChannel[0].claim_id },
false
),
{ cost: 0 }
)
2018-03-06 09:36:04 +01:00
);
}
const notif = new window.Notification(subscription.channelName, {
2018-03-06 09:36:04 +01:00
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 = () => {
2018-03-06 09:36:04 +01:00
dispatch(
doNavigate('/show', {
2018-03-07 20:19:45 +01:00
uri: buildURI(
{ contentName: claimsInChannel[0].name, claimId: claimsInChannel[0].claim_id },
true
),
2018-03-06 09:36:04 +01:00
})
);
};
}
dispatch(setSubscriptionLatest({
channelName: claimsInChannel[0].channel_name,
uri: buildURI(
{ channelName: claimsInChannel[0].channel_name, claimId: claimsInChannel[0].claim_id },
false
)
}, buildURI(
{ contentName: claimsInChannel[0].name, claimId: claimsInChannel[0].claim_id },
false
)));
dispatch({
type: ACTIONS.CHECK_SUBSCRIPTION_COMPLETED,
2018-03-06 09:36:04 +01:00
data: subscription,
});
});
2018-03-06 09:36:04 +01:00
};
2018-03-06 09:36:04 +01:00
export const setSubscriptionLatest = (subscription: Subscription, uri: string) => (
dispatch: Dispatch
) =>
dispatch({
type: ACTIONS.SET_SUBSCRIPTION_LATEST,
data: {
subscription,
2018-03-06 09:36:04 +01:00
uri,
},
});
2017-12-13 22:36:30 +01:00
export const setHasFetchedSubscriptions = () => (dispatch: Dispatch) =>
dispatch({ type: ACTIONS.HAS_FETCHED_SUBSCRIPTIONS });