Revert "remove tags from redux (to desktop)"
This reverts commit 22a26be26f
.
This commit is contained in:
parent
16c6ba1a24
commit
77b27fea99
6 changed files with 358 additions and 53 deletions
239
dist/bundle.es.js
vendored
239
dist/bundle.es.js
vendored
|
@ -289,6 +289,11 @@ const FETCH_COST_INFO_STARTED = 'FETCH_COST_INFO_STARTED';
|
||||||
const FETCH_COST_INFO_COMPLETED = 'FETCH_COST_INFO_COMPLETED';
|
const FETCH_COST_INFO_COMPLETED = 'FETCH_COST_INFO_COMPLETED';
|
||||||
const FETCH_COST_INFO_FAILED = 'FETCH_COST_INFO_FAILED';
|
const FETCH_COST_INFO_FAILED = 'FETCH_COST_INFO_FAILED';
|
||||||
|
|
||||||
|
// Tags
|
||||||
|
const TOGGLE_TAG_FOLLOW = 'TOGGLE_TAG_FOLLOW';
|
||||||
|
const TAG_ADD = 'TAG_ADD';
|
||||||
|
const TAG_DELETE = 'TAG_DELETE';
|
||||||
|
|
||||||
// Sync
|
// Sync
|
||||||
const USER_STATE_POPULATE = 'USER_STATE_POPULATE';
|
const USER_STATE_POPULATE = 'USER_STATE_POPULATE';
|
||||||
|
|
||||||
|
@ -531,6 +536,9 @@ var action_types = /*#__PURE__*/Object.freeze({
|
||||||
FETCH_COST_INFO_STARTED: FETCH_COST_INFO_STARTED,
|
FETCH_COST_INFO_STARTED: FETCH_COST_INFO_STARTED,
|
||||||
FETCH_COST_INFO_COMPLETED: FETCH_COST_INFO_COMPLETED,
|
FETCH_COST_INFO_COMPLETED: FETCH_COST_INFO_COMPLETED,
|
||||||
FETCH_COST_INFO_FAILED: FETCH_COST_INFO_FAILED,
|
FETCH_COST_INFO_FAILED: FETCH_COST_INFO_FAILED,
|
||||||
|
TOGGLE_TAG_FOLLOW: TOGGLE_TAG_FOLLOW,
|
||||||
|
TAG_ADD: TAG_ADD,
|
||||||
|
TAG_DELETE: TAG_DELETE,
|
||||||
USER_STATE_POPULATE: USER_STATE_POPULATE
|
USER_STATE_POPULATE: USER_STATE_POPULATE
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -4615,6 +4623,29 @@ function savePosition(claimId, outpoint, position) {
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
|
const doToggleTagFollow = name => ({
|
||||||
|
type: TOGGLE_TAG_FOLLOW,
|
||||||
|
data: {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const doAddTag = name => ({
|
||||||
|
type: TAG_ADD,
|
||||||
|
data: {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const doDeleteTag = name => ({
|
||||||
|
type: TAG_DELETE,
|
||||||
|
data: {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
function parseQueryParams(queryString) {
|
function parseQueryParams(queryString) {
|
||||||
if (queryString === '') return {};
|
if (queryString === '') return {};
|
||||||
const parts = queryString.split('?').pop().split('&').map(p => p.split('='));
|
const parts = queryString.split('?').pop().split('&').map(p => p.split('='));
|
||||||
|
@ -5665,6 +5696,73 @@ const publishReducer = handleActions({
|
||||||
|
|
||||||
var _extends$d = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
var _extends$d = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||||||
|
|
||||||
|
function getDefaultKnownTags() {
|
||||||
|
return DEFAULT_FOLLOWED_TAGS.concat(DEFAULT_KNOWN_TAGS).reduce((tagsMap, tag) => _extends$d({}, tagsMap, {
|
||||||
|
[tag]: { name: tag }
|
||||||
|
}), {});
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultState$5 = {
|
||||||
|
followedTags: [],
|
||||||
|
knownTags: getDefaultKnownTags()
|
||||||
|
};
|
||||||
|
|
||||||
|
const tagsReducer = handleActions({
|
||||||
|
[TOGGLE_TAG_FOLLOW]: (state, action) => {
|
||||||
|
const { followedTags } = state;
|
||||||
|
const { name } = action.data;
|
||||||
|
|
||||||
|
let newFollowedTags = followedTags.slice();
|
||||||
|
|
||||||
|
if (newFollowedTags.includes(name)) {
|
||||||
|
newFollowedTags = newFollowedTags.filter(tag => tag !== name);
|
||||||
|
} else {
|
||||||
|
newFollowedTags.push(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return _extends$d({}, state, {
|
||||||
|
followedTags: newFollowedTags
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
[TAG_ADD]: (state, action) => {
|
||||||
|
const { knownTags } = state;
|
||||||
|
const { name } = action.data;
|
||||||
|
|
||||||
|
let newKnownTags = _extends$d({}, knownTags);
|
||||||
|
newKnownTags[name] = { name };
|
||||||
|
|
||||||
|
return _extends$d({}, state, {
|
||||||
|
knownTags: newKnownTags
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
[TAG_DELETE]: (state, action) => {
|
||||||
|
const { knownTags, followedTags } = state;
|
||||||
|
const { name } = action.data;
|
||||||
|
|
||||||
|
let newKnownTags = _extends$d({}, knownTags);
|
||||||
|
delete newKnownTags[name];
|
||||||
|
const newFollowedTags = followedTags.filter(tag => tag !== name);
|
||||||
|
|
||||||
|
return _extends$d({}, state, {
|
||||||
|
knownTags: newKnownTags,
|
||||||
|
followedTags: newFollowedTags
|
||||||
|
});
|
||||||
|
},
|
||||||
|
[USER_STATE_POPULATE]: (state, action) => {
|
||||||
|
const { tags } = action.data;
|
||||||
|
if (Array.isArray(tags)) {
|
||||||
|
return _extends$d({}, state, {
|
||||||
|
followedTags: tags
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return _extends$d({}, state);
|
||||||
|
}
|
||||||
|
}, defaultState$5);
|
||||||
|
|
||||||
|
var _extends$e = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||||||
|
|
||||||
const buildDraftTransaction = () => ({
|
const buildDraftTransaction = () => ({
|
||||||
amount: undefined,
|
amount: undefined,
|
||||||
address: undefined
|
address: undefined
|
||||||
|
@ -5674,7 +5772,7 @@ const buildDraftTransaction = () => ({
|
||||||
// See details in https://github.com/lbryio/lbry/issues/1307
|
// See details in https://github.com/lbryio/lbry/issues/1307
|
||||||
|
|
||||||
|
|
||||||
const defaultState$5 = {
|
const defaultState$6 = {
|
||||||
balance: undefined,
|
balance: undefined,
|
||||||
totalBalance: undefined,
|
totalBalance: undefined,
|
||||||
reservedBalance: undefined,
|
reservedBalance: undefined,
|
||||||
|
@ -5715,40 +5813,40 @@ const defaultState$5 = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const walletReducer = handleActions({
|
const walletReducer = handleActions({
|
||||||
[FETCH_TRANSACTIONS_STARTED]: state => _extends$d({}, state, {
|
[FETCH_TRANSACTIONS_STARTED]: state => _extends$e({}, state, {
|
||||||
fetchingTransactions: true
|
fetchingTransactions: true
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[FETCH_TRANSACTIONS_COMPLETED]: (state, action) => {
|
[FETCH_TRANSACTIONS_COMPLETED]: (state, action) => {
|
||||||
const byId = _extends$d({}, state.transactions);
|
const byId = _extends$e({}, state.transactions);
|
||||||
|
|
||||||
const { transactions } = action.data;
|
const { transactions } = action.data;
|
||||||
transactions.forEach(transaction => {
|
transactions.forEach(transaction => {
|
||||||
byId[transaction.txid] = transaction;
|
byId[transaction.txid] = transaction;
|
||||||
});
|
});
|
||||||
|
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
transactions: byId,
|
transactions: byId,
|
||||||
fetchingTransactions: false
|
fetchingTransactions: false
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
[FETCH_TXO_PAGE_STARTED]: state => {
|
[FETCH_TXO_PAGE_STARTED]: state => {
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
fetchingTxos: true,
|
fetchingTxos: true,
|
||||||
fetchingTxosError: undefined
|
fetchingTxosError: undefined
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
[FETCH_TXO_PAGE_COMPLETED]: (state, action) => {
|
[FETCH_TXO_PAGE_COMPLETED]: (state, action) => {
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
txoPage: action.data,
|
txoPage: action.data,
|
||||||
fetchingTxos: false
|
fetchingTxos: false
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
[FETCH_TXO_PAGE_FAILED]: (state, action) => {
|
[FETCH_TXO_PAGE_FAILED]: (state, action) => {
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
txoPage: {},
|
txoPage: {},
|
||||||
fetchingTxos: false,
|
fetchingTxos: false,
|
||||||
fetchingTxosError: action.data
|
fetchingTxosError: action.data
|
||||||
|
@ -5756,12 +5854,12 @@ const walletReducer = handleActions({
|
||||||
},
|
},
|
||||||
|
|
||||||
[UPDATE_TXO_FETCH_PARAMS]: (state, action) => {
|
[UPDATE_TXO_FETCH_PARAMS]: (state, action) => {
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
txoFetchParams: action.data
|
txoFetchParams: action.data
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
[FETCH_SUPPORTS_STARTED]: state => _extends$d({}, state, {
|
[FETCH_SUPPORTS_STARTED]: state => _extends$e({}, state, {
|
||||||
fetchingSupports: true
|
fetchingSupports: true
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
@ -5774,7 +5872,7 @@ const walletReducer = handleActions({
|
||||||
byOutpoint[`${txid}:${nout}`] = transaction;
|
byOutpoint[`${txid}:${nout}`] = transaction;
|
||||||
});
|
});
|
||||||
|
|
||||||
return _extends$d({}, state, { supports: byOutpoint, fetchingSupports: false });
|
return _extends$e({}, state, { supports: byOutpoint, fetchingSupports: false });
|
||||||
},
|
},
|
||||||
|
|
||||||
[ABANDON_SUPPORT_STARTED]: (state, action) => {
|
[ABANDON_SUPPORT_STARTED]: (state, action) => {
|
||||||
|
@ -5783,7 +5881,7 @@ const walletReducer = handleActions({
|
||||||
|
|
||||||
currentlyAbandoning[outpoint] = true;
|
currentlyAbandoning[outpoint] = true;
|
||||||
|
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
abandoningSupportsByOutpoint: currentlyAbandoning
|
abandoningSupportsByOutpoint: currentlyAbandoning
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -5796,20 +5894,20 @@ const walletReducer = handleActions({
|
||||||
delete currentlyAbandoning[outpoint];
|
delete currentlyAbandoning[outpoint];
|
||||||
delete byOutpoint[outpoint];
|
delete byOutpoint[outpoint];
|
||||||
|
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
supports: byOutpoint,
|
supports: byOutpoint,
|
||||||
abandoningSupportsById: currentlyAbandoning
|
abandoningSupportsById: currentlyAbandoning
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
[ABANDON_CLAIM_SUPPORT_STARTED]: (state, action) => {
|
[ABANDON_CLAIM_SUPPORT_STARTED]: (state, action) => {
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
abandonClaimSupportError: undefined
|
abandonClaimSupportError: undefined
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
[ABANDON_CLAIM_SUPPORT_PREVIEW]: (state, action) => {
|
[ABANDON_CLAIM_SUPPORT_PREVIEW]: (state, action) => {
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
abandonClaimSupportError: undefined
|
abandonClaimSupportError: undefined
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -5820,36 +5918,36 @@ const walletReducer = handleActions({
|
||||||
|
|
||||||
pendingtxs[claimId] = { txid, type, effective };
|
pendingtxs[claimId] = { txid, type, effective };
|
||||||
|
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
pendingSupportTransactions: pendingtxs,
|
pendingSupportTransactions: pendingtxs,
|
||||||
abandonClaimSupportError: undefined
|
abandonClaimSupportError: undefined
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
[ABANDON_CLAIM_SUPPORT_FAILED]: (state, action) => {
|
[ABANDON_CLAIM_SUPPORT_FAILED]: (state, action) => {
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
abandonClaimSupportError: action.data
|
abandonClaimSupportError: action.data
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
[PENDING_SUPPORTS_UPDATED]: (state, action) => {
|
[PENDING_SUPPORTS_UPDATED]: (state, action) => {
|
||||||
|
|
||||||
return _extends$d({}, state, {
|
return _extends$e({}, state, {
|
||||||
pendingSupportTransactions: action.data
|
pendingSupportTransactions: action.data
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
[GET_NEW_ADDRESS_STARTED]: state => _extends$d({}, state, {
|
[GET_NEW_ADDRESS_STARTED]: state => _extends$e({}, state, {
|
||||||
gettingNewAddress: true
|
gettingNewAddress: true
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[GET_NEW_ADDRESS_COMPLETED]: (state, action) => {
|
[GET_NEW_ADDRESS_COMPLETED]: (state, action) => {
|
||||||
const { address } = action.data;
|
const { address } = action.data;
|
||||||
|
|
||||||
return _extends$d({}, state, { gettingNewAddress: false, receiveAddress: address });
|
return _extends$e({}, state, { gettingNewAddress: false, receiveAddress: address });
|
||||||
},
|
},
|
||||||
|
|
||||||
[UPDATE_BALANCE]: (state, action) => _extends$d({}, state, {
|
[UPDATE_BALANCE]: (state, action) => _extends$e({}, state, {
|
||||||
totalBalance: action.data.totalBalance,
|
totalBalance: action.data.totalBalance,
|
||||||
balance: action.data.balance,
|
balance: action.data.balance,
|
||||||
reservedBalance: action.data.reservedBalance,
|
reservedBalance: action.data.reservedBalance,
|
||||||
|
@ -5858,32 +5956,32 @@ const walletReducer = handleActions({
|
||||||
tipsBalance: action.data.tipsBalance
|
tipsBalance: action.data.tipsBalance
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[CHECK_ADDRESS_IS_MINE_STARTED]: state => _extends$d({}, state, {
|
[CHECK_ADDRESS_IS_MINE_STARTED]: state => _extends$e({}, state, {
|
||||||
checkingAddressOwnership: true
|
checkingAddressOwnership: true
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[CHECK_ADDRESS_IS_MINE_COMPLETED]: state => _extends$d({}, state, {
|
[CHECK_ADDRESS_IS_MINE_COMPLETED]: state => _extends$e({}, state, {
|
||||||
checkingAddressOwnership: false
|
checkingAddressOwnership: false
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[SET_DRAFT_TRANSACTION_AMOUNT]: (state, action) => {
|
[SET_DRAFT_TRANSACTION_AMOUNT]: (state, action) => {
|
||||||
const oldDraft = state.draftTransaction;
|
const oldDraft = state.draftTransaction;
|
||||||
const newDraft = _extends$d({}, oldDraft, { amount: parseFloat(action.data.amount) });
|
const newDraft = _extends$e({}, oldDraft, { amount: parseFloat(action.data.amount) });
|
||||||
|
|
||||||
return _extends$d({}, state, { draftTransaction: newDraft });
|
return _extends$e({}, state, { draftTransaction: newDraft });
|
||||||
},
|
},
|
||||||
|
|
||||||
[SET_DRAFT_TRANSACTION_ADDRESS]: (state, action) => {
|
[SET_DRAFT_TRANSACTION_ADDRESS]: (state, action) => {
|
||||||
const oldDraft = state.draftTransaction;
|
const oldDraft = state.draftTransaction;
|
||||||
const newDraft = _extends$d({}, oldDraft, { address: action.data.address });
|
const newDraft = _extends$e({}, oldDraft, { address: action.data.address });
|
||||||
|
|
||||||
return _extends$d({}, state, { draftTransaction: newDraft });
|
return _extends$e({}, state, { draftTransaction: newDraft });
|
||||||
},
|
},
|
||||||
|
|
||||||
[SEND_TRANSACTION_STARTED]: state => {
|
[SEND_TRANSACTION_STARTED]: state => {
|
||||||
const newDraftTransaction = _extends$d({}, state.draftTransaction, { sending: true });
|
const newDraftTransaction = _extends$e({}, state.draftTransaction, { sending: true });
|
||||||
|
|
||||||
return _extends$d({}, state, { draftTransaction: newDraftTransaction });
|
return _extends$e({}, state, { draftTransaction: newDraftTransaction });
|
||||||
},
|
},
|
||||||
|
|
||||||
[SEND_TRANSACTION_COMPLETED]: state => Object.assign({}, state, {
|
[SEND_TRANSACTION_COMPLETED]: state => Object.assign({}, state, {
|
||||||
|
@ -5896,117 +5994,117 @@ const walletReducer = handleActions({
|
||||||
error: action.data.error
|
error: action.data.error
|
||||||
});
|
});
|
||||||
|
|
||||||
return _extends$d({}, state, { draftTransaction: newDraftTransaction });
|
return _extends$e({}, state, { draftTransaction: newDraftTransaction });
|
||||||
},
|
},
|
||||||
|
|
||||||
[SUPPORT_TRANSACTION_STARTED]: state => _extends$d({}, state, {
|
[SUPPORT_TRANSACTION_STARTED]: state => _extends$e({}, state, {
|
||||||
sendingSupport: true
|
sendingSupport: true
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[SUPPORT_TRANSACTION_COMPLETED]: state => _extends$d({}, state, {
|
[SUPPORT_TRANSACTION_COMPLETED]: state => _extends$e({}, state, {
|
||||||
sendingSupport: false
|
sendingSupport: false
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[SUPPORT_TRANSACTION_FAILED]: (state, action) => _extends$d({}, state, {
|
[SUPPORT_TRANSACTION_FAILED]: (state, action) => _extends$e({}, state, {
|
||||||
error: action.data.error,
|
error: action.data.error,
|
||||||
sendingSupport: false
|
sendingSupport: false
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[CLEAR_SUPPORT_TRANSACTION]: state => _extends$d({}, state, {
|
[CLEAR_SUPPORT_TRANSACTION]: state => _extends$e({}, state, {
|
||||||
sendingSupport: false
|
sendingSupport: false
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_STATUS_COMPLETED]: (state, action) => _extends$d({}, state, {
|
[WALLET_STATUS_COMPLETED]: (state, action) => _extends$e({}, state, {
|
||||||
walletIsEncrypted: action.result
|
walletIsEncrypted: action.result
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_ENCRYPT_START]: state => _extends$d({}, state, {
|
[WALLET_ENCRYPT_START]: state => _extends$e({}, state, {
|
||||||
walletEncryptPending: true,
|
walletEncryptPending: true,
|
||||||
walletEncryptSucceded: null,
|
walletEncryptSucceded: null,
|
||||||
walletEncryptResult: null
|
walletEncryptResult: null
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_ENCRYPT_COMPLETED]: (state, action) => _extends$d({}, state, {
|
[WALLET_ENCRYPT_COMPLETED]: (state, action) => _extends$e({}, state, {
|
||||||
walletEncryptPending: false,
|
walletEncryptPending: false,
|
||||||
walletEncryptSucceded: true,
|
walletEncryptSucceded: true,
|
||||||
walletEncryptResult: action.result
|
walletEncryptResult: action.result
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_ENCRYPT_FAILED]: (state, action) => _extends$d({}, state, {
|
[WALLET_ENCRYPT_FAILED]: (state, action) => _extends$e({}, state, {
|
||||||
walletEncryptPending: false,
|
walletEncryptPending: false,
|
||||||
walletEncryptSucceded: false,
|
walletEncryptSucceded: false,
|
||||||
walletEncryptResult: action.result
|
walletEncryptResult: action.result
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_DECRYPT_START]: state => _extends$d({}, state, {
|
[WALLET_DECRYPT_START]: state => _extends$e({}, state, {
|
||||||
walletDecryptPending: true,
|
walletDecryptPending: true,
|
||||||
walletDecryptSucceded: null,
|
walletDecryptSucceded: null,
|
||||||
walletDecryptResult: null
|
walletDecryptResult: null
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_DECRYPT_COMPLETED]: (state, action) => _extends$d({}, state, {
|
[WALLET_DECRYPT_COMPLETED]: (state, action) => _extends$e({}, state, {
|
||||||
walletDecryptPending: false,
|
walletDecryptPending: false,
|
||||||
walletDecryptSucceded: true,
|
walletDecryptSucceded: true,
|
||||||
walletDecryptResult: action.result
|
walletDecryptResult: action.result
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_DECRYPT_FAILED]: (state, action) => _extends$d({}, state, {
|
[WALLET_DECRYPT_FAILED]: (state, action) => _extends$e({}, state, {
|
||||||
walletDecryptPending: false,
|
walletDecryptPending: false,
|
||||||
walletDecryptSucceded: false,
|
walletDecryptSucceded: false,
|
||||||
walletDecryptResult: action.result
|
walletDecryptResult: action.result
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_UNLOCK_START]: state => _extends$d({}, state, {
|
[WALLET_UNLOCK_START]: state => _extends$e({}, state, {
|
||||||
walletUnlockPending: true,
|
walletUnlockPending: true,
|
||||||
walletUnlockSucceded: null,
|
walletUnlockSucceded: null,
|
||||||
walletUnlockResult: null
|
walletUnlockResult: null
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_UNLOCK_COMPLETED]: (state, action) => _extends$d({}, state, {
|
[WALLET_UNLOCK_COMPLETED]: (state, action) => _extends$e({}, state, {
|
||||||
walletUnlockPending: false,
|
walletUnlockPending: false,
|
||||||
walletUnlockSucceded: true,
|
walletUnlockSucceded: true,
|
||||||
walletUnlockResult: action.result
|
walletUnlockResult: action.result
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_UNLOCK_FAILED]: (state, action) => _extends$d({}, state, {
|
[WALLET_UNLOCK_FAILED]: (state, action) => _extends$e({}, state, {
|
||||||
walletUnlockPending: false,
|
walletUnlockPending: false,
|
||||||
walletUnlockSucceded: false,
|
walletUnlockSucceded: false,
|
||||||
walletUnlockResult: action.result
|
walletUnlockResult: action.result
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_LOCK_START]: state => _extends$d({}, state, {
|
[WALLET_LOCK_START]: state => _extends$e({}, state, {
|
||||||
walletLockPending: false,
|
walletLockPending: false,
|
||||||
walletLockSucceded: null,
|
walletLockSucceded: null,
|
||||||
walletLockResult: null
|
walletLockResult: null
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_LOCK_COMPLETED]: (state, action) => _extends$d({}, state, {
|
[WALLET_LOCK_COMPLETED]: (state, action) => _extends$e({}, state, {
|
||||||
walletLockPending: false,
|
walletLockPending: false,
|
||||||
walletLockSucceded: true,
|
walletLockSucceded: true,
|
||||||
walletLockResult: action.result
|
walletLockResult: action.result
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_LOCK_FAILED]: (state, action) => _extends$d({}, state, {
|
[WALLET_LOCK_FAILED]: (state, action) => _extends$e({}, state, {
|
||||||
walletLockPending: false,
|
walletLockPending: false,
|
||||||
walletLockSucceded: false,
|
walletLockSucceded: false,
|
||||||
walletLockResult: action.result
|
walletLockResult: action.result
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[SET_TRANSACTION_LIST_FILTER]: (state, action) => _extends$d({}, state, {
|
[SET_TRANSACTION_LIST_FILTER]: (state, action) => _extends$e({}, state, {
|
||||||
transactionListFilter: action.data
|
transactionListFilter: action.data
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[UPDATE_CURRENT_HEIGHT]: (state, action) => _extends$d({}, state, {
|
[UPDATE_CURRENT_HEIGHT]: (state, action) => _extends$e({}, state, {
|
||||||
latestBlock: action.data
|
latestBlock: action.data
|
||||||
}),
|
}),
|
||||||
[WALLET_RESTART]: state => _extends$d({}, state, {
|
[WALLET_RESTART]: state => _extends$e({}, state, {
|
||||||
walletReconnecting: true
|
walletReconnecting: true
|
||||||
}),
|
}),
|
||||||
|
|
||||||
[WALLET_RESTART_COMPLETED]: state => _extends$d({}, state, {
|
[WALLET_RESTART_COMPLETED]: state => _extends$e({}, state, {
|
||||||
walletReconnecting: false
|
walletReconnecting: false
|
||||||
})
|
})
|
||||||
}, defaultState$5);
|
}, defaultState$6);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
|
@ -6021,14 +6119,14 @@ const makeSelectContentPositionForUri = uri => reselect.createSelector(selectSta
|
||||||
return state.positions[id] ? state.positions[id][outpoint] : null;
|
return state.positions[id] ? state.positions[id][outpoint] : null;
|
||||||
});
|
});
|
||||||
|
|
||||||
var _extends$e = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
var _extends$f = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
||||||
|
|
||||||
const selectState$5 = state => state.notifications || {};
|
const selectState$5 = state => state.notifications || {};
|
||||||
|
|
||||||
const selectToast = reselect.createSelector(selectState$5, state => {
|
const selectToast = reselect.createSelector(selectState$5, state => {
|
||||||
if (state.toasts.length) {
|
if (state.toasts.length) {
|
||||||
const { id, params } = state.toasts[0];
|
const { id, params } = state.toasts[0];
|
||||||
return _extends$e({
|
return _extends$f({
|
||||||
id
|
id
|
||||||
}, params);
|
}, params);
|
||||||
}
|
}
|
||||||
|
@ -6047,6 +6145,33 @@ const selectError = reselect.createSelector(selectState$5, state => {
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
const selectState$6 = state => state.tags || {};
|
||||||
|
|
||||||
|
const selectKnownTagsByName = reselect.createSelector(selectState$6, state => state.knownTags);
|
||||||
|
|
||||||
|
const selectFollowedTagsList = reselect.createSelector(selectState$6, state => state.followedTags.filter(tag => typeof tag === 'string'));
|
||||||
|
|
||||||
|
const selectFollowedTags = reselect.createSelector(selectFollowedTagsList, followedTags => followedTags.map(tag => ({ name: tag.toLowerCase() })).sort((a, b) => a.name.localeCompare(b.name)));
|
||||||
|
|
||||||
|
const selectUnfollowedTags = reselect.createSelector(selectKnownTagsByName, selectFollowedTagsList, (tagsByName, followedTags) => {
|
||||||
|
const followedTagsSet = new Set(followedTags);
|
||||||
|
let tagsToReturn = [];
|
||||||
|
Object.keys(tagsByName).forEach(key => {
|
||||||
|
if (!followedTagsSet.has(key)) {
|
||||||
|
const { name } = tagsByName[key];
|
||||||
|
tagsToReturn.push({ name: name.toLowerCase() });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return tagsToReturn;
|
||||||
|
});
|
||||||
|
|
||||||
|
const makeSelectIsFollowingTag = tag => reselect.createSelector(selectFollowedTags, followedTags => {
|
||||||
|
return followedTags.some(followedTag => followedTag.name === tag.toLowerCase());
|
||||||
|
});
|
||||||
|
|
||||||
exports.ABANDON_STATES = abandon_states;
|
exports.ABANDON_STATES = abandon_states;
|
||||||
exports.ACTIONS = action_types;
|
exports.ACTIONS = action_types;
|
||||||
exports.CLAIM_VALUES = claim;
|
exports.CLAIM_VALUES = claim;
|
||||||
|
@ -6077,6 +6202,7 @@ exports.createNormalizedClaimSearchKey = createNormalizedClaimSearchKey;
|
||||||
exports.creditsToString = creditsToString;
|
exports.creditsToString = creditsToString;
|
||||||
exports.doAbandonClaim = doAbandonClaim;
|
exports.doAbandonClaim = doAbandonClaim;
|
||||||
exports.doAbandonTxo = doAbandonTxo;
|
exports.doAbandonTxo = doAbandonTxo;
|
||||||
|
exports.doAddTag = doAddTag;
|
||||||
exports.doBalanceSubscribe = doBalanceSubscribe;
|
exports.doBalanceSubscribe = doBalanceSubscribe;
|
||||||
exports.doCheckAddressIsMine = doCheckAddressIsMine;
|
exports.doCheckAddressIsMine = doCheckAddressIsMine;
|
||||||
exports.doCheckPendingClaims = doCheckPendingClaims;
|
exports.doCheckPendingClaims = doCheckPendingClaims;
|
||||||
|
@ -6089,6 +6215,7 @@ exports.doClearPurchasedUriSuccess = doClearPurchasedUriSuccess;
|
||||||
exports.doClearRepostError = doClearRepostError;
|
exports.doClearRepostError = doClearRepostError;
|
||||||
exports.doClearSupport = doClearSupport;
|
exports.doClearSupport = doClearSupport;
|
||||||
exports.doCreateChannel = doCreateChannel;
|
exports.doCreateChannel = doCreateChannel;
|
||||||
|
exports.doDeleteTag = doDeleteTag;
|
||||||
exports.doDismissError = doDismissError;
|
exports.doDismissError = doDismissError;
|
||||||
exports.doDismissToast = doDismissToast;
|
exports.doDismissToast = doDismissToast;
|
||||||
exports.doError = doError;
|
exports.doError = doError;
|
||||||
|
@ -6122,6 +6249,7 @@ exports.doSetFileListSort = doSetFileListSort;
|
||||||
exports.doSetTransactionListFilter = doSetTransactionListFilter;
|
exports.doSetTransactionListFilter = doSetTransactionListFilter;
|
||||||
exports.doSupportAbandonForClaim = doSupportAbandonForClaim;
|
exports.doSupportAbandonForClaim = doSupportAbandonForClaim;
|
||||||
exports.doToast = doToast;
|
exports.doToast = doToast;
|
||||||
|
exports.doToggleTagFollow = doToggleTagFollow;
|
||||||
exports.doUpdateBalance = doUpdateBalance;
|
exports.doUpdateBalance = doUpdateBalance;
|
||||||
exports.doUpdateBlockHeight = doUpdateBlockHeight;
|
exports.doUpdateBlockHeight = doUpdateBlockHeight;
|
||||||
exports.doUpdateChannel = doUpdateChannel;
|
exports.doUpdateChannel = doUpdateChannel;
|
||||||
|
@ -6164,6 +6292,7 @@ exports.makeSelectFileNameForUri = makeSelectFileNameForUri;
|
||||||
exports.makeSelectFilePartlyDownloaded = makeSelectFilePartlyDownloaded;
|
exports.makeSelectFilePartlyDownloaded = makeSelectFilePartlyDownloaded;
|
||||||
exports.makeSelectFilteredTransactionsForPage = makeSelectFilteredTransactionsForPage;
|
exports.makeSelectFilteredTransactionsForPage = makeSelectFilteredTransactionsForPage;
|
||||||
exports.makeSelectIsAbandoningClaimForUri = makeSelectIsAbandoningClaimForUri;
|
exports.makeSelectIsAbandoningClaimForUri = makeSelectIsAbandoningClaimForUri;
|
||||||
|
exports.makeSelectIsFollowingTag = makeSelectIsFollowingTag;
|
||||||
exports.makeSelectIsUriResolving = makeSelectIsUriResolving;
|
exports.makeSelectIsUriResolving = makeSelectIsUriResolving;
|
||||||
exports.makeSelectLatestTransactions = makeSelectLatestTransactions;
|
exports.makeSelectLatestTransactions = makeSelectLatestTransactions;
|
||||||
exports.makeSelectLoadingForUri = makeSelectLoadingForUri;
|
exports.makeSelectLoadingForUri = makeSelectLoadingForUri;
|
||||||
|
@ -6240,6 +6369,8 @@ exports.selectFileListDownloadedSort = selectFileListDownloadedSort;
|
||||||
exports.selectFileListPublishedSort = selectFileListPublishedSort;
|
exports.selectFileListPublishedSort = selectFileListPublishedSort;
|
||||||
exports.selectFilteredTransactionCount = selectFilteredTransactionCount;
|
exports.selectFilteredTransactionCount = selectFilteredTransactionCount;
|
||||||
exports.selectFilteredTransactions = selectFilteredTransactions;
|
exports.selectFilteredTransactions = selectFilteredTransactions;
|
||||||
|
exports.selectFollowedTags = selectFollowedTags;
|
||||||
|
exports.selectFollowedTagsList = selectFollowedTagsList;
|
||||||
exports.selectGettingNewAddress = selectGettingNewAddress;
|
exports.selectGettingNewAddress = selectGettingNewAddress;
|
||||||
exports.selectHasTransactions = selectHasTransactions;
|
exports.selectHasTransactions = selectHasTransactions;
|
||||||
exports.selectIsFetchingClaimListMine = selectIsFetchingClaimListMine;
|
exports.selectIsFetchingClaimListMine = selectIsFetchingClaimListMine;
|
||||||
|
@ -6293,6 +6424,7 @@ exports.selectTxoItemCount = selectTxoItemCount;
|
||||||
exports.selectTxoPage = selectTxoPage;
|
exports.selectTxoPage = selectTxoPage;
|
||||||
exports.selectTxoPageNumber = selectTxoPageNumber;
|
exports.selectTxoPageNumber = selectTxoPageNumber;
|
||||||
exports.selectTxoPageParams = selectTxoPageParams;
|
exports.selectTxoPageParams = selectTxoPageParams;
|
||||||
|
exports.selectUnfollowedTags = selectUnfollowedTags;
|
||||||
exports.selectUpdateChannelError = selectUpdateChannelError;
|
exports.selectUpdateChannelError = selectUpdateChannelError;
|
||||||
exports.selectUpdatingChannel = selectUpdatingChannel;
|
exports.selectUpdatingChannel = selectUpdatingChannel;
|
||||||
exports.selectUrisLoading = selectUrisLoading;
|
exports.selectUrisLoading = selectUrisLoading;
|
||||||
|
@ -6307,5 +6439,6 @@ exports.selectWalletState = selectWalletState;
|
||||||
exports.selectWalletUnlockPending = selectWalletUnlockPending;
|
exports.selectWalletUnlockPending = selectWalletUnlockPending;
|
||||||
exports.selectWalletUnlockResult = selectWalletUnlockResult;
|
exports.selectWalletUnlockResult = selectWalletUnlockResult;
|
||||||
exports.selectWalletUnlockSucceeded = selectWalletUnlockSucceeded;
|
exports.selectWalletUnlockSucceeded = selectWalletUnlockSucceeded;
|
||||||
|
exports.tagsReducer = tagsReducer;
|
||||||
exports.toQueryString = toQueryString;
|
exports.toQueryString = toQueryString;
|
||||||
exports.walletReducer = walletReducer;
|
exports.walletReducer = walletReducer;
|
||||||
|
|
|
@ -266,5 +266,10 @@ export const FETCH_COST_INFO_STARTED = 'FETCH_COST_INFO_STARTED';
|
||||||
export const FETCH_COST_INFO_COMPLETED = 'FETCH_COST_INFO_COMPLETED';
|
export const FETCH_COST_INFO_COMPLETED = 'FETCH_COST_INFO_COMPLETED';
|
||||||
export const FETCH_COST_INFO_FAILED = 'FETCH_COST_INFO_FAILED';
|
export const FETCH_COST_INFO_FAILED = 'FETCH_COST_INFO_FAILED';
|
||||||
|
|
||||||
|
// Tags
|
||||||
|
export const TOGGLE_TAG_FOLLOW = 'TOGGLE_TAG_FOLLOW';
|
||||||
|
export const TAG_ADD = 'TAG_ADD';
|
||||||
|
export const TAG_DELETE = 'TAG_DELETE';
|
||||||
|
|
||||||
// Sync
|
// Sync
|
||||||
export const USER_STATE_POPULATE = 'USER_STATE_POPULATE';
|
export const USER_STATE_POPULATE = 'USER_STATE_POPULATE';
|
||||||
|
|
10
src/index.js
10
src/index.js
|
@ -122,6 +122,8 @@ export {
|
||||||
doSupportAbandonForClaim,
|
doSupportAbandonForClaim,
|
||||||
} from 'redux/actions/wallet';
|
} from 'redux/actions/wallet';
|
||||||
|
|
||||||
|
export { doToggleTagFollow, doAddTag, doDeleteTag } from 'redux/actions/tags';
|
||||||
|
|
||||||
export { doPopulateSharedUserState, doPreferenceGet, doPreferenceSet } from 'redux/actions/sync';
|
export { doPopulateSharedUserState, doPreferenceGet, doPreferenceSet } from 'redux/actions/sync';
|
||||||
|
|
||||||
// utils
|
// utils
|
||||||
|
@ -136,6 +138,7 @@ export { contentReducer } from 'redux/reducers/content';
|
||||||
export { fileInfoReducer } from 'redux/reducers/file_info';
|
export { fileInfoReducer } from 'redux/reducers/file_info';
|
||||||
export { notificationsReducer } from 'redux/reducers/notifications';
|
export { notificationsReducer } from 'redux/reducers/notifications';
|
||||||
export { publishReducer } from 'redux/reducers/publish';
|
export { publishReducer } from 'redux/reducers/publish';
|
||||||
|
export { tagsReducer } from 'redux/reducers/tags';
|
||||||
export { walletReducer } from 'redux/reducers/wallet';
|
export { walletReducer } from 'redux/reducers/wallet';
|
||||||
|
|
||||||
// selectors
|
// selectors
|
||||||
|
@ -310,3 +313,10 @@ export {
|
||||||
selectAbandonClaimSupportError,
|
selectAbandonClaimSupportError,
|
||||||
makeSelectPendingAmountByUri,
|
makeSelectPendingAmountByUri,
|
||||||
} from 'redux/selectors/wallet';
|
} from 'redux/selectors/wallet';
|
||||||
|
|
||||||
|
export {
|
||||||
|
selectFollowedTags,
|
||||||
|
selectFollowedTagsList,
|
||||||
|
selectUnfollowedTags,
|
||||||
|
makeSelectIsFollowingTag,
|
||||||
|
} from 'redux/selectors/tags';
|
||||||
|
|
24
src/redux/actions/tags.js
Normal file
24
src/redux/actions/tags.js
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
// @flow
|
||||||
|
import * as ACTIONS from 'constants/action_types';
|
||||||
|
import Lbry from 'lbry';
|
||||||
|
|
||||||
|
export const doToggleTagFollow = (name: string) => ({
|
||||||
|
type: ACTIONS.TOGGLE_TAG_FOLLOW,
|
||||||
|
data: {
|
||||||
|
name,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const doAddTag = (name: string) => ({
|
||||||
|
type: ACTIONS.TAG_ADD,
|
||||||
|
data: {
|
||||||
|
name,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const doDeleteTag = (name: string) => ({
|
||||||
|
type: ACTIONS.TAG_DELETE,
|
||||||
|
data: {
|
||||||
|
name,
|
||||||
|
},
|
||||||
|
});
|
86
src/redux/reducers/tags.js
Normal file
86
src/redux/reducers/tags.js
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
// @flow
|
||||||
|
import * as ACTIONS from 'constants/action_types';
|
||||||
|
import { handleActions } from 'util/redux-utils';
|
||||||
|
import { DEFAULT_KNOWN_TAGS, DEFAULT_FOLLOWED_TAGS } from 'constants/tags';
|
||||||
|
|
||||||
|
function getDefaultKnownTags() {
|
||||||
|
return DEFAULT_FOLLOWED_TAGS.concat(DEFAULT_KNOWN_TAGS).reduce(
|
||||||
|
(tagsMap, tag) => ({
|
||||||
|
...tagsMap,
|
||||||
|
[tag]: { name: tag },
|
||||||
|
}),
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultState: TagState = {
|
||||||
|
followedTags: [],
|
||||||
|
knownTags: getDefaultKnownTags(),
|
||||||
|
};
|
||||||
|
|
||||||
|
export const tagsReducer = handleActions(
|
||||||
|
{
|
||||||
|
[ACTIONS.TOGGLE_TAG_FOLLOW]: (state: TagState, action: TagAction): TagState => {
|
||||||
|
const { followedTags } = state;
|
||||||
|
const { name } = action.data;
|
||||||
|
|
||||||
|
let newFollowedTags = followedTags.slice();
|
||||||
|
|
||||||
|
if (newFollowedTags.includes(name)) {
|
||||||
|
newFollowedTags = newFollowedTags.filter(tag => tag !== name);
|
||||||
|
} else {
|
||||||
|
newFollowedTags.push(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
followedTags: newFollowedTags,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
[ACTIONS.TAG_ADD]: (state: TagState, action: TagAction) => {
|
||||||
|
const { knownTags } = state;
|
||||||
|
const { name } = action.data;
|
||||||
|
|
||||||
|
let newKnownTags = { ...knownTags };
|
||||||
|
newKnownTags[name] = { name };
|
||||||
|
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
knownTags: newKnownTags,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
[ACTIONS.TAG_DELETE]: (state: TagState, action: TagAction) => {
|
||||||
|
const { knownTags, followedTags } = state;
|
||||||
|
const { name } = action.data;
|
||||||
|
|
||||||
|
let newKnownTags = { ...knownTags };
|
||||||
|
delete newKnownTags[name];
|
||||||
|
const newFollowedTags = followedTags.filter(tag => tag !== name);
|
||||||
|
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
knownTags: newKnownTags,
|
||||||
|
followedTags: newFollowedTags,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
[ACTIONS.USER_STATE_POPULATE]: (
|
||||||
|
state: TagState,
|
||||||
|
action: { data: { tags: ?Array<string> } }
|
||||||
|
) => {
|
||||||
|
const { tags } = action.data;
|
||||||
|
if (Array.isArray(tags)) {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
followedTags: tags,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
};
|
||||||
|
|
||||||
|
},
|
||||||
|
},
|
||||||
|
defaultState
|
||||||
|
);
|
47
src/redux/selectors/tags.js
Normal file
47
src/redux/selectors/tags.js
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
// @flow
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
|
||||||
|
const selectState = (state: { tags: TagState }) => state.tags || {};
|
||||||
|
|
||||||
|
export const selectKnownTagsByName = createSelector(
|
||||||
|
selectState,
|
||||||
|
(state: TagState): KnownTags => state.knownTags
|
||||||
|
);
|
||||||
|
|
||||||
|
export const selectFollowedTagsList = createSelector(
|
||||||
|
selectState,
|
||||||
|
(state: TagState): Array<string> => state.followedTags.filter(tag => typeof tag === 'string')
|
||||||
|
);
|
||||||
|
|
||||||
|
export const selectFollowedTags = createSelector(
|
||||||
|
selectFollowedTagsList,
|
||||||
|
(followedTags: Array<string>): Array<Tag> =>
|
||||||
|
followedTags
|
||||||
|
.map(tag => ({ name: tag.toLowerCase() }))
|
||||||
|
.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
|
);
|
||||||
|
|
||||||
|
export const selectUnfollowedTags = createSelector(
|
||||||
|
selectKnownTagsByName,
|
||||||
|
selectFollowedTagsList,
|
||||||
|
(tagsByName: KnownTags, followedTags: Array<string>): Array<Tag> => {
|
||||||
|
const followedTagsSet = new Set(followedTags);
|
||||||
|
let tagsToReturn = [];
|
||||||
|
Object.keys(tagsByName).forEach(key => {
|
||||||
|
if (!followedTagsSet.has(key)) {
|
||||||
|
const { name } = tagsByName[key];
|
||||||
|
tagsToReturn.push({ name: name.toLowerCase() });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return tagsToReturn;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
export const makeSelectIsFollowingTag = (tag: string) =>
|
||||||
|
createSelector(
|
||||||
|
selectFollowedTags,
|
||||||
|
followedTags => {
|
||||||
|
return followedTags.some(followedTag => followedTag.name === tag.toLowerCase());
|
||||||
|
}
|
||||||
|
);
|
Loading…
Reference in a new issue