5fdac4898f
* Add horizontal layout (#636) * Test out a horizontal scroll for upcoming (tile only for now) * - add support for list layout - add following label on home page - clan up css and naming conventions * Update header type + show only if scheduled streams are showing * [Playlist] Pull in sorting changes from desktop + Add Drag-n-Drop + Handle unavailable/deleted claims (#641) * Add ordering Icons * Refactor doCollectionEdit - It required claims as parameter, when only uris are used to populate the collection, so that was changed to pass down the uris instead. - There were unused and mostly unnecessary functions inside, for example the parameter claimIds was never used so it would never enter the claimSearch function which again would be used to generate uris, so it's better to just use uris as parameter * Add List Reordering changes * Add toggle button for list editing * Add toggle on content page collection sidebar * Enable drag-n-drop to re-order list items https://www.youtube.com/watch?v=aYZRRyukuIw * Allow removing all unavailable claims from a List * Fix <g> on icons * Fix section buttons positioning * Move preventDefault and stopPropagation to buttons div instead of each button, preventing clicking even if disabled opening the claim * Change dragging cursor * Fix sizing * Fix dragging component * Restrict dragging to vertical axis * Ignore shuffle state for ordering * Fix console errors * Mobile fixes * Fix sidebar spacing * Fix grey on mobile after click * cleanup Co-authored-by: Dan Peterson <dan@dan-peterson.ca> Co-authored-by: saltrafael <76502841+saltrafael@users.noreply.github.com>
110 lines
3 KiB
JavaScript
110 lines
3 KiB
JavaScript
// @flow
|
|
import { MATURE_TAGS } from 'constants/tags';
|
|
import { parseURI } from 'util/lbryURI';
|
|
|
|
const matureTagMap = MATURE_TAGS.reduce((acc, tag) => ({ ...acc, [tag]: true }), {});
|
|
|
|
export const isClaimNsfw = (claim: Claim): boolean => {
|
|
if (!claim) {
|
|
throw new Error('No claim passed to isClaimNsfw()');
|
|
}
|
|
|
|
if (!claim.value) {
|
|
return false;
|
|
}
|
|
|
|
const tags = claim.value.tags || [];
|
|
for (let i = 0; i < tags.length; i += 1) {
|
|
const tag = tags[i].toLowerCase();
|
|
if (matureTagMap[tag]) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
export function createNormalizedClaimSearchKey(options: { page: number, release_time?: string }) {
|
|
// Ignore page because we don't care what the last page searched was, we want everything
|
|
// Ignore release_time because that will change depending on when you call claim_search ex: release_time: ">12344567"
|
|
const { page: optionToIgnoreForQuery, release_time: anotherToIgnore, ...rest } = options;
|
|
const query = JSON.stringify(rest);
|
|
return query;
|
|
}
|
|
|
|
export function concatClaims(claimList: Array<Claim> = [], concatClaimList: Array<any> = []): Array<Claim> {
|
|
if (!claimList || claimList.length === 0) {
|
|
if (!concatClaimList) {
|
|
return [];
|
|
}
|
|
return concatClaimList.slice();
|
|
}
|
|
|
|
const claims = claimList.slice();
|
|
concatClaimList.forEach((claim) => {
|
|
if (!claims.some((item) => item.claim_id === claim.claim_id)) {
|
|
claims.push(claim);
|
|
}
|
|
});
|
|
|
|
return claims;
|
|
}
|
|
|
|
export function filterClaims(claims: Array<Claim>, query: ?string): Array<Claim> {
|
|
if (query) {
|
|
const queryMatchRegExp = new RegExp(query, 'i');
|
|
return claims.filter((claim) => {
|
|
const { value } = claim;
|
|
|
|
return (
|
|
(value.title && value.title.match(queryMatchRegExp)) ||
|
|
(claim.signing_channel && claim.signing_channel.name && claim.signing_channel.name.match(queryMatchRegExp)) ||
|
|
(claim.name && claim.name.match(queryMatchRegExp))
|
|
);
|
|
});
|
|
}
|
|
|
|
return claims;
|
|
}
|
|
|
|
/**
|
|
* Determines if the claim is a channel.
|
|
*
|
|
* @param claim
|
|
* @param uri An abandoned claim will be null, so provide the `uri` as a fallback to parse.
|
|
*/
|
|
export function isChannelClaim(claim: ?Claim, uri?: string) {
|
|
// 1. parseURI can't resolve a repost's channel, so a `claim` will be needed.
|
|
// 2. parseURI is still needed to cover the case of abandoned claims.
|
|
if (claim) {
|
|
return claim.value_type === 'channel';
|
|
} else if (uri) {
|
|
try {
|
|
return Boolean(parseURI(uri).isChannel);
|
|
} catch (err) {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export function getChannelIdFromClaim(claim: ?Claim) {
|
|
if (claim) {
|
|
if (claim.value_type === 'channel') {
|
|
return claim.claim_id;
|
|
} else if (claim.signing_channel) {
|
|
return claim.signing_channel.claim_id;
|
|
}
|
|
}
|
|
}
|
|
|
|
export function getChannelFromClaim(claim: ?Claim) {
|
|
return !claim
|
|
? null
|
|
: claim.value_type === 'channel'
|
|
? claim
|
|
: claim.signing_channel && claim.is_channel_signature_valid
|
|
? claim.signing_channel
|
|
: null;
|
|
}
|