@susonwaiba/react-media-uploader 0.1.3 → 0.1.4

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.
@@ -0,0 +1,25 @@
1
+ name: Release Package
2
+
3
+ on:
4
+ release:
5
+ types: [created]
6
+
7
+ jobs:
8
+ build:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+ - name: Setup Node
13
+ uses: actions/setup-node@v4
14
+ with:
15
+ node-version: 24
16
+ registry-url: https://registry.npmjs.org/
17
+ - name: Setup Bun
18
+ uses: oven-sh/setup-bun@v2
19
+ with:
20
+ bun-version: 1.3.4
21
+ - run: bun install
22
+ - run: bun run build
23
+ - run: npm publish
24
+ env:
25
+ NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
@@ -1,128 +1,128 @@
1
- # NextJS Integration
2
-
3
- ## Prisma schema
4
-
5
- ```text
6
- enum MediaStatusEnum {
7
- INIT
8
- TEMP
9
- ACTIVE
10
- INACTIVE
11
- CANCELED
12
- DELETED
13
- }
14
-
15
- enum MediaTypeEnum {
16
- IMAGE
17
- PDF
18
- DOCS
19
- OTHER
20
- }
21
-
22
- model Media {
23
- id String @id @default(cuid())
24
- status MediaStatusEnum @default(INIT)
25
- type MediaTypeEnum
26
- title String
27
- description String?
28
- name String
29
- dir String?
30
- path String
31
- provider String
32
- container String?
33
- mimeType String?
34
- size Float?
35
- height Float?
36
- width Float?
37
- duration Float?
38
- tags String[] @default([])
39
- checksum String?
40
- createdAt DateTime @default(now())
41
- updatedAt DateTime @default(now()) @updatedAt
42
- deletedAt DateTime?
43
- }
44
- ```
45
-
46
- ## API endpoints
47
-
48
- - POST: `/api/media/generate-upload-url`
49
-
50
- Payload:
51
-
52
- ```json
53
- {
54
- "type": "IMAGE",
55
- "name": "screenshot.jpeg",
56
- "mimeType": "image/jpeg",
57
- "size": 40868,
58
- "checksum": "b745eb078c31eaa2ef5d87f772bbf37d78528d3c"
59
- }
60
- ```
61
-
62
- Response:
63
-
64
- ```json
65
- {
66
- "item": {},
67
- "uploadUrl": "<upload_url_with_token>"
68
- }
69
- ```
70
-
71
- - POST: `/api/media/mark-media-as-active`
72
-
73
- Payload:
74
-
75
- ```json
76
- {
77
- "mediaIds": []
78
- }
79
- ```
80
-
81
- Response:
82
-
83
- ```json
84
- {
85
- "items": []
86
- }
87
- ```
88
-
89
- - POST: `/api/media/mark-media-as-canceled`
90
-
91
- Payload:
92
-
93
- ```json
94
- {
95
- "mediaIds": []
96
- }
97
- ```
98
-
99
- Response:
100
-
101
- ```json
102
- {
103
- "items": []
104
- }
105
- ```
106
-
107
- - POST: `/api/media/mark-media-as-temp`
108
-
109
- Payload:
110
-
111
- ```json
112
- {
113
- "mediaIds": []
114
- }
115
- ```
116
-
117
- Response:
118
-
119
- ```json
120
- {
121
- "items": []
122
- }
123
- ```
124
-
125
- ## Storage cleanup
126
-
127
- Run cron and filter with status for unused media cleanup.
128
-
1
+ # NextJS Integration
2
+
3
+ ## Prisma schema
4
+
5
+ ```text
6
+ enum MediaStatusEnum {
7
+ INIT
8
+ TEMP
9
+ ACTIVE
10
+ INACTIVE
11
+ CANCELED
12
+ DELETED
13
+ }
14
+
15
+ enum MediaTypeEnum {
16
+ IMAGE
17
+ PDF
18
+ DOCS
19
+ OTHER
20
+ }
21
+
22
+ model Media {
23
+ id String @id @default(cuid())
24
+ status MediaStatusEnum @default(INIT)
25
+ type MediaTypeEnum
26
+ title String
27
+ description String?
28
+ name String
29
+ dir String?
30
+ path String
31
+ provider String
32
+ container String?
33
+ mimeType String?
34
+ size Float?
35
+ height Float?
36
+ width Float?
37
+ duration Float?
38
+ tags String[] @default([])
39
+ checksum String?
40
+ createdAt DateTime @default(now())
41
+ updatedAt DateTime @default(now()) @updatedAt
42
+ deletedAt DateTime?
43
+ }
44
+ ```
45
+
46
+ ## API endpoints
47
+
48
+ - POST: `/api/media/generate-upload-url`
49
+
50
+ Payload:
51
+
52
+ ```json
53
+ {
54
+ "type": "IMAGE",
55
+ "name": "screenshot.jpeg",
56
+ "mimeType": "image/jpeg",
57
+ "size": 40868,
58
+ "checksum": "b745eb078c31eaa2ef5d87f772bbf37d78528d3c"
59
+ }
60
+ ```
61
+
62
+ Response:
63
+
64
+ ```json
65
+ {
66
+ "item": {},
67
+ "uploadUrl": "<upload_url_with_token>"
68
+ }
69
+ ```
70
+
71
+ - POST: `/api/media/mark-media-as-active`
72
+
73
+ Payload:
74
+
75
+ ```json
76
+ {
77
+ "mediaIds": []
78
+ }
79
+ ```
80
+
81
+ Response:
82
+
83
+ ```json
84
+ {
85
+ "items": []
86
+ }
87
+ ```
88
+
89
+ - POST: `/api/media/mark-media-as-canceled`
90
+
91
+ Payload:
92
+
93
+ ```json
94
+ {
95
+ "mediaIds": []
96
+ }
97
+ ```
98
+
99
+ Response:
100
+
101
+ ```json
102
+ {
103
+ "items": []
104
+ }
105
+ ```
106
+
107
+ - POST: `/api/media/mark-media-as-temp`
108
+
109
+ Payload:
110
+
111
+ ```json
112
+ {
113
+ "mediaIds": []
114
+ }
115
+ ```
116
+
117
+ Response:
118
+
119
+ ```json
120
+ {
121
+ "items": []
122
+ }
123
+ ```
124
+
125
+ ## Storage cleanup
126
+
127
+ Run cron and filter with status for unused media cleanup.
128
+
package/README.md CHANGED
@@ -1,106 +1,118 @@
1
- # React Media Uploader
2
-
3
- `Status: Under development`
4
-
5
- ## Quick start
6
-
7
- ```bash
8
- bun install
9
-
10
- bun run build
11
- ```
12
-
13
- ## Hook
14
-
15
- #### Upload on select
16
-
17
- ```typescript
18
- "use client";
19
-
20
- import { useMediaUploader } from "@susonwaiba/react-media-uploader";
21
-
22
- export function Uploader() {
23
- const uploader = useMediaUploader();
24
- return (
25
- <input
26
- name="image"
27
- type="file"
28
- onChange={uploader.onFileInputChange}
29
- />
30
- );
31
- }
32
- ```
33
-
34
- #### Manual upload
35
-
36
- ```typescript
37
- "use client";
38
-
39
- import { useMediaUploader, MediaStatusEnum } from "@susonwaiba/react-media-uploader";
40
-
41
- export function ManualUploader() {
42
- const uploader = useMediaUploader({
43
- enableManualUpload: true,
44
- // Update media status to ACTIVE status on success
45
- mediaUploadSuccessStatus: MediaStatusEnum.ACTIVE,
46
- });
47
-
48
- const onSubmit = async (e: React.FormEvent) => {
49
- e.preventDefault();
50
- const mediaValues = await uploader.uploadManually();
51
- console.log("mediaValues ->", mediaValues);
52
- // submit data to API
53
- };
54
-
55
- return (
56
- <form onSubmit={onSubmit}>
57
- <div className="mb-4">
58
- <input
59
- name="image"
60
- type="file"
61
- multiple
62
- onChange={uploader.onFileInputChange}
63
- />
64
- </div>
65
- <div>
66
- <button type="submit">Upload</button>
67
- </div>
68
- </form>
69
- );
70
- }
71
- ```
72
-
73
- #### UseMediaUploaderProps
74
-
75
- ```typescript
76
- export interface UseMediaUploaderProps<T extends object> {
77
- defaultValues?: T;
78
- mediaUploadSuccessStatus?: MediaStatusEnum;
79
- enableManualUpload?: boolean;
80
- serverConfig?: {
81
- additionalHeaders?: Record<string, string>;
82
- generateUploadUrl?: string;
83
- markMediaAsTemp?: string;
84
- markMediaAsActive?: string;
85
- markMediaAsCanceled?: string;
86
- };
87
- onUploadSuccess?: (currentValues: any) => Promise<void>;
88
- onUploadFailure?: (uploadRes: any) => Promise<void>;
89
- }
90
- ```
91
-
92
- #### UseMediaUploaderResponse
93
-
94
- ```typescript
95
- export interface UseMediaUploaderResponse<T extends object> {
96
- values: T;
97
- setValues: (val: T) => void;
98
- enableManualUpload?: boolean;
99
- uploadManually: () => Promise<T>;
100
- mediaItems: Record<string, MediaItem>;
101
- setMediaItems: (items: Record<string, MediaItem>) => void;
102
- uploadInfos: Record<string, UploadMediaInfo>;
103
- onFileInputChange: (e: React.ChangeEvent<HTMLInputElement>) => Promise<void>;
104
- onFileChange: (file: File, name: string, multiple?: boolean) => Promise<void>;
105
- }
106
- ```
1
+ # React Media Uploader
2
+
3
+ `Status: Under development`
4
+
5
+ ## Quick start
6
+
7
+ ```bash
8
+ bun install
9
+
10
+ bun run build
11
+ ```
12
+
13
+ ## Hook
14
+
15
+ #### Upload on select
16
+
17
+ ```typescript
18
+ "use client";
19
+
20
+ import { useMediaUploader } from "@susonwaiba/react-media-uploader";
21
+
22
+ export function Uploader() {
23
+ const uploader = useMediaUploader();
24
+ return (
25
+ <input
26
+ name="image"
27
+ type="file"
28
+ onChange={uploader.onFileInputChange}
29
+ />
30
+ );
31
+ }
32
+ ```
33
+
34
+ #### Manual upload
35
+
36
+ ```typescript
37
+ "use client";
38
+
39
+ import { useMediaUploader, MediaStatusEnum } from "@susonwaiba/react-media-uploader";
40
+
41
+ export function ManualUploader() {
42
+ const uploader = useMediaUploader({
43
+ enableManualUpload: true,
44
+ // Update media status to ACTIVE status on success
45
+ mediaUploadSuccessStatus: MediaStatusEnum.ACTIVE,
46
+ });
47
+
48
+ const onSubmit = async (e: React.FormEvent) => {
49
+ e.preventDefault();
50
+ const mediaValues = await uploader.uploadManually();
51
+ console.log("mediaValues ->", mediaValues);
52
+ // submit data to API
53
+ };
54
+
55
+ return (
56
+ <form onSubmit={onSubmit}>
57
+ <div className="mb-4">
58
+ <input
59
+ name="image"
60
+ type="file"
61
+ multiple
62
+ onChange={uploader.onFileInputChange}
63
+ />
64
+ </div>
65
+ <div>
66
+ <button type="submit">Upload</button>
67
+ </div>
68
+ </form>
69
+ );
70
+ }
71
+ ```
72
+
73
+ #### UseMediaUploaderProps
74
+
75
+ ```typescript
76
+ export interface UseMediaUploaderProps<T extends object> {
77
+ defaultValues?: T;
78
+ mediaUploadSuccessStatus?: MediaStatusEnum;
79
+ enableManualUpload?: boolean;
80
+ serverConfig?: {
81
+ additionalHeaders?: Record<string, string>;
82
+ generateUploadUrl?: string;
83
+ onGenerateUploadUrl?: (
84
+ media: Partial<Media>,
85
+ ) => Promise<{ item: Media; uploadUrl: string }>;
86
+ markMediaAsTemp?: string;
87
+ onMarkMediaAsTemp?: (
88
+ mediaIds: (string | number)[],
89
+ ) => Promise<Partial<Media>[]>;
90
+ markMediaAsActive?: string;
91
+ onMarkMediaAsActive?: (
92
+ mediaIds: (string | number)[],
93
+ ) => Promise<Partial<Media>[]>;
94
+ markMediaAsCanceled?: string;
95
+ onMarkMediaAsCanceled?: (
96
+ mediaIds: (string | number)[],
97
+ ) => Promise<Partial<Media>[]>;
98
+ };
99
+ onUploadSuccess?: (currentValues: any) => Promise<void>;
100
+ onUploadFailure?: (uploadRes: any) => Promise<void>;
101
+ }
102
+ ```
103
+
104
+ #### UseMediaUploaderResponse
105
+
106
+ ```typescript
107
+ export interface UseMediaUploaderResponse<T extends object> {
108
+ values: T;
109
+ setValues: (val: T) => void;
110
+ enableManualUpload?: boolean;
111
+ uploadManually: () => Promise<T>;
112
+ mediaItems: Record<string, MediaItem>;
113
+ setMediaItems: (items: Record<string, MediaItem>) => void;
114
+ uploadInfos: Record<string, UploadMediaInfo>;
115
+ onFileInputChange: (e: React.ChangeEvent<HTMLInputElement>) => Promise<void>;
116
+ onFileChange: (file: File, name: string, multiple?: boolean) => Promise<void>;
117
+ }
118
+ ```
package/bun.lock CHANGED
@@ -8,6 +8,7 @@
8
8
  "@types/react": "^18",
9
9
  "@types/react-dom": "^18",
10
10
  "tsc-alias": "^1",
11
+ "tsc-watch": "^7.2.0",
11
12
  "typescript": "^5",
12
13
  },
13
14
  "peerDependencies": {
@@ -50,6 +51,8 @@
50
51
 
51
52
  "commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="],
52
53
 
54
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
55
+
53
56
  "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
54
57
 
55
58
  "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
@@ -58,6 +61,8 @@
58
61
 
59
62
  "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
60
63
 
64
+ "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="],
65
+
61
66
  "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
62
67
 
63
68
  "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
@@ -66,6 +71,8 @@
66
71
 
67
72
  "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
68
73
 
74
+ "event-stream": ["event-stream@3.3.4", "", { "dependencies": { "duplexer": "~0.1.1", "from": "~0", "map-stream": "~0.1.0", "pause-stream": "0.0.11", "split": "0.3", "stream-combiner": "~0.0.4", "through": "~2.3.1" } }, "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g=="],
75
+
69
76
  "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
70
77
 
71
78
  "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="],
@@ -76,6 +83,8 @@
76
83
 
77
84
  "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="],
78
85
 
86
+ "from": ["from@0.1.7", "", {}, "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g=="],
87
+
79
88
  "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
80
89
 
81
90
  "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
@@ -108,6 +117,10 @@
108
117
 
109
118
  "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
110
119
 
120
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
121
+
122
+ "map-stream": ["map-stream@0.1.0", "", {}, "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g=="],
123
+
111
124
  "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
112
125
 
113
126
  "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
@@ -120,16 +133,24 @@
120
133
 
121
134
  "mylas": ["mylas@2.1.14", "", {}, "sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog=="],
122
135
 
136
+ "node-cleanup": ["node-cleanup@2.1.2", "", {}, "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw=="],
137
+
123
138
  "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
124
139
 
140
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
141
+
125
142
  "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
126
143
 
144
+ "pause-stream": ["pause-stream@0.0.11", "", { "dependencies": { "through": "~2.3" } }, "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A=="],
145
+
127
146
  "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
128
147
 
129
148
  "plimit-lit": ["plimit-lit@1.6.1", "", { "dependencies": { "queue-lit": "^1.5.1" } }, "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA=="],
130
149
 
131
150
  "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
132
151
 
152
+ "ps-tree": ["ps-tree@1.2.0", "", { "dependencies": { "event-stream": "=3.3.4" }, "bin": { "ps-tree": "./bin/ps-tree.js" } }, "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA=="],
153
+
133
154
  "queue-lit": ["queue-lit@1.5.2", "", {}, "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw=="],
134
155
 
135
156
  "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
@@ -148,12 +169,28 @@
148
169
 
149
170
  "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
150
171
 
172
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
173
+
174
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
175
+
151
176
  "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
152
177
 
178
+ "split": ["split@0.3.3", "", { "dependencies": { "through": "2" } }, "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA=="],
179
+
180
+ "stream-combiner": ["stream-combiner@0.0.4", "", { "dependencies": { "duplexer": "~0.1.1" } }, "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw=="],
181
+
182
+ "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="],
183
+
184
+ "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="],
185
+
153
186
  "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
154
187
 
155
188
  "tsc-alias": ["tsc-alias@1.8.16", "", { "dependencies": { "chokidar": "^3.5.3", "commander": "^9.0.0", "get-tsconfig": "^4.10.0", "globby": "^11.0.4", "mylas": "^2.1.9", "normalize-path": "^3.0.0", "plimit-lit": "^1.2.6" }, "bin": { "tsc-alias": "dist/bin/index.js" } }, "sha512-QjCyu55NFyRSBAl6+MTFwplpFcnm2Pq01rR/uxfqJoLMm6X3O14KEGtaSDZpJYaE1bJBGDjD0eSuiIWPe2T58g=="],
156
189
 
190
+ "tsc-watch": ["tsc-watch@7.2.0", "", { "dependencies": { "cross-spawn": "^7.0.6", "node-cleanup": "^2.1.2", "ps-tree": "^1.2.0", "string-argv": "^0.3.2" }, "peerDependencies": { "typescript": "*" }, "bin": { "tsc-watch": "dist/lib/tsc-watch.js" } }, "sha512-4gRFawQD1cVSaILvG7wl2x6NtteKbS2dGBMbL7Q6n1ldLIOKXCJUoEwUXdGuee4dp+zcnA6tukBBLz1lZrNI9w=="],
191
+
157
192
  "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
193
+
194
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
158
195
  }
159
196
  }
@@ -1,4 +1,4 @@
1
- import { MediaStatusEnum, type MediaItem } from "../types/media";
1
+ import { type Media, MediaStatusEnum, type MediaItem } from "../types/media";
2
2
  import { type AxiosProgressEvent } from "axios";
3
3
  export interface UploadMediaInfo extends Omit<AxiosProgressEvent, "event"> {
4
4
  event?: undefined;
@@ -11,9 +11,16 @@ export interface UseMediaUploaderProps<T extends object> {
11
11
  serverConfig?: {
12
12
  additionalHeaders?: Record<string, string>;
13
13
  generateUploadUrl?: string;
14
+ onGenerateUploadUrl?: (media: Partial<Media>) => Promise<{
15
+ item: Media;
16
+ uploadUrl: string;
17
+ }>;
14
18
  markMediaAsTemp?: string;
19
+ onMarkMediaAsTemp?: (mediaIds: (string | number)[]) => Promise<Partial<Media>[]>;
15
20
  markMediaAsActive?: string;
21
+ onMarkMediaAsActive?: (mediaIds: (string | number)[]) => Promise<Partial<Media>[]>;
16
22
  markMediaAsCanceled?: string;
23
+ onMarkMediaAsCanceled?: (mediaIds: (string | number)[]) => Promise<Partial<Media>[]>;
17
24
  };
18
25
  onUploadSuccess?: (currentValues: any) => Promise<void>;
19
26
  onUploadFailure?: (uploadRes: any) => Promise<void>;