import React, { useState, useCallback, useMemo } from 'react';
import { useMutableCallback, useLocalStorage, useDebouncedState, useUniqueId, useResizeObserver } from '@rocket.chat/fuselage-hooks';
import {
Box,
Icon,
TextInput,
Field,
FieldGroup,
Select,
Throbber,
} from '@rocket.chat/fuselage';
import { FixedSizeList as List } from 'react-window';
import InfiniteLoader from 'react-window-infinite-loader';
import memoize from 'memoize-one';
import { useUserId, useUserRoom } from '../../../../contexts/UserContext';
import DeleteFileWarning from '../../../../components/DeleteFileWarning';
import { useToastMessageDispatch } from '../../../../contexts/ToastMessagesContext';
import { useSetModal } from '../../../../contexts/ModalContext';
import { useMethod } from '../../../../contexts/ServerContext';
import { AsyncStatePhase } from '../../../../hooks/useAsyncState';
import { useTranslation } from '../../../../contexts/TranslationContext';
import VerticalBar from '../../../../components/VerticalBar';
import FileItem from './components/FileItem';
import ScrollableContentWrapper from '../../../../components/ScrollableContentWrapper';
import { useFileList } from './hooks/useFileList';
import { useComponentDidUpdate } from '../../../../hooks/useComponentDidUpdate';
import { useMessageDeletionIsAllowed } from './hooks/useMessageDeletionIsAllowed';
const Row = React.memo(({ data, index, style }) => {
const { items, userId, onClickDelete, isDeletionAllowed } = data;
const item = items[index] || null;
return item && ;
});
export const createItemData = memoize((items, onClickDelete, isDeletionAllowed) => ({
items,
onClickDelete,
isDeletionAllowed,
}));
export const RoomFiles = function RoomFiles({
loading,
filesItems = [],
text,
type,
setText,
setType,
onClickClose,
onClickDelete,
total,
loadMoreItems,
isDeletionAllowed,
}) {
const t = useTranslation();
const isItemLoaded = (index) => !!filesItems[index];
const options = useMemo(() => [
['all', t('All')],
['image', t('Images')],
['video', t('Videos')],
['audio', t('Audios')],
['text', t('Texts')],
['application', t('Files')],
], [t]);
const { ref, contentBoxSize: { blockSize = 780 } = {} } = useResizeObserver({ debounceDelay: 100 });
const searchId = useUniqueId();
const itemData = createItemData(filesItems, onClickDelete, isDeletionAllowed);
return (
<>
{t('Files')}
{ onClickClose && }
{t('Search_by_file_name')}
}/>
{loading && }
{!loading && filesItems.length <= 0 && {t('No_results_found')}}
{({ onItemsRendered, ref }) => (
{Row}
)}
>
);
};
RoomFiles.Item = FileItem;
export default ({ rid, tabBar }) => {
const uid = useUserId();
const onClickClose = useMutableCallback(() => tabBar && tabBar.close());
const room = useUserRoom(rid);
room.type = room.t;
room.rid = rid;
const setModal = useSetModal();
const closeModal = useMutableCallback(() => setModal());
const dispatchToastMessage = useToastMessageDispatch();
const deleteFile = useMethod('deleteFileMessage');
const [type, setType] = useLocalStorage('file-list-type', 'all');
const [text, setText] = useState('');
const [query, setQuery] = useDebouncedState({
roomId: rid,
sort: JSON.stringify({ uploadedAt: -1 }),
count: 50,
query: JSON.stringify({
...type !== 'all' && {
typeGroup: type,
},
}),
}, 500);
const handleTextChange = useCallback((event) => {
setText(event.currentTarget.value);
}, []);
useComponentDidUpdate(() => setQuery((params) => ({
...params,
roomId: rid,
query: JSON.stringify({
name: { $regex: text || '', $options: 'i' },
...type !== 'all' && {
typeGroup: type,
},
}),
})), [rid, text, type, setQuery]);
const { value: data, phase: state, reload, more } = useFileList(room.type, query);
const handleDelete = useMutableCallback((_id) => {
const onConfirm = async () => {
try {
await deleteFile(_id);
} catch (error) {
dispatchToastMessage({ type: 'error', message: error });
}
closeModal();
reload();
};
setModal();
}, []);
const loadMoreItems = useCallback((start, end) => more((params) => ({ ...params, offset: start, count: end - start }), (prev, next) => ({
total: next.total,
files: [...prev.files, ...next.files],
})), [more]);
const isDeletionAllowed = useMessageDeletionIsAllowed(rid, uid);
return (
);
};