@muhgholy/next-drive 4.23.8 → 4.23.10
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/README.md +152 -1
- package/dist/{chunk-OU5TKLHV.cjs → chunk-V75PCJHT.cjs} +116 -24
- package/dist/chunk-V75PCJHT.cjs.map +1 -0
- package/dist/{chunk-RBSFEEJJ.js → chunk-XUPDNN2U.js} +115 -25
- package/dist/chunk-XUPDNN2U.js.map +1 -0
- package/dist/client/file-chooser.d.ts +1 -0
- package/dist/client/file-chooser.d.ts.map +1 -1
- package/dist/client/hooks/use-upload.d.ts +1 -1
- package/dist/client/hooks/use-upload.d.ts.map +1 -1
- package/dist/client/index.cjs +88 -42
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.js +87 -41
- package/dist/client/index.js.map +1 -1
- package/dist/server/actions/drive.d.ts.map +1 -1
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/controllers/drive.d.ts +26 -0
- package/dist/server/controllers/drive.d.ts.map +1 -1
- package/dist/server/database/mongoose/schema/drive.d.ts +1 -0
- package/dist/server/database/mongoose/schema/drive.d.ts.map +1 -1
- package/dist/server/express.cjs +11 -11
- package/dist/server/express.js +2 -2
- package/dist/server/hono.cjs +11 -11
- package/dist/server/hono.js +2 -2
- package/dist/server/index.cjs +24 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/zod/schemas.d.ts +5 -0
- package/dist/server/zod/schemas.d.ts.map +1 -1
- package/dist/types/lib/database/drive.d.ts +1 -0
- package/dist/types/lib/database/drive.d.ts.map +1 -1
- package/dist/types/server/config.d.ts +17 -0
- package/dist/types/server/config.d.ts.map +1 -1
- package/package.json +2 -1
- package/dist/chunk-OU5TKLHV.cjs.map +0 -1
- package/dist/chunk-RBSFEEJJ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-chooser.d.ts","sourceRoot":"","sources":["../../src/client/file-chooser.tsx"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"file-chooser.d.ts","sourceRoot":"","sources":["../../src/client/file-chooser.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0WjD,eAAO,MAAM,gBAAgB,GAAI,OAAO,QAAQ,CAAC;IAC5C,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACnC,CAAC,sBAiQD,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TDriveUploadState } from '../../types/client';
|
|
2
|
-
export declare const useUpload: (apiEndpoint: string, activeAccountId: string | null, withCredentials?: boolean, onUploadComplete?: (item: unknown) => void) => {
|
|
2
|
+
export declare const useUpload: (apiEndpoint: string, activeAccountId: string | null, withCredentials?: boolean, onUploadComplete?: (item: unknown) => void, unauthenticated?: boolean) => {
|
|
3
3
|
uploads: TDriveUploadState[];
|
|
4
4
|
uploadFiles: (files: File[], folderId: string | null) => Promise<void>;
|
|
5
5
|
cancelUpload: (id: string) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-upload.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/use-upload.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAYxD,eAAO,MAAM,SAAS,GAAI,aAAa,MAAM,EAAE,iBAAiB,MAAM,GAAG,IAAI,EAAE,kBAAiB,OAAe,EAAE,mBAAmB,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI;;
|
|
1
|
+
{"version":3,"file":"use-upload.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/use-upload.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAYxD,eAAO,MAAM,SAAS,GAAI,aAAa,MAAM,EAAE,iBAAiB,MAAM,GAAG,IAAI,EAAE,kBAAiB,OAAe,EAAE,mBAAmB,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,kBAAiB,OAAe;;yBAmK3I,IAAI,EAAE,YAAY,MAAM,GAAG,IAAI;uBAuB9D,MAAM;;CA+CxB,CAAC"}
|
package/dist/client/index.cjs
CHANGED
|
@@ -6,6 +6,7 @@ var React3 = require('react');
|
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
7
|
var reactSlot = require('@radix-ui/react-slot');
|
|
8
8
|
var classVarianceAuthority = require('class-variance-authority');
|
|
9
|
+
var ProgressPrimitive = require('@radix-ui/react-progress');
|
|
9
10
|
var SheetPrimitive = require('@radix-ui/react-dialog');
|
|
10
11
|
var lucideReact = require('lucide-react');
|
|
11
12
|
var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
|
|
@@ -13,7 +14,6 @@ var LabelPrimitive = require('@radix-ui/react-label');
|
|
|
13
14
|
var reactHookForm = require('react-hook-form');
|
|
14
15
|
var core = require('@dnd-kit/core');
|
|
15
16
|
var sortable = require('@dnd-kit/sortable');
|
|
16
|
-
var ProgressPrimitive = require('@radix-ui/react-progress');
|
|
17
17
|
var dateFns = require('date-fns');
|
|
18
18
|
var ContextMenuPrimitive = require('@radix-ui/react-context-menu');
|
|
19
19
|
var utilities = require('@dnd-kit/utilities');
|
|
@@ -37,10 +37,10 @@ function _interopNamespace(e) {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
var React3__namespace = /*#__PURE__*/_interopNamespace(React3);
|
|
40
|
+
var ProgressPrimitive__namespace = /*#__PURE__*/_interopNamespace(ProgressPrimitive);
|
|
40
41
|
var SheetPrimitive__namespace = /*#__PURE__*/_interopNamespace(SheetPrimitive);
|
|
41
42
|
var DropdownMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(DropdownMenuPrimitive);
|
|
42
43
|
var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
|
|
43
|
-
var ProgressPrimitive__namespace = /*#__PURE__*/_interopNamespace(ProgressPrimitive);
|
|
44
44
|
var ContextMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(ContextMenuPrimitive);
|
|
45
45
|
|
|
46
46
|
var DriveContext = React3.createContext(null);
|
|
@@ -322,7 +322,7 @@ var getChunkSize = (fileSize) => {
|
|
|
322
322
|
if (fileSize < 1024 * 1024 * 1024) return 8 * 1024 * 1024;
|
|
323
323
|
return 16 * 1024 * 1024;
|
|
324
324
|
};
|
|
325
|
-
var useUpload = (apiEndpoint, activeAccountId, withCredentials = false, onUploadComplete) => {
|
|
325
|
+
var useUpload = (apiEndpoint, activeAccountId, withCredentials = false, onUploadComplete, unauthenticated = false) => {
|
|
326
326
|
const [uploads, setUploads] = React3.useState([]);
|
|
327
327
|
const abortControllers = React3.useRef(/* @__PURE__ */ new Map());
|
|
328
328
|
const filesRef = React3.useRef(/* @__PURE__ */ new Map());
|
|
@@ -406,6 +406,7 @@ var useUpload = (apiEndpoint, activeAccountId, withCredentials = false, onUpload
|
|
|
406
406
|
formData.append("fileType", file.type);
|
|
407
407
|
formData.append("folderId", folderId || "root");
|
|
408
408
|
if (driveId) formData.append("driveId", driveId);
|
|
409
|
+
if (unauthenticated) formData.append("unauthenticated", "true");
|
|
409
410
|
let attempts = 0;
|
|
410
411
|
let success = false;
|
|
411
412
|
while (!success && attempts < 3 && !controller.signal.aborted) {
|
|
@@ -565,6 +566,39 @@ function Button({
|
|
|
565
566
|
}
|
|
566
567
|
);
|
|
567
568
|
}
|
|
569
|
+
function Progress({
|
|
570
|
+
className,
|
|
571
|
+
value,
|
|
572
|
+
indicatorClassName,
|
|
573
|
+
indeterminate = false,
|
|
574
|
+
...props
|
|
575
|
+
}) {
|
|
576
|
+
const isIndeterminate = indeterminate || value === void 0;
|
|
577
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
578
|
+
ProgressPrimitive__namespace.Root,
|
|
579
|
+
{
|
|
580
|
+
"data-slot": "progress",
|
|
581
|
+
className: chunkHQTC3554_cjs.cn(
|
|
582
|
+
"nd:bg-primary/20 nd:relative nd:h-2 nd:w-full nd:overflow-hidden nd:rounded-full",
|
|
583
|
+
className
|
|
584
|
+
),
|
|
585
|
+
...props,
|
|
586
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
587
|
+
ProgressPrimitive__namespace.Indicator,
|
|
588
|
+
{
|
|
589
|
+
"data-slot": "progress-indicator",
|
|
590
|
+
className: chunkHQTC3554_cjs.cn(
|
|
591
|
+
"nd:bg-primary nd:h-full nd:flex-1 nd:transition-all",
|
|
592
|
+
isIndeterminate && "nd:w-1/3 nd:animate-[indeterminate_1.5s_ease-in-out_infinite]",
|
|
593
|
+
!isIndeterminate && "nd:w-full",
|
|
594
|
+
indicatorClassName
|
|
595
|
+
),
|
|
596
|
+
style: isIndeterminate ? void 0 : { transform: `translateX(-${100 - (value || 0)}%)` }
|
|
597
|
+
}
|
|
598
|
+
)
|
|
599
|
+
}
|
|
600
|
+
);
|
|
601
|
+
}
|
|
568
602
|
function Dialog2({ ...props }) {
|
|
569
603
|
return /* @__PURE__ */ jsxRuntime.jsx(SheetPrimitive__namespace.Root, { "data-slot": "dialog2", ...props });
|
|
570
604
|
}
|
|
@@ -1388,39 +1422,6 @@ var DriveDndProvider = (props) => {
|
|
|
1388
1422
|
}
|
|
1389
1423
|
) : children });
|
|
1390
1424
|
};
|
|
1391
|
-
function Progress({
|
|
1392
|
-
className,
|
|
1393
|
-
value,
|
|
1394
|
-
indicatorClassName,
|
|
1395
|
-
indeterminate = false,
|
|
1396
|
-
...props
|
|
1397
|
-
}) {
|
|
1398
|
-
const isIndeterminate = indeterminate || value === void 0;
|
|
1399
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1400
|
-
ProgressPrimitive__namespace.Root,
|
|
1401
|
-
{
|
|
1402
|
-
"data-slot": "progress",
|
|
1403
|
-
className: chunkHQTC3554_cjs.cn(
|
|
1404
|
-
"nd:bg-primary/20 nd:relative nd:h-2 nd:w-full nd:overflow-hidden nd:rounded-full",
|
|
1405
|
-
className
|
|
1406
|
-
),
|
|
1407
|
-
...props,
|
|
1408
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1409
|
-
ProgressPrimitive__namespace.Indicator,
|
|
1410
|
-
{
|
|
1411
|
-
"data-slot": "progress-indicator",
|
|
1412
|
-
className: chunkHQTC3554_cjs.cn(
|
|
1413
|
-
"nd:bg-primary nd:h-full nd:flex-1 nd:transition-all",
|
|
1414
|
-
isIndeterminate && "nd:w-1/3 nd:animate-[indeterminate_1.5s_ease-in-out_infinite]",
|
|
1415
|
-
!isIndeterminate && "nd:w-full",
|
|
1416
|
-
indicatorClassName
|
|
1417
|
-
),
|
|
1418
|
-
style: isIndeterminate ? void 0 : { transform: `translateX(-${100 - (value || 0)}%)` }
|
|
1419
|
-
}
|
|
1420
|
-
)
|
|
1421
|
-
}
|
|
1422
|
-
);
|
|
1423
|
-
}
|
|
1424
1425
|
var ContextMenu = ContextMenuPrimitive__namespace.Root;
|
|
1425
1426
|
var ContextMenuTrigger = ContextMenuPrimitive__namespace.Trigger;
|
|
1426
1427
|
var ContextMenuSubTrigger = React3__namespace.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -3126,11 +3127,46 @@ var DriveFileChooser = (props) => {
|
|
|
3126
3127
|
className,
|
|
3127
3128
|
disabled = false,
|
|
3128
3129
|
error,
|
|
3129
|
-
helperText
|
|
3130
|
+
helperText,
|
|
3131
|
+
allowUnauthenticated = false
|
|
3130
3132
|
} = props;
|
|
3131
|
-
const { items, selectedFileIds, setSelectedFileIds, createUrl, triggerFetch } = useDrive();
|
|
3133
|
+
const { items, selectedFileIds, setSelectedFileIds, createUrl, triggerFetch, apiEndpoint, activeAccountId, withCredentials, callAPI } = useDrive();
|
|
3132
3134
|
useStyleInjector();
|
|
3133
3135
|
const [isOpen, setIsOpen] = React3.useState(false);
|
|
3136
|
+
const fileInputRef = React3.useRef(null);
|
|
3137
|
+
const valueRef = React3.useRef(value);
|
|
3138
|
+
valueRef.current = value;
|
|
3139
|
+
const [authed, setAuthed] = React3.useState(allowUnauthenticated ? null : true);
|
|
3140
|
+
React3.useEffect(() => {
|
|
3141
|
+
if (!allowUnauthenticated) return;
|
|
3142
|
+
callAPI("information").then((res) => setAuthed(res.status === 200 ? !!res.data?.authenticated : false));
|
|
3143
|
+
}, [allowUnauthenticated, callAPI]);
|
|
3144
|
+
const unauthenticatedMode = allowUnauthenticated && authed === false;
|
|
3145
|
+
const handleUploaded = React3.useCallback((item) => {
|
|
3146
|
+
const isFile = item?.information?.type === "FILE";
|
|
3147
|
+
const uploaded = {
|
|
3148
|
+
id: item.id,
|
|
3149
|
+
file: { name: item.name, mime: isFile ? item.information.mime : "", size: isFile ? item.information.sizeInBytes : 0 }
|
|
3150
|
+
};
|
|
3151
|
+
const current = valueRef.current;
|
|
3152
|
+
if (multiple) {
|
|
3153
|
+
const arr = Array.isArray(current) ? current : current ? [current] : [];
|
|
3154
|
+
onChange([...arr, uploaded]);
|
|
3155
|
+
} else {
|
|
3156
|
+
onChange(uploaded);
|
|
3157
|
+
}
|
|
3158
|
+
}, [multiple, onChange]);
|
|
3159
|
+
const { uploads, uploadFiles } = useUpload(apiEndpoint, activeAccountId, withCredentials, handleUploaded, unauthenticatedMode);
|
|
3160
|
+
const openPicker = React3.useCallback(() => {
|
|
3161
|
+
if (unauthenticatedMode) fileInputRef.current?.click();
|
|
3162
|
+
else setIsOpen(true);
|
|
3163
|
+
}, [unauthenticatedMode]);
|
|
3164
|
+
const handleFilePick = React3.useCallback((e) => {
|
|
3165
|
+
const picked = Array.from(e.target.files ?? []);
|
|
3166
|
+
if (picked.length) uploadFiles(multiple ? picked : [picked[0]], null);
|
|
3167
|
+
e.target.value = "";
|
|
3168
|
+
}, [uploadFiles, multiple]);
|
|
3169
|
+
const activeUploads = unauthenticatedMode ? uploads.filter((u) => ["queued", "uploading", "error"].includes(u.status)) : [];
|
|
3134
3170
|
React3.useEffect(() => {
|
|
3135
3171
|
if (isOpen) {
|
|
3136
3172
|
triggerFetch();
|
|
@@ -3164,8 +3200,8 @@ var DriveFileChooser = (props) => {
|
|
|
3164
3200
|
{
|
|
3165
3201
|
type: "button",
|
|
3166
3202
|
variant: "outline",
|
|
3167
|
-
onClick:
|
|
3168
|
-
disabled,
|
|
3203
|
+
onClick: openPicker,
|
|
3204
|
+
disabled: disabled || allowUnauthenticated && authed === null,
|
|
3169
3205
|
className: chunkHQTC3554_cjs.cn(
|
|
3170
3206
|
"nd:w-full nd:h-auto nd:justify-start nd:gap-3 nd:px-3 nd:py-2.5 nd:border-dashed",
|
|
3171
3207
|
error && "nd:border-destructive"
|
|
@@ -3194,7 +3230,7 @@ var DriveFileChooser = (props) => {
|
|
|
3194
3230
|
] })
|
|
3195
3231
|
] }),
|
|
3196
3232
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:flex nd:items-center nd:gap-1 nd:shrink-0", children: [
|
|
3197
|
-
/* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick:
|
|
3233
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: openPicker, disabled, children: "Change" }),
|
|
3198
3234
|
!disabled && /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "nd:size-8", onClick: () => handleRemove(displayFiles[0].id), children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "nd:size-4" }) })
|
|
3199
3235
|
] })
|
|
3200
3236
|
] }),
|
|
@@ -3207,7 +3243,7 @@ var DriveFileChooser = (props) => {
|
|
|
3207
3243
|
" selected"
|
|
3208
3244
|
] }),
|
|
3209
3245
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:flex nd:items-center nd:gap-1", children: [
|
|
3210
|
-
/* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "nd:h-7 nd:text-xs", onClick:
|
|
3246
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "nd:h-7 nd:text-xs", onClick: openPicker, disabled, children: "Add more" }),
|
|
3211
3247
|
!disabled && /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "nd:h-7 nd:text-xs nd:text-muted-foreground", onClick: () => onChange([]), children: "Clear" })
|
|
3212
3248
|
] })
|
|
3213
3249
|
] }),
|
|
@@ -3226,6 +3262,16 @@ var DriveFileChooser = (props) => {
|
|
|
3226
3262
|
] })
|
|
3227
3263
|
),
|
|
3228
3264
|
error && helperText && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "nd:text-xs nd:text-destructive nd:mt-1.5", children: helperText }),
|
|
3265
|
+
unauthenticatedMode && /* @__PURE__ */ jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept, multiple, className: "nd:hidden", onChange: handleFilePick }),
|
|
3266
|
+
activeUploads.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "nd:mt-2 nd:space-y-2", children: activeUploads.map((u) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:rounded-lg nd:border nd:px-3 nd:py-2", children: [
|
|
3267
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:flex nd:items-center nd:gap-2", children: [
|
|
3268
|
+
u.status === "error" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "nd:size-4 nd:text-destructive nd:shrink-0" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "nd:size-4 nd:animate-spin nd:text-muted-foreground nd:shrink-0" }),
|
|
3269
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "nd:text-sm nd:truncate nd:flex-1", children: u.name }),
|
|
3270
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "nd:text-xs nd:text-muted-foreground nd:shrink-0", children: u.status === "error" ? "Failed" : `${Math.round(u.currentChunk / Math.max(1, u.totalChunks) * 100)}%` })
|
|
3271
|
+
] }),
|
|
3272
|
+
u.status !== "error" && /* @__PURE__ */ jsxRuntime.jsx(Progress, { value: Math.round(u.currentChunk / Math.max(1, u.totalChunks) * 100), className: "nd:mt-1.5" }),
|
|
3273
|
+
u.status === "error" && u.error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "nd:text-xs nd:text-destructive nd:mt-1", children: u.error })
|
|
3274
|
+
] }, u.id)) }),
|
|
3229
3275
|
/* @__PURE__ */ jsxRuntime.jsx(Dialog2, { open: isOpen, onOpenChange: setIsOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(Dialog2Content, { showCloseButton: false, className: "nd-drive-root", children: [
|
|
3230
3276
|
/* @__PURE__ */ jsxRuntime.jsxs(Dialog2Header, { className: "nd:gap-2", children: [
|
|
3231
3277
|
/* @__PURE__ */ jsxRuntime.jsx(MobileSidebarSheet, {}),
|