@sparkstudio/storage-ui 1.0.31 → 1.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +75 -31
- package/dist/index.js +75 -31
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1950,31 +1950,41 @@ function SingleImageUploadEditor(props) {
|
|
|
1950
1950
|
[storageApiBaseUrl]
|
|
1951
1951
|
);
|
|
1952
1952
|
const busy = disabled || isDeleting || isLoadingImage;
|
|
1953
|
+
function logError(context, err) {
|
|
1954
|
+
console.error(`[SingleImageUploadEditor] ${context}`, err);
|
|
1955
|
+
}
|
|
1956
|
+
function resetState() {
|
|
1957
|
+
setCurrentImage(null);
|
|
1958
|
+
setError(null);
|
|
1959
|
+
pendingContainerRef.current = null;
|
|
1960
|
+
}
|
|
1953
1961
|
(0, import_react13.useEffect)(() => {
|
|
1954
1962
|
let cancelled = false;
|
|
1955
1963
|
async function loadImage() {
|
|
1956
1964
|
if (!value) {
|
|
1957
|
-
|
|
1965
|
+
resetState();
|
|
1958
1966
|
return;
|
|
1959
1967
|
}
|
|
1960
1968
|
try {
|
|
1969
|
+
setError(null);
|
|
1961
1970
|
setIsLoadingImage(true);
|
|
1962
1971
|
const image = await sdkDb.container.Read(value);
|
|
1963
|
-
if (
|
|
1964
|
-
|
|
1972
|
+
if (cancelled) {
|
|
1973
|
+
return;
|
|
1965
1974
|
}
|
|
1975
|
+
setCurrentImage(image ?? null);
|
|
1966
1976
|
} catch (err) {
|
|
1967
|
-
if (
|
|
1968
|
-
|
|
1969
|
-
setError(err instanceof Error ? err.message : "Failed to load image.");
|
|
1977
|
+
if (cancelled) {
|
|
1978
|
+
return;
|
|
1970
1979
|
}
|
|
1980
|
+
logError(`Failed to load image for value '${String(value)}'`, err);
|
|
1981
|
+
resetState();
|
|
1971
1982
|
} finally {
|
|
1972
1983
|
if (!cancelled) {
|
|
1973
1984
|
setIsLoadingImage(false);
|
|
1974
1985
|
}
|
|
1975
1986
|
}
|
|
1976
1987
|
}
|
|
1977
|
-
setError(null);
|
|
1978
1988
|
loadImage();
|
|
1979
1989
|
return () => {
|
|
1980
1990
|
cancelled = true;
|
|
@@ -2024,18 +2034,21 @@ function SingleImageUploadEditor(props) {
|
|
|
2024
2034
|
if (uploaded) {
|
|
2025
2035
|
setCurrentImage(uploaded);
|
|
2026
2036
|
onChange?.(uploaded.Id);
|
|
2027
|
-
pendingContainerRef.current = null;
|
|
2028
2037
|
}
|
|
2038
|
+
pendingContainerRef.current = null;
|
|
2029
2039
|
},
|
|
2030
2040
|
onUploadError: async (_file, err) => {
|
|
2031
2041
|
const pending = pendingContainerRef.current;
|
|
2032
2042
|
if (pending) {
|
|
2033
2043
|
try {
|
|
2034
2044
|
await sdkDb.container.DeleteContainer(pending.Id);
|
|
2035
|
-
} catch {
|
|
2045
|
+
} catch (cleanupErr) {
|
|
2046
|
+
logError("Failed to cleanup pending container after upload error", cleanupErr);
|
|
2036
2047
|
}
|
|
2037
2048
|
}
|
|
2038
2049
|
pendingContainerRef.current = null;
|
|
2050
|
+
logError("Upload failed", err);
|
|
2051
|
+
setCurrentImage(null);
|
|
2039
2052
|
setError(getErrorMessage(err, "Upload failed"));
|
|
2040
2053
|
}
|
|
2041
2054
|
});
|
|
@@ -2054,7 +2067,11 @@ function SingleImageUploadEditor(props) {
|
|
|
2054
2067
|
setError(null);
|
|
2055
2068
|
if (value) {
|
|
2056
2069
|
setIsDeleting(true);
|
|
2057
|
-
|
|
2070
|
+
try {
|
|
2071
|
+
await deleteContainerFile(value);
|
|
2072
|
+
} catch (err) {
|
|
2073
|
+
logError(`Failed to delete existing container '${String(value)}'`, err);
|
|
2074
|
+
}
|
|
2058
2075
|
setCurrentImage(null);
|
|
2059
2076
|
onChange?.(null);
|
|
2060
2077
|
}
|
|
@@ -2062,6 +2079,8 @@ function SingleImageUploadEditor(props) {
|
|
|
2062
2079
|
dt.items.add(file);
|
|
2063
2080
|
startUploadsIfNeeded(dt.files);
|
|
2064
2081
|
} catch (err) {
|
|
2082
|
+
logError("Failed to replace image", err);
|
|
2083
|
+
resetState();
|
|
2065
2084
|
setError(getErrorMessage(err, "Failed to replace image."));
|
|
2066
2085
|
} finally {
|
|
2067
2086
|
setIsDeleting(false);
|
|
@@ -2091,11 +2110,16 @@ function SingleImageUploadEditor(props) {
|
|
|
2091
2110
|
try {
|
|
2092
2111
|
setError(null);
|
|
2093
2112
|
setIsDeleting(true);
|
|
2094
|
-
|
|
2095
|
-
|
|
2113
|
+
try {
|
|
2114
|
+
await deleteContainerFile(value);
|
|
2115
|
+
} catch (err) {
|
|
2116
|
+
logError(`Failed to delete container '${String(value)}'`, err);
|
|
2117
|
+
}
|
|
2118
|
+
resetState();
|
|
2096
2119
|
onChange?.(null);
|
|
2097
2120
|
} catch (err) {
|
|
2098
|
-
|
|
2121
|
+
logError("Failed to delete image", err);
|
|
2122
|
+
resetState();
|
|
2099
2123
|
} finally {
|
|
2100
2124
|
setIsDeleting(false);
|
|
2101
2125
|
}
|
|
@@ -2336,20 +2360,40 @@ function SingleImageView(props) {
|
|
|
2336
2360
|
[containerApiBaseUrl]
|
|
2337
2361
|
);
|
|
2338
2362
|
(0, import_react14.useEffect)(() => {
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2363
|
+
let cancelled = false;
|
|
2364
|
+
async function load() {
|
|
2365
|
+
if (!value) {
|
|
2366
|
+
setLoading(false);
|
|
2367
|
+
setImageUrl(null);
|
|
2368
|
+
onLoaded?.(null);
|
|
2369
|
+
return;
|
|
2370
|
+
}
|
|
2371
|
+
try {
|
|
2372
|
+
setLoading(true);
|
|
2373
|
+
const x = await sdk.container.Read(value);
|
|
2374
|
+
const url = x?.PublicUrl ?? null;
|
|
2375
|
+
if (cancelled) {
|
|
2376
|
+
return;
|
|
2377
|
+
}
|
|
2378
|
+
setImageUrl(url);
|
|
2379
|
+
onLoaded?.(url);
|
|
2380
|
+
} catch (err) {
|
|
2381
|
+
if (cancelled) {
|
|
2382
|
+
return;
|
|
2383
|
+
}
|
|
2384
|
+
console.error(`[SingleImageView] Failed to load image '${String(value)}'`, err);
|
|
2385
|
+
setImageUrl(null);
|
|
2386
|
+
onLoaded?.(null);
|
|
2387
|
+
} finally {
|
|
2388
|
+
if (!cancelled) {
|
|
2389
|
+
setLoading(false);
|
|
2390
|
+
}
|
|
2391
|
+
}
|
|
2343
2392
|
}
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
onLoaded?.(url);
|
|
2349
|
-
}).catch(() => {
|
|
2350
|
-
setImageUrl(null);
|
|
2351
|
-
onLoaded?.(null);
|
|
2352
|
-
}).finally(() => setLoading(false));
|
|
2393
|
+
load();
|
|
2394
|
+
return () => {
|
|
2395
|
+
cancelled = true;
|
|
2396
|
+
};
|
|
2353
2397
|
}, [sdk, value, onLoaded]);
|
|
2354
2398
|
return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
2355
2399
|
"div",
|
|
@@ -2363,7 +2407,7 @@ function SingleImageView(props) {
|
|
|
2363
2407
|
position: "relative"
|
|
2364
2408
|
},
|
|
2365
2409
|
children: [
|
|
2366
|
-
imageUrl
|
|
2410
|
+
imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
2367
2411
|
"img",
|
|
2368
2412
|
{
|
|
2369
2413
|
src: imageUrl,
|
|
@@ -2375,15 +2419,15 @@ function SingleImageView(props) {
|
|
|
2375
2419
|
display: "block"
|
|
2376
2420
|
}
|
|
2377
2421
|
}
|
|
2378
|
-
),
|
|
2379
|
-
loading
|
|
2422
|
+
) : null,
|
|
2423
|
+
loading ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
2380
2424
|
"div",
|
|
2381
2425
|
{
|
|
2382
2426
|
className: "spinner-border text-primary",
|
|
2383
2427
|
style: { position: "absolute" }
|
|
2384
2428
|
}
|
|
2385
|
-
),
|
|
2386
|
-
!loading && !imageUrl
|
|
2429
|
+
) : null,
|
|
2430
|
+
!loading && !imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { fontSize: 13, opacity: 0.6 }, children: "No image" }) : null
|
|
2387
2431
|
]
|
|
2388
2432
|
}
|
|
2389
2433
|
);
|
package/dist/index.js
CHANGED
|
@@ -1917,31 +1917,41 @@ function SingleImageUploadEditor(props) {
|
|
|
1917
1917
|
[storageApiBaseUrl]
|
|
1918
1918
|
);
|
|
1919
1919
|
const busy = disabled || isDeleting || isLoadingImage;
|
|
1920
|
+
function logError(context, err) {
|
|
1921
|
+
console.error(`[SingleImageUploadEditor] ${context}`, err);
|
|
1922
|
+
}
|
|
1923
|
+
function resetState() {
|
|
1924
|
+
setCurrentImage(null);
|
|
1925
|
+
setError(null);
|
|
1926
|
+
pendingContainerRef.current = null;
|
|
1927
|
+
}
|
|
1920
1928
|
useEffect4(() => {
|
|
1921
1929
|
let cancelled = false;
|
|
1922
1930
|
async function loadImage() {
|
|
1923
1931
|
if (!value) {
|
|
1924
|
-
|
|
1932
|
+
resetState();
|
|
1925
1933
|
return;
|
|
1926
1934
|
}
|
|
1927
1935
|
try {
|
|
1936
|
+
setError(null);
|
|
1928
1937
|
setIsLoadingImage(true);
|
|
1929
1938
|
const image = await sdkDb.container.Read(value);
|
|
1930
|
-
if (
|
|
1931
|
-
|
|
1939
|
+
if (cancelled) {
|
|
1940
|
+
return;
|
|
1932
1941
|
}
|
|
1942
|
+
setCurrentImage(image ?? null);
|
|
1933
1943
|
} catch (err) {
|
|
1934
|
-
if (
|
|
1935
|
-
|
|
1936
|
-
setError(err instanceof Error ? err.message : "Failed to load image.");
|
|
1944
|
+
if (cancelled) {
|
|
1945
|
+
return;
|
|
1937
1946
|
}
|
|
1947
|
+
logError(`Failed to load image for value '${String(value)}'`, err);
|
|
1948
|
+
resetState();
|
|
1938
1949
|
} finally {
|
|
1939
1950
|
if (!cancelled) {
|
|
1940
1951
|
setIsLoadingImage(false);
|
|
1941
1952
|
}
|
|
1942
1953
|
}
|
|
1943
1954
|
}
|
|
1944
|
-
setError(null);
|
|
1945
1955
|
loadImage();
|
|
1946
1956
|
return () => {
|
|
1947
1957
|
cancelled = true;
|
|
@@ -1991,18 +2001,21 @@ function SingleImageUploadEditor(props) {
|
|
|
1991
2001
|
if (uploaded) {
|
|
1992
2002
|
setCurrentImage(uploaded);
|
|
1993
2003
|
onChange?.(uploaded.Id);
|
|
1994
|
-
pendingContainerRef.current = null;
|
|
1995
2004
|
}
|
|
2005
|
+
pendingContainerRef.current = null;
|
|
1996
2006
|
},
|
|
1997
2007
|
onUploadError: async (_file, err) => {
|
|
1998
2008
|
const pending = pendingContainerRef.current;
|
|
1999
2009
|
if (pending) {
|
|
2000
2010
|
try {
|
|
2001
2011
|
await sdkDb.container.DeleteContainer(pending.Id);
|
|
2002
|
-
} catch {
|
|
2012
|
+
} catch (cleanupErr) {
|
|
2013
|
+
logError("Failed to cleanup pending container after upload error", cleanupErr);
|
|
2003
2014
|
}
|
|
2004
2015
|
}
|
|
2005
2016
|
pendingContainerRef.current = null;
|
|
2017
|
+
logError("Upload failed", err);
|
|
2018
|
+
setCurrentImage(null);
|
|
2006
2019
|
setError(getErrorMessage(err, "Upload failed"));
|
|
2007
2020
|
}
|
|
2008
2021
|
});
|
|
@@ -2021,7 +2034,11 @@ function SingleImageUploadEditor(props) {
|
|
|
2021
2034
|
setError(null);
|
|
2022
2035
|
if (value) {
|
|
2023
2036
|
setIsDeleting(true);
|
|
2024
|
-
|
|
2037
|
+
try {
|
|
2038
|
+
await deleteContainerFile(value);
|
|
2039
|
+
} catch (err) {
|
|
2040
|
+
logError(`Failed to delete existing container '${String(value)}'`, err);
|
|
2041
|
+
}
|
|
2025
2042
|
setCurrentImage(null);
|
|
2026
2043
|
onChange?.(null);
|
|
2027
2044
|
}
|
|
@@ -2029,6 +2046,8 @@ function SingleImageUploadEditor(props) {
|
|
|
2029
2046
|
dt.items.add(file);
|
|
2030
2047
|
startUploadsIfNeeded(dt.files);
|
|
2031
2048
|
} catch (err) {
|
|
2049
|
+
logError("Failed to replace image", err);
|
|
2050
|
+
resetState();
|
|
2032
2051
|
setError(getErrorMessage(err, "Failed to replace image."));
|
|
2033
2052
|
} finally {
|
|
2034
2053
|
setIsDeleting(false);
|
|
@@ -2058,11 +2077,16 @@ function SingleImageUploadEditor(props) {
|
|
|
2058
2077
|
try {
|
|
2059
2078
|
setError(null);
|
|
2060
2079
|
setIsDeleting(true);
|
|
2061
|
-
|
|
2062
|
-
|
|
2080
|
+
try {
|
|
2081
|
+
await deleteContainerFile(value);
|
|
2082
|
+
} catch (err) {
|
|
2083
|
+
logError(`Failed to delete container '${String(value)}'`, err);
|
|
2084
|
+
}
|
|
2085
|
+
resetState();
|
|
2063
2086
|
onChange?.(null);
|
|
2064
2087
|
} catch (err) {
|
|
2065
|
-
|
|
2088
|
+
logError("Failed to delete image", err);
|
|
2089
|
+
resetState();
|
|
2066
2090
|
} finally {
|
|
2067
2091
|
setIsDeleting(false);
|
|
2068
2092
|
}
|
|
@@ -2303,20 +2327,40 @@ function SingleImageView(props) {
|
|
|
2303
2327
|
[containerApiBaseUrl]
|
|
2304
2328
|
);
|
|
2305
2329
|
useEffect5(() => {
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2330
|
+
let cancelled = false;
|
|
2331
|
+
async function load() {
|
|
2332
|
+
if (!value) {
|
|
2333
|
+
setLoading(false);
|
|
2334
|
+
setImageUrl(null);
|
|
2335
|
+
onLoaded?.(null);
|
|
2336
|
+
return;
|
|
2337
|
+
}
|
|
2338
|
+
try {
|
|
2339
|
+
setLoading(true);
|
|
2340
|
+
const x = await sdk.container.Read(value);
|
|
2341
|
+
const url = x?.PublicUrl ?? null;
|
|
2342
|
+
if (cancelled) {
|
|
2343
|
+
return;
|
|
2344
|
+
}
|
|
2345
|
+
setImageUrl(url);
|
|
2346
|
+
onLoaded?.(url);
|
|
2347
|
+
} catch (err) {
|
|
2348
|
+
if (cancelled) {
|
|
2349
|
+
return;
|
|
2350
|
+
}
|
|
2351
|
+
console.error(`[SingleImageView] Failed to load image '${String(value)}'`, err);
|
|
2352
|
+
setImageUrl(null);
|
|
2353
|
+
onLoaded?.(null);
|
|
2354
|
+
} finally {
|
|
2355
|
+
if (!cancelled) {
|
|
2356
|
+
setLoading(false);
|
|
2357
|
+
}
|
|
2358
|
+
}
|
|
2310
2359
|
}
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
onLoaded?.(url);
|
|
2316
|
-
}).catch(() => {
|
|
2317
|
-
setImageUrl(null);
|
|
2318
|
-
onLoaded?.(null);
|
|
2319
|
-
}).finally(() => setLoading(false));
|
|
2360
|
+
load();
|
|
2361
|
+
return () => {
|
|
2362
|
+
cancelled = true;
|
|
2363
|
+
};
|
|
2320
2364
|
}, [sdk, value, onLoaded]);
|
|
2321
2365
|
return /* @__PURE__ */ jsxs9(
|
|
2322
2366
|
"div",
|
|
@@ -2330,7 +2374,7 @@ function SingleImageView(props) {
|
|
|
2330
2374
|
position: "relative"
|
|
2331
2375
|
},
|
|
2332
2376
|
children: [
|
|
2333
|
-
imageUrl
|
|
2377
|
+
imageUrl ? /* @__PURE__ */ jsx12(
|
|
2334
2378
|
"img",
|
|
2335
2379
|
{
|
|
2336
2380
|
src: imageUrl,
|
|
@@ -2342,15 +2386,15 @@ function SingleImageView(props) {
|
|
|
2342
2386
|
display: "block"
|
|
2343
2387
|
}
|
|
2344
2388
|
}
|
|
2345
|
-
),
|
|
2346
|
-
loading
|
|
2389
|
+
) : null,
|
|
2390
|
+
loading ? /* @__PURE__ */ jsx12(
|
|
2347
2391
|
"div",
|
|
2348
2392
|
{
|
|
2349
2393
|
className: "spinner-border text-primary",
|
|
2350
2394
|
style: { position: "absolute" }
|
|
2351
2395
|
}
|
|
2352
|
-
),
|
|
2353
|
-
!loading && !imageUrl
|
|
2396
|
+
) : null,
|
|
2397
|
+
!loading && !imageUrl ? /* @__PURE__ */ jsx12("div", { style: { fontSize: 13, opacity: 0.6 }, children: "No image" }) : null
|
|
2354
2398
|
]
|
|
2355
2399
|
}
|
|
2356
2400
|
);
|