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

117 lines
3.4 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';
const CHECK_SUBSCRIPTIONS_INTERVAL = 10 * 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))
),
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;
2018-03-06 09:36:04 +01:00
let count = subscription.latest
? claimsInChannel.reduce(
(prev, cur, index) =>
`${cur.name}#${cur.claim_id}` === subscription.latest ? index : prev,
-1
)
: 1;
2018-03-06 09:36:04 +01:00
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, {
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', {
uri: `lbry://${claimsInChannel[0].name}#${claimsInChannel[0].claim_id}`,
})
);
};
}
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 checkSubscriptionLatest = (channel: Subscription, uri: string) => (
dispatch: Dispatch
) => {
Lbry.claim_list_by_channel({ uri: channel.uri, page: 1 }).then(result => {
const claimResult = result[channel.uri] || {};
const { claims_in_channel: claimsInChannel } = claimResult;
2018-03-06 09:36:04 +01:00
if (
claimsInChannel &&
claimsInChannel.length &&
`${claimsInChannel[0].name}#${claimsInChannel[0].claim_id}` === uri
) {
dispatch(setSubscriptionLatest(channel, uri));
}
});
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 });