Files
workavia-drive/tdrive/frontend/src/app/features/drive/hooks/use-drive-preview.ts
T
Aymeric e6b2d53dd6 Go to a folder when searched (#68) (#152)
 Go to a folder when searched (#68)
2023-07-26 10:34:01 +02:00

99 lines
3.1 KiB
TypeScript

import fileUploadApiClient from '@features/files/api/file-upload-api-client';
import fileUploadService from '@features/files/services/file-upload-service';
import { useGlobalEffect } from '@features/global/hooks/use-global-effect';
import { LoadingState } from '@features/global/state/atoms/Loading';
import { useRecoilState } from 'recoil';
import { DriveApiClient } from '../api-client/api-client';
import { DriveViewerState } from '../state/viewer';
import { DriveItem } from '../types';
import { useHistory } from 'react-router-dom';
import RouterServices from '@features/router/services/router-service';
import useRouterCompany from '@features/router/hooks/use-router-company';
import { DriveCurrentFolderAtom } from 'app/views/client/body/drive/browser';
export const useDrivePreviewModal = () => {
const history = useHistory();
const company = useRouterCompany();
const [status, setStatus] = useRecoilState(DriveViewerState);
const [ parentId, setParentId ] = useRecoilState(
DriveCurrentFolderAtom({ initialFolderId: 'root' }),
);
const open: (item: DriveItem) => void = (item: DriveItem) => {
if (item.last_version_cache?.file_metadata?.source === 'internal') {
setStatus({ item, loading: true });
} else if (item.is_directory){
setParentId(item.id);
}
};
const close = () => {
setStatus({ item: null, loading: true });
history.push(RouterServices.generateRouteFromState({companyId: company, viewId: "", itemId: ""}));
}
return { open, close, isOpen: !!status.item };
};
export const useDrivePreview = () => {
const [status, setStatus] = useRecoilState(DriveViewerState);
const modal = useDrivePreviewModal();
useGlobalEffect(
'useDrivePreview',
async () => {
if (modal.isOpen && status.item) {
setStatus({
...status,
loading: true,
});
const details = await DriveApiClient.get(status.item.company_id, status.item.id);
setStatus({
...status,
details,
loading: false,
});
}
},
[status.item?.id],
);
return {
...modal,
status,
loading: status.loading,
};
};
export const useDrivePreviewLoading = () => {
const [loading, setLoading] = useRecoilState(LoadingState('useDrivePreviewLoading'));
return { loading, setLoading };
};
export const useDrivePreviewDisplayData = () => {
const { status } = useDrivePreview();
if (!status) {
return {};
}
const name =
status.details?.item.last_version_cache.file_metadata.name || status.details?.item.name || '';
const extension = name.split('.').pop();
const type = fileUploadApiClient.mimeToType(
status.details?.item.last_version_cache.file_metadata.mime || '',
extension,
);
const id = status.details?.item.last_version_cache.file_metadata.external_id || '';
const download = fileUploadService.getDownloadRoute({
companyId: status.item?.company_id || '',
fileId: status.details?.item.last_version_cache.file_metadata.external_id || '',
});
return { download, id, name, type, extension, size: status.details?.item.size };
};