@sparkstudio/storage-ui 1.0.31 → 1.0.33

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 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
- setCurrentImage(null);
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 (!cancelled) {
1964
- setCurrentImage(image ?? null);
1972
+ if (cancelled) {
1973
+ return;
1965
1974
  }
1975
+ setCurrentImage(image ?? null);
1966
1976
  } catch (err) {
1967
- if (!cancelled) {
1968
- setCurrentImage(null);
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
- await deleteContainerFile(value);
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
- await deleteContainerFile(value);
2095
- setCurrentImage(null);
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
- setError(getErrorMessage(err, "Failed to delete image."));
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
- if (!value) {
2340
- setImageUrl(null);
2341
- onLoaded?.(null);
2342
- return;
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
- setLoading(true);
2345
- sdk.container.Read(value).then((x) => {
2346
- const url = x?.PublicUrl ?? null;
2347
- setImageUrl(url);
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 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
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 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
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 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { fontSize: 13, opacity: 0.6 }, children: "No image" })
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
- setCurrentImage(null);
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 (!cancelled) {
1931
- setCurrentImage(image ?? null);
1939
+ if (cancelled) {
1940
+ return;
1932
1941
  }
1942
+ setCurrentImage(image ?? null);
1933
1943
  } catch (err) {
1934
- if (!cancelled) {
1935
- setCurrentImage(null);
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
- await deleteContainerFile(value);
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
- await deleteContainerFile(value);
2062
- setCurrentImage(null);
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
- setError(getErrorMessage(err, "Failed to delete image."));
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
- if (!value) {
2307
- setImageUrl(null);
2308
- onLoaded?.(null);
2309
- return;
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
- setLoading(true);
2312
- sdk.container.Read(value).then((x) => {
2313
- const url = x?.PublicUrl ?? null;
2314
- setImageUrl(url);
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 && /* @__PURE__ */ jsx12(
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 && /* @__PURE__ */ jsx12(
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 && /* @__PURE__ */ jsx12("div", { style: { fontSize: 13, opacity: 0.6 }, children: "No image" })
2396
+ ) : null,
2397
+ !loading && !imageUrl ? /* @__PURE__ */ jsx12("div", { style: { fontSize: 13, opacity: 0.6 }, children: "No image" }) : null
2354
2398
  ]
2355
2399
  }
2356
2400
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sparkstudio/storage-ui",
3
- "version": "1.0.31",
3
+ "version": "1.0.33",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",