diff --git a/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx b/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx
index 665144e53..f35b4d4eb 100644
--- a/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx
+++ b/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx
@@ -910,7 +910,7 @@ const ListObjects = ({
dataObject={{
name: selectedPreview.name,
last_modified: "",
- version_id: selectedPreview.version_id || null,
+ version_id: selectedPreview.version_id,
}}
/>
)}
diff --git a/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ObjectDetails/ShareFile.tsx b/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ObjectDetails/ShareFile.tsx
index dabd3f25a..9cb14168b 100644
--- a/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ObjectDetails/ShareFile.tsx
+++ b/portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ObjectDetails/ShareFile.tsx
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
-import React, { useEffect, useState } from "react";
+import React, { useEffect, useState, Fragment } from "react";
import get from "lodash/get";
import { connect } from "react-redux";
import { createStyles, Theme, withStyles } from "@material-ui/core/styles";
@@ -34,6 +34,7 @@ import api from "../../../../../../common/api";
import ModalWrapper from "../../../../Common/ModalWrapper/ModalWrapper";
import PredefinedList from "../../../../Common/FormComponents/PredefinedList/PredefinedList";
import DaysSelector from "../../../../Common/FormComponents/DaysSelector/DaysSelector";
+import { LinearProgress } from "@material-ui/core";
const styles = (theme: Theme) =>
createStyles({
@@ -68,9 +69,11 @@ const ShareFile = ({
setModalErrorSnackMessage,
}: IShareFileProps) => {
const [shareURL, setShareURL] = useState("");
+ const [isLoadingVersion, setIsLoadingVersion] = useState(true);
const [isLoadingFile, setIsLoadingFile] = useState(false);
const [selectedDate, setSelectedDate] = useState("");
const [dateValid, setDateValid] = useState(true);
+ const [versionID, setVersionID] = useState("null");
const initialDate = new Date();
@@ -85,7 +88,49 @@ const ShareFile = ({
};
useEffect(() => {
- if (dateValid) {
+ // In case version is undefined, we get the latest version of the object
+ if (dataObject.version_id === undefined) {
+ // In case it is not distributed setup, then we default to "null";
+ if (distributedSetup) {
+ api
+ .invoke(
+ "GET",
+ `/api/v1/buckets/${bucketName}/objects?prefix=${btoa(
+ dataObject.name
+ )}${distributedSetup ? "&with_versions=true" : ""}`
+ )
+ .then((res: IFileInfo[]) => {
+ const result = get(res, "objects", []);
+
+ const latestVersion = result.find(
+ (elem: IFileInfo) => elem.is_latest
+ );
+
+ if (latestVersion) {
+ setVersionID(latestVersion.version_id);
+ return;
+ }
+
+ // Version couldn't ve retrieved, we default
+ setVersionID("null");
+ })
+ .catch((error: ErrorResponseHandler) => {
+ setModalErrorSnackMessage(error);
+ });
+
+ setIsLoadingVersion(false);
+ return;
+ }
+ setVersionID("null");
+ setIsLoadingVersion(false);
+ return;
+ }
+ setVersionID(dataObject.version_id || "null");
+ setIsLoadingVersion(false);
+ }, [bucketName, dataObject, distributedSetup, setModalErrorSnackMessage]);
+
+ useEffect(() => {
+ if (dateValid && !isLoadingVersion) {
setIsLoadingFile(true);
setShareURL("");
@@ -95,14 +140,12 @@ const ShareFile = ({
const diffDate = slDate.getTime() - currDate.getTime();
if (diffDate > 0) {
- const versID = distributedSetup ? dataObject.version_id : "null";
-
api
.invoke(
"GET",
`/api/v1/buckets/${bucketName}/objects/share?prefix=${btoa(
dataObject.name
- )}&version_id=${versID || "null"}${
+ )}&version_id=${versionID}${
selectedDate !== "" ? `&expires=${diffDate}ms` : ""
}`
)
@@ -125,6 +168,8 @@ const ShareFile = ({
setShareURL,
setModalErrorSnackMessage,
distributedSetup,
+ isLoadingVersion,
+ versionID,
]);
return (
@@ -137,42 +182,51 @@ const ShareFile = ({
}}
>
-
- This module generates a temporary URL with integrated access
- credentials for sharing objects for up to 7 days.
-
- The temporary URL expires after the configured time limit.
-
-
-
-
-
-
-
+ {isLoadingVersion && (
+
+
-
-
- }
- onClick={() => {
- setModalSnackMessage("Share URL Copied to clipboard");
- }}
- disabled={shareURL === "" || isLoadingFile}
- >
- Copy
-
-
-
-
+ )}
+ {!isLoadingVersion && (
+
+
+ This module generates a temporary URL with integrated access
+ credentials for sharing objects for up to 7 days.
+
+ The temporary URL expires after the configured time limit.
+
+
+
+
+
+
+
+
+
+
+ }
+ onClick={() => {
+ setModalSnackMessage("Share URL Copied to clipboard");
+ }}
+ disabled={shareURL === "" || isLoadingFile}
+ >
+ Copy
+
+
+
+
+
+ )}