// @flow import React from 'react'; import CollectionPreviewTile from 'component/collectionPreviewTile'; import ClaimList from 'component/claimList'; import Button from 'component/button'; import * as COLLECTIONS_CONSTS from 'constants/collections'; import Icon from 'component/common/icon'; import * as ICONS from 'constants/icons'; import * as PAGES from 'constants/pages'; import * as KEYCODES from 'constants/keycodes'; import Yrbl from 'component/yrbl'; import classnames from 'classnames'; import { FormField, Form } from 'component/common/form'; import { useIsMobile } from 'effects/use-screensize'; type Props = { builtinCollections: CollectionGroup, publishedCollections: CollectionGroup, unpublishedCollections: CollectionGroup, // savedCollections: CollectionGroup, fetchingCollections: boolean, }; const LIST_TYPE = Object.freeze({ ALL: 'All', PRIVATE: 'Private', PUBLIC: 'Public' }); const COLLECTION_FILTERS = [LIST_TYPE.ALL, LIST_TYPE.PRIVATE, LIST_TYPE.PUBLIC]; const PLAYLIST_SHOW_COUNT = Object.freeze({ DEFAULT: 12, MOBILE: 6 }); export default function CollectionsListMine(props: Props) { const { builtinCollections, publishedCollections, unpublishedCollections, // savedCollections, these are resolved on startup from sync'd claimIds or urls fetchingCollections, } = props; const builtinCollectionsList = (Object.values(builtinCollections || {}): any); const unpublishedCollectionsList = (Object.keys(unpublishedCollections || {}): any); const publishedList = (Object.keys(publishedCollections || {}): any); const hasCollections = unpublishedCollectionsList.length || publishedList.length; const [filterType, setFilterType] = React.useState(LIST_TYPE.ALL); const [searchText, setSearchText] = React.useState(''); const isMobileScreen = useIsMobile(); const playlistShowCount = isMobileScreen ? PLAYLIST_SHOW_COUNT.MOBILE : PLAYLIST_SHOW_COUNT.DEFAULT; const playlistPageUrl = `/$/${PAGES.PLAYLISTS}?type=${filterType}`; let collectionsToShow = []; if (filterType === LIST_TYPE.ALL) { collectionsToShow = unpublishedCollectionsList.concat(publishedList); } else if (filterType === LIST_TYPE.PRIVATE) { collectionsToShow = unpublishedCollectionsList; } else if (filterType === LIST_TYPE.PUBLIC) { collectionsToShow = publishedList; } let filteredCollections; if (searchText && collectionsToShow) { filteredCollections = collectionsToShow .filter((id) => { return ( (unpublishedCollections[id] && unpublishedCollections[id].name.toLocaleLowerCase().includes(searchText.toLocaleLowerCase())) || (publishedCollections[id] && publishedCollections[id].name.toLocaleLowerCase().includes(searchText.toLocaleLowerCase())) ); }) .slice(0, playlistShowCount); } else { filteredCollections = collectionsToShow.slice(0, playlistShowCount) || []; } const totalLength = collectionsToShow ? collectionsToShow.length : 0; const filteredLength = filteredCollections.length; const isTruncated = totalLength > filteredLength; const watchLater = builtinCollectionsList.find((list) => list.id === COLLECTIONS_CONSTS.WATCH_LATER_ID); const favorites = builtinCollectionsList.find((list) => list.id === COLLECTIONS_CONSTS.FAVORITES_ID); const builtin = [watchLater, favorites]; function escapeListener(e: SyntheticKeyboardEvent<*>) { if (e.keyCode === KEYCODES.ESCAPE) { e.preventDefault(); setSearchText(''); } } function onTextareaFocus() { window.addEventListener('keydown', escapeListener); } function onTextareaBlur() { window.removeEventListener('keydown', escapeListener); } return ( <> {/* Built-in lists */} {builtin.map((list: Collection) => { const { items: itemUrls } = list; return (
{isTruncated && ( <> {__('Showing %filtered% results of %total%', { filtered: filteredLength, total: totalLength })} {`${searchText ? ' (' + __('filtered') + ') ' : ' '}`} > )}