From 2044d83af6be28428e03a2ad9c7b766594189187 Mon Sep 17 00:00:00 2001
From: Francis Terrero <61791901+terrerox@users.noreply.github.com>
Date: Thu, 12 Feb 2026 13:23:23 -0400
Subject: [PATCH] Revert "[PB-5462] File Version History"
---
package.json | 2 +-
.../HeaderAndSidenavLayout.tsx | 9 +-
.../NameCollisionContainer.tsx | 75 +----
.../services/downloadManager.service.test.ts | 1 -
.../drive/services/downloadManager.service.ts | 24 +-
.../worker.service/downloadWorkerHandler.ts | 4 +-
src/app/i18n/locales/de.json | 31 +-
src/app/i18n/locales/en.json | 29 --
src/app/i18n/locales/es.json | 29 --
src/app/i18n/locales/fr.json | 29 --
src/app/i18n/locales/it.json | 31 +-
src/app/i18n/locales/ru.json | 29 --
src/app/i18n/locales/tw.json | 29 --
src/app/i18n/locales/zh.json | 29 --
src/app/store/index.ts | 2 -
.../fileVersions/fileVersions.selectors.ts | 19 --
.../store/slices/fileVersions/index.test.ts | 161 ---------
src/app/store/slices/fileVersions/index.ts | 102 ------
src/app/store/slices/ui/index.ts | 31 --
src/services/date.service.test.ts | 28 +-
src/services/date.service.ts | 8 -
src/views/Drive/DriveView.tsx | 2 -
.../components/DriveExplorerList.tsx | 23 --
.../components/DriveItemContextMenu.tsx | 73 +---
.../components/DriveTopBarActions.tsx | 20 --
.../components/DriveItemDropdownActions.tsx | 5 -
.../components/VersionHistory/Sidebar.tsx | 314 ------------------
.../components/AutosaveSection.tsx | 53 ---
.../components/CurrentVersionItem.tsx | 30 --
.../VersionHistory/components/Header.tsx | 20 --
.../components/LockedFeatureModal.tsx | 49 ---
.../components/VersionActionDialog.tsx | 83 -----
.../components/VersionHistorySkeleton.tsx | 30 --
.../VersionHistory/components/VersionItem.tsx | 133 --------
.../VersionHistory/components/index.ts | 7 -
.../Drive/components/VersionHistory/index.ts | 1 -
.../components/VersionHistory/utils/index.ts | 14 -
src/views/Drive/hooks/index.ts | 3 -
src/views/Drive/hooks/useDriveItemActions.tsx | 7 -
.../hooks/useDropdownPositioning.test.ts | 87 -----
.../Drive/hooks/useDropdownPositioning.ts | 58 ----
.../hooks/useVersionHistoryMenuConfig.test.ts | 56 ----
.../hooks/useVersionHistoryMenuConfig.ts | 16 -
.../Drive/hooks/useVersionItemActions.test.ts | 172 ----------
.../Drive/hooks/useVersionItemActions.ts | 81 -----
.../services/fileVersion.service.test.ts | 114 -------
.../Drive/services/fileVersion.service.ts | 56 ----
.../Drive/services/replaceFile.service.ts | 18 -
.../Sections/Account/Plans/PlansSection.tsx | 38 +--
yarn.lock | 12 +-
50 files changed, 40 insertions(+), 2237 deletions(-)
delete mode 100644 src/app/store/slices/fileVersions/fileVersions.selectors.ts
delete mode 100644 src/app/store/slices/fileVersions/index.test.ts
delete mode 100644 src/app/store/slices/fileVersions/index.ts
delete mode 100644 src/views/Drive/components/VersionHistory/Sidebar.tsx
delete mode 100644 src/views/Drive/components/VersionHistory/components/AutosaveSection.tsx
delete mode 100644 src/views/Drive/components/VersionHistory/components/CurrentVersionItem.tsx
delete mode 100644 src/views/Drive/components/VersionHistory/components/Header.tsx
delete mode 100644 src/views/Drive/components/VersionHistory/components/LockedFeatureModal.tsx
delete mode 100644 src/views/Drive/components/VersionHistory/components/VersionActionDialog.tsx
delete mode 100644 src/views/Drive/components/VersionHistory/components/VersionHistorySkeleton.tsx
delete mode 100644 src/views/Drive/components/VersionHistory/components/VersionItem.tsx
delete mode 100644 src/views/Drive/components/VersionHistory/components/index.ts
delete mode 100644 src/views/Drive/components/VersionHistory/index.ts
delete mode 100644 src/views/Drive/components/VersionHistory/utils/index.ts
delete mode 100644 src/views/Drive/hooks/useDropdownPositioning.test.ts
delete mode 100644 src/views/Drive/hooks/useDropdownPositioning.ts
delete mode 100644 src/views/Drive/hooks/useVersionHistoryMenuConfig.test.ts
delete mode 100644 src/views/Drive/hooks/useVersionHistoryMenuConfig.ts
delete mode 100644 src/views/Drive/hooks/useVersionItemActions.test.ts
delete mode 100644 src/views/Drive/hooks/useVersionItemActions.ts
delete mode 100644 src/views/Drive/services/fileVersion.service.test.ts
delete mode 100644 src/views/Drive/services/fileVersion.service.ts
delete mode 100644 src/views/Drive/services/replaceFile.service.ts
diff --git a/package.json b/package.json
index 1563e1a8d0..3a3221bf16 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
"@iconscout/react-unicons": "^1.1.6",
"@internxt/css-config": "1.1.0",
"@internxt/lib": "1.4.1",
- "@internxt/sdk": "=1.13.1",
+ "@internxt/sdk": "=1.12.6",
"@internxt/ui": "=0.1.3",
"@phosphor-icons/react": "^2.1.7",
"@popperjs/core": "^2.11.6",
diff --git a/src/app/core/layouts/HeaderAndSidenavLayout/HeaderAndSidenavLayout.tsx b/src/app/core/layouts/HeaderAndSidenavLayout/HeaderAndSidenavLayout.tsx
index 63c4b05ab6..57bf04e565 100644
--- a/src/app/core/layouts/HeaderAndSidenavLayout/HeaderAndSidenavLayout.tsx
+++ b/src/app/core/layouts/HeaderAndSidenavLayout/HeaderAndSidenavLayout.tsx
@@ -11,7 +11,6 @@ import DriveItemInfoMenu from 'app/drive/components/DriveItemInfoMenu/DriveItemI
import SharedFolderTooBigDialog from '../../../drive/components/SharedFolderTooBigDialog/SharedFolderTooBigDialog';
import { getAppConfig } from 'services/config.service';
import ShareItemDialog from '../../../../views/Shared/components/ShareItemDialog/ShareItemDialog';
-import { Sidebar as VersionHistorySidebar } from '../../../../views/Drive/components/VersionHistory';
export interface HeaderAndSidenavLayoutProps {
children: JSX.Element;
@@ -49,18 +48,14 @@ export default function HeaderAndSidenavLayout(props: HeaderAndSidenavLayoutProp
-
+
{children}
{isDriveItemInfoMenuOpen && driveItemInfo && (
)}
-
-
-
-
-
+
diff --git a/src/app/drive/components/NameCollisionDialog/NameCollisionContainer.tsx b/src/app/drive/components/NameCollisionDialog/NameCollisionContainer.tsx
index 3d465ea21b..a7b1723a04 100644
--- a/src/app/drive/components/NameCollisionDialog/NameCollisionContainer.tsx
+++ b/src/app/drive/components/NameCollisionDialog/NameCollisionContainer.tsx
@@ -12,10 +12,6 @@ import { DriveItemData } from 'app/drive/types';
import { IRoot } from 'app/store/slices/storage/types';
import workspacesSelectors from 'app/store/slices/workspaces/workspaces.selectors';
import { uploadFoldersWithManager } from 'app/network/UploadFolderManager';
-import replaceFileService from 'views/Drive/services/replaceFile.service';
-import { Network, getEnvironmentConfig } from 'app/drive/services/network.service';
-import { fileVersionsActions, fileVersionsSelectors } from 'app/store/slices/fileVersions';
-import { isVersioningExtensionAllowed } from 'views/Drive/components/VersionHistory/utils';
type NameCollisionContainerProps = {
currentFolderId: string;
@@ -47,8 +43,6 @@ const NameCollisionContainer: FC = ({
() => moveDestinationFolderId ?? currentFolderId,
[moveDestinationFolderId, currentFolderId],
);
- const limits = useAppSelector(fileVersionsSelectors.getLimits);
- const isVersioningEnabled = limits?.versioning?.enabled ?? false;
const handleNewItems = (files: (File | DriveItemData)[], folders: (IRoot | DriveItemData)[]) => [
...files,
@@ -128,47 +122,6 @@ const NameCollisionContainer: FC = ({
);
};
- const uploadFileAndGetFileId = async (file: File, itemToReplace: DriveItemData) => {
- const { bridgeUser, bridgePass, encryptionKey, bucketId } = getEnvironmentConfig(!!selectedWorkspace);
- const network = new Network(bridgeUser, bridgePass, encryptionKey);
-
- const taskId = `replace-${itemToReplace.uuid}-${Date.now()}`;
-
- const [uploadPromise] = network.uploadFile(
- bucketId,
- {
- filecontent: file,
- filesize: file.size,
- progressCallback: () => {},
- },
- { taskId },
- );
-
- return await uploadPromise;
- };
-
- const replaceFileVersion = async (file: File, itemToReplace: DriveItemData) => {
- const newFileId = await uploadFileAndGetFileId(file, itemToReplace);
- await replaceFileService.replaceFile(itemToReplace.uuid, {
- fileId: newFileId,
- size: file.size,
- });
- dispatch(fileVersionsActions.invalidateCache(itemToReplace.uuid));
- };
-
- const trashAndUpload = async (file: File, itemToReplace: DriveItemData) => {
- await moveItemsToTrash([itemToReplace]);
- await dispatch(
- storageThunks.uploadItemsThunk({
- files: [file],
- parentFolderId: folderId,
- options: {
- disableDuplicatedNamesCheck: true,
- },
- }),
- );
- };
-
const replaceAndUploadItem = async ({
itemsToReplace,
itemsToUpload,
@@ -176,13 +129,11 @@ const NameCollisionContainer: FC = ({
itemsToReplace: DriveItemData[];
itemsToUpload: (IRoot | File)[];
}) => {
- for (let i = 0; i < itemsToUpload.length; i++) {
- const itemToUpload = itemsToUpload[i];
- const itemToReplace = itemsToReplace[i];
+ await moveItemsToTrash(itemsToReplace);
+ itemsToUpload.forEach((itemToUpload) => {
if ((itemToUpload as IRoot).fullPathEdited) {
- await moveItemsToTrash([itemToReplace]);
- await uploadFoldersWithManager({
+ uploadFoldersWithManager({
payload: [
{
root: { ...(itemToUpload as IRoot) },
@@ -191,15 +142,23 @@ const NameCollisionContainer: FC = ({
],
selectedWorkspace,
dispatch,
+ }).then(() => {
+ dispatch(fetchSortedFolderContentThunk(folderId));
});
} else {
- const file = itemToUpload as File;
- const canReplaceVersion = isVersioningEnabled && isVersioningExtensionAllowed(itemToReplace);
- canReplaceVersion ? await replaceFileVersion(file, itemToReplace) : await trashAndUpload(file, itemToReplace);
+ dispatch(
+ storageThunks.uploadItemsThunk({
+ files: [itemToUpload] as File[],
+ parentFolderId: folderId,
+ options: {
+ disableDuplicatedNamesCheck: true,
+ },
+ }),
+ ).then(() => {
+ dispatch(fetchSortedFolderContentThunk(folderId));
+ });
}
-
- dispatch(fetchSortedFolderContentThunk(folderId));
- }
+ });
};
const keepAndUploadItem = async (itemsToUpload: (IRoot | File)[]) => {
diff --git a/src/app/drive/services/downloadManager.service.test.ts b/src/app/drive/services/downloadManager.service.test.ts
index fe4d426cf4..9246b469c5 100644
--- a/src/app/drive/services/downloadManager.service.test.ts
+++ b/src/app/drive/services/downloadManager.service.test.ts
@@ -892,7 +892,6 @@ describe('downloadManagerService', () => {
updateProgressCallback: mockUpdateProgress,
abortController: mockTask.abortController,
sharingOptions: mockTask.credentials,
- downloadName: mockTask.options.downloadName,
});
});
diff --git a/src/app/drive/services/downloadManager.service.ts b/src/app/drive/services/downloadManager.service.ts
index 6c32e54145..82ec911bcc 100644
--- a/src/app/drive/services/downloadManager.service.ts
+++ b/src/app/drive/services/downloadManager.service.ts
@@ -47,7 +47,6 @@ export type DownloadItem = {
downloadOptions?: {
areSharedItems?: boolean;
showErrors?: boolean;
- downloadName?: string;
};
createFoldersIterator?: FolderIterator | SharedFolderIterator;
createFilesIterator?: FileIterator | SharedFileIterator;
@@ -93,13 +92,6 @@ export type DownloadTask = {
export class DownloadManagerService {
public static readonly instance: DownloadManagerService = new DownloadManagerService();
- private getSingleItemName(item: DownloadItem['payload'][0]): string {
- if (item.isFolder) {
- return item.name;
- }
- return item.type ? `${item.name}.${item.type}` : item.name;
- }
-
readonly getDownloadCredentialsFromWorkspace = (
selectedWorkspace: WorkspaceData | null,
workspaceCredentials: WorkspaceCredentialsDetails | null,
@@ -127,11 +119,14 @@ export class DownloadManagerService {
const abort = () => Promise.resolve(uploadFolderAbortController.abort('Download cancelled'));
const formattedDate = date.format(new Date(), 'YYYY-MM-DD_HHmmss');
- let downloadName = downloadItem.downloadOptions?.downloadName;
-
- if (!downloadName) {
- downloadName =
- itemsPayload.length === 1 ? this.getSingleItemName(itemsPayload[0]) : `Internxt (${formattedDate})`;
+ let downloadName = `Internxt (${formattedDate})`;
+ if (itemsPayload.length === 1) {
+ const item = itemsPayload[0];
+ if (itemsPayload[0].isFolder) {
+ downloadName = item.name;
+ } else {
+ downloadName = item.type ? `${item.name}.${item.type}` : item.name;
+ }
}
let taskId = downloadItem.taskId;
@@ -300,7 +295,6 @@ export class DownloadManagerService {
updateProgressCallback,
abortController,
sharingOptions: credentials,
- downloadName: options.downloadName,
});
console.timeEnd(`download-file-${file.uuid}`);
@@ -514,7 +508,6 @@ export class DownloadManagerService {
updateProgressCallback: (progress: number) => void;
abortController?: AbortController;
sharingOptions: { credentials: { user: string; pass: string }; mnemonic: string };
- downloadName?: string;
}) => {
const shouldDownloadUsingBlob =
!!(navigator.brave && (await navigator.brave.isBrave())) ||
@@ -538,7 +531,6 @@ export class DownloadManagerService {
itemData: payload.file,
updateProgressCallback: payload.updateProgressCallback,
abortController: payload.abortController,
- downloadName: payload.downloadName,
});
};
}
diff --git a/src/app/drive/services/worker.service/downloadWorkerHandler.ts b/src/app/drive/services/worker.service/downloadWorkerHandler.ts
index bbdf5f8b34..14cc3e9a95 100644
--- a/src/app/drive/services/worker.service/downloadWorkerHandler.ts
+++ b/src/app/drive/services/worker.service/downloadWorkerHandler.ts
@@ -11,7 +11,6 @@ interface HandleWorkerMessagesPayload {
abortController?: AbortController;
itemData: DriveFileData;
updateProgressCallback: (progress: number) => void;
- downloadName?: string;
}
interface HandleMessagesPayload {
@@ -38,10 +37,9 @@ export class DownloadWorkerHandler {
abortController,
itemData,
updateProgressCallback,
- downloadName,
}: HandleWorkerMessagesPayload) {
const fileName = itemData.plainName ?? itemData.name;
- const completeFilename = downloadName || (itemData.type ? `${fileName}.${itemData.type}` : fileName);
+ const completeFilename = itemData.type ? `${fileName}.${itemData.type}` : fileName;
const downloadId = itemData.fileId;
const fileSize = itemData.size;
diff --git a/src/app/i18n/locales/de.json b/src/app/i18n/locales/de.json
index d3763253f9..f3b5b40168 100644
--- a/src/app/i18n/locales/de.json
+++ b/src/app/i18n/locales/de.json
@@ -793,34 +793,6 @@
"Ort": "Ort"
}
},
- "versionHistory": {
- "title": "Versionsverlauf",
- "current": "Aktuell",
- "expiresInDays": "Läuft in {{days}} Tagen ab",
- "autosaveVersions": "{{count}}/{{total}} automatisch gespeicherte Versionen",
- "restoreVersion": "Version wiederherstellen",
- "downloadVersion": "Version herunterladen",
- "deleteVersion": "Version löschen",
- "deleteVersionTitle": "Version löschen",
- "deleteButton": "Löschen",
- "restoreButton": "Wiederherstellen",
- "downloadError": "Fehler beim Herunterladen der Version",
- "deleteVersionAdvice": "Diese Version wird dauerhaft gelöscht. \nDiese Aktion kann nicht rückgängig gemacht werden.",
- "deletingVersion": "Lösche",
- "restoreVersionTitle": "Version wiederherstellen",
- "restoreVersionAdvice": "Das Wiederherstellen dieser Version ersetzt die aktuelle Datei und entfernt alle neueren Versionen. \nSobald wiederhergestellt, kann diese Aktion nicht rückgängig gemacht werden.\n\nSie können eine Kopie neuerer Versionen herunterladen, bevor Sie wiederherstellen.",
- "restoringVersion": "Wiederherstellung",
- "restoreSuccess": "Version erfolgreich wiederhergestellt",
- "restoreError": "Fehler beim Wiederherstellen der Version",
- "deleteSuccess": "Version erfolgreich gelöscht",
- "deleteError": "Fehler beim Löschen der Version",
- "lockedFeature": {
- "title": "Gesperrte Funktion",
- "description": "Stellen Sie frühere Versionen Ihrer Dateien wieder her und verfolgen Sie Änderungen im Laufe der Zeit.",
- "supportedFormats": "Verfügbar für PDF-, Word-, Excel- und CSV-Dateien in kostenpflichtigen Plänen.",
- "upgradeButton": "Upgrade"
- }
- },
"shareModal": {
"title": "\"{{name}}\" teilen",
"list": {
@@ -1490,8 +1462,7 @@
"restore": "Wiederherstellen",
"deletePermanently": "Lösche dauerhaft",
"move": "Verschiebe",
- "delete": "Lösche",
- "versionHistory": "Versionsverlauf"
+ "delete": "Lösche"
},
"deleteItems": {
"title": "Dauerhaft löschen?",
diff --git a/src/app/i18n/locales/en.json b/src/app/i18n/locales/en.json
index 43e7c61095..c06c3d068d 100644
--- a/src/app/i18n/locales/en.json
+++ b/src/app/i18n/locales/en.json
@@ -890,34 +890,6 @@
"location": "Location"
}
},
- "versionHistory": {
- "title": "Version history",
- "current": "Current",
- "expiresInDays": "Expires in {{days}} days",
- "autosaveVersions": "{{count}}/{{total}} autosave versions",
- "restoreVersion": "Restore version",
- "downloadVersion": "Download version",
- "deleteVersion": "Delete version",
- "deleteVersionTitle": "Delete version",
- "deleteButton": "Delete",
- "restoreButton": "Restore",
- "downloadError": "Failed to download version",
- "deleteVersionAdvice": "This version will be permanently deleted. \nThis action cannot be undone.",
- "deletingVersion": "Deleting",
- "restoreVersionTitle": "Restore version",
- "restoreVersionAdvice": "Restoring this version will replace the current file and remove all newer versions. \nOnce restored, this action cannot be undone.\n\nYou can download a copy of newer versions before restoring.",
- "restoringVersion": "Restoring",
- "restoreSuccess": "Version restored successfully",
- "restoreError": "Failed to restore version",
- "deleteSuccess": "Version deleted successfully",
- "deleteError": "Failed to delete version",
- "lockedFeature": {
- "title": "Locked feature",
- "description": "Restore previous versions of your files and track changes over time.",
- "supportedFormats": "Available for PDF, Word, Excel, and CSV files in paid plans.",
- "upgradeButton": "Upgrade"
- }
- },
"shareModal": {
"title": "Share \"{{name}}\"",
"list": {
@@ -1566,7 +1538,6 @@
"share": "Share",
"manageAccess": "Manage access",
"download": "Download",
- "versionHistory": "Version history",
"moveToTrash": "Move to trash",
"copyLink": "Copy link",
"linkSettings": "Link settings",
diff --git a/src/app/i18n/locales/es.json b/src/app/i18n/locales/es.json
index 208338f7b4..19bc8565a6 100644
--- a/src/app/i18n/locales/es.json
+++ b/src/app/i18n/locales/es.json
@@ -872,34 +872,6 @@
"location": "Ubicación"
}
},
- "versionHistory": {
- "title": "Historial de versiones",
- "current": "Actual",
- "expiresInDays": "Expira en {{days}} días",
- "autosaveVersions": "{{count}}/{{total}} versiones de autoguardado",
- "restoreVersion": "Restaurar versión",
- "downloadVersion": "Descargar versión",
- "deleteVersion": "Eliminar versión",
- "deleteVersionTitle": "Eliminar versión",
- "deleteButton": "Eliminar",
- "restoreButton": "Restaurar",
- "downloadError": "Error al descargar la versión",
- "deleteVersionAdvice": "Esta versión será eliminada permanentemente. \nEsta acción no se puede deshacer.",
- "deletingVersion": "Eliminando",
- "restoreVersionTitle": "Restaurar versión",
- "restoreVersionAdvice": "Restaurar esta versión reemplazará el archivo actual y eliminará todas las versiones más recientes. \nUna vez restaurada, esta acción no se puede deshacer.\n\nPuedes descargar una copia de las versiones más recientes antes de restaurar.",
- "restoringVersion": "Restaurando",
- "restoreSuccess": "Versión restaurada exitosamente",
- "restoreError": "Error al restaurar la versión",
- "deleteSuccess": "Versión eliminada exitosamente",
- "deleteError": "Error al eliminar la versión",
- "lockedFeature": {
- "title": "Función bloqueada",
- "description": "Restaura versiones anteriores de tus archivos y realiza un seguimiento de los cambios a lo largo del tiempo.",
- "supportedFormats": "Disponible para archivos PDF, Word, Excel y CSV en planes de pago.",
- "upgradeButton": "Mejorar plan"
- }
- },
"shareModal": {
"title": "Compartir \"{{name}}\"",
"list": {
@@ -1543,7 +1515,6 @@
"manageLinkAccess": "Gestionar acceso",
"manageAccess": "Gestionar acceso",
"download": "Descargar",
- "versionHistory": "Historial de versiones",
"moveToTrash": "Mover a la papelera",
"copyLink": "Copiar enlace",
"linkSettings": "Ajustes del enlace",
diff --git a/src/app/i18n/locales/fr.json b/src/app/i18n/locales/fr.json
index e838edffd7..8f3d74539f 100644
--- a/src/app/i18n/locales/fr.json
+++ b/src/app/i18n/locales/fr.json
@@ -814,34 +814,6 @@
"location": "Emplacement"
}
},
- "versionHistory": {
- "title": "Historique des versions",
- "current": "Actuelle",
- "expiresInDays": "Expire dans {{days}} jours",
- "autosaveVersions": "{{count}}/{{total}} versions de sauvegarde automatique",
- "restoreVersion": "Restaurer la version",
- "downloadVersion": "Télécharger la version",
- "deleteVersion": "Supprimer la version",
- "deleteVersionTitle": "Supprimer la version",
- "deleteButton": "Supprimer",
- "restoreButton": "Restaurer",
- "downloadError": "Échec du téléchargement de la version",
- "deleteVersionAdvice": "Cette version sera définitivement supprimée. \nCette action ne peut pas être annulée.",
- "deletingVersion": "Suppression",
- "restoreVersionTitle": "Restaurer la version",
- "restoreVersionAdvice": "La restauration de cette version remplacera le fichier actuel et supprimera toutes les versions plus récentes. \nUne fois restaurée, cette action ne peut pas être annulée.\n\nVous pouvez télécharger une copie des versions plus récentes avant de restaurer.",
- "restoringVersion": "Restauration",
- "restoreSuccess": "Version restaurée avec succès",
- "restoreError": "Échec de la restauration de la version",
- "deleteSuccess": "Version supprimée avec succès",
- "deleteError": "Échec de la suppression de la version",
- "lockedFeature": {
- "title": "Fonctionnalité verrouillée",
- "description": "Restaurez les versions précédentes de vos fichiers et suivez les modifications au fil du temps.",
- "supportedFormats": "Disponible pour les fichiers PDF, Word, Excel et CSV dans les forfaits payants.",
- "upgradeButton": "Mettre à niveau"
- }
- },
"newFolderModal": {
"title": "Nouveau dossier",
"label": "Nom",
@@ -1489,7 +1461,6 @@
"manageLinkAccess": "Gestion de l'accès",
"manageAccess": "Gestion de l'accès",
"download": "Télécharger",
- "versionHistory": "Historique des versions",
"moveToTrash": "Déplacer vers la corbeille",
"copyLink": "Copier le lien",
"linkSettings": "Paramètres du lien",
diff --git a/src/app/i18n/locales/it.json b/src/app/i18n/locales/it.json
index a54d948c2a..3106ba4b8e 100644
--- a/src/app/i18n/locales/it.json
+++ b/src/app/i18n/locales/it.json
@@ -926,34 +926,6 @@
"location": "Posizione"
}
},
- "versionHistory": {
- "title": "Cronologia versioni",
- "current": "Attuale",
- "expiresInDays": "Scade tra {{days}} giorni",
- "autosaveVersions": "{{count}}/{{total}} versioni di salvataggio automatico",
- "restoreVersion": "Ripristina versione",
- "downloadVersion": "Scarica versione",
- "deleteVersion": "Elimina versione",
- "deleteVersionTitle": "Elimina versione",
- "deleteButton": "Elimina",
- "restoreButton": "Ripristina",
- "downloadError": "Impossibile scaricare la versione",
- "deleteVersionAdvice": "Questa versione sarà eliminata in modo permanente. \nQuesta azione non può essere annullata.",
- "deletingVersion": "Eliminazione",
- "restoreVersionTitle": "Ripristina versione",
- "restoreVersionAdvice": "Il ripristino di questa versione sostituirà il file corrente e rimuoverà tutte le versioni più recenti. \nUna volta ripristinata, questa azione non può essere annullata.\n\nPuoi scaricare una copia delle versioni più recenti prima del ripristino.",
- "restoringVersion": "Ripristino",
- "restoreSuccess": "Versione ripristinata con successo",
- "restoreError": "Impossibile ripristinare la versione",
- "deleteSuccess": "Versione eliminata con successo",
- "deleteError": "Impossibile eliminare la versione",
- "lockedFeature": {
- "title": "Funzione bloccata",
- "description": "Ripristina le versioni precedenti dei tuoi file e monitora le modifiche nel tempo.",
- "supportedFormats": "Disponibile per file PDF, Word, Excel e CSV nei piani a pagamento.",
- "upgradeButton": "Aggiorna"
- }
- },
"shareModal": {
"title": "Condividi \"{{name}}\"",
"list": {
@@ -1603,8 +1575,7 @@
"restore": "Ripristinare",
"deletePermanently": "Eliminare definitivamente",
"move": "Sposta",
- "delete": "Elimina",
- "versionHistory": "Cronologia versioni"
+ "delete": "Elimina"
},
"deleteItems": {
"title": "Eliminare definitivamente?",
diff --git a/src/app/i18n/locales/ru.json b/src/app/i18n/locales/ru.json
index e8b6f05ecf..a80bcca5b3 100644
--- a/src/app/i18n/locales/ru.json
+++ b/src/app/i18n/locales/ru.json
@@ -833,34 +833,6 @@
"location": "Расположение"
}
},
- "versionHistory": {
- "title": "История версий",
- "current": "Текущая",
- "expiresInDays": "Истекает через {{days}} дней",
- "autosaveVersions": "{{count}}/{{total}} версий автосохранения",
- "restoreVersion": "Восстановить версию",
- "downloadVersion": "Скачать версию",
- "deleteVersion": "Удалить версию",
- "deleteVersionTitle": "Удалить версию",
- "deleteButton": "Удалить",
- "restoreButton": "Восстановить",
- "downloadError": "Не удалось загрузить версию",
- "deleteVersionAdvice": "Эта версия будет удалена навсегда. \nЭто действие нельзя отменить.",
- "deletingVersion": "Удаление",
- "restoreVersionTitle": "Восстановить версию",
- "restoreVersionAdvice": "Восстановление этой версии заменит текущий файл и удалит все более новые версии. \nПосле восстановления это действие нельзя отменить.\n\nВы можете скачать копию более новых версий перед восстановлением.",
- "restoringVersion": "Восстановление",
- "restoreSuccess": "Версия успешно восстановлена",
- "restoreError": "Не удалось восстановить версию",
- "deleteSuccess": "Версия успешно удалена",
- "deleteError": "Не удалось удалить версию",
- "lockedFeature": {
- "title": "Заблокированная функция",
- "description": "Восстанавливайте предыдущие версии файлов и отслеживайте изменения со временем.",
- "supportedFormats": "Доступно для файлов PDF, Word, Excel и CSV в платных тарифах.",
- "upgradeButton": "Обновить"
- }
- },
"shareModal": {
"title": "Поделиться \"{{name}}\"",
"list": {
@@ -1502,7 +1474,6 @@
"manageLinkAccess": "Управление доступом",
"manageAccess": "Управление доступом",
"download": "Загрузить",
- "versionHistory": "История версий",
"moveToTrash": "Переместить в корзину",
"copyLink": "Копировать ссылку",
"linkSettings": "Настройки ссылки",
diff --git a/src/app/i18n/locales/tw.json b/src/app/i18n/locales/tw.json
index 604e3d06f1..25c4645256 100644
--- a/src/app/i18n/locales/tw.json
+++ b/src/app/i18n/locales/tw.json
@@ -820,34 +820,6 @@
"location": "位置"
}
},
- "versionHistory": {
- "title": "版本歷史",
- "current": "目前",
- "expiresInDays": "{{days}} 天後過期",
- "autosaveVersions": "{{count}}/{{total}} 自動儲存版本",
- "restoreVersion": "復原版本",
- "downloadVersion": "下載版本",
- "deleteVersion": "刪除版本",
- "deleteVersionTitle": "刪除版本",
- "deleteButton": "刪除",
- "restoreButton": "復原",
- "downloadError": "下載版本失敗",
- "deleteVersionAdvice": "此版本將被永久刪除。\n此操作無法復原。",
- "deletingVersion": "刪除中",
- "restoreVersionTitle": "復原版本",
- "restoreVersionAdvice": "復原此版本將取代目前檔案並刪除所有較新的版本。\n一旦復原,此操作無法撤銷。\n\n您可以在復原之前下載較新版本的副本。",
- "restoringVersion": "復原中",
- "restoreSuccess": "版本復原成功",
- "restoreError": "復原版本失敗",
- "deleteSuccess": "版本刪除成功",
- "deleteError": "刪除版本失敗",
- "lockedFeature": {
- "title": "功能已鎖定",
- "description": "復原檔案的先前版本並追蹤隨時間的變化。",
- "supportedFormats": "適用於付費方案中的PDF、Word、Excel和CSV檔案。",
- "upgradeButton": "升級"
- }
- },
"shareModal": {
"title": "分享“{{name}}”",
"list": {
@@ -1486,7 +1458,6 @@
},
"dropdown": {
"openPreview": "打開預覽",
- "versionHistory": "版本歷史",
"details": "詳細信息",
"shareLink": "分享",
"shareTeam": "与团队分享",
diff --git a/src/app/i18n/locales/zh.json b/src/app/i18n/locales/zh.json
index c753a87e2e..688c33df0e 100644
--- a/src/app/i18n/locales/zh.json
+++ b/src/app/i18n/locales/zh.json
@@ -856,34 +856,6 @@
"location": "位置"
}
},
- "versionHistory": {
- "title": "版本历史",
- "current": "当前",
- "expiresInDays": "{{days}} 天后到期",
- "autosaveVersions": "{{count}}/{{total}} 自动保存版本",
- "restoreVersion": "恢复版本",
- "downloadVersion": "下载版本",
- "deleteVersion": "删除版本",
- "deleteVersionTitle": "删除版本",
- "deleteButton": "删除",
- "restoreButton": "恢复",
- "downloadError": "下载版本失败",
- "deleteVersionAdvice": "此版本将被永久删除。\n此操作无法撤销。",
- "deletingVersion": "删除中",
- "restoreVersionTitle": "恢复版本",
- "restoreVersionAdvice": "恢复此版本将替换当前文件并删除所有较新的版本。\n一旦恢复,此操作无法撤销。\n\n您可以在恢复之前下载较新版本的副本。",
- "restoringVersion": "恢复中",
- "restoreSuccess": "版本恢复成功",
- "restoreError": "恢复版本失败",
- "deleteSuccess": "版本删除成功",
- "deleteError": "删除版本失败",
- "lockedFeature": {
- "title": "功能已锁定",
- "description": "恢复文件的以前版本并跟踪随时间的变化。",
- "supportedFormats": "适用于付费计划中的PDF、Word、Excel和CSV文件。",
- "upgradeButton": "升级"
- }
- },
"shareModal": {
"title": "分享 \"{{name}}\"",
"list": {
@@ -1531,7 +1503,6 @@
"share": "分享",
"manageAccess": "管理访问权限",
"download": "下载",
- "versionHistory": "版本历史",
"moveToTrash": "移入垃圾箱",
"copyLink": "复制链接",
"linkSettings": "链接设置",
diff --git a/src/app/store/index.ts b/src/app/store/index.ts
index 76b3e1236b..da313723c5 100644
--- a/src/app/store/index.ts
+++ b/src/app/store/index.ts
@@ -11,7 +11,6 @@ import taskManagerReducer from './slices/taskManager';
import uiReducer from './slices/ui';
import userReducer from './slices/user';
import workspacesReducer from './slices/workspaces/workspacesStore';
-import { fileVersionsReducer } from './slices/fileVersions';
export const store = configureStore({
reducer: {
@@ -26,7 +25,6 @@ export const store = configureStore({
referrals: referralsReducer,
shared: sharedReducer,
workspaces: workspacesReducer,
- fileVersions: fileVersionsReducer,
},
});
diff --git a/src/app/store/slices/fileVersions/fileVersions.selectors.ts b/src/app/store/slices/fileVersions/fileVersions.selectors.ts
deleted file mode 100644
index 55b0d24b2e..0000000000
--- a/src/app/store/slices/fileVersions/fileVersions.selectors.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { FileVersion, FileLimitsResponse } from '@internxt/sdk/dist/drive/storage/types';
-import { RootState } from '../..';
-
-const fileVersionsSelectors = {
- getLimits(state: RootState): FileLimitsResponse | null {
- return state.fileVersions.limits;
- },
- isLimitsLoading(state: RootState): boolean {
- return state.fileVersions.isLimitsLoading;
- },
- getVersionsByFileId(state: RootState, fileId: NonNullable): FileVersion[] {
- return state.fileVersions.versionsByFileId[fileId] ?? [];
- },
- isLoadingByFileId(state: RootState, fileId: NonNullable): boolean {
- return state.fileVersions.isLoadingByFileId[fileId] ?? false;
- },
-};
-
-export default fileVersionsSelectors;
diff --git a/src/app/store/slices/fileVersions/index.test.ts b/src/app/store/slices/fileVersions/index.test.ts
deleted file mode 100644
index c935495416..0000000000
--- a/src/app/store/slices/fileVersions/index.test.ts
+++ /dev/null
@@ -1,161 +0,0 @@
-import { beforeEach, describe, expect, it, vi } from 'vitest';
-import { FileVersion, FileLimitsResponse } from '@internxt/sdk/dist/drive/storage/types';
-import fileVersionService from 'views/Drive/services/fileVersion.service';
-import { fileVersionsActions, fileVersionsReducer, fetchFileVersionsThunk, fetchVersionLimitsThunk } from './index';
-import { RootState } from '../..';
-
-vi.mock('views/Drive/services/fileVersion.service', () => ({
- default: {
- getFileVersions: vi.fn(),
- getLimits: vi.fn(),
- },
-}));
-
-describe('File history state', () => {
- const fileUuid = 'file-uuid';
- const versions: FileVersion[] = [
- { id: 'v1', fileId: fileUuid } as FileVersion,
- { id: 'v2', fileId: fileUuid } as FileVersion,
- ];
-
- beforeEach(() => {
- vi.clearAllMocks();
- });
-
- describe('Loading file history', () => {
- it('when file history is requested, then the versions load successfully', async () => {
- const getFileVersionsSpy = vi.spyOn(fileVersionService, 'getFileVersions').mockResolvedValueOnce(versions);
- const dispatch = vi.fn();
-
- const action = await fetchFileVersionsThunk(fileUuid)(dispatch, () => ({}) as RootState, undefined);
-
- expect(getFileVersionsSpy).toHaveBeenCalledWith(fileUuid);
- expect(action.meta.requestStatus).toBe('fulfilled');
- expect(action.payload).toEqual({ fileUuid, versions });
- });
-
- it('when file history fails to load, then the error is reported', async () => {
- const getFileVersionsSpy = vi
- .spyOn(fileVersionService, 'getFileVersions')
- .mockRejectedValueOnce(new Error('failed to fetch'));
- const dispatch = vi.fn();
-
- const action = await fetchFileVersionsThunk(fileUuid)(dispatch, () => ({}) as RootState, undefined);
-
- expect(getFileVersionsSpy).toHaveBeenCalledWith(fileUuid);
- expect(action.meta.requestStatus).toBe('rejected');
- expect(action.payload).toBe('failed to fetch');
- });
-
- it('when version limits are requested, then the limits load successfully', async () => {
- const limits: FileLimitsResponse = {
- versioning: { enabled: true, maxFileSize: 0, retentionDays: 0, maxVersions: 0 },
- };
- const getLimitsSpy = vi.spyOn(fileVersionService, 'getLimits').mockResolvedValueOnce(limits);
- const dispatch = vi.fn();
-
- const action = await fetchVersionLimitsThunk({})(dispatch, () => ({}) as RootState, undefined);
-
- expect(getLimitsSpy).toHaveBeenCalled();
- expect(action.meta.requestStatus).toBe('fulfilled');
- expect(action.payload).toEqual({ limits, isSilent: false });
- });
-
- it('when version limits fail to load, then the error is reported', async () => {
- const getLimitsSpy = vi
- .spyOn(fileVersionService, 'getLimits')
- .mockRejectedValueOnce(new Error('limits unavailable'));
- const dispatch = vi.fn();
-
- const action = await fetchVersionLimitsThunk({})(dispatch, () => ({}) as RootState, undefined);
-
- expect(getLimitsSpy).toHaveBeenCalled();
- expect(action.meta.requestStatus).toBe('rejected');
- expect(action.payload).toBe('limits unavailable');
- });
- });
-
- describe('Updating stored history', () => {
- it('when history starts loading, then loading and error states update', () => {
- const pendingState = fileVersionsReducer(undefined, fetchFileVersionsThunk.pending('', fileUuid));
-
- expect(pendingState.isLoadingByFileId[fileUuid]).toBe(true);
- expect(pendingState.errorsByFileId[fileUuid]).toBeNull();
-
- const rejectedState = fileVersionsReducer(pendingState, {
- type: fetchFileVersionsThunk.rejected.type,
- meta: { arg: fileUuid },
- payload: 'problem',
- } as any);
-
- expect(rejectedState.isLoadingByFileId[fileUuid]).toBe(false);
- expect(rejectedState.errorsByFileId[fileUuid]).toBe('problem');
-
- const fulfilledState = fileVersionsReducer(
- rejectedState,
- fetchFileVersionsThunk.fulfilled({ fileUuid, versions }, '', fileUuid),
- );
-
- expect(fulfilledState.isLoadingByFileId[fileUuid]).toBe(false);
- expect(fulfilledState.versionsByFileId[fileUuid]).toEqual(versions);
- });
-
- it('when cached history is cleared for a file or all files, then entries are removed', () => {
- const populatedState = {
- versionsByFileId: { [fileUuid]: versions },
- isLoadingByFileId: { [fileUuid]: false },
- errorsByFileId: { [fileUuid]: 'error' },
- limits: null,
- isLimitsLoading: false,
- };
-
- const afterInvalidate = fileVersionsReducer(populatedState as any, fileVersionsActions.invalidateCache(fileUuid));
- expect(afterInvalidate.versionsByFileId[fileUuid]).toBeUndefined();
- expect(afterInvalidate.isLoadingByFileId[fileUuid]).toBeUndefined();
- expect(afterInvalidate.errorsByFileId[fileUuid]).toBeUndefined();
-
- const afterClearAll = fileVersionsReducer(populatedState as any, fileVersionsActions.clearAllCache());
- expect(afterClearAll.versionsByFileId).toEqual({});
- expect(afterClearAll.isLoadingByFileId).toEqual({});
- expect(afterClearAll.errorsByFileId).toEqual({});
- });
-
- it('when a version is deleted, then it is removed from the list', () => {
- const state = {
- versionsByFileId: { [fileUuid]: versions },
- isLoadingByFileId: {},
- errorsByFileId: {},
- limits: null,
- isLimitsLoading: false,
- };
-
- const updatedState = fileVersionsReducer(
- state as any,
- fileVersionsActions.updateVersionsAfterDelete({ fileUuid, versionId: 'v1' }),
- );
-
- expect(updatedState.versionsByFileId[fileUuid]).toEqual([versions[1]]);
- });
-
- it('when limits are loading or finished, then the loading state updates', () => {
- const pendingState = fileVersionsReducer(undefined, fetchVersionLimitsThunk.pending('', {}));
- expect(pendingState.isLimitsLoading).toBe(true);
-
- const limits: FileLimitsResponse = {
- versioning: { enabled: true, maxFileSize: 0, retentionDays: 0, maxVersions: 0 },
- };
- const fulfilledState = fileVersionsReducer(
- pendingState,
- fetchVersionLimitsThunk.fulfilled({ limits, isSilent: false }, '', {}),
- );
- expect(fulfilledState.isLimitsLoading).toBe(false);
- expect(fulfilledState.limits).toEqual(limits);
-
- const rejectedState = fileVersionsReducer(
- pendingState,
- fetchVersionLimitsThunk.rejected(new Error('err'), '', {}),
- );
- expect(rejectedState.isLimitsLoading).toBe(false);
- });
- });
-});
diff --git a/src/app/store/slices/fileVersions/index.ts b/src/app/store/slices/fileVersions/index.ts
deleted file mode 100644
index cee9190397..0000000000
--- a/src/app/store/slices/fileVersions/index.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-import { createSlice, PayloadAction, createAsyncThunk } from '@reduxjs/toolkit';
-import { FileVersion, FileLimitsResponse } from '@internxt/sdk/dist/drive/storage/types';
-import fileVersionService from 'views/Drive/services/fileVersion.service';
-
-export const VERSION_LIMITS_POLL_MAX_ATTEMPTS = 3;
-export const VERSION_LIMITS_POLL_DELAYS = [2000, 4000, 6000];
-
-interface FileVersionsState {
- versionsByFileId: Record, FileVersion[]>;
- isLoadingByFileId: Record, boolean>;
- errorsByFileId: Record, string | null>;
- limits: FileLimitsResponse | null;
- isLimitsLoading: boolean;
-}
-
-const initialState: FileVersionsState = {
- versionsByFileId: {},
- isLoadingByFileId: {},
- errorsByFileId: {},
- limits: null,
- isLimitsLoading: false,
-};
-
-export const fetchFileVersionsThunk = createAsyncThunk(
- 'fileVersions/fetch',
- async (fileUuid: string, { rejectWithValue }) => {
- try {
- const versions = await fileVersionService.getFileVersions(fileUuid);
- return { fileUuid, versions };
- } catch (error) {
- return rejectWithValue((error as Error).message);
- }
- },
-);
-
-export const fetchVersionLimitsThunk = createAsyncThunk(
- 'fileVersions/fetchLimits',
- async ({ isSilent = false }: { isSilent?: boolean } = {}, { rejectWithValue }) => {
- try {
- const limits = await fileVersionService.getLimits();
- return { limits, isSilent };
- } catch (error) {
- return rejectWithValue((error as Error).message);
- }
- },
-);
-
-export const fileVersionsSlice = createSlice({
- name: 'fileVersions',
- initialState,
- reducers: {
- invalidateCache: (state, action: PayloadAction) => {
- delete state.versionsByFileId[action.payload];
- delete state.isLoadingByFileId[action.payload];
- delete state.errorsByFileId[action.payload];
- },
- clearAllCache: (state) => {
- state.versionsByFileId = {};
- state.isLoadingByFileId = {};
- state.errorsByFileId = {};
- },
- updateVersionsAfterDelete: (state, action: PayloadAction<{ fileUuid: string; versionId: string }>) => {
- const { fileUuid, versionId } = action.payload;
- if (state.versionsByFileId[fileUuid]) {
- state.versionsByFileId[fileUuid] = state.versionsByFileId[fileUuid].filter((v) => v.id !== versionId);
- }
- },
- },
- extraReducers: (builder) => {
- builder
- .addCase(fetchFileVersionsThunk.pending, (state, action) => {
- state.isLoadingByFileId[action.meta.arg] = true;
- state.errorsByFileId[action.meta.arg] = null;
- })
- .addCase(fetchFileVersionsThunk.fulfilled, (state, action) => {
- const { fileUuid, versions } = action.payload;
- state.versionsByFileId[fileUuid] = versions;
- state.isLoadingByFileId[fileUuid] = false;
- })
- .addCase(fetchFileVersionsThunk.rejected, (state, action) => {
- state.isLoadingByFileId[action.meta.arg] = false;
- state.errorsByFileId[action.meta.arg] = action.payload as string;
- })
- .addCase(fetchVersionLimitsThunk.pending, (state, action) => {
- const isSilent = action.meta.arg?.isSilent || false;
- if (!isSilent) {
- state.isLimitsLoading = true;
- }
- })
- .addCase(fetchVersionLimitsThunk.fulfilled, (state, action) => {
- state.limits = action.payload.limits;
- state.isLimitsLoading = false;
- })
- .addCase(fetchVersionLimitsThunk.rejected, (state) => {
- state.isLimitsLoading = false;
- });
- },
-});
-
-export const fileVersionsActions = fileVersionsSlice.actions;
-export const fileVersionsReducer = fileVersionsSlice.reducer;
-export { default as fileVersionsSelectors } from './fileVersions.selectors';
diff --git a/src/app/store/slices/ui/index.ts b/src/app/store/slices/ui/index.ts
index 732f20632e..e1e3f8e96e 100644
--- a/src/app/store/slices/ui/index.ts
+++ b/src/app/store/slices/ui/index.ts
@@ -1,7 +1,6 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { DriveItemData, DriveItemDetails, FileInfoMenuItem, UpgradePlanDialogInfo } from 'app/drive/types';
import { PreviewFileItem } from '../../../share/types';
-import { FileVersion } from 'views/Drive/components/VersionHistory/types';
interface UISliceState {
isSidenavCollapsed: boolean;
@@ -10,11 +9,8 @@ interface UISliceState {
isShareDialogOpen: boolean;
isInvitationsDialogOpen: boolean;
isItemDetailsDialogOpen: boolean;
- isVersionHistorySidebarOpen: boolean;
isCreateFolderDialogOpen: boolean;
isDeleteItemsDialogOpen: boolean;
- isDeleteVersionDialogOpen: boolean;
- isRestoreVersionDialogOpen: boolean;
isMoveItemsDialogOpen: boolean;
isClearTrashDialogOpen: boolean;
isEditFolderNameDialog: boolean;
@@ -31,9 +27,6 @@ interface UISliceState {
isFileViewerOpen: boolean;
fileViewerItem: PreviewFileItem | null;
itemDetails: DriveItemDetails | null;
- versionHistoryItem: DriveItemData | null;
- versionToDelete: FileVersion | null;
- versionToRestore: FileVersion | null;
currentFileInfoMenuItem: FileInfoMenuItem | null;
currentEditingNameDriveItem: DriveItemData | null;
currentEditingNameDirty: string;
@@ -48,11 +41,8 @@ const initialState: UISliceState = {
isShareDialogOpen: false,
isInvitationsDialogOpen: false,
isItemDetailsDialogOpen: false,
- isVersionHistorySidebarOpen: false,
isCreateFolderDialogOpen: false,
isDeleteItemsDialogOpen: false,
- isDeleteVersionDialogOpen: false,
- isRestoreVersionDialogOpen: false,
isMoveItemsDialogOpen: false,
isClearTrashDialogOpen: false,
isEditFolderNameDialog: false,
@@ -69,9 +59,6 @@ const initialState: UISliceState = {
isFileViewerOpen: false,
fileViewerItem: null,
itemDetails: null,
- versionHistoryItem: null,
- versionToDelete: null,
- versionToRestore: null,
currentFileInfoMenuItem: null,
currentEditingNameDriveItem: null,
currentEditingNameDirty: '',
@@ -101,30 +88,12 @@ export const uiSlice = createSlice({
setIsItemDetailsDialogOpen(state: UISliceState, action: PayloadAction) {
state.isItemDetailsDialogOpen = action.payload;
},
- setIsVersionHistorySidebarOpen(state: UISliceState, action: PayloadAction) {
- state.isVersionHistorySidebarOpen = action.payload;
- },
- setVersionHistoryItem: (state: UISliceState, action: PayloadAction) => {
- state.versionHistoryItem = action.payload;
- },
- setVersionToDelete: (state: UISliceState, action: PayloadAction) => {
- state.versionToDelete = action.payload;
- },
- setVersionToRestore: (state: UISliceState, action: PayloadAction) => {
- state.versionToRestore = action.payload;
- },
setIsCreateFolderDialogOpen: (state: UISliceState, action: PayloadAction) => {
state.isCreateFolderDialogOpen = action.payload;
},
setIsDeleteItemsDialogOpen: (state: UISliceState, action: PayloadAction) => {
state.isDeleteItemsDialogOpen = action.payload;
},
- setIsDeleteVersionDialogOpen: (state: UISliceState, action: PayloadAction) => {
- state.isDeleteVersionDialogOpen = action.payload;
- },
- setIsRestoreVersionDialogOpen: (state: UISliceState, action: PayloadAction) => {
- state.isRestoreVersionDialogOpen = action.payload;
- },
setIsMoveItemsDialogOpen: (state: UISliceState, action: PayloadAction) => {
state.isMoveItemsDialogOpen = action.payload;
},
diff --git a/src/services/date.service.test.ts b/src/services/date.service.test.ts
index 334d2117e4..6b5791aa87 100644
--- a/src/services/date.service.test.ts
+++ b/src/services/date.service.test.ts
@@ -1,5 +1,5 @@
import dayjs from 'dayjs';
-import { beforeEach, afterEach, describe, expect, test, vi } from 'vitest';
+import { describe, expect, test } from 'vitest';
import dateService from './date.service';
describe('dateService', () => {
@@ -27,30 +27,4 @@ describe('dateService', () => {
expect(isBefore).toBe(false);
});
-
- describe('Expiration countdown', () => {
- beforeEach(() => {
- vi.useFakeTimers();
- vi.setSystemTime(new Date('2023-01-01T00:00:00Z'));
- });
-
- afterEach(() => {
- vi.useRealTimers();
- });
-
- test('when the expiration is in the future, then remaining days round up', () => {
- const expiresAt = '2023-01-02T06:00:00Z';
- expect(dateService.getDaysUntilExpiration(expiresAt)).toBe(2);
- });
-
- test('when the expiration has passed, then zero days remain', () => {
- const expiresAt = '2022-12-31T23:59:59Z';
- expect(dateService.getDaysUntilExpiration(expiresAt)).toBe(0);
- });
-
- test('when the expiration is later today, then it counts as one day remaining', () => {
- const expiresAt = '2023-01-01T12:00:00Z';
- expect(dateService.getDaysUntilExpiration(expiresAt)).toBe(1);
- });
- });
});
diff --git a/src/services/date.service.ts b/src/services/date.service.ts
index 2e2213ffd9..b21c1c83d3 100644
--- a/src/services/date.service.ts
+++ b/src/services/date.service.ts
@@ -24,20 +24,12 @@ export const formatDefaultDate = (date: Date | string | number, translate: (key:
return dayjs(date).format(`D MMM, YYYY [${translatedAt}] HH:mm`);
};
-export const getDaysUntilExpiration = (expiresAt: Date | string): number => {
- const expirationDate = dayjs(expiresAt);
- const now = dayjs();
- const diffInDays = expirationDate.diff(now, 'day', true);
- return Math.max(0, Math.ceil(diffInDays));
-};
-
const dateService = {
format,
isDateOneBefore,
getCurrentDate,
getExpirationDate,
formatDefaultDate,
- getDaysUntilExpiration,
};
export default dateService;
diff --git a/src/views/Drive/DriveView.tsx b/src/views/Drive/DriveView.tsx
index 78dbff8852..5eef11f20b 100644
--- a/src/views/Drive/DriveView.tsx
+++ b/src/views/Drive/DriveView.tsx
@@ -23,7 +23,6 @@ import { STORAGE_KEYS } from 'services/storage-keys';
import workspacesService from 'services/workspace.service';
import { useHistory } from 'react-router-dom';
import envService from 'services/env.service';
-import { fetchVersionLimitsThunk } from 'app/store/slices/fileVersions';
export interface DriveViewProps {
namePath: FolderPath[];
@@ -48,7 +47,6 @@ const DriveView = (props: DriveViewProps) => {
dispatch(uiActions.setIsGlobalSearch(false));
dispatch(storageThunks.resetNamePathThunk());
dispatch(storageActions.clearSelectedItems());
- dispatch(fetchVersionLimitsThunk());
}, []);
useEffect(() => {
diff --git a/src/views/Drive/components/DriveExplorer/components/DriveExplorerList.tsx b/src/views/Drive/components/DriveExplorer/components/DriveExplorerList.tsx
index affe976cfd..35b1ec10c0 100644
--- a/src/views/Drive/components/DriveExplorer/components/DriveExplorerList.tsx
+++ b/src/views/Drive/components/DriveExplorer/components/DriveExplorerList.tsx
@@ -34,7 +34,6 @@ import {
} from './DriveItemContextMenu';
import { List } from '@internxt/ui';
import { DownloadManager } from 'app/network/DownloadManager';
-import { useVersionHistoryMenuConfig } from 'views/Drive/hooks/useVersionHistoryMenuConfig';
interface DriveExplorerListProps {
folderId: string;
@@ -122,8 +121,6 @@ const DriveExplorerList: React.FC = memo((props) => {
const { translate } = useTranslationContext();
- const versionHistoryMenuConfig = useVersionHistoryMenuConfig(props.selectedItems[0]);
-
const onSelectedItemsChanged = (changes: { props: DriveItemData; value: boolean }[]) => {
let updatedSelectedItems = props.selectedItems;
@@ -272,14 +269,6 @@ const DriveExplorerList: React.FC = memo((props) => {
[selectedWorkspace, workspaceCredentials],
);
- const viewVersionHistory = useCallback(
- (item: ContextMenuDriveItem) => {
- dispatch(uiActions.setVersionHistoryItem(item as DriveItemData));
- dispatch(uiActions.setIsVersionHistorySidebarOpen(true));
- },
- [dispatch, uiActions],
- );
-
const moveToTrash = useCallback(
(items: ContextMenuDriveItem[]) => {
if (isSelectedSharedItems) {
@@ -338,9 +327,7 @@ const DriveExplorerList: React.FC = memo((props) => {
renameItem: renameItem,
moveItem: moveItem,
downloadItem: downloadItem,
- viewVersionHistory: viewVersionHistory,
moveToTrash: props.onOpenStopSharingAndMoveToTrashDialog,
- versionHistoryConfig: versionHistoryMenuConfig,
});
const selectedSharedFileMenu = contextMenuDriveItemShared({
@@ -353,9 +340,7 @@ const DriveExplorerList: React.FC = memo((props) => {
renameItem: renameItem,
moveItem: moveItem,
downloadItem: downloadItem,
- viewVersionHistory: viewVersionHistory,
moveToTrash: props.onOpenStopSharingAndMoveToTrashDialog,
- versionHistoryConfig: versionHistoryMenuConfig,
});
const selectedFolderMenu = contextMenuDriveFolderNotSharedLink({
@@ -366,8 +351,6 @@ const DriveExplorerList: React.FC = memo((props) => {
moveItem: moveItem,
downloadItem: downloadItem,
moveToTrash: () => moveToTrash(props.selectedItems),
- viewVersionHistory: viewVersionHistory,
- versionHistoryConfig: versionHistoryMenuConfig,
});
const selectedFileMenu = contextMenuDriveNotSharedLink({
@@ -379,8 +362,6 @@ const DriveExplorerList: React.FC = memo((props) => {
moveItem: moveItem,
downloadItem: downloadItem,
moveToTrash: () => moveToTrash(props.selectedItems),
- viewVersionHistory: viewVersionHistory,
- versionHistoryConfig: versionHistoryMenuConfig,
});
const shareWithTeam = () => {
@@ -397,8 +378,6 @@ const DriveExplorerList: React.FC = memo((props) => {
moveItem: moveItem,
downloadItem: downloadItem,
moveToTrash: () => moveToTrash(props.selectedItems),
- viewVersionHistory: viewVersionHistory,
- versionHistoryConfig: versionHistoryMenuConfig,
});
const workspaceFolderMenu = contextMenuWorkspaceFolder({
@@ -410,8 +389,6 @@ const DriveExplorerList: React.FC = memo((props) => {
moveItem: moveItem,
downloadItem: downloadItem,
moveToTrash: () => moveToTrash(props.selectedItems),
- viewVersionHistory: viewVersionHistory,
- versionHistoryConfig: versionHistoryMenuConfig,
});
const getContextMenu = () => {
diff --git a/src/views/Drive/components/DriveExplorer/components/DriveItemContextMenu.tsx b/src/views/Drive/components/DriveExplorer/components/DriveItemContextMenu.tsx
index 1666039545..3467b1b69e 100644
--- a/src/views/Drive/components/DriveExplorer/components/DriveItemContextMenu.tsx
+++ b/src/views/Drive/components/DriveExplorer/components/DriveItemContextMenu.tsx
@@ -6,7 +6,6 @@ import {
Eye,
Icon,
Info,
- LockSimple,
Link,
PencilSimple,
Trash,
@@ -94,46 +93,6 @@ const getDownloadMenuItem = (downloadItems: (target?) => void) => ({
},
});
-export type VersionHistoryMenuConfig = {
- isLocked: boolean;
- isExtensionAllowed: boolean;
- onUpgradeClick?: () => void;
-};
-
-const getVersionHistoryMenuItem = (
- viewVersionHistory: (target?) => void,
- config?: VersionHistoryMenuConfig,
-): MenuItemType => {
- const isLocked = config?.isLocked ?? false;
- const isExtensionAllowed = config?.isExtensionAllowed ?? true;
-
- if (isLocked) {
- return {
- name: t('drive.dropdown.versionHistory') as string,
- icon: LockSimple,
- action: viewVersionHistory,
- disabled: () => false,
- node: (
-
-
- {t('drive.dropdown.versionHistory')}
-
- ),
- };
- }
-
- return {
- name: t('drive.dropdown.versionHistory') as string,
- icon: ClockCounterClockwise,
- action: viewVersionHistory,
- disabled: (item: DriveItemData) => item.isFolder || !isExtensionAllowed,
- };
-};
-
const getMoveToTrashMenuItem = (moveToTrash: (target?) => void) => ({
name: t('drive.dropdown.moveToTrash'),
icon: Trash,
@@ -206,9 +165,7 @@ const contextMenuDriveNotSharedLink = ({
renameItem,
moveItem,
downloadItem,
- viewVersionHistory,
moveToTrash,
- versionHistoryConfig,
}: {
shareLink: (item: DriveItemData) => void;
openPreview?: (item: DriveItemData) => void;
@@ -217,9 +174,7 @@ const contextMenuDriveNotSharedLink = ({
renameItem: (item: DriveItemData) => void;
moveItem: (item: DriveItemData) => void;
downloadItem: (item: DriveItemData) => void;
- viewVersionHistory: (item: DriveItemData) => void;
moveToTrash: (item: DriveItemData) => void;
- versionHistoryConfig?: VersionHistoryMenuConfig;
}): Array> =>
[
shareLinkMenuItem(shareLink),
@@ -230,7 +185,6 @@ const contextMenuDriveNotSharedLink = ({
getRenameMenuItem(renameItem),
getMoveItemMenuItem(moveItem),
getDownloadMenuItem(downloadItem),
- getVersionHistoryMenuItem(viewVersionHistory, versionHistoryConfig),
{ separator: true },
getMoveToTrashMenuItem(moveToTrash),
].filter(Boolean) as MenuItemType[];
@@ -242,9 +196,7 @@ const contextMenuDriveFolderNotSharedLink = ({
renameItem,
moveItem,
downloadItem,
- viewVersionHistory,
moveToTrash,
- versionHistoryConfig,
}: {
shareLink: (item: DriveItemData) => void;
getLink: (item: DriveItemData) => void;
@@ -252,9 +204,7 @@ const contextMenuDriveFolderNotSharedLink = ({
renameItem: (item: DriveItemData) => void;
moveItem: (item: DriveItemData) => void;
downloadItem: (item: DriveItemData) => void;
- viewVersionHistory: (item: DriveItemData) => void;
moveToTrash: (item: DriveItemData) => void;
- versionHistoryConfig?: VersionHistoryMenuConfig;
}): Array> => [
shareLinkMenuItem(shareLink),
getCopyLinkMenuItem(getLink),
@@ -263,7 +213,6 @@ const contextMenuDriveFolderNotSharedLink = ({
getRenameMenuItem(renameItem),
getMoveItemMenuItem(moveItem),
getDownloadMenuItem(downloadItem),
- getVersionHistoryMenuItem(viewVersionHistory, versionHistoryConfig),
{ separator: true },
getMoveToTrashMenuItem(moveToTrash),
];
@@ -276,9 +225,7 @@ const contextMenuDriveItemShared = ({
renameItem,
moveItem,
downloadItem,
- viewVersionHistory,
moveToTrash,
- versionHistoryConfig,
}: {
openPreview?: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
showDetails: (item: DriveItemData) => void;
@@ -287,9 +234,7 @@ const contextMenuDriveItemShared = ({
renameItem: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
moveItem: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
downloadItem: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
- viewVersionHistory: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
moveToTrash: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
- versionHistoryConfig?: VersionHistoryMenuConfig;
}): Array> => {
const shareLinkItems = [manageLinkAccessMenuItem(openShareAccessSettings), getCopyLinkMenuItem(copyLink)];
return [
@@ -300,7 +245,6 @@ const contextMenuDriveItemShared = ({
getRenameMenuItem(renameItem),
getMoveItemMenuItem(moveItem),
getDownloadMenuItem(downloadItem),
- getVersionHistoryMenuItem(viewVersionHistory, versionHistoryConfig),
{ separator: true },
getMoveToTrashMenuItem(moveToTrash),
].filter(Boolean) as MenuItemType[];
@@ -313,9 +257,7 @@ const contextMenuDriveFolderShared = ({
renameItem,
moveItem,
downloadItem,
- viewVersionHistory,
moveToTrash,
- versionHistoryConfig,
}: {
copyLink: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
openShareAccessSettings: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
@@ -323,9 +265,7 @@ const contextMenuDriveFolderShared = ({
renameItem: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
moveItem: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
downloadItem: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
- viewVersionHistory: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
moveToTrash: (item: DriveItemData | (ListShareLinksItem & { code: string })) => void;
- versionHistoryConfig?: VersionHistoryMenuConfig;
}): Array> => {
const shareLinkItems = [manageLinkAccessMenuItem(openShareAccessSettings), getCopyLinkMenuItem(copyLink)];
return [
@@ -335,10 +275,9 @@ const contextMenuDriveFolderShared = ({
getRenameMenuItem(renameItem),
getMoveItemMenuItem(moveItem),
getDownloadMenuItem(downloadItem),
- getVersionHistoryMenuItem(viewVersionHistory, versionHistoryConfig),
{ separator: true },
getMoveToTrashMenuItem(moveToTrash),
- ].filter(Boolean) as MenuItemType[];
+ ];
};
const contextMenuTrashItems = ({
@@ -484,9 +423,7 @@ const contextMenuWorkspaceFolder = ({
renameItem,
moveItem,
downloadItem,
- viewVersionHistory,
moveToTrash,
- versionHistoryConfig,
}: {
shareLink: (item: DriveItemData) => void;
getLink: (item: DriveItemData) => void;
@@ -495,9 +432,7 @@ const contextMenuWorkspaceFolder = ({
renameItem: (item: DriveItemData) => void;
moveItem: (item: DriveItemData) => void;
downloadItem: (item: DriveItemData) => void;
- viewVersionHistory: (item: DriveItemData) => void;
moveToTrash: (item: DriveItemData) => void;
- versionHistoryConfig?: VersionHistoryMenuConfig;
}): Array> => [
shareLinkMenuItem(shareLink),
getCopyLinkMenuItem(getLink),
@@ -507,7 +442,6 @@ const contextMenuWorkspaceFolder = ({
getRenameMenuItem(renameItem),
getMoveItemMenuItem(moveItem),
getDownloadMenuItem(downloadItem),
- getVersionHistoryMenuItem(viewVersionHistory, versionHistoryConfig),
{ separator: true },
getMoveToTrashMenuItem(moveToTrash),
];
@@ -521,9 +455,7 @@ const contextMenuWorkspaceFile = ({
renameItem,
moveItem,
downloadItem,
- viewVersionHistory,
moveToTrash,
- versionHistoryConfig,
}: {
shareLink: (item: DriveItemData) => void;
shareWithTeam: (item: DriveItemData) => void;
@@ -533,9 +465,7 @@ const contextMenuWorkspaceFile = ({
renameItem: (item: DriveItemData) => void;
moveItem: (item: DriveItemData) => void;
downloadItem: (item: DriveItemData) => void;
- viewVersionHistory: (item: DriveItemData) => void;
moveToTrash: (item: DriveItemData) => void;
- versionHistoryConfig?: VersionHistoryMenuConfig;
}): Array> =>
[
shareLinkMenuItem(shareLink),
@@ -547,7 +477,6 @@ const contextMenuWorkspaceFile = ({
getRenameMenuItem(renameItem),
getMoveItemMenuItem(moveItem),
getDownloadMenuItem(downloadItem),
- getVersionHistoryMenuItem(viewVersionHistory, versionHistoryConfig),
{ separator: true },
getMoveToTrashMenuItem(moveToTrash),
].filter(Boolean) as MenuItemType[];
diff --git a/src/views/Drive/components/DriveExplorer/components/DriveTopBarActions.tsx b/src/views/Drive/components/DriveExplorer/components/DriveTopBarActions.tsx
index dc6a4efeba..be6990ef77 100644
--- a/src/views/Drive/components/DriveExplorer/components/DriveTopBarActions.tsx
+++ b/src/views/Drive/components/DriveExplorer/components/DriveTopBarActions.tsx
@@ -31,7 +31,6 @@ import {
} from './DriveItemContextMenu';
import workspacesSelectors from 'app/store/slices/workspaces/workspaces.selectors';
import { DownloadManager } from 'app/network/DownloadManager';
-import { useVersionHistoryMenuConfig } from 'views/Drive/hooks/useVersionHistoryMenuConfig';
const DriveTopBarActions = ({
selectedItems,
@@ -64,8 +63,6 @@ const DriveTopBarActions = ({
const hasItemsAndIsNotTrash = hasAnyItemSelected && !isTrash;
const hasItemsAndIsTrash = hasAnyItemSelected && isTrash;
- const versionHistoryMenuConfig = useVersionHistoryMenuConfig(selectedItems[0]);
-
const viewModesIcons = {
[FileViewMode.List]: (
{
- dispatch(uiActions.setVersionHistoryItem(selectedItems[0]));
- dispatch(uiActions.setIsVersionHistorySidebarOpen(true));
- };
-
const onBulkDeleteButtonClicked = (): void => {
moveItemsToTrash(selectedItems);
};
@@ -184,9 +176,7 @@ const DriveTopBarActions = ({
renameItem: onSelectedOneItemRename,
moveItem: onMoveItemButtonClicked,
downloadItem: onDownloadButtonClicked,
- viewVersionHistory: onViewVersionHistoryButtonClicked,
moveToTrash: onBulkDeleteButtonClicked,
- versionHistoryConfig: versionHistoryMenuConfig,
});
const workspaceFolderMenu = contextMenuWorkspaceFolder({
@@ -197,9 +187,7 @@ const DriveTopBarActions = ({
renameItem: onSelectedOneItemRename,
moveItem: onMoveItemButtonClicked,
downloadItem: onDownloadButtonClicked,
- viewVersionHistory: onViewVersionHistoryButtonClicked,
moveToTrash: onBulkDeleteButtonClicked,
- versionHistoryConfig: versionHistoryMenuConfig,
});
const dropdownActions = () => {
@@ -220,9 +208,7 @@ const DriveTopBarActions = ({
renameItem: onSelectedOneItemRename,
moveItem: onMoveItemButtonClicked,
downloadItem: onDownloadButtonClicked,
- viewVersionHistory: onViewVersionHistoryButtonClicked,
moveToTrash: onBulkDeleteButtonClicked,
- versionHistoryConfig: versionHistoryMenuConfig,
})
: contextMenuDriveItemShared({
openPreview: onOpenPreviewButtonClicked,
@@ -232,9 +218,7 @@ const DriveTopBarActions = ({
renameItem: onSelectedOneItemRename,
moveItem: onMoveItemButtonClicked,
downloadItem: onDownloadButtonClicked,
- viewVersionHistory: onViewVersionHistoryButtonClicked,
moveToTrash: onBulkDeleteButtonClicked,
- versionHistoryConfig: versionHistoryMenuConfig,
});
} else {
return selectedItems[0].isFolder
@@ -245,9 +229,7 @@ const DriveTopBarActions = ({
renameItem: onSelectedOneItemRename,
moveItem: onMoveItemButtonClicked,
downloadItem: onDownloadButtonClicked,
- viewVersionHistory: onViewVersionHistoryButtonClicked,
moveToTrash: onBulkDeleteButtonClicked,
- versionHistoryConfig: versionHistoryMenuConfig,
})
: contextMenuDriveNotSharedLink({
shareLink: onOpenShareSettingsButtonClicked,
@@ -257,9 +239,7 @@ const DriveTopBarActions = ({
renameItem: onSelectedOneItemRename,
moveItem: onMoveItemButtonClicked,
downloadItem: onDownloadButtonClicked,
- viewVersionHistory: onViewVersionHistoryButtonClicked,
moveToTrash: onBulkDeleteButtonClicked,
- versionHistoryConfig: versionHistoryMenuConfig,
});
}
};
diff --git a/src/views/Drive/components/DriveItemDropdownActions.tsx b/src/views/Drive/components/DriveItemDropdownActions.tsx
index 43c4257771..863ebdb8b8 100644
--- a/src/views/Drive/components/DriveItemDropdownActions.tsx
+++ b/src/views/Drive/components/DriveItemDropdownActions.tsx
@@ -25,7 +25,6 @@ const FileDropdownActions = (props: FileDropdownActionsProps) => {
onMoveToTrashButtonClicked,
onShowDetailsButtonClicked,
onDownloadItemButtonClicked,
- onViewVersionHistoryButtonClicked,
onLinkSettingsButtonClicked,
onRenameItemButtonClicked,
onOpenPreviewButtonClicked,
@@ -51,7 +50,6 @@ const FileDropdownActions = (props: FileDropdownActionsProps) => {
renameItem: onRenameItemButtonClicked,
moveItem: onMoveItemButtonClicked,
downloadItem: onDownloadItemButtonClicked,
- viewVersionHistory: onViewVersionHistoryButtonClicked,
moveToTrash: onMoveToTrashButtonClicked,
});
}
@@ -63,7 +61,6 @@ const FileDropdownActions = (props: FileDropdownActionsProps) => {
renameItem: onRenameItemButtonClicked,
moveItem: onMoveItemButtonClicked,
downloadItem: onDownloadItemButtonClicked,
- viewVersionHistory: onViewVersionHistoryButtonClicked,
moveToTrash: onMoveToTrashButtonClicked,
});
} else if (item?.isFolder) {
@@ -74,7 +71,6 @@ const FileDropdownActions = (props: FileDropdownActionsProps) => {
renameItem: onRenameItemButtonClicked,
moveItem: onMoveItemButtonClicked,
downloadItem: onDownloadItemButtonClicked,
- viewVersionHistory: onViewVersionHistoryButtonClicked,
moveToTrash: onMoveToTrashButtonClicked,
});
}
@@ -86,7 +82,6 @@ const FileDropdownActions = (props: FileDropdownActionsProps) => {
renameItem: onRenameItemButtonClicked,
moveItem: onMoveItemButtonClicked,
downloadItem: onDownloadItemButtonClicked,
- viewVersionHistory: onViewVersionHistoryButtonClicked,
moveToTrash: onMoveToTrashButtonClicked,
});
};
diff --git a/src/views/Drive/components/VersionHistory/Sidebar.tsx b/src/views/Drive/components/VersionHistory/Sidebar.tsx
deleted file mode 100644
index 5966b60ed9..0000000000
--- a/src/views/Drive/components/VersionHistory/Sidebar.tsx
+++ /dev/null
@@ -1,314 +0,0 @@
-import { useState, useEffect, useCallback, useMemo } from 'react';
-import { RootState } from 'app/store';
-import { useAppDispatch, useAppSelector } from 'app/store/hooks';
-import { uiActions } from 'app/store/slices/ui';
-import { useTranslationContext } from 'app/i18n/provider/TranslationProvider';
-import storageSelectors from 'app/store/slices/storage/storage.selectors';
-import { fetchSortedFolderContentThunk } from 'app/store/slices/storage/storage.thunks/fetchSortedFolderContentThunk';
-import workspacesSelectors from 'app/store/slices/workspaces/workspaces.selectors';
-import navigationService from 'services/navigation.service';
-import {
- Header,
- CurrentVersionItem,
- VersionItem,
- AutosaveSection,
- VersionActionDialog,
- VersionHistorySkeleton,
- LockedFeatureModal,
-} from './components';
-import fileVersionService from 'views/Drive/services/fileVersion.service';
-import errorService from 'services/error.service';
-import notificationsService, { ToastType } from 'app/notifications/services/notifications.service';
-import {
- fetchFileVersionsThunk,
- fetchVersionLimitsThunk,
- fileVersionsActions,
- fileVersionsSelectors,
-} from 'app/store/slices/fileVersions';
-import { getDaysUntilExpiration } from 'services/date.service';
-import { FileVersion } from '@internxt/sdk/dist/drive/storage/types';
-
-type VersionInfo = { id: string; updatedAt: string };
-
-const EMPTY_ARRAY: FileVersion[] = [];
-
-const Sidebar = () => {
- const dispatch = useAppDispatch();
- const isOpen = useAppSelector((state: RootState) => state.ui.isVersionHistorySidebarOpen);
- const item = useAppSelector((state: RootState) => state.ui.versionHistoryItem);
- const user = useAppSelector((state: RootState) => state.user.user);
- const isDeleteVersionDialogOpen = useAppSelector((state: RootState) => state.ui.isDeleteVersionDialogOpen);
- const versionToDelete = useAppSelector((state: RootState) => state.ui.versionToDelete);
- const isRestoreVersionDialogOpen = useAppSelector((state: RootState) => state.ui.isRestoreVersionDialogOpen);
- const versionToRestore = useAppSelector((state: RootState) => state.ui.versionToRestore);
- const currentFolderId = useAppSelector(storageSelectors.currentFolderId);
- const selectedWorkspace = useAppSelector(workspacesSelectors.getSelectedWorkspace);
- const { translate } = useTranslationContext();
-
- const limits = useAppSelector(fileVersionsSelectors.getLimits);
- const isLimitsLoading = useAppSelector(fileVersionsSelectors.isLimitsLoading);
- const versions = useAppSelector((state: RootState) =>
- item ? fileVersionsSelectors.getVersionsByFileId(state, item.uuid) : EMPTY_ARRAY,
- );
- const isLoading = useAppSelector((state: RootState) =>
- item ? fileVersionsSelectors.isLoadingByFileId(state, item.uuid) : false,
- );
- const [selectedAutosaveVersions, setSelectedAutosaveVersions] = useState>(new Set());
- const [isBatchDeleteMode, setIsBatchDeleteMode] = useState(false);
- const [currentVersion, setCurrentVersion] = useState({
- id: '',
- updatedAt: '',
- });
-
- const isVersioningEnabled = limits?.versioning?.enabled ?? false;
- const isLoadingContent = (isVersioningEnabled && isLoading) || isLimitsLoading;
-
- const blurredBackgroundVersions = useMemo(() => {
- if (isVersioningEnabled) return [];
-
- const fixedDate = new Date('2024-05-01').toISOString();
- return Array.from({ length: 10 }, (_, i) => ({
- id: `mock-${i}`,
- fileId: '',
- size: '1000000',
- createdAt: fixedDate,
- updatedAt: fixedDate,
- type: 'file',
- }));
- }, [isVersioningEnabled]);
-
- const displayVersions = useMemo(() => {
- if (!isVersioningEnabled) return blurredBackgroundVersions;
- return versions.filter((version) => {
- if (!version.expiresAt) return true;
- return getDaysUntilExpiration(version.expiresAt) > 0;
- });
- }, [isVersioningEnabled, versions]);
-
- useEffect(() => {
- if (item) {
- setCurrentVersion({
- id: item.fileId,
- updatedAt: item.updatedAt,
- });
- }
- }, [item]);
- const totalVersionsCount = displayVersions.length;
- const selectedCount = selectedAutosaveVersions.size;
- const selectAllAutosave = selectedCount === totalVersionsCount && totalVersionsCount > 0;
- const totalAllowedVersions = limits?.versioning.maxVersions ?? 0;
-
- const userName = useMemo(
- () => (user?.name && user?.lastname ? `${user.name} ${user.lastname}` : user?.email || 'Unknown User'),
- [user],
- );
-
- const userAvatar = user?.avatar ?? null;
-
- useEffect(() => {
- if (!item || !isOpen) return;
-
- if (!limits) {
- dispatch(fetchVersionLimitsThunk());
- }
-
- const hasCachedVersions = versions && versions.length > 0;
- if (!hasCachedVersions) {
- dispatch(fetchFileVersionsThunk(item.uuid));
- }
- }, [item?.uuid, isOpen, dispatch, limits]);
-
- const handleError = useCallback(
- (error: unknown, messageKey: string) => {
- const castedError = errorService.castError(error);
- errorService.reportError(castedError);
- notificationsService.show({
- text: translate(messageKey),
- type: ToastType.Error,
- });
- },
- [translate],
- );
-
- const onClose = useCallback(() => {
- dispatch(uiActions.setIsVersionHistorySidebarOpen(false));
- setSelectedAutosaveVersions(new Set());
- setIsBatchDeleteMode(false);
- }, [dispatch]);
-
- const removeVersionsFromSelection = (versionIds: string[]) => {
- setSelectedAutosaveVersions((prev) => {
- const updated = new Set(prev);
- versionIds.forEach((id) => updated.delete(id));
- return updated;
- });
- };
-
- const handleCloseDeleteDialog = () => {
- dispatch(uiActions.setIsDeleteVersionDialogOpen(false));
- dispatch(uiActions.setVersionToDelete(null));
- setIsBatchDeleteMode(false);
- };
-
- const handleCloseRestoreDialog = () => {
- dispatch(uiActions.setIsRestoreVersionDialogOpen(false));
- dispatch(uiActions.setVersionToRestore(null));
- };
-
- const handleDeleteConfirm = async () => {
- if (!item) return;
-
- let versionIdsToDelete: string[] = [];
-
- if (isBatchDeleteMode) {
- versionIdsToDelete = Array.from(selectedAutosaveVersions);
- } else if (versionToDelete) {
- versionIdsToDelete = [versionToDelete.id];
- }
-
- if (versionIdsToDelete.length === 0) return;
-
- try {
- await Promise.all(versionIdsToDelete.map((versionId) => fileVersionService.deleteVersion(item.uuid, versionId)));
-
- versionIdsToDelete.forEach((versionId) => {
- dispatch(fileVersionsActions.updateVersionsAfterDelete({ fileUuid: item.uuid, versionId }));
- });
-
- notificationsService.show({
- text: translate('modals.versionHistory.deleteSuccess'),
- type: ToastType.Success,
- });
- removeVersionsFromSelection(versionIdsToDelete);
- } catch (error) {
- handleError(error, 'modals.versionHistory.deleteError');
- } finally {
- setIsBatchDeleteMode(false);
- }
- };
-
- const handleRestoreConfirm = async () => {
- if (!versionToRestore || !item) return;
-
- try {
- const restoredVersion = await fileVersionService.restoreVersion(item.uuid, versionToRestore.id);
-
- setCurrentVersion({
- id: restoredVersion.fileId as string,
- updatedAt: new Date().toISOString(),
- });
-
- dispatch(fileVersionsActions.invalidateCache(item.uuid));
- dispatch(fetchFileVersionsThunk(item.uuid));
-
- notificationsService.show({
- text: translate('modals.versionHistory.restoreSuccess'),
- type: ToastType.Success,
- });
- if (currentFolderId) {
- await dispatch(fetchSortedFolderContentThunk(currentFolderId));
- }
- removeVersionsFromSelection([versionToRestore.id]);
- } catch (error) {
- handleError(error, 'modals.versionHistory.restoreError');
- }
- };
-
- const handleSelectAllAutosave = useCallback(
- (checked: boolean) => {
- setSelectedAutosaveVersions(checked ? new Set(versions.map((v) => v.id)) : new Set());
- },
- [versions],
- );
-
- const handleVersionSelectionChange = useCallback((versionId: string, selected: boolean) => {
- setSelectedAutosaveVersions((prev) => {
- const newSelection = new Set(prev);
- selected ? newSelection.add(versionId) : newSelection.delete(versionId);
- return newSelection;
- });
- }, []);
-
- const handleDeleteSelectedVersions = useCallback(() => {
- if (!item || selectedCount === 0) return;
- setIsBatchDeleteMode(true);
- dispatch(uiActions.setIsDeleteVersionDialogOpen(true));
- }, [item, selectedCount, dispatch]);
-
- const handleUpgrade = () => {
- dispatch(uiActions.setIsPreferencesDialogOpen(true));
- navigationService.openPreferencesDialog({
- section: 'account',
- subsection: 'plans',
- workspaceUuid: selectedWorkspace?.workspaceUser.workspaceId,
- });
- };
-
- const shouldShowSidebar = isOpen && item;
-
- return (
- <>
- {shouldShowSidebar && }
-
-
-
-
-
- {isLoadingContent ? (
-
- ) : (
- <>
-
-
-
-
- {displayVersions.map((version) => (
-
handleVersionSelectionChange(version.id, selected)}
- />
- ))}
- >
- )}
- {!isVersioningEnabled && !isLimitsLoading && }
-
-
-
-
-
- >
- );
-};
-
-export default Sidebar;
diff --git a/src/views/Drive/components/VersionHistory/components/AutosaveSection.tsx b/src/views/Drive/components/VersionHistory/components/AutosaveSection.tsx
deleted file mode 100644
index 4d404ae975..0000000000
--- a/src/views/Drive/components/VersionHistory/components/AutosaveSection.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { Trash } from '@phosphor-icons/react';
-import { Checkbox } from '@internxt/ui';
-import { useTranslationContext } from 'app/i18n/provider/TranslationProvider';
-
-interface AutosaveSectionProps {
- totalVersionsCount: number;
- totalAllowedVersions: number;
- selectedCount: number;
- selectAllAutosave: boolean;
- onSelectAllChange: (checked: boolean) => void;
- onDeleteAll: () => void;
-}
-
-export const AutosaveSection = ({
- totalVersionsCount,
- totalAllowedVersions,
- selectedCount,
- selectAllAutosave,
- onSelectAllChange,
- onDeleteAll,
-}: AutosaveSectionProps) => {
- const { translate } = useTranslationContext();
- const hasSelection = selectedCount > 0;
- const isIndeterminate = hasSelection && !selectAllAutosave;
-
- return (
-
-
- onSelectAllChange(!selectAllAutosave)}
- className="h-4 w-4"
- />
-
- {translate('modals.versionHistory.autosaveVersions', {
- count: totalVersionsCount,
- total: totalAllowedVersions,
- })}
-
-
-
-
- );
-};
diff --git a/src/views/Drive/components/VersionHistory/components/CurrentVersionItem.tsx b/src/views/Drive/components/VersionHistory/components/CurrentVersionItem.tsx
deleted file mode 100644
index e48da3477f..0000000000
--- a/src/views/Drive/components/VersionHistory/components/CurrentVersionItem.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Avatar } from '@internxt/ui';
-import { useTranslationContext } from 'app/i18n/provider/TranslationProvider';
-import { formatVersionDate } from '../utils';
-
-interface CurrentVersionItemProps {
- createdAt: string;
- userName: string;
- userAvatar: string | null;
-}
-
-export const CurrentVersionItem = ({ createdAt, userName, userAvatar }: CurrentVersionItemProps) => {
- const { translate } = useTranslationContext();
-
- return (
-
-
-
- {formatVersionDate(createdAt)}
-
- {translate('modals.versionHistory.current')}
-
-
-
-
-
- );
-};
diff --git a/src/views/Drive/components/VersionHistory/components/Header.tsx b/src/views/Drive/components/VersionHistory/components/Header.tsx
deleted file mode 100644
index ed9578fdda..0000000000
--- a/src/views/Drive/components/VersionHistory/components/Header.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { X } from '@phosphor-icons/react';
-
-interface HeaderProps {
- title: string;
- onClose: () => void;
-}
-
-export const Header = ({ title, onClose }: HeaderProps) => {
- return (
-
- {title}
-
-
- );
-};
diff --git a/src/views/Drive/components/VersionHistory/components/LockedFeatureModal.tsx b/src/views/Drive/components/VersionHistory/components/LockedFeatureModal.tsx
deleted file mode 100644
index 4150619b44..0000000000
--- a/src/views/Drive/components/VersionHistory/components/LockedFeatureModal.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { Button } from '@internxt/ui';
-import { useTranslationContext } from 'app/i18n/provider/TranslationProvider';
-import { ClockCounterClockwise, LockSimple } from '@phosphor-icons/react';
-
-interface LockedFeatureModalProps {
- onUpgrade: () => void;
-}
-
-const ICON_SIZES = {
- clock: 64,
- lock: 35,
-} as const;
-
-export const LockedFeatureModal = ({ onUpgrade }: LockedFeatureModalProps) => {
- const { translate } = useTranslationContext();
-
- return (
-
-
-
-
-
-
- {translate('modals.versionHistory.lockedFeature.title')}
-
-
- {translate('modals.versionHistory.lockedFeature.description')}
-
-
- {translate('modals.versionHistory.lockedFeature.supportedFormats')}
-
-
-
-
-
-
-
-
- );
-};
diff --git a/src/views/Drive/components/VersionHistory/components/VersionActionDialog.tsx b/src/views/Drive/components/VersionHistory/components/VersionActionDialog.tsx
deleted file mode 100644
index c2f8f8d6a5..0000000000
--- a/src/views/Drive/components/VersionHistory/components/VersionActionDialog.tsx
+++ /dev/null
@@ -1,83 +0,0 @@
-import { useState } from 'react';
-import { Button, Modal } from '@internxt/ui';
-import { useTranslationContext } from 'app/i18n/provider/TranslationProvider';
-import errorService from 'services/error.service';
-
-type VersionActionType = 'delete' | 'restore';
-
-interface VersionActionDialogProps {
- isOpen: boolean;
- actionType: VersionActionType;
- onClose: () => void;
- onConfirm: () => Promise;
-}
-
-export const VersionActionDialog = ({ isOpen, actionType, onClose, onConfirm }: VersionActionDialogProps) => {
- const { translate } = useTranslationContext();
- const [isLoading, setIsLoading] = useState(false);
-
- const handleClose = () => {
- if (isLoading) return;
- onClose();
- };
-
- const handleConfirm = async () => {
- try {
- setIsLoading(true);
- await onConfirm();
- setIsLoading(false);
- onClose();
- } catch (error) {
- setIsLoading(false);
- const castedError = errorService.castError(error);
- errorService.reportError(castedError);
- }
- };
-
- const config = {
- delete: {
- titleKey: 'deleteVersionTitle',
- adviceKey: 'deleteVersionAdvice',
- buttonKey: 'deleteButton',
- buttonVariant: 'destructive' as const,
- buttonClassName: '[&:not(:disabled)]:!bg-[#E50B00] [&:not(:disabled)]:hover:!bg-[#C00A00]',
- },
- restore: {
- titleKey: 'restoreVersionTitle',
- adviceKey: 'restoreVersionAdvice',
- buttonKey: 'restoreButton',
- buttonVariant: 'primary' as const,
- buttonClassName: '',
- },
- }[actionType];
-
- return (
-
-
-
{translate(`modals.versionHistory.${config.titleKey}`)}
-
- {translate(`modals.versionHistory.${config.adviceKey}`)}
-
-
-
-
-
-
-
-
- );
-};
diff --git a/src/views/Drive/components/VersionHistory/components/VersionHistorySkeleton.tsx b/src/views/Drive/components/VersionHistory/components/VersionHistorySkeleton.tsx
deleted file mode 100644
index a7a445a72b..0000000000
--- a/src/views/Drive/components/VersionHistory/components/VersionHistorySkeleton.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-export const VersionHistorySkeleton = () => {
- return (
-
-
-
- {Array.from({ length: 6 }, (_, index) => (
-
- ))}
-
- );
-};
diff --git a/src/views/Drive/components/VersionHistory/components/VersionItem.tsx b/src/views/Drive/components/VersionHistory/components/VersionItem.tsx
deleted file mode 100644
index dd1f954e05..0000000000
--- a/src/views/Drive/components/VersionHistory/components/VersionItem.tsx
+++ /dev/null
@@ -1,133 +0,0 @@
-import { Info, DotsThree } from '@phosphor-icons/react';
-import { Checkbox, Dropdown, Avatar } from '@internxt/ui';
-import { useTranslationContext } from 'app/i18n/provider/TranslationProvider';
-import { useDropdownPositioning } from 'views/Drive/hooks/useDropdownPositioning';
-import { useVersionItemActions } from 'views/Drive/hooks/useVersionItemActions';
-import { formatVersionDate } from '../utils';
-import { getDaysUntilExpiration } from 'services/date.service';
-import { FileVersion } from '@internxt/sdk/dist/drive/storage/types';
-import { memo } from 'react';
-import sizeService from 'app/drive/services/size.service';
-
-interface VersionItemProps {
- version: FileVersion;
- userName: string;
- userAvatar: string | null;
- isSelected: boolean;
- onSelectionChange: (selected: boolean) => void;
-}
-
-export const VersionItem = memo(
- ({ version, userName, userAvatar, isSelected, onSelectionChange }: VersionItemProps) => {
- const { translate } = useTranslationContext();
- const { isOpen, setIsOpen, dropdownPosition, dropdownRef, itemRef } = useDropdownPositioning();
- const { menuItems } = useVersionItemActions({
- version,
- onDropdownClose: () => setIsOpen(false),
- });
-
- const handleToggleSelection = () => {
- onSelectionChange(!isSelected);
- };
-
- const handleItemClick = () => {
- handleToggleSelection();
- };
-
- const dropdownOpenDirection = dropdownPosition === 'above' ? 'left' : 'right';
- const versionSize = sizeService.bytesToString(Number.parseInt(version.size), false);
-
- return (
- <>
- {isOpen && (
- {
- e.stopPropagation();
- setIsOpen(false);
- }}
- aria-hidden="true"
- />
- )}
-
- >
- );
- },
-);
diff --git a/src/views/Drive/components/VersionHistory/components/index.ts b/src/views/Drive/components/VersionHistory/components/index.ts
deleted file mode 100644
index f63f5c3aee..0000000000
--- a/src/views/Drive/components/VersionHistory/components/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export { Header } from './Header';
-export { CurrentVersionItem } from './CurrentVersionItem';
-export { VersionItem } from './VersionItem';
-export { AutosaveSection } from './AutosaveSection';
-export { VersionActionDialog } from './VersionActionDialog';
-export { VersionHistorySkeleton } from './VersionHistorySkeleton';
-export { LockedFeatureModal } from './LockedFeatureModal';
diff --git a/src/views/Drive/components/VersionHistory/index.ts b/src/views/Drive/components/VersionHistory/index.ts
deleted file mode 100644
index 871a4d9d0a..0000000000
--- a/src/views/Drive/components/VersionHistory/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default as Sidebar } from './Sidebar';
diff --git a/src/views/Drive/components/VersionHistory/utils/index.ts b/src/views/Drive/components/VersionHistory/utils/index.ts
deleted file mode 100644
index 902f77aa52..0000000000
--- a/src/views/Drive/components/VersionHistory/utils/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import dateService from 'services/date.service';
-import { DriveItemData } from 'app/drive/types';
-
-export const formatVersionDate = (date: string): string => dateService.format(date, 'D MMM, YYYY [at] HH:mm');
-
-const ALLOWED_VERSIONING_EXTENSIONS = new Set(['pdf', 'docx', 'xlsx', 'csv']);
-
-export const isVersioningExtensionAllowed = (item?: Pick
| null): boolean => {
- if (!item?.type) {
- return false;
- }
- const extension = item.type.toLowerCase();
- return ALLOWED_VERSIONING_EXTENSIONS.has(extension);
-};
diff --git a/src/views/Drive/hooks/index.ts b/src/views/Drive/hooks/index.ts
index 8a207b8786..ae8b20a932 100644
--- a/src/views/Drive/hooks/index.ts
+++ b/src/views/Drive/hooks/index.ts
@@ -3,7 +3,4 @@ export { useDriveItemDrag, useDriveItemDrop } from './useDriveItemDragAndDrop';
export { default as useDriveItemStoreProps } from './useDriveStoreProps';
export { usePaginationState } from './usePaginationState';
export { useTutorialState } from './useTutorialState';
-export { useVersionHistoryMenuConfig } from './useVersionHistoryMenuConfig';
-export { useVersionItemActions } from './useVersionItemActions';
-export { useDropdownPositioning } from './useDropdownPositioning';
export type { DriveItemActions } from './useDriveItemActions';
diff --git a/src/views/Drive/hooks/useDriveItemActions.tsx b/src/views/Drive/hooks/useDriveItemActions.tsx
index a64eb0c718..ae8edecd00 100644
--- a/src/views/Drive/hooks/useDriveItemActions.tsx
+++ b/src/views/Drive/hooks/useDriveItemActions.tsx
@@ -23,7 +23,6 @@ export interface DriveItemActions {
onCopyLinkButtonClicked: () => void;
onLinkSettingsButtonClicked: () => void;
onDownloadItemButtonClicked: () => void;
- onViewVersionHistoryButtonClicked: () => void;
onShowDetailsButtonClicked: () => void;
onMoveToTrashButtonClicked: () => void;
onNameClicked: (e) => void;
@@ -101,11 +100,6 @@ const useDriveItemActions = (item): DriveItemActions => {
});
};
- const onViewVersionHistoryButtonClicked = () => {
- dispatch(uiActions.setVersionHistoryItem(item as DriveItemData));
- dispatch(uiActions.setIsVersionHistorySidebarOpen(true));
- };
-
const onMoveToTrashButtonClicked = () => {
moveItemsToTrash([item as DriveItemData]);
};
@@ -165,7 +159,6 @@ const useDriveItemActions = (item): DriveItemActions => {
onCopyLinkButtonClicked,
onLinkSettingsButtonClicked,
onDownloadItemButtonClicked,
- onViewVersionHistoryButtonClicked,
onShowDetailsButtonClicked,
onMoveToTrashButtonClicked,
onNameClicked,
diff --git a/src/views/Drive/hooks/useDropdownPositioning.test.ts b/src/views/Drive/hooks/useDropdownPositioning.test.ts
deleted file mode 100644
index d5ab8abffa..0000000000
--- a/src/views/Drive/hooks/useDropdownPositioning.test.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { renderHook, act, waitFor } from '@testing-library/react';
-import { afterEach, beforeEach, describe, expect, it } from 'vitest';
-import type { MutableRefObject } from 'react';
-import { useDropdownPositioning } from './useDropdownPositioning';
-
-const originalInnerHeight = window.innerHeight;
-const setRefCurrent = (ref: React.RefObject, value: T) => {
- (ref as MutableRefObject).current = value;
-};
-
-describe('Version menu behavior', () => {
- beforeEach(() => {
- Object.defineProperty(window, 'innerHeight', { value: originalInnerHeight, writable: true, configurable: true });
- });
-
- afterEach(() => {
- Object.defineProperty(window, 'innerHeight', { value: originalInnerHeight, writable: true, configurable: true });
- });
-
- it('when clicking inside the menu, then it stays open', () => {
- const { result } = renderHook(() => useDropdownPositioning());
- const dropdownElement = document.createElement('div');
- const childElement = document.createElement('span');
- dropdownElement.appendChild(childElement);
- setRefCurrent(result.current.dropdownRef, dropdownElement);
-
- act(() => {
- result.current.setIsOpen(true);
- });
-
- act(() => {
- childElement.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
- });
-
- expect(result.current.isOpen).toBe(true);
- });
-
- it('when clicking outside the menu, then it closes', () => {
- const { result } = renderHook(() => useDropdownPositioning());
- const dropdownElement = document.createElement('div');
- setRefCurrent(result.current.dropdownRef, dropdownElement);
-
- act(() => {
- result.current.setIsOpen(true);
- });
-
- act(() => {
- document.body.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
- });
-
- expect(result.current.isOpen).toBe(false);
- });
-
- it('when there is space below the item, then the menu opens below', async () => {
- Object.defineProperty(window, 'innerHeight', { value: 500, writable: true, configurable: true });
- const { result } = renderHook(() => useDropdownPositioning());
- const mockItem = {
- getBoundingClientRect: () => ({ bottom: 100 }) as DOMRect,
- } as unknown as HTMLElement;
- setRefCurrent(result.current.itemRef, mockItem);
-
- act(() => {
- result.current.setIsOpen(true);
- });
-
- await waitFor(() => {
- expect(result.current.dropdownPosition).toBe('below');
- });
- });
-
- it('when space is tight below the item, then the menu opens above', async () => {
- Object.defineProperty(window, 'innerHeight', { value: 150, writable: true, configurable: true });
- const { result } = renderHook(() => useDropdownPositioning());
- const mockItem = {
- getBoundingClientRect: () => ({ bottom: 20 }) as DOMRect,
- } as unknown as HTMLElement;
- setRefCurrent(result.current.itemRef, mockItem);
-
- act(() => {
- result.current.setIsOpen(true);
- });
-
- await waitFor(() => {
- expect(result.current.dropdownPosition).toBe('above');
- });
- });
-});
diff --git a/src/views/Drive/hooks/useDropdownPositioning.ts b/src/views/Drive/hooks/useDropdownPositioning.ts
deleted file mode 100644
index 70ba700b9e..0000000000
--- a/src/views/Drive/hooks/useDropdownPositioning.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { useEffect, useState, useRef, RefObject } from 'react';
-
-type DropdownPosition = 'above' | 'below';
-
-const DROPDOWN_POSITION = {
- ABOVE: 'above' as const,
- BELOW: 'below' as const,
-};
-
-interface UseDropdownPositioningReturn {
- isOpen: boolean;
- setIsOpen: (open: boolean) => void;
- dropdownPosition: DropdownPosition;
- dropdownRef: RefObject;
- itemRef: RefObject;
-}
-
-export const useDropdownPositioning = (): UseDropdownPositioningReturn => {
- const [isOpen, setIsOpen] = useState(false);
- const [dropdownPosition, setDropdownPosition] = useState(DROPDOWN_POSITION.BELOW);
- const dropdownRef = useRef(null);
- const itemRef = useRef(null);
-
- useEffect(() => {
- const handleClickOutside = (event: MouseEvent) => {
- if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
- setIsOpen(false);
- }
- };
-
- if (isOpen) {
- document.addEventListener('mousedown', handleClickOutside);
- if (itemRef.current) {
- const rect = itemRef.current.getBoundingClientRect();
- const spaceBelow = window.innerHeight - rect.bottom;
- const menuHeight = 200;
-
- if (spaceBelow < menuHeight) {
- setDropdownPosition(DROPDOWN_POSITION.ABOVE);
- } else {
- setDropdownPosition(DROPDOWN_POSITION.BELOW);
- }
- }
- }
-
- return () => {
- document.removeEventListener('mousedown', handleClickOutside);
- };
- }, [isOpen]);
-
- return {
- isOpen,
- setIsOpen,
- dropdownPosition,
- dropdownRef,
- itemRef,
- };
-};
diff --git a/src/views/Drive/hooks/useVersionHistoryMenuConfig.test.ts b/src/views/Drive/hooks/useVersionHistoryMenuConfig.test.ts
deleted file mode 100644
index f8989ab120..0000000000
--- a/src/views/Drive/hooks/useVersionHistoryMenuConfig.test.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { renderHook } from '@testing-library/react';
-import { beforeEach, describe, expect, it, vi, Mock } from 'vitest';
-import { useSelector } from 'react-redux';
-import { useVersionHistoryMenuConfig } from './useVersionHistoryMenuConfig';
-import { FileLimitsResponse } from '@internxt/sdk/dist/drive/storage/types';
-
-vi.mock('react-redux', () => ({
- useSelector: vi.fn(),
-}));
-
-const enabledLimits: FileLimitsResponse = {
- versioning: { enabled: true, maxFileSize: 0, retentionDays: 0, maxVersions: 0 },
-};
-
-const disabledLimits: FileLimitsResponse = {
- versioning: { enabled: false, maxFileSize: 0, retentionDays: 0, maxVersions: 0 },
-};
-
-describe('Version history menu', () => {
- const mockUseSelector = useSelector as unknown as Mock;
-
- const mockState = (limits: FileLimitsResponse | null) =>
- ({
- fileVersions: { limits },
- }) as any;
-
- beforeEach(() => {
- vi.clearAllMocks();
- });
-
- it('when versioning is locked, then the menu is marked as locked', () => {
- mockUseSelector.mockImplementation((selector: (state: any) => unknown) => selector(mockState(disabledLimits)));
-
- const { result } = renderHook(() => useVersionHistoryMenuConfig({ type: 'pdf' } as any));
-
- expect(result.current.isLocked).toBe(true);
- expect(result.current.isExtensionAllowed).toBe(true);
- });
-
- it('when versioning is enabled and the file is supported, then the menu is unlocked', () => {
- mockUseSelector.mockImplementation((selector: (state: any) => unknown) => selector(mockState(enabledLimits)));
-
- const { result } = renderHook(() => useVersionHistoryMenuConfig({ type: 'pdf' } as any));
-
- expect(result.current.isLocked).toBe(false);
- expect(result.current.isExtensionAllowed).toBe(true);
- });
-
- it('when the file type is unsupported, then it is marked as not allowed', () => {
- mockUseSelector.mockImplementation((selector: (state: any) => unknown) => selector(mockState(enabledLimits)));
-
- const { result } = renderHook(() => useVersionHistoryMenuConfig({ type: 'exe' } as any));
-
- expect(result.current.isExtensionAllowed).toBe(false);
- });
-});
diff --git a/src/views/Drive/hooks/useVersionHistoryMenuConfig.ts b/src/views/Drive/hooks/useVersionHistoryMenuConfig.ts
deleted file mode 100644
index 215b94093d..0000000000
--- a/src/views/Drive/hooks/useVersionHistoryMenuConfig.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { useSelector } from 'react-redux';
-import { fileVersionsSelectors } from 'app/store/slices/fileVersions';
-import { DriveItemData } from 'app/drive/types';
-import { isVersioningExtensionAllowed } from '../components/VersionHistory/utils';
-import { VersionHistoryMenuConfig } from '../components/DriveExplorer/components/DriveItemContextMenu';
-
-export const useVersionHistoryMenuConfig = (selectedItem?: DriveItemData): VersionHistoryMenuConfig => {
- const limits = useSelector(fileVersionsSelectors.getLimits);
- const isVersioningEnabled = limits?.versioning?.enabled ?? false;
- const isExtensionAllowed = selectedItem ? isVersioningExtensionAllowed(selectedItem) : true;
-
- return {
- isLocked: !isVersioningEnabled,
- isExtensionAllowed,
- };
-};
diff --git a/src/views/Drive/hooks/useVersionItemActions.test.ts b/src/views/Drive/hooks/useVersionItemActions.test.ts
deleted file mode 100644
index 0739f87ddc..0000000000
--- a/src/views/Drive/hooks/useVersionItemActions.test.ts
+++ /dev/null
@@ -1,172 +0,0 @@
-import { renderHook, act } from '@testing-library/react';
-import { beforeEach, describe, expect, it, vi, Mock } from 'vitest';
-import { Trash, ClockCounterClockwise, DownloadSimple } from '@phosphor-icons/react';
-import { useVersionItemActions } from './useVersionItemActions';
-import fileVersionService from '../services/fileVersion.service';
-import notificationsService, { ToastType } from 'app/notifications/services/notifications.service';
-import { useTranslationContext } from 'app/i18n/provider/TranslationProvider';
-import { useAppDispatch, useAppSelector } from 'app/store/hooks';
-import { FileVersion } from '@internxt/sdk/dist/drive/storage/types';
-import { WorkspaceData } from '@internxt/sdk/dist/workspaces';
-import { RootState } from 'app/store';
-import { MenuItemType } from '@internxt/ui';
-
-vi.mock('app/i18n/provider/TranslationProvider', () => ({
- useTranslationContext: vi.fn(),
-}));
-
-vi.mock('app/store/hooks', () => ({
- useAppDispatch: vi.fn(),
- useAppSelector: vi.fn(),
-}));
-
-vi.mock('views/Drive/services/fileVersion.service', () => ({
- default: {
- downloadVersion: vi.fn(),
- },
-}));
-
-vi.mock('app/notifications/services/notifications.service', () => ({
- default: {
- show: vi.fn(),
- },
- ToastType: {
- Error: 'error',
- },
-}));
-
-vi.mock('services/date.service', () => ({
- default: {
- format: vi.fn(() => '10-01-2026 at 14:30'),
- },
-}));
-
-const mockSetVersionToRestore = vi.hoisted(() => vi.fn((payload) => ({ type: 'setVersionToRestore', payload })));
-const mockSetIsRestoreVersionDialogOpen = vi.hoisted(() =>
- vi.fn((payload) => ({ type: 'setIsRestoreVersionDialogOpen', payload })),
-);
-const mockSetVersionToDelete = vi.hoisted(() => vi.fn((payload) => ({ type: 'setVersionToDelete', payload })));
-const mockSetIsDeleteVersionDialogOpen = vi.hoisted(() =>
- vi.fn((payload) => ({ type: 'setIsDeleteVersionDialogOpen', payload })),
-);
-
-vi.mock('app/store/slices/ui', () => ({
- uiActions: {
- setVersionToRestore: mockSetVersionToRestore,
- setIsRestoreVersionDialogOpen: mockSetIsRestoreVersionDialogOpen,
- setVersionToDelete: mockSetVersionToDelete,
- setIsDeleteVersionDialogOpen: mockSetIsDeleteVersionDialogOpen,
- },
-}));
-
-describe('Version item menu', () => {
- const translateMock = vi.fn((key: string) => key);
- const version = {
- id: 'version-id',
- fileId: 'file-uuid',
- networkFileId: 'network-file-id',
- size: '5',
- createdAt: '2026-01-10T14:30:00.000Z',
- } as FileVersion;
- const fileItem = {
- id: 'file-id',
- name: 'fallback-name',
- plainName: 'pretty-name',
- fileId: 'file-id',
- } as any;
- const selectedWorkspace = { workspace: { id: 'workspace-id' } } as WorkspaceData;
- const workspaceCredentials = { workspaceId: 'workspace-id', token: 'token' } as any;
- const baseState = {
- ui: { versionHistoryItem: fileItem },
- workspaces: { selectedWorkspace, workspaceCredentials },
- } as unknown as RootState;
-
- const mockDispatch = vi.fn();
- const mockUseAppDispatch = useAppDispatch as unknown as Mock;
- const mockUseAppSelector = useAppSelector as unknown as Mock;
-
- beforeEach(() => {
- vi.clearAllMocks();
- mockUseAppDispatch.mockReturnValue(mockDispatch);
- (useTranslationContext as Mock).mockReturnValue({ translate: translateMock });
- mockUseAppSelector.mockImplementation((selector: (state: RootState) => unknown) => selector(baseState));
- });
-
- const getMenuActionByIcon = (items: Array>, icon: any) => {
- const item = items.find((item) => 'icon' in item && item.icon === icon);
- return item && 'action' in item ? (item as any).action : undefined;
- };
-
- it('when restore is chosen, then the restore dialog opens', () => {
- const onDropdownClose = vi.fn();
- const { result } = renderHook(() => useVersionItemActions({ version, onDropdownClose }));
- const restoreAction = getMenuActionByIcon(result.current.menuItems, ClockCounterClockwise);
-
- act(() => {
- restoreAction();
- });
-
- expect(onDropdownClose).toHaveBeenCalled();
- expect(mockDispatch).toHaveBeenCalledWith({ type: 'setVersionToRestore', payload: version });
- expect(mockDispatch).toHaveBeenCalledWith({ type: 'setIsRestoreVersionDialogOpen', payload: true });
- });
-
- it('when nothing is selected to download, then an error toast is shown', async () => {
- const onDropdownClose = vi.fn();
- mockUseAppSelector.mockImplementation((selector: (state: RootState) => unknown) =>
- selector({
- ui: { versionHistoryItem: null },
- workspaces: { selectedWorkspace: null, workspaceCredentials: null },
- } as unknown as RootState),
- );
- const showSpy = vi.spyOn(notificationsService, 'show');
- const { result } = renderHook(() => useVersionItemActions({ version, onDropdownClose }));
- const downloadAction = getMenuActionByIcon(result.current.menuItems, DownloadSimple);
-
- await act(async () => {
- await downloadAction();
- });
-
- expect(onDropdownClose).toHaveBeenCalled();
- expect(showSpy).toHaveBeenCalledWith({
- text: 'modals.versionHistory.downloadError',
- type: ToastType.Error,
- });
- expect(fileVersionService.downloadVersion).not.toHaveBeenCalled();
- });
-
- it('when a previous version is downloaded, then it uses the readable name and workspace data', async () => {
- const onDropdownClose = vi.fn();
- const downloadVersionSpy = vi.spyOn(fileVersionService, 'downloadVersion').mockResolvedValue(undefined as any);
- const { result } = renderHook(() => useVersionItemActions({ version, onDropdownClose }));
- const downloadAction = getMenuActionByIcon(result.current.menuItems, DownloadSimple);
-
- await act(async () => {
- await downloadAction();
- });
-
- expect(onDropdownClose).toHaveBeenCalled();
- expect(downloadVersionSpy).toHaveBeenCalledWith(
- version,
- fileItem,
- '(10-01-2026 at 14:30) pretty-name',
- selectedWorkspace,
- workspaceCredentials,
- );
- expect(notificationsService.show).not.toHaveBeenCalled();
- });
-
- it('when delete is chosen, then the delete dialog opens', () => {
- const onDropdownClose = vi.fn();
- const { result } = renderHook(() => useVersionItemActions({ version, onDropdownClose }));
- const deleteAction = getMenuActionByIcon(result.current.menuItems, Trash);
-
- act(() => {
- deleteAction();
- });
-
- expect(onDropdownClose).toHaveBeenCalled();
- expect(mockDispatch).toHaveBeenCalledWith({ type: 'setVersionToDelete', payload: version });
- expect(mockDispatch).toHaveBeenCalledWith({ type: 'setIsDeleteVersionDialogOpen', payload: true });
- });
-});
diff --git a/src/views/Drive/hooks/useVersionItemActions.ts b/src/views/Drive/hooks/useVersionItemActions.ts
deleted file mode 100644
index 6067f37724..0000000000
--- a/src/views/Drive/hooks/useVersionItemActions.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { Trash, ClockCounterClockwise, DownloadSimple } from '@phosphor-icons/react';
-import { MenuItemType } from '@internxt/ui';
-import { useTranslationContext } from 'app/i18n/provider/TranslationProvider';
-import fileVersionService from '../services/fileVersion.service';
-import notificationsService, { ToastType } from 'app/notifications/services/notifications.service';
-import { useAppDispatch, useAppSelector } from 'app/store/hooks';
-import { uiActions } from 'app/store/slices/ui';
-import { RootState } from 'app/store';
-import workspacesSelectors from 'app/store/slices/workspaces/workspaces.selectors';
-import { FileVersion } from '@internxt/sdk/dist/drive/storage/types';
-import dateService from 'services/date.service';
-import { items as itemsUtils } from '@internxt/lib';
-
-interface UseVersionItemActionsParams {
- version: FileVersion;
- onDropdownClose: () => void;
-}
-
-export const useVersionItemActions = ({ version, onDropdownClose }: UseVersionItemActionsParams) => {
- const { translate } = useTranslationContext();
- const dispatch = useAppDispatch();
- const item = useAppSelector((state: RootState) => state.ui.versionHistoryItem);
- const selectedWorkspace = useAppSelector(workspacesSelectors.getSelectedWorkspace);
- const workspaceCredentials = useAppSelector(workspacesSelectors.getWorkspaceCredentials);
-
- const handleRestoreClick = () => {
- onDropdownClose();
- dispatch(uiActions.setVersionToRestore(version));
- dispatch(uiActions.setIsRestoreVersionDialogOpen(true));
- };
-
- const handleDownload = async () => {
- onDropdownClose();
-
- if (!item) {
- notificationsService.show({
- text: translate('modals.versionHistory.downloadError'),
- type: ToastType.Error,
- });
- return;
- }
-
- const entireFilename = item.plainName || item.name;
- const formattedDate = dateService.format(version.modificationTime, 'DD-MM-YYYY [at] HH:mm');
- const { filename, extension } = itemsUtils.getFilenameAndExt(entireFilename);
-
- const fileExtension = extension || item.type ? `.${extension || item.type}` : '';
- const versionFileName = `(${formattedDate}) ${filename}${fileExtension}`;
-
- await fileVersionService.downloadVersion(version, item, versionFileName, selectedWorkspace, workspaceCredentials);
- };
-
- const handleDeleteClick = () => {
- onDropdownClose();
- dispatch(uiActions.setVersionToDelete(version));
- dispatch(uiActions.setIsDeleteVersionDialogOpen(true));
- };
-
- const menuItems: Array> = [
- {
- name: translate('modals.versionHistory.restoreVersion'),
- icon: ClockCounterClockwise,
- action: handleRestoreClick,
- },
- {
- name: translate('modals.versionHistory.downloadVersion'),
- icon: DownloadSimple,
- action: handleDownload,
- },
- {
- separator: true,
- },
- {
- name: translate('modals.versionHistory.deleteVersion'),
- icon: Trash,
- action: handleDeleteClick,
- },
- ];
-
- return { menuItems };
-};
diff --git a/src/views/Drive/services/fileVersion.service.test.ts b/src/views/Drive/services/fileVersion.service.test.ts
deleted file mode 100644
index 53cf50a133..0000000000
--- a/src/views/Drive/services/fileVersion.service.test.ts
+++ /dev/null
@@ -1,114 +0,0 @@
-import { beforeEach, describe, expect, it, vi } from 'vitest';
-import { SdkFactory } from 'app/core/factory/sdk';
-import { DownloadManager } from 'app/network/DownloadManager';
-import fileVersionService from './fileVersion.service';
-import { FileVersion, RestoreFileVersionResponse } from '@internxt/sdk/dist/drive/storage/types';
-import { WorkspaceCredentialsDetails, WorkspaceData } from '@internxt/sdk/dist/workspaces';
-
-vi.mock('app/core/factory/sdk', () => ({
- SdkFactory: {
- getNewApiInstance: vi.fn(),
- },
-}));
-
-vi.mock('app/network/DownloadManager', () => ({
- DownloadManager: {
- downloadItem: vi.fn(),
- },
-}));
-
-describe('File version actions', () => {
- const fileUuid = 'file-uuid';
- const versionId = 'version-id';
- let storageClientMock: {
- getFileVersions: ReturnType;
- deleteFileVersion: ReturnType;
- restoreFileVersion: ReturnType;
- getFileVersionLimits: ReturnType;
- };
-
- beforeEach(() => {
- storageClientMock = {
- getFileVersions: vi.fn(),
- deleteFileVersion: vi.fn(),
- restoreFileVersion: vi.fn(),
- getFileVersionLimits: vi.fn(),
- };
-
- vi.clearAllMocks();
-
- vi.spyOn(SdkFactory, 'getNewApiInstance').mockReturnValue({
- createNewStorageClient: () => storageClientMock,
- } as any);
- });
-
- it('when file versions are requested, then the available list is returned', async () => {
- const versions = [{ id: 'v1' } as FileVersion];
- storageClientMock.getFileVersions.mockResolvedValueOnce(versions);
-
- const result = await fileVersionService.getFileVersions(fileUuid);
-
- expect(storageClientMock.getFileVersions).toHaveBeenCalledWith(fileUuid);
- expect(result).toBe(versions);
- });
-
- it('when a version is deleted, then the delete request is sent', async () => {
- storageClientMock.deleteFileVersion.mockResolvedValueOnce(undefined);
-
- await fileVersionService.deleteVersion(fileUuid, versionId);
-
- expect(storageClientMock.deleteFileVersion).toHaveBeenCalledWith(fileUuid, versionId);
- });
-
- it('when a version is restored, then the restore response is returned', async () => {
- const restoreResponse = { restored: true } as unknown as RestoreFileVersionResponse;
- storageClientMock.restoreFileVersion.mockResolvedValueOnce(restoreResponse);
-
- const result = await fileVersionService.restoreVersion(fileUuid, versionId);
-
- expect(storageClientMock.restoreFileVersion).toHaveBeenCalledWith(fileUuid, versionId);
- expect(result).toBe(restoreResponse);
- });
-
- it('when versioning limits are checked, then the limits are returned', async () => {
- const limits = { versioning: { enabled: true, maxFileSize: 0, retentionDays: 0, maxVersions: 0 } } as any;
- storageClientMock.getFileVersionLimits.mockResolvedValueOnce(limits);
-
- const result = await fileVersionService.getLimits();
-
- expect(storageClientMock.getFileVersionLimits).toHaveBeenCalled();
- expect(result).toBe(limits);
- });
-
- it('when a previous version is downloaded, then the request uses the version data', async () => {
- const version = { networkFileId: 'network-file-id', size: '42' } as FileVersion;
- const fileItem = { fileId: 'file-id', size: 10, name: 'original-name' } as any;
- const selectedWorkspace = { workspace: { id: 'workspace-id' }, workspaceUser: {} } as unknown as WorkspaceData;
- const workspaceCredentials = {
- workspaceId: 'workspace-id',
- bucket: 'bucket',
- workspaceUserId: 'workspace-user',
- email: 'user@example.com',
- credentials: {} as any,
- tokenHeader: 'token-header',
- } as WorkspaceCredentialsDetails;
- const downloadItemSpy = vi.spyOn(DownloadManager, 'downloadItem').mockResolvedValueOnce(undefined);
-
- await fileVersionService.downloadVersion(version, fileItem, 'custom-name', selectedWorkspace, workspaceCredentials);
-
- expect(downloadItemSpy).toHaveBeenCalledWith({
- payload: [
- {
- ...fileItem,
- fileId: version.networkFileId,
- size: Number(version.size),
- },
- ],
- selectedWorkspace,
- workspaceCredentials,
- downloadOptions: {
- downloadName: 'custom-name',
- },
- });
- });
-});
diff --git a/src/views/Drive/services/fileVersion.service.ts b/src/views/Drive/services/fileVersion.service.ts
deleted file mode 100644
index 6a82e43d43..0000000000
--- a/src/views/Drive/services/fileVersion.service.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { SdkFactory } from 'app/core/factory/sdk';
-import { DownloadManager } from 'app/network/DownloadManager';
-import { DriveItemData } from 'app/drive/types';
-import { WorkspaceCredentialsDetails, WorkspaceData } from '@internxt/sdk/dist/workspaces';
-import { FileLimitsResponse, FileVersion, RestoreFileVersionResponse } from '@internxt/sdk/dist/drive/storage/types';
-
-const getStorageClient = () => SdkFactory.getNewApiInstance().createNewStorageClient();
-
-export async function getFileVersions(fileUuid: string): Promise {
- return getStorageClient().getFileVersions(fileUuid);
-}
-
-export async function deleteVersion(fileUuid: string, versionId: string): Promise {
- await getStorageClient().deleteFileVersion(fileUuid, versionId);
-}
-
-export async function restoreVersion(fileUuid: string, versionId: string): Promise {
- return getStorageClient().restoreFileVersion(fileUuid, versionId);
-}
-
-export async function getLimits(): Promise {
- return getStorageClient().getFileVersionLimits();
-}
-
-export async function downloadVersion(
- version: FileVersion,
- fileItem: DriveItemData,
- fileName: string,
- selectedWorkspace: WorkspaceData | null,
- workspaceCredentials: WorkspaceCredentialsDetails | null,
-): Promise {
- const versionFileData: DriveItemData = {
- ...fileItem,
- fileId: version.networkFileId,
- size: Number(version.size),
- };
-
- await DownloadManager.downloadItem({
- payload: [versionFileData],
- selectedWorkspace,
- workspaceCredentials,
- downloadOptions: {
- downloadName: fileName,
- },
- });
-}
-
-const fileVersionService = {
- getFileVersions,
- deleteVersion,
- restoreVersion,
- downloadVersion,
- getLimits,
-};
-
-export default fileVersionService;
diff --git a/src/views/Drive/services/replaceFile.service.ts b/src/views/Drive/services/replaceFile.service.ts
deleted file mode 100644
index b98b40ed63..0000000000
--- a/src/views/Drive/services/replaceFile.service.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { SdkFactory } from 'app/core/factory/sdk';
-import { DriveFileData } from 'app/drive/types';
-
-export interface ReplaceFilePayload {
- fileId: string;
- size: number;
-}
-
-export async function replaceFile(fileUuid: string, payload: ReplaceFilePayload): Promise {
- const storageClient = SdkFactory.getNewApiInstance().createNewStorageClient();
- return storageClient.replaceFile(fileUuid, payload);
-}
-
-const replaceFileService = {
- replaceFile,
-};
-
-export default replaceFileService;
diff --git a/src/views/NewSettings/components/Sections/Account/Plans/PlansSection.tsx b/src/views/NewSettings/components/Sections/Account/Plans/PlansSection.tsx
index fda1a57e5d..d3f2aa7726 100644
--- a/src/views/NewSettings/components/Sections/Account/Plans/PlansSection.tsx
+++ b/src/views/NewSettings/components/Sections/Account/Plans/PlansSection.tsx
@@ -13,13 +13,6 @@ import { paymentService } from 'views/Checkout/services';
import { RootState } from 'app/store';
import { useAppDispatch } from 'app/store/hooks';
import { PlanState, planThunks } from 'app/store/slices/plan';
-import {
- fetchVersionLimitsThunk,
- VERSION_LIMITS_POLL_MAX_ATTEMPTS,
- VERSION_LIMITS_POLL_DELAYS,
- fileVersionsSelectors,
- fileVersionsActions,
-} from 'app/store/slices/fileVersions';
import CancelSubscriptionModal from '../../Workspace/Billing/CancelSubscriptionModal';
import { fetchPlanPrices, getStripe } from '../../../../services/plansApi';
import ChangePlanDialog from './components/ChangePlanDialog';
@@ -53,7 +46,6 @@ const PlansSection = ({ changeSection, onClosePreferences }: PlansSectionProps)
const selectedWorkspace = useSelector((state: RootState) => state.workspaces.selectedWorkspace);
const plan = useSelector((state) => state.plan);
const user = useSelector((state) => state.user.user);
- const versionLimits = useSelector(fileVersionsSelectors.getLimits);
const { individualSubscription, businessSubscription } = plan;
let stripe;
@@ -190,36 +182,9 @@ const PlansSection = ({ changeSection, onClosePreferences }: PlansSectionProps)
[translate],
);
- const pollVersionLimitsUntilChanged = useCallback(
- async (attempt = 0, previousLimits = versionLimits) => {
- if (attempt >= VERSION_LIMITS_POLL_MAX_ATTEMPTS) return;
-
- const delay = VERSION_LIMITS_POLL_DELAYS[attempt] || VERSION_LIMITS_POLL_DELAYS.at(-1);
- await new Promise((resolve) => setTimeout(resolve, delay));
- const result = await dispatch(fetchVersionLimitsThunk({ isSilent: true })).unwrap();
-
- const hasLimitsChanged =
- previousLimits?.versioning.enabled !== result.limits.versioning.enabled ||
- previousLimits?.versioning.maxFileSize !== result.limits.versioning.maxFileSize ||
- previousLimits?.versioning.retentionDays !== result.limits.versioning.retentionDays ||
- previousLimits?.versioning.maxVersions !== result.limits.versioning.maxVersions;
-
- if (!hasLimitsChanged) {
- await pollVersionLimitsUntilChanged(attempt + 1, previousLimits);
- return;
- }
-
- dispatch(fileVersionsActions.clearAllCache());
- },
- [dispatch, versionLimits],
- );
-
const handlePaymentSuccess = () => {
showSuccessSubscriptionNotification();
- setTimeout(() => {
- dispatch(planThunks.initializeThunk()).unwrap();
- }, 2000);
- pollVersionLimitsUntilChanged();
+ setTimeout(() => dispatch(planThunks.initializeThunk()).unwrap(), 2000);
};
const handleSubscriptionPayment = async (priceId: string) => {
@@ -277,7 +242,6 @@ const PlansSection = ({ changeSection, onClosePreferences }: PlansSectionProps)
setTimeout(() => {
dispatch(planThunks.initializeThunk()).unwrap();
}, 1000);
- pollVersionLimitsUntilChanged();
}
}
diff --git a/yarn.lock b/yarn.lock
index 6ef95426a5..5eec953fca 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1906,13 +1906,13 @@
version "1.0.2"
resolved "https://codeload.github.com/internxt/prettier-config/tar.gz/9fa74e9a2805e1538b50c3809324f1c9d0f3e4f9"
-"@internxt/sdk@=1.13.1":
- version "1.13.1"
- resolved "https://registry.yarnpkg.com/@internxt/sdk/-/sdk-1.13.1.tgz#41e76bd2baa1508e47630e0f19fbafbea89678b0"
- integrity sha512-6MRMdCEzwMPPK0V8jiFGh7FyUFrEP9ZvgitqqRvmtLsmE5oUjivlXrCX9SkQME0m+TweTuA+BAzr6oUgkSf9bw==
+"@internxt/sdk@=1.12.6":
+ version "1.12.6"
+ resolved "https://registry.yarnpkg.com/@internxt/sdk/-/sdk-1.12.6.tgz#6e7e08cfb78aac1a9cde45f0669b5e094f716909"
+ integrity sha512-V5XfRRb6HaiFLtLq9nTUQScd9c41MOyvr3GT5lvpqj7pd/gMnBV9HBpMqdiiRzPWXgf1WDddcjo2QBNChEzCxQ==
dependencies:
- axios "1.13.5"
- uuid "13.0.0"
+ axios "1.13.2"
+ uuid "11.1.0"
"@internxt/ui@=0.1.3":
version "0.1.3"