@useupup/react 3.3.0
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/LICENSE +21 -0
- package/README.md +72 -0
- package/dist/AudioUploader-2WITC5YR.js +298 -0
- package/dist/AudioUploader-2WITC5YR.js.map +1 -0
- package/dist/AudioUploader-HWP4U6UJ.cjs +298 -0
- package/dist/AudioUploader-HWP4U6UJ.cjs.map +1 -0
- package/dist/BoxUploader-NEGZOMR4.cjs +172 -0
- package/dist/BoxUploader-NEGZOMR4.cjs.map +1 -0
- package/dist/BoxUploader-VE5LRJ7M.js +172 -0
- package/dist/BoxUploader-VE5LRJ7M.js.map +1 -0
- package/dist/CameraUploader-BJ3AU3VS.cjs +200 -0
- package/dist/CameraUploader-BJ3AU3VS.cjs.map +1 -0
- package/dist/CameraUploader-WF5A6UIS.js +200 -0
- package/dist/CameraUploader-WF5A6UIS.js.map +1 -0
- package/dist/DropboxUploader-INTOYHJP.cjs +174 -0
- package/dist/DropboxUploader-INTOYHJP.cjs.map +1 -0
- package/dist/DropboxUploader-VMUYG3OP.js +174 -0
- package/dist/DropboxUploader-VMUYG3OP.js.map +1 -0
- package/dist/GoogleDriveUploader-CXZUZI6R.cjs +177 -0
- package/dist/GoogleDriveUploader-CXZUZI6R.cjs.map +1 -0
- package/dist/GoogleDriveUploader-YA56X3QR.js +177 -0
- package/dist/GoogleDriveUploader-YA56X3QR.js.map +1 -0
- package/dist/ImageEditorInline-GJ3HCPPZ.cjs +185 -0
- package/dist/ImageEditorInline-GJ3HCPPZ.cjs.map +1 -0
- package/dist/ImageEditorInline-N2NSAODR.js +185 -0
- package/dist/ImageEditorInline-N2NSAODR.js.map +1 -0
- package/dist/ImageEditorModal-CWKMDVPY.js +236 -0
- package/dist/ImageEditorModal-CWKMDVPY.js.map +1 -0
- package/dist/ImageEditorModal-XJKPBTVQ.cjs +236 -0
- package/dist/ImageEditorModal-XJKPBTVQ.cjs.map +1 -0
- package/dist/OneDriveUploader-4RPTY7KT.cjs +175 -0
- package/dist/OneDriveUploader-4RPTY7KT.cjs.map +1 -0
- package/dist/OneDriveUploader-I25Y6AJP.js +175 -0
- package/dist/OneDriveUploader-I25Y6AJP.js.map +1 -0
- package/dist/ScreenCaptureUploader-7K6QPD42.cjs +281 -0
- package/dist/ScreenCaptureUploader-7K6QPD42.cjs.map +1 -0
- package/dist/ScreenCaptureUploader-WKDO4S75.js +281 -0
- package/dist/ScreenCaptureUploader-WKDO4S75.js.map +1 -0
- package/dist/chunk-6TFTTLOD.js +852 -0
- package/dist/chunk-6TFTTLOD.js.map +1 -0
- package/dist/chunk-DZQBTC6T.cjs +39 -0
- package/dist/chunk-DZQBTC6T.cjs.map +1 -0
- package/dist/chunk-GNMEQB32.cjs +195 -0
- package/dist/chunk-GNMEQB32.cjs.map +1 -0
- package/dist/chunk-IG62MHVQ.cjs +276 -0
- package/dist/chunk-IG62MHVQ.cjs.map +1 -0
- package/dist/chunk-L3E5OMY7.cjs +852 -0
- package/dist/chunk-L3E5OMY7.cjs.map +1 -0
- package/dist/chunk-LCMDDPUD.js +276 -0
- package/dist/chunk-LCMDDPUD.js.map +1 -0
- package/dist/chunk-N4XGN66E.cjs +79 -0
- package/dist/chunk-N4XGN66E.cjs.map +1 -0
- package/dist/chunk-N7TWHP5Z.js +195 -0
- package/dist/chunk-N7TWHP5Z.js.map +1 -0
- package/dist/chunk-OXWVO7Z6.cjs +70 -0
- package/dist/chunk-OXWVO7Z6.cjs.map +1 -0
- package/dist/chunk-PLGHK2Y4.js +79 -0
- package/dist/chunk-PLGHK2Y4.js.map +1 -0
- package/dist/chunk-SSLP3MEC.js +39 -0
- package/dist/chunk-SSLP3MEC.js.map +1 -0
- package/dist/chunk-WYMKISZI.js +70 -0
- package/dist/chunk-WYMKISZI.js.map +1 -0
- package/dist/index.cjs +4219 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +240 -0
- package/dist/index.d.ts +240 -0
- package/dist/index.js +4219 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.d.ts +4 -0
- package/dist/tailwind-prefixed.css +2529 -0
- package/package.json +110 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkIG62MHVQcjs = require('./chunk-IG62MHVQ.cjs');
|
|
5
|
+
|
|
6
|
+
// src/hooks/useFetchFileByUrl.ts
|
|
7
|
+
var _react = require('react');
|
|
8
|
+
var _internal = require('@useupup/core/internal');
|
|
9
|
+
function useFetchFileByUrl() {
|
|
10
|
+
const { core } = _chunkIG62MHVQcjs.useUploaderRuntime.call(void 0, );
|
|
11
|
+
const { onError } = _chunkIG62MHVQcjs.useUploaderOptions.call(void 0, );
|
|
12
|
+
const [loading, setLoading] = _react.useState.call(void 0, false);
|
|
13
|
+
const abortControllerRef = _react.useRef.call(void 0, null);
|
|
14
|
+
const mountedRef = _react.useRef.call(void 0, true);
|
|
15
|
+
const cancelFetch = _react.useCallback.call(void 0, () => {
|
|
16
|
+
var _a;
|
|
17
|
+
(_a = abortControllerRef.current) == null ? void 0 : _a.abort();
|
|
18
|
+
abortControllerRef.current = null;
|
|
19
|
+
}, []);
|
|
20
|
+
_react.useEffect.call(void 0, () => {
|
|
21
|
+
return () => {
|
|
22
|
+
mountedRef.current = false;
|
|
23
|
+
cancelFetch();
|
|
24
|
+
};
|
|
25
|
+
}, [cancelFetch]);
|
|
26
|
+
const fetchImage = _react.useCallback.call(void 0,
|
|
27
|
+
async (url) => {
|
|
28
|
+
if (loading) return;
|
|
29
|
+
const abortController = new AbortController();
|
|
30
|
+
abortControllerRef.current = abortController;
|
|
31
|
+
try {
|
|
32
|
+
setLoading(true);
|
|
33
|
+
const response = await fetch(url, {
|
|
34
|
+
signal: abortController.signal
|
|
35
|
+
});
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
throw new Error(`Failed to fetch URL: ${response.status}`);
|
|
38
|
+
}
|
|
39
|
+
const blob = await response.blob();
|
|
40
|
+
const fileName = _internal.deriveFetchedFileName.call(void 0, url, response, blob);
|
|
41
|
+
const file = new File([blob], fileName, {
|
|
42
|
+
type: blob.type
|
|
43
|
+
});
|
|
44
|
+
core == null ? void 0 : core.emit("url-fetch", { file });
|
|
45
|
+
return file;
|
|
46
|
+
} catch (error) {
|
|
47
|
+
if (error.name === "AbortError") {
|
|
48
|
+
core == null ? void 0 : core.emit("url-fetch-cancel", { url });
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
onError(error.message);
|
|
52
|
+
return;
|
|
53
|
+
} finally {
|
|
54
|
+
if (abortControllerRef.current === abortController) {
|
|
55
|
+
abortControllerRef.current = null;
|
|
56
|
+
}
|
|
57
|
+
if (mountedRef.current) {
|
|
58
|
+
setLoading(false);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
[core, loading, onError]
|
|
63
|
+
);
|
|
64
|
+
return { loading, fetchImage, cancelFetch };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
exports.useFetchFileByUrl = useFetchFileByUrl;
|
|
70
|
+
//# sourceMappingURL=chunk-OXWVO7Z6.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\react\\dist\\chunk-OXWVO7Z6.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;AACA,8BAAgE;AAChE,kDAA8D;AAC9D,SAAS,iBAAiB,CAAC,EAAE;AAC7B,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,kDAAkB,CAAE;AACvC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,kDAAkB,CAAE;AAC1C,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,6BAAQ,KAAM,CAAC;AAC/C,EAAE,MAAM,mBAAmB,EAAE,2BAAM,IAAK,CAAC;AACzC,EAAE,MAAM,WAAW,EAAE,2BAAM,IAAK,CAAC;AACjC,EAAE,MAAM,YAAY,EAAE,gCAAW,CAAE,EAAE,GAAG;AACxC,IAAI,IAAI,EAAE;AACV,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AACnE,IAAI,kBAAkB,CAAC,QAAQ,EAAE,IAAI;AACrC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,EAAE,8BAAS,CAAE,EAAE,GAAG;AAClB,IAAI,OAAO,CAAC,EAAE,GAAG;AACjB,MAAM,UAAU,CAAC,QAAQ,EAAE,KAAK;AAChC,MAAM,WAAW,CAAC,CAAC;AACnB,IAAI,CAAC;AACL,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;AACnB,EAAE,MAAM,WAAW,EAAE,gCAAW;AAChC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG;AACnB,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM;AACzB,MAAM,MAAM,gBAAgB,EAAE,IAAI,eAAe,CAAC,CAAC;AACnD,MAAM,kBAAkB,CAAC,QAAQ,EAAE,eAAe;AAClD,MAAM,IAAI;AACV,QAAQ,UAAU,CAAC,IAAI,CAAC;AACxB,QAAQ,MAAM,SAAS,EAAE,MAAM,KAAK,CAAC,GAAG,EAAE;AAC1C,UAAU,MAAM,EAAE,eAAe,CAAC;AAClC,QAAQ,CAAC,CAAC;AACV,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE;AAC1B,UAAU,MAAM,IAAI,KAAK,CAAC,CAAC,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA","file":"C:\\Users\\amind\\OneDrive\\Desktop\\Projects\\INTERNAL\\upup\\packages\\react\\dist\\chunk-OXWVO7Z6.cjs","sourcesContent":[null]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// src/components/Icon.tsx
|
|
2
|
+
import { createElement } from "react";
|
|
3
|
+
import { ICONS } from "@useupup/core";
|
|
4
|
+
import { cn } from "@useupup/core/internal";
|
|
5
|
+
var REACT_ATTR_MAP = {
|
|
6
|
+
"stroke-width": "strokeWidth",
|
|
7
|
+
"stroke-linecap": "strokeLinecap",
|
|
8
|
+
"stroke-linejoin": "strokeLinejoin",
|
|
9
|
+
"fill-rule": "fillRule"
|
|
10
|
+
};
|
|
11
|
+
function toReactAttrs(attrs) {
|
|
12
|
+
var _a;
|
|
13
|
+
const out = {};
|
|
14
|
+
for (const [k, v] of Object.entries(attrs != null ? attrs : {}))
|
|
15
|
+
out[(_a = REACT_ATTR_MAP[k]) != null ? _a : k] = v;
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
function Icon({ name, size, className }) {
|
|
19
|
+
const def = ICONS[name];
|
|
20
|
+
const px = size != null ? size : def.defaultSize;
|
|
21
|
+
return createElement("svg", {
|
|
22
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
23
|
+
viewBox: def.viewBox,
|
|
24
|
+
width: px,
|
|
25
|
+
height: px,
|
|
26
|
+
...toReactAttrs(def.attrs),
|
|
27
|
+
className: cn(def.className, className),
|
|
28
|
+
dangerouslySetInnerHTML: { __html: def.inner }
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
var Icon_default = Icon;
|
|
32
|
+
|
|
33
|
+
// src/lib/file.ts
|
|
34
|
+
import pako from "pako";
|
|
35
|
+
import { fileAppendParams, revokeFileUrl } from "@useupup/core/internal";
|
|
36
|
+
import {
|
|
37
|
+
bytesToSize,
|
|
38
|
+
sizeToBytes,
|
|
39
|
+
checkFileSize,
|
|
40
|
+
PREVIEW_MAX_TEXT_SIZE,
|
|
41
|
+
PREVIEW_TEXT_TRUNCATE_LENGTH,
|
|
42
|
+
fileGetIsImage,
|
|
43
|
+
fileGetIsPdf,
|
|
44
|
+
fileGetIsText,
|
|
45
|
+
fileCanPreviewText,
|
|
46
|
+
fileGetExtension,
|
|
47
|
+
fileIs3D,
|
|
48
|
+
searchDriveFiles
|
|
49
|
+
} from "@useupup/core/internal";
|
|
50
|
+
function formatFileSize(bytes, tr) {
|
|
51
|
+
var _a;
|
|
52
|
+
if (!bytes || bytes === 0) return tr.zeroBytes;
|
|
53
|
+
const k = 1024;
|
|
54
|
+
const sizes = [tr.bytes, tr.kb, tr.mb, tr.gb];
|
|
55
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
56
|
+
return `${Math.round(bytes / Math.pow(k, i) * 10) / 10} ${(_a = sizes[i]) != null ? _a : ""}`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// src/context/SourceViewHeaderExtraContext.ts
|
|
60
|
+
import { createContext } from "react";
|
|
61
|
+
var SourceViewHeaderExtraContext = createContext(
|
|
62
|
+
null
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
export {
|
|
66
|
+
Icon_default,
|
|
67
|
+
formatFileSize,
|
|
68
|
+
PREVIEW_MAX_TEXT_SIZE,
|
|
69
|
+
PREVIEW_TEXT_TRUNCATE_LENGTH,
|
|
70
|
+
fileGetIsImage,
|
|
71
|
+
fileGetIsPdf,
|
|
72
|
+
fileGetIsText,
|
|
73
|
+
fileCanPreviewText,
|
|
74
|
+
fileGetExtension,
|
|
75
|
+
fileIs3D,
|
|
76
|
+
searchDriveFiles,
|
|
77
|
+
SourceViewHeaderExtraContext
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=chunk-PLGHK2Y4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Icon.tsx","../src/lib/file.ts","../src/context/SourceViewHeaderExtraContext.ts"],"sourcesContent":["import { createElement, type ReactElement } from 'react'\r\nimport { ICONS, type IconName } from '@useupup/core'\r\nimport { cn } from '@useupup/core/internal'\r\n\r\nexport interface IconProps {\r\n name: IconName\r\n size?: number | undefined\r\n className?: string | undefined\r\n}\r\n\r\n// React uses camelCase SVG prop names; the registry stores kebab-case (raw-SVG) keys.\r\n// Mapping the OUTER-svg attrs avoids React's \"Invalid DOM property\" dev warnings.\r\n// (def.inner is injected raw via dangerouslySetInnerHTML and is NOT processed by React,\r\n// so kebab attrs inside it are fine.)\r\nconst REACT_ATTR_MAP: Record<string, string> = {\r\n 'stroke-width': 'strokeWidth',\r\n 'stroke-linecap': 'strokeLinecap',\r\n 'stroke-linejoin': 'strokeLinejoin',\r\n 'fill-rule': 'fillRule',\r\n}\r\nfunction toReactAttrs(attrs?: Record<string, string>): Record<string, string> {\r\n const out: Record<string, string> = {}\r\n for (const [k, v] of Object.entries(attrs ?? {}))\r\n out[REACT_ATTR_MAP[k] ?? k] = v\r\n return out\r\n}\r\n\r\nexport function Icon({ name, size, className }: IconProps): ReactElement {\r\n const def = ICONS[name]\r\n const px = size ?? def.defaultSize\r\n return createElement('svg', {\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n viewBox: def.viewBox,\r\n width: px,\r\n height: px,\r\n ...toReactAttrs(def.attrs),\r\n className: cn(def.className, className),\r\n dangerouslySetInnerHTML: { __html: def.inner },\r\n })\r\n}\r\n\r\nexport default Icon\r\n","import pako from 'pako'\r\nimport type { Translations, UploadFile } from '@useupup/core'\r\nimport { fileAppendParams, revokeFileUrl } from '@useupup/core/internal'\r\n\r\nexport { fileAppendParams, revokeFileUrl }\r\n\r\n/** Human-readable file size using the localized unit labels. Shared by\r\n * FilePreview (grid tile), FileRow (list) and FileHero (single-file). */\r\nexport function formatFileSize(\r\n bytes: number | undefined,\r\n tr: Translations,\r\n): string {\r\n if (!bytes || bytes === 0) return tr.zeroBytes\r\n const k = 1024\r\n const sizes = [tr.bytes, tr.kb, tr.mb, tr.gb]\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n return `${Math.round((bytes / Math.pow(k, i)) * 10) / 10} ${sizes[i] ?? ''}`\r\n}\r\nexport {\r\n bytesToSize,\r\n sizeToBytes,\r\n checkFileSize,\r\n PREVIEW_MAX_TEXT_SIZE,\r\n PREVIEW_TEXT_TRUNCATE_LENGTH,\r\n fileGetIsImage,\r\n fileGetIsPdf,\r\n fileGetIsText,\r\n fileCanPreviewText,\r\n fileGetExtension,\r\n fileIs3D,\r\n searchDriveFiles,\r\n} from '@useupup/core/internal'\r\n\r\nexport async function compressFile(oldFile: UploadFile): Promise<UploadFile> {\r\n const buffer = await oldFile.arrayBuffer()\r\n const compressed = new File([pako.gzip(buffer)], oldFile.name + '.gz', {\r\n type: 'application/octet-stream',\r\n lastModified: oldFile.lastModified,\r\n })\r\n const newUploadFile = fileAppendParams(compressed)\r\n newUploadFile.id = oldFile.id\r\n /* eslint-disable @typescript-eslint/no-deprecated -- carry legacy thumbnail/fileHash across compression until v3 removes them */\r\n if (oldFile.thumbnail !== undefined)\r\n newUploadFile.thumbnail = oldFile.thumbnail\r\n if (oldFile.fileHash !== undefined)\r\n newUploadFile.fileHash = oldFile.fileHash\r\n /* eslint-enable @typescript-eslint/no-deprecated -- end legacy field carry-over */\r\n if (oldFile.key !== undefined) newUploadFile.key = oldFile.key\r\n newUploadFile.source = oldFile.source\r\n newUploadFile.status = oldFile.status\r\n newUploadFile.metadata = oldFile.metadata\r\n revokeFileUrl(oldFile)\r\n return newUploadFile\r\n}\r\n","import { createContext } from 'react'\r\n\r\n/**\r\n * DOM host inside the SourceView header row, just before the Back button.\r\n * A source view portals its right-side header extras into it (e.g. the drive\r\n * browser's avatar + log out + separator) so account controls share the top\r\n * row instead of occupying their own strip. Null when no header is mounted.\r\n */\r\nexport const SourceViewHeaderExtraContext = createContext<HTMLElement | null>(\r\n null,\r\n)\r\n"],"mappings":";AAAA,SAAS,qBAAwC;AACjD,SAAS,aAA4B;AACrC,SAAS,UAAU;AAYnB,IAAM,iBAAyC;AAAA,EAC3C,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,aAAa;AACjB;AACA,SAAS,aAAa,OAAwD;AApB9E;AAqBI,QAAM,MAA8B,CAAC;AACrC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,wBAAS,CAAC,CAAC;AAC3C,SAAI,oBAAe,CAAC,MAAhB,YAAqB,CAAC,IAAI;AAClC,SAAO;AACX;AAEO,SAAS,KAAK,EAAE,MAAM,MAAM,UAAU,GAA4B;AACrE,QAAM,MAAM,MAAM,IAAI;AACtB,QAAM,KAAK,sBAAQ,IAAI;AACvB,SAAO,cAAc,OAAO;AAAA,IACxB,OAAO;AAAA,IACP,SAAS,IAAI;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,GAAG,aAAa,IAAI,KAAK;AAAA,IACzB,WAAW,GAAG,IAAI,WAAW,SAAS;AAAA,IACtC,yBAAyB,EAAE,QAAQ,IAAI,MAAM;AAAA,EACjD,CAAC;AACL;AAEA,IAAO,eAAQ;;;ACzCf,OAAO,UAAU;AAEjB,SAAS,kBAAkB,qBAAqB;AAgBhD;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAvBA,SAAS,eACZ,OACA,IACM;AAXV;AAYI,MAAI,CAAC,SAAS,UAAU,EAAG,QAAO,GAAG;AACrC,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;AAC5C,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,SAAO,GAAG,KAAK,MAAO,QAAQ,KAAK,IAAI,GAAG,CAAC,IAAK,EAAE,IAAI,EAAE,KAAI,WAAM,CAAC,MAAP,YAAY,EAAE;AAC9E;;;ACjBA,SAAS,qBAAqB;AAQvB,IAAM,+BAA+B;AAAA,EACxC;AACJ;","names":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useUploaderTheme
|
|
3
|
+
} from "./chunk-LCMDDPUD.js";
|
|
4
|
+
|
|
5
|
+
// src/components/shared/SourceViewContainer.tsx
|
|
6
|
+
import { cn } from "@useupup/core/internal";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
function SourceViewContainer({
|
|
9
|
+
children,
|
|
10
|
+
isLoading = false,
|
|
11
|
+
...rest
|
|
12
|
+
}) {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme();
|
|
15
|
+
return /* @__PURE__ */ jsx(
|
|
16
|
+
"div",
|
|
17
|
+
{
|
|
18
|
+
"data-testid": "upup-source-view",
|
|
19
|
+
className: cn(
|
|
20
|
+
// Transparent by design: the view body sits directly on the
|
|
21
|
+
// panel's gradient chrome (the old black/[0.075] wash read as
|
|
22
|
+
// a mismatched gray block over the light gradient).
|
|
23
|
+
"upup-flex upup-items-center upup-justify-center upup-overflow-hidden",
|
|
24
|
+
{
|
|
25
|
+
"upup-text-[#FAFAFA] dark:upup-text-[#FAFAFA]": isLoading && dark,
|
|
26
|
+
[(_a = slotClasses.sourceView) != null ? _a : ""]: !isLoading && slotClasses.sourceView,
|
|
27
|
+
[(_b = slotClasses.driveLoading) != null ? _b : ""]: isLoading && slotClasses.driveLoading
|
|
28
|
+
}
|
|
29
|
+
),
|
|
30
|
+
...rest,
|
|
31
|
+
children
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export {
|
|
37
|
+
SourceViewContainer
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=chunk-SSLP3MEC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/shared/SourceViewContainer.tsx"],"sourcesContent":["import React, { HTMLAttributes, PropsWithChildren } from 'react'\r\nimport { useUploaderTheme } from '../../context/UploaderContext'\r\nimport { cn } from '@useupup/core/internal'\r\n\r\nexport default function SourceViewContainer({\r\n children,\r\n isLoading = false,\r\n ...rest\r\n}: PropsWithChildren<\r\n { isLoading?: boolean } & HTMLAttributes<HTMLDivElement>\r\n>): React.ReactElement | null {\r\n const { isDark: dark, slotOverrides: slotClasses } = useUploaderTheme()\r\n\r\n return (\r\n <div\r\n data-testid=\"upup-source-view\"\r\n className={cn(\r\n // Transparent by design: the view body sits directly on the\r\n // panel's gradient chrome (the old black/[0.075] wash read as\r\n // a mismatched gray block over the light gradient).\r\n 'upup-flex upup-items-center upup-justify-center upup-overflow-hidden',\r\n {\r\n 'upup-text-[#FAFAFA] dark:upup-text-[#FAFAFA]':\r\n isLoading && dark,\r\n [slotClasses.sourceView ?? '']:\r\n !isLoading && slotClasses.sourceView,\r\n [slotClasses.driveLoading ?? '']:\r\n isLoading && slotClasses.driveLoading,\r\n },\r\n )}\r\n {...rest}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n"],"mappings":";;;;;AAEA,SAAS,UAAU;AAYX;AAVO,SAAR,oBAAqC;AAAA,EACxC;AAAA,EACA,YAAY;AAAA,EACZ,GAAG;AACP,GAE8B;AAV9B;AAWI,QAAM,EAAE,QAAQ,MAAM,eAAe,YAAY,IAAI,iBAAiB;AAEtE,SACI;AAAA,IAAC;AAAA;AAAA,MACG,eAAY;AAAA,MACZ,WAAW;AAAA;AAAA;AAAA;AAAA,QAIP;AAAA,QACA;AAAA,UACI,gDACI,aAAa;AAAA,UACjB,EAAC,iBAAY,eAAZ,YAA0B,EAAE,GACzB,CAAC,aAAa,YAAY;AAAA,UAC9B,EAAC,iBAAY,iBAAZ,YAA4B,EAAE,GAC3B,aAAa,YAAY;AAAA,QACjC;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;","names":[]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useUploaderOptions,
|
|
3
|
+
useUploaderRuntime
|
|
4
|
+
} from "./chunk-LCMDDPUD.js";
|
|
5
|
+
|
|
6
|
+
// src/hooks/useFetchFileByUrl.ts
|
|
7
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
8
|
+
import { deriveFetchedFileName } from "@useupup/core/internal";
|
|
9
|
+
function useFetchFileByUrl() {
|
|
10
|
+
const { core } = useUploaderRuntime();
|
|
11
|
+
const { onError } = useUploaderOptions();
|
|
12
|
+
const [loading, setLoading] = useState(false);
|
|
13
|
+
const abortControllerRef = useRef(null);
|
|
14
|
+
const mountedRef = useRef(true);
|
|
15
|
+
const cancelFetch = useCallback(() => {
|
|
16
|
+
var _a;
|
|
17
|
+
(_a = abortControllerRef.current) == null ? void 0 : _a.abort();
|
|
18
|
+
abortControllerRef.current = null;
|
|
19
|
+
}, []);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
return () => {
|
|
22
|
+
mountedRef.current = false;
|
|
23
|
+
cancelFetch();
|
|
24
|
+
};
|
|
25
|
+
}, [cancelFetch]);
|
|
26
|
+
const fetchImage = useCallback(
|
|
27
|
+
async (url) => {
|
|
28
|
+
if (loading) return;
|
|
29
|
+
const abortController = new AbortController();
|
|
30
|
+
abortControllerRef.current = abortController;
|
|
31
|
+
try {
|
|
32
|
+
setLoading(true);
|
|
33
|
+
const response = await fetch(url, {
|
|
34
|
+
signal: abortController.signal
|
|
35
|
+
});
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
throw new Error(`Failed to fetch URL: ${response.status}`);
|
|
38
|
+
}
|
|
39
|
+
const blob = await response.blob();
|
|
40
|
+
const fileName = deriveFetchedFileName(url, response, blob);
|
|
41
|
+
const file = new File([blob], fileName, {
|
|
42
|
+
type: blob.type
|
|
43
|
+
});
|
|
44
|
+
core == null ? void 0 : core.emit("url-fetch", { file });
|
|
45
|
+
return file;
|
|
46
|
+
} catch (error) {
|
|
47
|
+
if (error.name === "AbortError") {
|
|
48
|
+
core == null ? void 0 : core.emit("url-fetch-cancel", { url });
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
onError(error.message);
|
|
52
|
+
return;
|
|
53
|
+
} finally {
|
|
54
|
+
if (abortControllerRef.current === abortController) {
|
|
55
|
+
abortControllerRef.current = null;
|
|
56
|
+
}
|
|
57
|
+
if (mountedRef.current) {
|
|
58
|
+
setLoading(false);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
[core, loading, onError]
|
|
63
|
+
);
|
|
64
|
+
return { loading, fetchImage, cancelFetch };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export {
|
|
68
|
+
useFetchFileByUrl
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=chunk-WYMKISZI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useFetchFileByUrl.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\r\nimport { deriveFetchedFileName } from '@useupup/core/internal'\r\nimport {\r\n useUploaderOptions,\r\n useUploaderRuntime,\r\n} from '../context/UploaderContext'\r\n\r\nexport { deriveFetchedFileName }\r\n\r\nexport default function useFetchFileByUrl(): {\r\n loading: boolean\r\n fetchImage: (url: string) => Promise<File | undefined>\r\n cancelFetch: () => void\r\n} {\r\n const { core } = useUploaderRuntime()\r\n const { onError } = useUploaderOptions()\r\n const [loading, setLoading] = useState(false)\r\n const abortControllerRef = useRef<AbortController | null>(null)\r\n const mountedRef = useRef(true)\r\n\r\n const cancelFetch = useCallback(() => {\r\n abortControllerRef.current?.abort()\r\n abortControllerRef.current = null\r\n }, [])\r\n\r\n // Abort any in-flight fetch on unmount so we never setState after teardown.\r\n useEffect(() => {\r\n return () => {\r\n mountedRef.current = false\r\n cancelFetch()\r\n }\r\n }, [cancelFetch])\r\n\r\n const fetchImage = useCallback(\r\n async (url: string) => {\r\n if (loading) return\r\n const abortController = new AbortController()\r\n abortControllerRef.current = abortController\r\n\r\n try {\r\n setLoading(true)\r\n const response = await fetch(url, {\r\n signal: abortController.signal,\r\n })\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch URL: ${response.status}`)\r\n }\r\n const blob = await response.blob()\r\n const fileName = deriveFetchedFileName(url, response, blob)\r\n\r\n const file = new File([blob], fileName, {\r\n type: blob.type,\r\n })\r\n\r\n core?.emit('url-fetch', { file })\r\n return file\r\n } catch (error) {\r\n if ((error as Error).name === 'AbortError') {\r\n core?.emit('url-fetch-cancel', { url })\r\n return\r\n }\r\n onError((error as Error).message)\r\n return\r\n } finally {\r\n if (abortControllerRef.current === abortController) {\r\n abortControllerRef.current = null\r\n }\r\n if (mountedRef.current) {\r\n setLoading(false)\r\n }\r\n }\r\n },\r\n [core, loading, onError],\r\n )\r\n\r\n return { loading, fetchImage, cancelFetch }\r\n}\r\n"],"mappings":";;;;;;AAAA,SAAS,aAAa,WAAW,QAAQ,gBAAgB;AACzD,SAAS,6BAA6B;AAQvB,SAAR,oBAIL;AACE,QAAM,EAAE,KAAK,IAAI,mBAAmB;AACpC,QAAM,EAAE,QAAQ,IAAI,mBAAmB;AACvC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,qBAAqB,OAA+B,IAAI;AAC9D,QAAM,aAAa,OAAO,IAAI;AAE9B,QAAM,cAAc,YAAY,MAAM;AApB1C;AAqBQ,6BAAmB,YAAnB,mBAA4B;AAC5B,uBAAmB,UAAU;AAAA,EACjC,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACZ,WAAO,MAAM;AACT,iBAAW,UAAU;AACrB,kBAAY;AAAA,IAChB;AAAA,EACJ,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,aAAa;AAAA,IACf,OAAO,QAAgB;AACnB,UAAI,QAAS;AACb,YAAM,kBAAkB,IAAI,gBAAgB;AAC5C,yBAAmB,UAAU;AAE7B,UAAI;AACA,mBAAW,IAAI;AACf,cAAM,WAAW,MAAM,MAAM,KAAK;AAAA,UAC9B,QAAQ,gBAAgB;AAAA,QAC5B,CAAC;AACD,YAAI,CAAC,SAAS,IAAI;AACd,gBAAM,IAAI,MAAM,wBAAwB,SAAS,MAAM,EAAE;AAAA,QAC7D;AACA,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAM,WAAW,sBAAsB,KAAK,UAAU,IAAI;AAE1D,cAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,UAAU;AAAA,UACpC,MAAM,KAAK;AAAA,QACf,CAAC;AAED,qCAAM,KAAK,aAAa,EAAE,KAAK;AAC/B,eAAO;AAAA,MACX,SAAS,OAAO;AACZ,YAAK,MAAgB,SAAS,cAAc;AACxC,uCAAM,KAAK,oBAAoB,EAAE,IAAI;AACrC;AAAA,QACJ;AACA,gBAAS,MAAgB,OAAO;AAChC;AAAA,MACJ,UAAE;AACE,YAAI,mBAAmB,YAAY,iBAAiB;AAChD,6BAAmB,UAAU;AAAA,QACjC;AACA,YAAI,WAAW,SAAS;AACpB,qBAAW,KAAK;AAAA,QACpB;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,SAAS,OAAO;AAAA,EAC3B;AAEA,SAAO,EAAE,SAAS,YAAY,YAAY;AAC9C;","names":[]}
|