react-hook-toolkit 1.1.0 → 1.1.1

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright © 2022 Shivaji Surwase. All rights reserved.
3
+ Copyright © 2025 Shivaji Surwase. All rights reserved.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
 
package/README.md CHANGED
@@ -29,6 +29,40 @@ Here's the properly structured documentation with clear purpose explanations:
29
29
 
30
30
  ------------------------------------------ **Custom Hooks** ------------------------------------------------
31
31
 
32
+ 📌 **useBrowser**
33
+ Provides comprehensive browser control and environment detection with a unified API for navigation, window management, and system interactions.
34
+
35
+ ```ts
36
+ const {
37
+ currentUrl,
38
+ currentPath,
39
+ currentHash,
40
+ currentSearchParams,
41
+ goBack,
42
+ goForward,
43
+ reload,
44
+ navigateTo,
45
+ clearBrowserData,
46
+ historyState,
47
+ isOnline,
48
+ copyCurrentUrl,
49
+ openNewTab,
50
+ getFaviconUrl,
51
+ getPageTitle,
52
+ setPageTitle,
53
+ isSecureContext,
54
+ viewportSize,
55
+ screenSize,
56
+ enableFullscreen,
57
+ disableFullscreen,
58
+ isFullscreen,
59
+ printPage,
60
+ getUserAgent,
61
+ shareContent,
62
+ isShareSupported,
63
+ closeCurrentTab
64
+ } = useBrowser();
65
+ ```
32
66
 
33
67
  📌 **useAxios**
34
68
  A custom hook for making API requests using Axios. It manages request states (`loading`, `error`, `data`) and provides a function (`makeRequest`) to initiate a request.
@@ -790,6 +824,18 @@ Displays a customizable context menu with support for light/dark themes, keyboar
790
824
  </ContextMenu>
791
825
  ```
792
826
 
827
+ ✅ **RichTextEditor**
828
+ Provides a fully-featured WYSIWYG editor with HTML conversion, customizable toolbar, and responsive design for rich text input.
829
+
830
+ ```tsx
831
+ <RichTextEditor
832
+ initialHtml="<p>Initial content</p>"
833
+ onChange={(html) => console.log(html)}
834
+ placeholder="Type your text here..."
835
+ minHeight="300px"
836
+ />
837
+ ```
838
+
793
839
  ---
794
840
  ✅ **FilePreview**
795
841
  Displays a styled file card with an icon based on file type, filename with ellipsis handling, file size, and an optional download action.
@@ -0,0 +1,2 @@
1
+ import { UseBrowserControlsReturn } from "../type";
2
+ export declare const useBrowser: () => UseBrowserControlsReturn;
@@ -0,0 +1,381 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
38
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
39
+ if (ar || !(i in from)) {
40
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
41
+ ar[i] = from[i];
42
+ }
43
+ }
44
+ return to.concat(ar || Array.prototype.slice.call(from));
45
+ };
46
+ import { useCallback, useEffect, useState } from "react";
47
+ export var useBrowser = function () {
48
+ var _a, _b;
49
+ var _c = useState(new URL(window.location.href)), currentUrl = _c[0], setCurrentUrl = _c[1];
50
+ var _d = useState({
51
+ canGoBack: ((_a = window.history.state) === null || _a === void 0 ? void 0 : _a.idx) > 0,
52
+ canGoForward: ((_b = window.history.state) === null || _b === void 0 ? void 0 : _b.idx) < window.history.length - 1,
53
+ historyLength: window.history.length,
54
+ }), historyState = _d[0], setHistoryState = _d[1];
55
+ var _e = useState(navigator.onLine), isOnline = _e[0], setIsOnline = _e[1];
56
+ var _f = useState(false), isFullscreen = _f[0], setIsFullscreen = _f[1];
57
+ var _g = useState({
58
+ width: window.innerWidth,
59
+ height: window.innerHeight,
60
+ }), viewportSize = _g[0], setViewportSize = _g[1];
61
+ var _h = useState({
62
+ width: window.screen.width,
63
+ height: window.screen.height,
64
+ }), screenSize = _h[0], setScreenSize = _h[1];
65
+ // Update URL and history state when changes occur
66
+ var updateState = useCallback(function () {
67
+ var _a, _b;
68
+ setCurrentUrl(new URL(window.location.href));
69
+ setHistoryState({
70
+ canGoBack: ((_a = window.history.state) === null || _a === void 0 ? void 0 : _a.idx) > 0,
71
+ canGoForward: ((_b = window.history.state) === null || _b === void 0 ? void 0 : _b.idx) < window.history.length - 1,
72
+ historyLength: window.history.length,
73
+ });
74
+ }, []);
75
+ // Event listeners setup
76
+ useEffect(function () {
77
+ var handlePopState = function () { return updateState(); };
78
+ var handleOnline = function () { return setIsOnline(true); };
79
+ var handleOffline = function () { return setIsOnline(false); };
80
+ var handleResize = function () {
81
+ setViewportSize({
82
+ width: window.innerWidth,
83
+ height: window.innerHeight,
84
+ });
85
+ setScreenSize({
86
+ width: window.screen.width,
87
+ height: window.screen.height,
88
+ });
89
+ };
90
+ var handleFullscreenChange = function () {
91
+ setIsFullscreen(!!document.fullscreenElement);
92
+ };
93
+ window.addEventListener('popstate', handlePopState);
94
+ window.addEventListener('online', handleOnline);
95
+ window.addEventListener('offline', handleOffline);
96
+ window.addEventListener('resize', handleResize);
97
+ document.addEventListener('fullscreenchange', handleFullscreenChange);
98
+ return function () {
99
+ window.removeEventListener('popstate', handlePopState);
100
+ window.removeEventListener('online', handleOnline);
101
+ window.removeEventListener('offline', handleOffline);
102
+ window.removeEventListener('resize', handleResize);
103
+ document.removeEventListener('fullscreenchange', handleFullscreenChange);
104
+ };
105
+ }, [updateState]);
106
+ var goBack = useCallback(function () {
107
+ try {
108
+ if (historyState.canGoBack) {
109
+ window.history.back();
110
+ }
111
+ else {
112
+ console.warn('Cannot go back - no history available');
113
+ }
114
+ }
115
+ catch (error) {
116
+ console.error('Error going back:', error);
117
+ window.location.href = '/';
118
+ }
119
+ }, [historyState.canGoBack]);
120
+ var goForward = useCallback(function () {
121
+ try {
122
+ if (historyState.canGoForward) {
123
+ window.history.forward();
124
+ }
125
+ else {
126
+ console.warn('Cannot go forward - no history available');
127
+ }
128
+ }
129
+ catch (error) {
130
+ console.error('Error going forward:', error);
131
+ }
132
+ }, [historyState.canGoForward]);
133
+ var reload = useCallback(function (hardReload, scrollToTop) {
134
+ if (hardReload === void 0) { hardReload = false; }
135
+ if (scrollToTop === void 0) { scrollToTop = false; }
136
+ try {
137
+ if (scrollToTop) {
138
+ window.scrollTo(0, 0);
139
+ }
140
+ if (hardReload) {
141
+ window.location.href = window.location.href;
142
+ }
143
+ else {
144
+ window.location.reload();
145
+ }
146
+ }
147
+ catch (error) {
148
+ console.error('Error reloading page:', error);
149
+ }
150
+ }, []);
151
+ var navigateTo = useCallback(function (url, replace) {
152
+ if (replace === void 0) { replace = false; }
153
+ try {
154
+ var urlObj = typeof url === 'string' ? new URL(url, window.location.origin) : url;
155
+ if (replace) {
156
+ window.location.replace(urlObj.href);
157
+ }
158
+ else {
159
+ window.location.href = urlObj.href;
160
+ }
161
+ }
162
+ catch (error) {
163
+ console.error("Error navigating to ".concat(url, ":"), error);
164
+ }
165
+ }, []);
166
+ var clearBrowserData = useCallback(function () {
167
+ var args_1 = [];
168
+ for (var _i = 0; _i < arguments.length; _i++) {
169
+ args_1[_i] = arguments[_i];
170
+ }
171
+ return __awaiter(void 0, __spreadArray([], args_1, true), void 0, function (settings) {
172
+ var _a, clearCache, _b, clearCookies, _c, clearLocalStorage, _d, clearSessionStorage, cacheKeys, error_1;
173
+ if (settings === void 0) { settings = {}; }
174
+ return __generator(this, function (_e) {
175
+ switch (_e.label) {
176
+ case 0:
177
+ _a = settings.clearCache, clearCache = _a === void 0 ? false : _a, _b = settings.clearCookies, clearCookies = _b === void 0 ? false : _b, _c = settings.clearLocalStorage, clearLocalStorage = _c === void 0 ? false : _c, _d = settings.clearSessionStorage, clearSessionStorage = _d === void 0 ? false : _d;
178
+ _e.label = 1;
179
+ case 1:
180
+ _e.trys.push([1, 5, , 6]);
181
+ if (clearLocalStorage) {
182
+ localStorage.clear();
183
+ }
184
+ if (clearSessionStorage) {
185
+ sessionStorage.clear();
186
+ }
187
+ if (clearCookies) {
188
+ document.cookie.split(';').forEach(function (cookie) {
189
+ var name = cookie.split('=')[0];
190
+ document.cookie = "".concat(name, "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/");
191
+ });
192
+ }
193
+ if (!(clearCache && 'caches' in window)) return [3 /*break*/, 4];
194
+ return [4 /*yield*/, caches.keys()];
195
+ case 2:
196
+ cacheKeys = _e.sent();
197
+ return [4 /*yield*/, Promise.all(cacheKeys.map(function (key) { return caches.delete(key); }))];
198
+ case 3:
199
+ _e.sent();
200
+ _e.label = 4;
201
+ case 4: return [3 /*break*/, 6];
202
+ case 5:
203
+ error_1 = _e.sent();
204
+ console.error('Error clearing browser data:', error_1);
205
+ throw error_1;
206
+ case 6: return [2 /*return*/];
207
+ }
208
+ });
209
+ });
210
+ }, []);
211
+ var copyCurrentUrl = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
212
+ var error_2, textArea;
213
+ return __generator(this, function (_a) {
214
+ switch (_a.label) {
215
+ case 0:
216
+ _a.trys.push([0, 2, , 3]);
217
+ return [4 /*yield*/, navigator.clipboard.writeText(window.location.href)];
218
+ case 1:
219
+ _a.sent();
220
+ return [3 /*break*/, 3];
221
+ case 2:
222
+ error_2 = _a.sent();
223
+ console.error('Error copying URL to clipboard:', error_2);
224
+ textArea = document.createElement('textarea');
225
+ textArea.value = window.location.href;
226
+ document.body.appendChild(textArea);
227
+ textArea.select();
228
+ document.execCommand('copy');
229
+ document.body.removeChild(textArea);
230
+ return [3 /*break*/, 3];
231
+ case 3: return [2 /*return*/];
232
+ }
233
+ });
234
+ }); }, []);
235
+ var openNewTab = useCallback(function (url) {
236
+ try {
237
+ window.open(url || window.location.href, '_blank', 'noopener,noreferrer');
238
+ }
239
+ catch (error) {
240
+ console.error('Error opening new tab:', error);
241
+ }
242
+ }, []);
243
+ var getFaviconUrl = useCallback(function (size) {
244
+ if (size === void 0) { size = 32; }
245
+ var url = new URL(window.location.origin);
246
+ url.pathname = '/favicon.ico';
247
+ url.searchParams.set('size', size.toString());
248
+ return url.href;
249
+ }, []);
250
+ var getPageTitle = useCallback(function () {
251
+ return document.title;
252
+ }, []);
253
+ var setPageTitle = useCallback(function (title) {
254
+ document.title = title;
255
+ }, []);
256
+ var enableFullscreen = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
257
+ var error_3;
258
+ return __generator(this, function (_a) {
259
+ switch (_a.label) {
260
+ case 0:
261
+ _a.trys.push([0, 7, , 8]);
262
+ if (!document.documentElement.requestFullscreen) return [3 /*break*/, 2];
263
+ return [4 /*yield*/, document.documentElement.requestFullscreen()];
264
+ case 1:
265
+ _a.sent();
266
+ return [3 /*break*/, 6];
267
+ case 2:
268
+ if (!document.documentElement.webkitRequestFullscreen) return [3 /*break*/, 4];
269
+ return [4 /*yield*/, document.documentElement.webkitRequestFullscreen()];
270
+ case 3:
271
+ _a.sent();
272
+ return [3 /*break*/, 6];
273
+ case 4:
274
+ if (!document.documentElement.msRequestFullscreen) return [3 /*break*/, 6];
275
+ return [4 /*yield*/, document.documentElement.msRequestFullscreen()];
276
+ case 5:
277
+ _a.sent();
278
+ _a.label = 6;
279
+ case 6: return [3 /*break*/, 8];
280
+ case 7:
281
+ error_3 = _a.sent();
282
+ console.error('Error enabling fullscreen:', error_3);
283
+ throw error_3;
284
+ case 8: return [2 /*return*/];
285
+ }
286
+ });
287
+ }); }, []);
288
+ var disableFullscreen = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
289
+ var error_4;
290
+ return __generator(this, function (_a) {
291
+ switch (_a.label) {
292
+ case 0:
293
+ _a.trys.push([0, 7, , 8]);
294
+ if (!document.exitFullscreen) return [3 /*break*/, 2];
295
+ return [4 /*yield*/, document.exitFullscreen()];
296
+ case 1:
297
+ _a.sent();
298
+ return [3 /*break*/, 6];
299
+ case 2:
300
+ if (!document.webkitExitFullscreen) return [3 /*break*/, 4];
301
+ return [4 /*yield*/, document.webkitExitFullscreen()];
302
+ case 3:
303
+ _a.sent();
304
+ return [3 /*break*/, 6];
305
+ case 4:
306
+ if (!document.msExitFullscreen) return [3 /*break*/, 6];
307
+ return [4 /*yield*/, document.msExitFullscreen()];
308
+ case 5:
309
+ _a.sent();
310
+ _a.label = 6;
311
+ case 6: return [3 /*break*/, 8];
312
+ case 7:
313
+ error_4 = _a.sent();
314
+ console.error('Error disabling fullscreen:', error_4);
315
+ throw error_4;
316
+ case 8: return [2 /*return*/];
317
+ }
318
+ });
319
+ }); }, []);
320
+ var printPage = useCallback(function () {
321
+ window.print();
322
+ }, []);
323
+ var getUserAgent = useCallback(function () {
324
+ return navigator.userAgent;
325
+ }, []);
326
+ var shareContent = useCallback(function (data) { return __awaiter(void 0, void 0, void 0, function () {
327
+ return __generator(this, function (_a) {
328
+ switch (_a.label) {
329
+ case 0:
330
+ if (!navigator.share) {
331
+ throw new Error('Web Share API not supported');
332
+ }
333
+ return [4 /*yield*/, navigator.share(data)];
334
+ case 1:
335
+ _a.sent();
336
+ return [2 /*return*/];
337
+ }
338
+ });
339
+ }); }, []);
340
+ var closeCurrentTab = useCallback(function () {
341
+ try {
342
+ // Note: This will only work if the tab was opened by JavaScript
343
+ // Browsers typically prevent closing windows/tabs not opened by script
344
+ window.close();
345
+ }
346
+ catch (error) {
347
+ console.error('Error closing tab:', error);
348
+ // Fallback: Redirect to about:blank
349
+ window.location.href = 'about:blank';
350
+ }
351
+ }, []);
352
+ return {
353
+ currentUrl: currentUrl,
354
+ currentPath: currentUrl.pathname,
355
+ currentHash: currentUrl.hash,
356
+ currentSearchParams: currentUrl.searchParams,
357
+ goBack: goBack,
358
+ goForward: goForward,
359
+ reload: reload,
360
+ navigateTo: navigateTo,
361
+ clearBrowserData: clearBrowserData,
362
+ historyState: historyState,
363
+ isOnline: isOnline,
364
+ copyCurrentUrl: copyCurrentUrl,
365
+ openNewTab: openNewTab,
366
+ getFaviconUrl: getFaviconUrl,
367
+ getPageTitle: getPageTitle,
368
+ setPageTitle: setPageTitle,
369
+ isSecureContext: window.isSecureContext,
370
+ viewportSize: viewportSize,
371
+ screenSize: screenSize,
372
+ enableFullscreen: enableFullscreen,
373
+ disableFullscreen: disableFullscreen,
374
+ isFullscreen: isFullscreen,
375
+ printPage: printPage,
376
+ getUserAgent: getUserAgent,
377
+ shareContent: shareContent,
378
+ isShareSupported: 'share' in navigator,
379
+ closeCurrentTab: closeCurrentTab,
380
+ };
381
+ };
@@ -0,0 +1,4 @@
1
+ import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css';
2
+ import 'draft-js/dist/Draft.css';
3
+ import { RichTextEditorProps } from '../type';
4
+ export declare const RichTextEditor: React.FC<RichTextEditorProps>;
@@ -0,0 +1,145 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ import { jsx as _jsx } from "react/jsx-runtime";
24
+ import { useCallback, useEffect, useState, useRef } from 'react';
25
+ import { convertToRaw, EditorState, ContentState } from 'draft-js';
26
+ import { Editor } from 'react-draft-wysiwyg';
27
+ import draftToHtml from 'draftjs-to-html';
28
+ import htmlToDraft from 'html-to-draftjs';
29
+ import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css';
30
+ import 'draft-js/dist/Draft.css';
31
+ export var RichTextEditor = function (_a) {
32
+ var _b = _a.initialHtml, initialHtml = _b === void 0 ? '' : _b, onChange = _a.onChange, _c = _a.wrapperClassName, wrapperClassName = _c === void 0 ? 'rich-text-wrapper' : _c, _d = _a.editorClassName, editorClassName = _d === void 0 ? 'rich-text-editor' : _d, _e = _a.toolbarClassName, toolbarClassName = _e === void 0 ? 'rich-text-toolbar' : _e, _f = _a.placeholder, placeholder = _f === void 0 ? 'Comment...' : _f, _g = _a.readOnly, readOnly = _g === void 0 ? false : _g, _h = _a.toolbar, toolbar = _h === void 0 ? undefined : _h, _j = _a.minHeight, minHeight = _j === void 0 ? '200px' : _j, _k = _a.editorStyle, editorStyle = _k === void 0 ? undefined : _k, _l = _a.wrapperStyle, wrapperStyle = _l === void 0 ? undefined : _l, _m = _a.toolbarStyle, toolbarStyle = _m === void 0 ? undefined : _m, restProps = __rest(_a, ["initialHtml", "onChange", "wrapperClassName", "editorClassName", "toolbarClassName", "placeholder", "readOnly", "toolbar", "minHeight", "editorStyle", "wrapperStyle", "toolbarStyle"]);
33
+ var editorRef = useRef(null);
34
+ var _o = useState(function () {
35
+ try {
36
+ if (initialHtml) {
37
+ var contentBlock = htmlToDraft(initialHtml);
38
+ if (contentBlock) {
39
+ var contentState = ContentState.createFromBlockArray(contentBlock.contentBlocks, contentBlock.entityMap);
40
+ return EditorState.createWithContent(contentState);
41
+ }
42
+ }
43
+ }
44
+ catch (error) {
45
+ console.error('Failed to parse initial HTML:', error);
46
+ }
47
+ return EditorState.createEmpty();
48
+ }), editorState = _o[0], setEditorState = _o[1];
49
+ useEffect(function () {
50
+ if (initialHtml && editorState.getCurrentContent().hasText() === false) {
51
+ try {
52
+ var contentBlock = htmlToDraft(initialHtml);
53
+ var contentState = ContentState.createFromBlockArray(contentBlock.contentBlocks, contentBlock.entityMap);
54
+ var newEditorState = EditorState.createWithContent(contentState);
55
+ var focusedState = EditorState.moveFocusToEnd(newEditorState);
56
+ setEditorState(focusedState);
57
+ }
58
+ catch (error) {
59
+ console.error('Error setting editor content:', error);
60
+ }
61
+ }
62
+ }, [initialHtml, editorState]);
63
+ var handleEditorStateChange = useCallback(function (newEditorState) {
64
+ setEditorState(newEditorState);
65
+ if (onChange) {
66
+ var html = draftToHtml(convertToRaw(newEditorState.getCurrentContent()));
67
+ onChange(html);
68
+ }
69
+ }, [onChange]);
70
+ var defaultToolbar = {
71
+ options: [
72
+ 'inline',
73
+ 'blockType',
74
+ 'fontSize',
75
+ 'fontFamily',
76
+ 'list',
77
+ 'textAlign',
78
+ 'colorPicker',
79
+ 'link',
80
+ 'embedded',
81
+ 'emoji',
82
+ 'image',
83
+ 'remove',
84
+ 'history',
85
+ ],
86
+ inline: {
87
+ options: ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'superscript', 'subscript'],
88
+ },
89
+ blockType: {
90
+ inDropdown: true,
91
+ options: ['Normal', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'Blockquote', 'Code'],
92
+ },
93
+ fontSize: {
94
+ options: [8, 9, 10, 11, 12, 14, 16, 18, 24, 30, 36, 48, 60, 72, 96],
95
+ },
96
+ fontFamily: {
97
+ options: ['Arial', 'Georgia', 'Impact', 'Tahoma', 'Times New Roman', 'Verdana', 'Courier New'],
98
+ },
99
+ list: {
100
+ options: ['unordered', 'ordered'],
101
+ },
102
+ textAlign: {
103
+ options: ['left', 'center', 'right', 'justify'],
104
+ },
105
+ link: {
106
+ defaultTargetOption: '_blank',
107
+ },
108
+ image: {
109
+ uploadCallback: function (file) {
110
+ return new Promise(function (resolve) {
111
+ var reader = new FileReader();
112
+ reader.onload = function (e) {
113
+ var _a;
114
+ var dataUrl = (_a = e.target) === null || _a === void 0 ? void 0 : _a.result;
115
+ resolve({ data: { link: dataUrl } });
116
+ };
117
+ reader.readAsDataURL(file);
118
+ });
119
+ },
120
+ previewImage: true,
121
+ alt: { present: true, mandatory: false },
122
+ },
123
+ };
124
+ return (_jsx("div", { className: wrapperClassName, style: {
125
+ border: '1px solid #e0e0e0',
126
+ borderRadius: '4px',
127
+ direction: 'ltr',
128
+ }, children: _jsx(Editor, __assign({ ref: editorRef, editorState: editorState, onEditorStateChange: handleEditorStateChange, wrapperClassName: wrapperClassName, editorClassName: editorClassName, toolbarClassName: toolbarClassName, placeholder: placeholder, readOnly: readOnly, toolbar: toolbar || defaultToolbar, wrapperStyle: wrapperStyle || {
129
+ padding: '0px',
130
+ backgroundColor: '#fff',
131
+ direction: 'ltr',
132
+ }, editorStyle: editorStyle || {
133
+ minHeight: minHeight,
134
+ padding: '10px',
135
+ lineHeight: '1.0',
136
+ fontSize: '16px',
137
+ direction: 'ltr',
138
+ textAlign: 'left',
139
+ }, toolbarStyle: toolbarStyle || {
140
+ marginBottom: '0',
141
+ borderBottom: '1px solid #e0e0e0',
142
+ backgroundColor: '#f5f5f5',
143
+ direction: 'ltr',
144
+ } }, restProps)) }));
145
+ };
package/dist/index.d.ts CHANGED
@@ -3,7 +3,9 @@ import { ReactHooksWrapper, getHook, setHook } from "./chunk1415/chunk143";
3
3
  import { DynamicLoader, AlertMessage, FilePreview, LabeledValue, DetailsCard, UploadFile, DownloadFile, ContextMenuWrapper } from './chunk1516/chunk613852';
4
4
  import { FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton } from './chunk1617/chunk613555';
5
5
  import { useHistoryState, useIdle, useIsFirstRender, useList, useLockBodyScroll, useLongPress, useRecentSearch, useSpeech, usePermission, usePageLeave, useMotion, useHoverDirty, useBeforeUnload, useClickAway, useResponsive, useUnmountedRef } from './chunk1516/chunk726433';
6
+ import { RichTextEditor } from './chunk1617/chunk613556';
7
+ import { useBrowser } from './chunk1516/chunk0022';
6
8
  import { useGenericReducer, useArray, useAsync, useAxios, useClipboard, useCookie, useDarkMode, useDebounce, useDebouncedCallback, useDebouncedValue, useDelay, useRequest, useRequestRetry, useForm, useImageLoader, useIndexedDB, useInterval, useKeyPress, useLocalStorage, useMediaQuery, useMousePosition, useOnlineStatus, usePersistedState, usePrevious, useReducedMotion, useResizeObserver, useScrollDirection, useScrollLock, useScrollPosition, useScript, useStepper, useThrottle, useTimeout, useToggle, useVisibilityChange, useWindowSize } from './chunk1516/chunk940514';
7
9
  import { createOptimizedContext, useBattery, useCountDown, useCountUp, useCrossFieldValidation, useCss, useDragReorder, useEventListener, useEventListeners, useFieldArray, useFormSubmit, useFormWizard, useGeoLocation, useHistory, useInfiniteScroll, useIsMounted, usePersistedForm, usePreferredLanguage, useSessionStorage, useSmartForm, useSound, useSpeak, useTimer, useTouch, useUndo, useUpdateEffect, useWebSocket } from './chunk1516/chunk0021';
8
10
  export default ReactHooksWrapper;
9
- export { getHook, setHook, useGenericReducer, useArray, useAsync, useAxios, useBattery, useBeforeUnload, useClipboard, useCookie, useClickAway, useCountDown, useCountUp, useCrossFieldValidation, useCss, useDarkMode, useDebounce, useDebouncedCallback, useDebouncedValue, useDelay, useDragReorder, useEventListener, useEventListeners, useRequest, useRequestRetry, useFieldArray, useForm, useFormSubmit, useFormWizard, useGeoLocation, useHoverDirty, useHistory, useHistoryState, useIdle, useImageLoader, useIndexedDB, useInfiniteScroll, useInterval, useIsFirstRender, useIsMounted, useKeyPress, useList, useLocalStorage, useLockBodyScroll, useLongPress, useMotion, useMediaQuery, useMousePosition, useOnlineStatus, usePersistedForm, usePersistedState, usePreferredLanguage, usePrevious, usePermission, usePageLeave, useReducedMotion, useRecentSearch, useResponsive, useResizeObserver, useScript, useScrollDirection, useScrollLock, useScrollPosition, useSessionStorage, useSmartForm, useSound, useSpeech, useSpeak, useStepper, useThrottle, useTimeout, useTimer, useToggle, useTouch, useUnmountedRef, useUndo, useUpdateEffect, useVisibilityChange, useWebSocket, useWindowSize, AlertMessage, CardSkeleton, ContextMenuWrapper, DetailsCard, DownloadFile, DynamicLoader, FieldSkeleton, FilePreview, FileSkeleton, LineChartSkeleton, LabeledValue, PieChartSkeleton, TableSkeleton, UploadFile, createOptimizedContext, };
11
+ export { getHook, setHook, useGenericReducer, useArray, useAsync, useAxios, useBrowser, useBattery, useBeforeUnload, useClipboard, useCookie, useClickAway, useCountDown, useCountUp, useCrossFieldValidation, useCss, useDarkMode, useDebounce, useDebouncedCallback, useDebouncedValue, useDelay, useDragReorder, useEventListener, useEventListeners, useRequest, useRequestRetry, useFieldArray, useForm, useFormSubmit, useFormWizard, useGeoLocation, useHoverDirty, useHistory, useHistoryState, useIdle, useImageLoader, useIndexedDB, useInfiniteScroll, useInterval, useIsFirstRender, useIsMounted, useKeyPress, useList, useLocalStorage, useLockBodyScroll, useLongPress, useMotion, useMediaQuery, useMousePosition, useOnlineStatus, usePersistedForm, usePersistedState, usePreferredLanguage, usePrevious, usePermission, usePageLeave, useReducedMotion, useRecentSearch, useResponsive, useResizeObserver, useScript, useScrollDirection, useScrollLock, useScrollPosition, useSessionStorage, useSmartForm, useSound, useSpeech, useSpeak, useStepper, useThrottle, useTimeout, useTimer, useToggle, useTouch, useUnmountedRef, useUndo, useUpdateEffect, useVisibilityChange, useWebSocket, useWindowSize, AlertMessage, CardSkeleton, ContextMenuWrapper, DetailsCard, DownloadFile, DynamicLoader, FieldSkeleton, FilePreview, FileSkeleton, LineChartSkeleton, LabeledValue, PieChartSkeleton, RichTextEditor, TableSkeleton, UploadFile, createOptimizedContext, };
package/dist/index.js CHANGED
@@ -3,7 +3,9 @@ import { ReactHooksWrapper, getHook, setHook } from "./chunk1415/chunk143";
3
3
  import { DynamicLoader, AlertMessage, FilePreview, LabeledValue, DetailsCard, UploadFile, DownloadFile, ContextMenuWrapper } from './chunk1516/chunk613852';
4
4
  import { FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton } from './chunk1617/chunk613555';
5
5
  import { useHistoryState, useIdle, useIsFirstRender, useList, useLockBodyScroll, useLongPress, useRecentSearch, useSpeech, usePermission, usePageLeave, useMotion, useHoverDirty, useBeforeUnload, useClickAway, useResponsive, useUnmountedRef } from './chunk1516/chunk726433';
6
+ import { RichTextEditor } from './chunk1617/chunk613556';
7
+ import { useBrowser } from './chunk1516/chunk0022';
6
8
  import { useGenericReducer, useArray, useAsync, useAxios, useClipboard, useCookie, useDarkMode, useDebounce, useDebouncedCallback, useDebouncedValue, useDelay, useRequest, useRequestRetry, useForm, useImageLoader, useIndexedDB, useInterval, useKeyPress, useLocalStorage, useMediaQuery, useMousePosition, useOnlineStatus, usePersistedState, usePrevious, useReducedMotion, useResizeObserver, useScrollDirection, useScrollLock, useScrollPosition, useScript, useStepper, useThrottle, useTimeout, useToggle, useVisibilityChange, useWindowSize, } from './chunk1516/chunk940514';
7
9
  import { createOptimizedContext, useBattery, useCountDown, useCountUp, useCrossFieldValidation, useCss, useDragReorder, useEventListener, useEventListeners, useFieldArray, useFormSubmit, useFormWizard, useGeoLocation, useHistory, useInfiniteScroll, useIsMounted, usePersistedForm, usePreferredLanguage, useSessionStorage, useSmartForm, useSound, useSpeak, useTimer, useTouch, useUndo, useUpdateEffect, useWebSocket } from './chunk1516/chunk0021';
8
10
  export default ReactHooksWrapper;
9
- export { getHook, setHook, useGenericReducer, useArray, useAsync, useAxios, useBattery, useBeforeUnload, useClipboard, useCookie, useClickAway, useCountDown, useCountUp, useCrossFieldValidation, useCss, useDarkMode, useDebounce, useDebouncedCallback, useDebouncedValue, useDelay, useDragReorder, useEventListener, useEventListeners, useRequest, useRequestRetry, useFieldArray, useForm, useFormSubmit, useFormWizard, useGeoLocation, useHoverDirty, useHistory, useHistoryState, useIdle, useImageLoader, useIndexedDB, useInfiniteScroll, useInterval, useIsFirstRender, useIsMounted, useKeyPress, useList, useLocalStorage, useLockBodyScroll, useLongPress, useMotion, useMediaQuery, useMousePosition, useOnlineStatus, usePersistedForm, usePersistedState, usePreferredLanguage, usePrevious, usePermission, usePageLeave, useReducedMotion, useRecentSearch, useResponsive, useResizeObserver, useScript, useScrollDirection, useScrollLock, useScrollPosition, useSessionStorage, useSmartForm, useSound, useSpeech, useSpeak, useStepper, useThrottle, useTimeout, useTimer, useToggle, useTouch, useUnmountedRef, useUndo, useUpdateEffect, useVisibilityChange, useWebSocket, useWindowSize, AlertMessage, CardSkeleton, ContextMenuWrapper, DetailsCard, DownloadFile, DynamicLoader, FieldSkeleton, FilePreview, FileSkeleton, LineChartSkeleton, LabeledValue, PieChartSkeleton, TableSkeleton, UploadFile, createOptimizedContext, };
11
+ export { getHook, setHook, useGenericReducer, useArray, useAsync, useAxios, useBrowser, useBattery, useBeforeUnload, useClipboard, useCookie, useClickAway, useCountDown, useCountUp, useCrossFieldValidation, useCss, useDarkMode, useDebounce, useDebouncedCallback, useDebouncedValue, useDelay, useDragReorder, useEventListener, useEventListeners, useRequest, useRequestRetry, useFieldArray, useForm, useFormSubmit, useFormWizard, useGeoLocation, useHoverDirty, useHistory, useHistoryState, useIdle, useImageLoader, useIndexedDB, useInfiniteScroll, useInterval, useIsFirstRender, useIsMounted, useKeyPress, useList, useLocalStorage, useLockBodyScroll, useLongPress, useMotion, useMediaQuery, useMousePosition, useOnlineStatus, usePersistedForm, usePersistedState, usePreferredLanguage, usePrevious, usePermission, usePageLeave, useReducedMotion, useRecentSearch, useResponsive, useResizeObserver, useScript, useScrollDirection, useScrollLock, useScrollPosition, useSessionStorage, useSmartForm, useSound, useSpeech, useSpeak, useStepper, useThrottle, useTimeout, useTimer, useToggle, useTouch, useUnmountedRef, useUndo, useUpdateEffect, useVisibilityChange, useWebSocket, useWindowSize, AlertMessage, CardSkeleton, ContextMenuWrapper, DetailsCard, DownloadFile, DynamicLoader, FieldSkeleton, FilePreview, FileSkeleton, LineChartSkeleton, LabeledValue, PieChartSkeleton, RichTextEditor, TableSkeleton, UploadFile, createOptimizedContext, };
package/dist/type.d.ts CHANGED
@@ -232,4 +232,65 @@ export declare enum VoiceStatus {
232
232
  pause = 2,
233
233
  end = 3
234
234
  }
235
+ export interface RichTextEditorProps {
236
+ initialHtml?: string;
237
+ onChange?: any;
238
+ wrapperClassName?: string;
239
+ editorClassName?: string;
240
+ toolbarClassName?: string;
241
+ placeholder?: string;
242
+ readOnly?: boolean;
243
+ toolbar?: object;
244
+ minHeight?: string;
245
+ editorStyle?: object;
246
+ wrapperStyle?: object;
247
+ toolbarStyle?: object;
248
+ restProps?: any;
249
+ }
250
+ export interface BrowserHistoryState {
251
+ canGoBack: boolean;
252
+ canGoForward: boolean;
253
+ historyLength: number;
254
+ }
255
+ export interface BrowserSettings {
256
+ clearCache: boolean;
257
+ clearCookies: boolean;
258
+ clearLocalStorage: boolean;
259
+ clearSessionStorage: boolean;
260
+ }
261
+ export interface UseBrowserControlsReturn {
262
+ currentUrl: URL;
263
+ currentPath: string;
264
+ currentHash: string;
265
+ currentSearchParams: URLSearchParams;
266
+ goBack: () => void;
267
+ goForward: () => void;
268
+ reload: (hardReload?: boolean, scrollToTop?: boolean) => void;
269
+ navigateTo: (url: string | URL, replace?: boolean) => void;
270
+ clearBrowserData: (settings: Partial<BrowserSettings>) => Promise<void>;
271
+ historyState: BrowserHistoryState;
272
+ isOnline: boolean;
273
+ copyCurrentUrl: () => Promise<void>;
274
+ openNewTab: (url?: string) => void;
275
+ getFaviconUrl: (size?: number) => string;
276
+ getPageTitle: () => string;
277
+ setPageTitle: (title: string) => void;
278
+ isSecureContext: boolean;
279
+ viewportSize: {
280
+ width: number;
281
+ height: number;
282
+ };
283
+ screenSize: {
284
+ width: number;
285
+ height: number;
286
+ };
287
+ enableFullscreen: () => Promise<void>;
288
+ disableFullscreen: () => Promise<void>;
289
+ isFullscreen: boolean;
290
+ printPage: () => void;
291
+ getUserAgent: () => string;
292
+ shareContent: (data: ShareData) => Promise<void>;
293
+ isShareSupported: boolean;
294
+ closeCurrentTab: () => void;
295
+ }
235
296
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-hook-toolkit",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Ultimate package for React developers, offering a powerful collection of hooks and components to enhance their development experience.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -32,9 +32,13 @@
32
32
  ],
33
33
  "license": "MIT",
34
34
  "devDependencies": {
35
+ "@types/draft-js": "^0.11.18",
36
+ "@types/draftjs-to-html": "^0.8.4",
37
+ "@types/html-to-draftjs": "^1.5.0",
35
38
  "@types/node": "^22.13.10",
36
39
  "@types/nprogress": "^0.2.3",
37
40
  "@types/react": "^18.2.14",
41
+ "@types/react-draft-wysiwyg": "^1.13.8",
38
42
  "tslib": "^2.6.3",
39
43
  "typescript": "^5.2.2"
40
44
  },
@@ -44,8 +48,12 @@
44
48
  "@mui/icons-material": "^7.0.1",
45
49
  "@mui/material": "^5.14.0",
46
50
  "axios": "^1.7.8",
51
+ "draft-js": "^0.11.7",
52
+ "draftjs-to-html": "^0.9.1",
53
+ "html-to-draftjs": "^1.5.0",
47
54
  "nprogress": "^0.2.0",
48
55
  "react": "^18.2.0",
56
+ "react-draft-wysiwyg": "^1.15.0",
49
57
  "react-error-boundary": "^4.0.13"
50
58
  }
51
59
  }