ultra-image-uploader 0.0.2 → 2.0.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/README.md CHANGED
@@ -1,146 +1,321 @@
1
1
  # Ultra Image Uploader
2
2
 
3
- A modern React component for handling image uploads with drag-and-drop functionality, image preview, and ImgBB integration.
3
+ <div align="center">
4
+
5
+ A modern, beautiful React image upload component with support for multiple providers.
6
+
7
+ [![npm version](https://badge.fury.io/js/ultra-image-uploader.svg)](https://www.npmjs.com/package/ultra-image-uploader)
8
+ ![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue)
9
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green)](https://opensource.org/licenses/MIT)
10
+
11
+ **Modern UI** • **Multiple Providers** • **5 Themes** • **Production Ready**
12
+
13
+ </div>
14
+
15
+ ---
4
16
 
5
17
  ## Features
6
18
 
7
- - 🎯 **Easy Integration** - Simple to use with any React/Next.js project
8
- - 🖼️ **Drag & Drop** - Intuitive drag and drop interface
9
- - 📸 **Image Preview** - Instant preview of uploaded images
10
- - **Multiple Upload** - Support for multiple image uploads
11
- - 🔍 **File Validation** - Built-in file type and size validation
12
- - 🎨 **Customizable** - Highly customizable styling and components
13
- - 🗑️ **Delete Function** - Easy image removal functionality
14
- - 🔄 **ImgBB Integration** - Built-in support for ImgBB image hosting
19
+ - **Beautiful UI** - Modern, clean design with smooth animations
20
+ - **5 Built-in Themes** - Light, Dark, Modern, Ocean, Sunset
21
+ - **Custom Themes** - Create your own color schemes
22
+ - **Multiple Providers** - ImgBB & Cloudinary support
23
+ - **Drag & Drop** - Intuitive file handling
24
+ - **Upload Progress** - Real-time progress tracking
25
+ - **File Validation** - Type and size validation
26
+ - **Auto Upload** - Optional automatic uploading
27
+ - **TypeScript** - Fully typed
28
+ - **Simple API** - Easy to use
15
29
 
16
30
  ## Installation
17
31
 
18
32
  ```bash
19
33
  npm install ultra-image-uploader
20
- # or
21
- yarn add ultra-image-uploader
22
- # or
23
- pnpm add ultra-image-uploader
24
34
  ```
25
35
 
26
36
  ## Quick Start
27
37
 
28
- ### Basic Usage
29
-
30
38
  ```tsx
31
39
  import { ImageUploader } from "ultra-image-uploader";
32
40
  import { useState } from "react";
33
41
 
34
42
  function App() {
35
- const [imageFiles, setImagesFiles] = useState<File[]>([]);
43
+ const [images, setImages] = useState<File[]>([]);
36
44
 
37
45
  return (
38
46
  <ImageUploader
39
- images={imageFiles}
40
- setImages={setImagesFiles}
41
- mode="add"
42
- multiple={true}
47
+ images={images}
48
+ setImages={setImages}
49
+ multiple
50
+ theme="light"
43
51
  />
44
52
  );
45
53
  }
46
54
  ```
47
55
 
48
- ### With ImgBB Integration
56
+ ## Themes
57
+
58
+ Choose from 5 beautiful themes:
59
+
60
+ ```tsx
61
+ // Light (default)
62
+ <ImageUploader theme="light" images={images} setImages={setImages} />
63
+
64
+ // Dark
65
+ <ImageUploader theme="dark" images={images} setImages={setImages} />
66
+
67
+ // Modern (pink)
68
+ <ImageUploader theme="modern" images={images} setImages={setImages} />
69
+
70
+ // Ocean (cyan)
71
+ <ImageUploader theme="ocean" images={images} setImages={setImages} />
72
+
73
+ // Sunset (orange)
74
+ <ImageUploader theme="sunset" images={images} setImages={setImages} />
75
+ ```
76
+
77
+ ## Custom Theme
78
+
79
+ ```tsx
80
+ import { ImageUploader, type ThemeConfig } from "ultra-image-uploader";
81
+
82
+ const customTheme: ThemeConfig = {
83
+ primary: '#ff6b6b',
84
+ background: '#fff',
85
+ border: '#ddd',
86
+ text: '#333',
87
+ textSecondary: '#666',
88
+ error: '#e74c3c',
89
+ success: '#2ecc71',
90
+ radius: '8px',
91
+ };
92
+
93
+ <ImageUploader
94
+ images={images}
95
+ setImages={setImages}
96
+ theme={customTheme}
97
+ />
98
+ ```
99
+
100
+ ## Upload to ImgBB
49
101
 
50
102
  ```tsx
51
103
  import { ImageUploader, uploadImagesToImageBB } from "ultra-image-uploader";
52
- import { useState } from "react";
53
104
 
54
- function ImageUploadForm() {
105
+ function UploadToImgBB() {
55
106
  const [images, setImages] = useState<File[]>([]);
56
- const [loading, setLoading] = useState(false);
57
-
58
- const handleGetImageUrl = async () => {
59
- setLoading(true);
60
- try {
61
- const result = await uploadImagesToImageBB(
62
- images,
63
- "your-imgbb-api-key-here"
64
- );
65
- console.log("Uploaded URLs:", result.urls);
66
- } catch (error) {
67
- console.error("Error uploading images:", error);
68
- } finally {
69
- setLoading(false);
70
- }
107
+
108
+ const handleUpload = async () => {
109
+ const result = await uploadImagesToImageBB(images, 'YOUR_API_KEY');
110
+ console.log('Uploaded:', result.urls);
71
111
  };
72
112
 
73
113
  return (
74
114
  <div>
75
- <ImageUploader
76
- images={images}
77
- setImages={setImages}
78
- mode="add"
79
- multiple={true}
80
- />
81
- <button
82
- onClick={handleGetImageUrl}
83
- disabled={loading || images.length === 0}
84
- className="bg-blue-500 text-white p-2 rounded disabled:opacity-50"
85
- >
86
- {loading ? "Uploading..." : "Upload Images"}
87
- </button>
115
+ <ImageUploader images={images} setImages={setImages} multiple />
116
+ <button onClick={handleUpload}>Upload</button>
88
117
  </div>
89
118
  );
90
119
  }
91
120
  ```
92
121
 
93
- ## Component Props
94
-
95
- | Prop | Type | Default | Description |
96
- |------------------|--------------------------|------------|-------------|
97
- | `images` | `File[]` | Required | Array of selected image files |
98
- | `setImages` | `(files: File[]) => void`| Required | Function to update images array |
99
- | `mode` | `"add" | "update"` | Required | Component operation mode |
100
- | `defaultImages` | `string[]` | `[]` | Existing image URLs for update mode |
101
- | `multiple` | `boolean` | `false` | Allow multiple file selection |
102
- | `inputStyles` | `string` | `""` | Custom CSS classes for upload input |
103
- | `containerStyles`| `string` | `""` | Custom CSS classes for container |
104
- | `uploadText` | `string` | `"Browse files or drag & drop"` | Upload area text |
105
- | `typeText` | `string` | `"PNG, JPG, JPEG, WEBP"` | Allowed file types text |
122
+ ## Upload to Cloudinary
106
123
 
124
+ ```tsx
125
+ import { ImageUploader, uploadImagesToCloudinary } from "ultra-image-uploader";
107
126
 
108
- ## ImgBB Utility
127
+ function UploadToCloudinary() {
128
+ const [images, setImages] = useState<File[]>([]);
109
129
 
110
- The package includes a utility function for uploading to ImgBB:
130
+ const handleUpload = async () => {
131
+ const results = await uploadImagesToCloudinary(images, {
132
+ cloudName: 'your-cloud-name',
133
+ uploadPreset: 'your-upload-preset',
134
+ });
135
+ console.log('Uploaded:', results.map(r => r.url));
136
+ };
111
137
 
112
- ```ts
113
- interface ImageBBUrlResult {
114
- urls: string[];
138
+ return (
139
+ <div>
140
+ <ImageUploader images={images} setImages={setImages} multiple theme="dark" />
141
+ <button onClick={handleUpload}>Upload</button>
142
+ </div>
143
+ );
115
144
  }
145
+ ```
116
146
 
117
- async function uploadImagesToImageBB(
118
- images: File[],
119
- apiKey: string
120
- ): Promise<ImageBBUrlResult>
147
+ ## Auto Upload Mode
148
+
149
+ ```tsx
150
+ <ImageUploader
151
+ images={images}
152
+ setImages={setImages}
153
+ multiple
154
+ autoUpload
155
+ uploadConfig={{
156
+ provider: 'imgbb',
157
+ config: { apiKey: 'your-api-key' },
158
+ }}
159
+ onUploadComplete={(urls) => console.log('Done!', urls)}
160
+ onUploadError={(error) => console.error('Error:', error)}
161
+ />
121
162
  ```
122
163
 
123
- ## Development
164
+ ## Props
124
165
 
125
- To contribute to this project:
166
+ | Prop | Type | Default | Description |
167
+ |------|------|---------|-------------|
168
+ | `images` | `File[]` | **Required** | Selected image files |
169
+ | `setImages` | `(files: File[]) => void` | **Required** | Update images state |
170
+ | `multiple` | `boolean` | `false` | Allow multiple files |
171
+ | `theme` | `'light' \| 'dark' \| 'modern' \| 'ocean' \| 'sunset' \| ThemeConfig` | `'light'` | Theme to use |
172
+ | `mode` | `'add' \| 'update'` | `'add'` | Component mode |
173
+ | `defaultImages` | `string[]` | `[]` | Existing image URLs |
174
+ | `uploadText` | `string` | `'Drop images here...'` | Upload area text |
175
+ | `maxSize` | `number` | `10485760` | Max file size (bytes) |
176
+ | `allowedTypes` | `string[]` | Image types | Allowed MIME types |
177
+ | `showFileSize` | `boolean` | `true` | Show file size |
178
+ | `dragAndDrop` | `boolean` | `true` | Enable drag-drop |
179
+ | `previewWidth` | `number` | `140` | Preview width (px) |
180
+ | `previewHeight` | `number` | `140` | Preview height (px) |
181
+ | `autoUpload` | `boolean` | `false` | Auto upload files |
182
+ | `uploadConfig` | `{ provider, config }` | `undefined` | Upload config |
183
+ | `onUploadComplete` | `(urls: string[]) => void` | `undefined` | Upload success callback |
184
+ | `onUploadError` | `(error: Error) => void` | `undefined` | Upload error callback |
185
+ | `className` | `string` | `''` | Extra CSS classes |
126
186
 
127
- 1. Clone the repository
128
- 2. Install dependencies:
129
- ```bash
130
- yarn
131
- ```
132
- 3. Make your changes
133
- 4. Run the build:
134
- ```bash
135
- yarn build
136
- ```
137
- 5. Test your changes
138
- 6. Submit a pull request
187
+ ## Upload Functions
188
+
189
+ ### `uploadImage(file, provider, config, options?)`
190
+
191
+ Upload a single image.
192
+
193
+ ```tsx
194
+ import { uploadImage } from "ultra-image-uploader";
195
+
196
+ const result = await uploadImage(
197
+ file,
198
+ 'imgbb',
199
+ { apiKey: 'your-key' },
200
+ {
201
+ onProgress: (p) => console.log(p.percentage + '%'),
202
+ }
203
+ );
204
+ console.log(result.url);
205
+ ```
206
+
207
+ ### `uploadImages(files, provider, config, options?)`
208
+
209
+ Upload multiple images.
210
+
211
+ ```tsx
212
+ const results = await uploadImages(files, 'cloudinary', {
213
+ cloudName: 'your-cloud',
214
+ });
215
+ ```
216
+
217
+ ### `uploadImagesToImageBB(images, apiKey)`
218
+
219
+ Upload to ImgBB (shorthand).
220
+
221
+ ```tsx
222
+ const { urls } = await uploadImagesToImageBB(images, 'api-key');
223
+ ```
224
+
225
+ ### `uploadImagesToCloudinary(files, config, options?)`
226
+
227
+ Upload to Cloudinary (shorthand).
228
+
229
+ ```tsx
230
+ const results = await uploadImagesToCloudinary(images, {
231
+ cloudName: 'your-cloud',
232
+ uploadPreset: 'your-preset',
233
+ });
234
+ ```
235
+
236
+ ## Get API Keys
237
+
238
+ ### ImgBB
239
+ 1. Go to [imgbb.com/settings/api](https://imgbb.com/settings/api)
240
+ 2. Copy your API key
241
+
242
+ ### Cloudinary
243
+ 1. Sign up at [cloudinary.com](https://cloudinary.com)
244
+ 2. Get your cloud name from dashboard
245
+ 3. Create upload preset (Settings → Upload)
246
+
247
+ ## TypeScript
248
+
249
+ All types are exported:
250
+
251
+ ```tsx
252
+ import type {
253
+ UploadProvider,
254
+ UploadResult,
255
+ ThemeConfig,
256
+ ImageUploaderProps,
257
+ FileValidationOptions,
258
+ // ... more
259
+ } from "ultra-image-uploader";
260
+ ```
261
+
262
+ ## Examples
263
+
264
+ ### Profile Picture
265
+
266
+ ```tsx
267
+ <ImageUploader
268
+ images={avatar}
269
+ setImages={setAvatar}
270
+ multiple={false}
271
+ maxSize={2 * 1024 * 1024}
272
+ theme="modern"
273
+ />
274
+ ```
275
+
276
+ ### Product Gallery
277
+
278
+ ```tsx
279
+ <ImageUploader
280
+ images={products}
281
+ setImages={setProducts}
282
+ multiple
283
+ mode="update"
284
+ defaultImages={existingImages}
285
+ allowedTypes={['image/jpeg', 'image/webp']}
286
+ theme="ocean"
287
+ />
288
+ ```
289
+
290
+ ### Custom Colors
291
+
292
+ ```tsx
293
+ <ImageUploader
294
+ images={images}
295
+ setImages={setImages}
296
+ theme={{
297
+ primary: '#00d9ff',
298
+ background: '#0a0a0a',
299
+ border: '#333',
300
+ text: '#fff',
301
+ textSecondary: '#999',
302
+ error: '#ff4757',
303
+ success: '#2ed573',
304
+ radius: '16px',
305
+ }}
306
+ />
307
+ ```
139
308
 
140
309
  ## License
141
310
 
142
311
  MIT © Digontha Das
143
312
 
144
- ## Support
313
+ ## Links
314
+
315
+ - [GitHub](https://github.com/digontha/ultra-image-uploader)
316
+ - [NPM](https://www.npmjs.com/package/ultra-image-uploader)
317
+ - [Issues](https://github.com/digontha/ultra-image-uploader/issues)
318
+
319
+ ---
145
320
 
146
- For support or feature requests, please [open an issue](https://github.com/Digontha/ultra_image_uploader) on GitHub.
321
+ Made with ❤️ by [Digontha Das](https://github.com/digontha)
@@ -1,12 +1,27 @@
1
+ import type { UploadProvider, ProviderConfig, ThemeConfig } from '../types';
2
+ export declare const themes: Record<string, ThemeConfig>;
1
3
  export interface ImageUploaderProps {
2
4
  images: File[];
3
5
  setImages: (images: File[]) => void;
4
- mode: "add" | "update";
6
+ mode?: 'add' | 'update';
5
7
  defaultImages?: string[];
6
8
  multiple?: boolean;
7
- inputStyles?: string;
8
- containerStyles?: string;
9
+ theme?: keyof typeof themes | ThemeConfig;
9
10
  uploadText?: string;
10
- typeText?: string;
11
+ maxSize?: number;
12
+ allowedTypes?: string[];
13
+ showFileSize?: boolean;
14
+ dragAndDrop?: boolean;
15
+ previewWidth?: number;
16
+ previewHeight?: number;
17
+ className?: string;
18
+ autoUpload?: boolean;
19
+ uploadConfig?: {
20
+ provider: UploadProvider;
21
+ config: ProviderConfig;
22
+ };
23
+ onUploadComplete?: (urls: string[]) => void;
24
+ onUploadError?: (error: Error) => void;
11
25
  }
12
- export declare function ImageUploader({ images, setImages, mode, defaultImages, multiple, inputStyles, containerStyles, uploadText, typeText, }: ImageUploaderProps): import("react/jsx-runtime").JSX.Element;
26
+ export declare function ImageUploader({ images, setImages, mode, defaultImages, multiple, theme, uploadText, maxSize, allowedTypes, showFileSize, dragAndDrop, previewWidth, previewHeight, className, autoUpload, uploadConfig, onUploadComplete, onUploadError, }: ImageUploaderProps): import("react/jsx-runtime").JSX.Element;
27
+ //# sourceMappingURL=ImageUploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageUploader.d.ts","sourceRoot":"","sources":["../../src/components/ImageUploader.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5E,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAmD9C,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,IAAI,EAAE,CAAC;IACf,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,OAAO,MAAM,GAAG,WAAW,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,cAAc,CAAC;QACzB,MAAM,EAAE,cAAc,CAAC;KACxB,CAAC;IACF,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACxC;AAMD,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAS,EACT,IAAY,EACZ,aAAkB,EAClB,QAAgB,EAChB,KAAe,EACf,UAAkD,EAClD,OAA0B,EAC1B,YAAkF,EAClF,YAAmB,EACnB,WAAkB,EAClB,YAAkB,EAClB,aAAmB,EACnB,SAAc,EACd,UAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,aAAa,GACd,EAAE,kBAAkB,2CAqTpB"}