import React, { useState, useEffect } from 'react';
import { useMediaFilter } from '../../utils/hooks/';
import { MaterialIcon, PopupMain } from '../_shared';
function MediaFilterOption(props) {
function onSelectOption() {
props.onSelect(props.id);
}
return (
);
}
function MediaFilterOptionsList(props) {
const [selected, setSelected] = useState(props.default);
function onSelectOption(newId) {
setSelected(newId);
if ('function' === typeof props.onSelect) {
props.onSelect(newId);
}
}
function renderOptions(selected) {
const ret = [];
let i = 0;
while (i < props.items.length) {
if (props.hideOptionOnSelect) {
if (props.items[i].id !== selected) {
ret.push(
);
}
} else {
ret.push(
);
}
i += 1;
}
return ret;
}
return {renderOptions(selected)}
;
}
function MediaTypesFilter(props) {
const [containerRef, value, setValue, popupContentRef, PopupContent, PopupTrigger] = useMediaFilter(props.default);
const [label, setLabel] = useState(props.label);
useEffect(() => {
popupContentRef.current.tryToHide();
if (props.updateTriggerButtonOnChange) {
let i = 0;
while (i < props.options.length) {
if (value === props.options[i].id) {
setLabel(props.options[i].label);
break;
}
i += 1;
}
}
if ('function' === typeof props.onSelect) {
props.onSelect(value);
}
}, [value]);
return (
);
}
function MediaSortingFilter(props) {
const [containerRef, value, setValue, popupContentRef, PopupContent, PopupTrigger] = useMediaFilter(props.default);
useEffect(() => {
popupContentRef.current.tryToHide();
if ('function' === typeof props.onSelect) {
props.onSelect(value);
}
}, [value]);
return (
);
}
const typeFilters = [
{
id: 'all',
label: 'All media types',
},
{
id: 'video',
label: 'Video',
},
{
id: 'audio',
label: 'Audio',
},
{
id: 'image',
label: 'Images',
},
{
id: 'pdf',
label: 'Pdf',
},
];
const sortingOptions = [
{
id: 'date_added_desc',
label: 'Upload date (newest)',
},
{
id: 'date_added_asc',
label: 'Upload date (oldest)',
},
{
id: 'most_views',
label: 'View count',
},
{
id: 'most_likes',
label: 'Like count',
},
];
export function SearchMediaFiltersRow(props) {
const [selectedFilterTypeId, setSelectedFilterTypeId] = useState('all');
const [selectedSortId, setSelectedSortId] = useState('date_added_desc');
const [args, setArgs] = useState({
sort_by: null,
ordering: null,
media_type: null,
});
function updateFiltersArgs() {
const newArgs = {
...args,
media_type: null,
sort_by: null,
ordering: null,
};
switch (selectedFilterTypeId) {
case 'video':
newArgs.media_type = 'video';
break;
case 'audio':
newArgs.media_type = 'audio';
break;
case 'image':
newArgs.media_type = 'image';
break;
case 'pdf':
newArgs.media_type = 'pdf';
break;
}
switch (selectedSortId) {
case 'most_views':
newArgs.sort_by = 'views';
newArgs.ordering = null;
break;
case 'most_likes':
newArgs.sort_by = 'likes';
newArgs.ordering = null;
break;
case 'date_added_asc':
newArgs.sort_by = null;
newArgs.ordering = 'asc';
break;
}
setArgs(newArgs);
}
function onSelectFilterTypeOption(newFilterTypeId) {
setSelectedFilterTypeId(newFilterTypeId);
}
function onSelectSortOption(newSortId) {
setSelectedSortId(newSortId);
}
useEffect(() => {
updateFiltersArgs();
}, [selectedFilterTypeId, selectedSortId]);
useEffect(() => {
if ('function' === typeof props.onFiltersUpdate) {
props.onFiltersUpdate(args);
}
}, [args]);
useEffect(() => {
updateFiltersArgs();
}, []);
return (
);
}