pixel-react 1.1.1 → 1.1.3

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.
Files changed (99) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/lib/components/Charts/DashboardDonutChart/DashboardDonutChart.d.ts +5 -0
  3. package/lib/components/Charts/DashboardDonutChart/DashboardDonutChart.stories.d.ts +7 -0
  4. package/lib/components/Charts/DashboardDonutChart/index.d.ts +1 -0
  5. package/lib/components/Charts/DashboardDonutChart/types.d.ts +21 -0
  6. package/lib/components/Charts/PieChart/PieChart.d.ts +5 -0
  7. package/lib/components/Charts/PieChart/PieChart.stories.d.ts +7 -0
  8. package/lib/components/Charts/PieChart/index.d.ts +1 -0
  9. package/lib/components/Charts/PieChart/types.d.ts +27 -0
  10. package/lib/components/MultiSelect/MultiSelect.d.ts +1 -1
  11. package/lib/components/MultiSelect/MultiSelectTypes.d.ts +1 -1
  12. package/lib/components/NLPInput/NlpInput.d.ts +4 -0
  13. package/lib/components/NLPInput/NlpInput.stories.d.ts +7 -0
  14. package/lib/components/NLPInput/components/NlpDropDown/NlpDropDownType.d.ts +19 -0
  15. package/lib/components/NLPInput/components/NlpDropDown/NlpDropdown.d.ts +4 -0
  16. package/lib/components/NLPInput/index.d.ts +1 -0
  17. package/lib/components/NLPInput/type.d.ts +70 -0
  18. package/lib/components/Paper/Paper.d.ts +4 -0
  19. package/lib/components/Paper/Paper.stories.d.ts +11 -0
  20. package/lib/components/Paper/index.d.ts +1 -0
  21. package/lib/components/Paper/types.d.ts +15 -0
  22. package/lib/components/Table/Table.d.ts +1 -1
  23. package/lib/components/VariableInput/VariableInput.d.ts +4 -0
  24. package/lib/components/VariableInput/VariableInput.stories.d.ts +6 -0
  25. package/lib/components/VariableInput/index.d.ts +1 -0
  26. package/lib/components/VariableInput/types.d.ts +53 -0
  27. package/lib/index.css +404 -0
  28. package/lib/index.d.ts +187 -18
  29. package/lib/index.esm.css +404 -0
  30. package/lib/index.esm.js +7040 -762
  31. package/lib/index.esm.js.map +1 -1
  32. package/lib/index.js +7052 -761
  33. package/lib/index.js.map +1 -1
  34. package/lib/tsconfig.tsbuildinfo +1 -1
  35. package/lib/utils/ffID/ffID.stories.d.ts +1 -1
  36. package/lib/utils/ffID/ffid.d.ts +1 -2
  37. package/lib/utils/findAndInsert/findAndInsert.d.ts +7 -0
  38. package/lib/utils/findAndInsert/findAndInsert.stories.d.ts +7 -0
  39. package/lib/utils/getEncryptedData/getEncryptedData.d.ts +1 -0
  40. package/lib/utils/getEncryptedData/getEncryptedData.stories.d.ts +6 -0
  41. package/package.json +2 -1
  42. package/rollup.config.mjs +8 -2
  43. package/src/StyleGuide/ColorPalette/ColorPalette.tsx +2 -4
  44. package/src/StyleGuide/ColorPalette/colorPaletteList.ts +95 -20
  45. package/src/assets/Themes/BaseTheme.scss +4 -3
  46. package/src/assets/Themes/DarkTheme.scss +11 -8
  47. package/src/assets/icons/wswb_delete_icon.svg +4 -0
  48. package/src/assets/icons/wswb_plus_icon.svg +5 -0
  49. package/src/components/AllProjectsDropdown/AllProjectsDropdown.tsx +1 -1
  50. package/src/components/Button/index.ts +1 -1
  51. package/src/components/Charts/DashboardDonutChart/DashboardDonutChart.scss +145 -0
  52. package/src/components/Charts/DashboardDonutChart/DashboardDonutChart.stories.tsx +52 -0
  53. package/src/components/Charts/DashboardDonutChart/DashboardDonutChart.tsx +335 -0
  54. package/src/components/Charts/DashboardDonutChart/index.ts +1 -0
  55. package/src/components/Charts/DashboardDonutChart/types.ts +33 -0
  56. package/src/components/Charts/PieChart/PieChart.scss +39 -0
  57. package/src/components/Charts/PieChart/PieChart.stories.tsx +46 -0
  58. package/src/components/Charts/PieChart/PieChart.tsx +193 -0
  59. package/src/components/Charts/PieChart/index.ts +1 -0
  60. package/src/components/Charts/PieChart/types.ts +28 -0
  61. package/src/components/Icon/iconList.ts +6 -0
  62. package/src/components/Modal/modal.scss +1 -1
  63. package/src/components/MultiSelect/MultiSelect.stories.tsx +2 -3
  64. package/src/components/MultiSelect/MultiSelect.tsx +35 -23
  65. package/src/components/MultiSelect/MultiSelectTypes.ts +1 -1
  66. package/src/components/NLPInput/NLPInput.scss +246 -0
  67. package/src/components/NLPInput/NlpInput.stories.tsx +136 -0
  68. package/src/components/NLPInput/NlpInput.tsx +374 -0
  69. package/src/components/NLPInput/components/NlpDropDown/NlpDropDownType.ts +60 -0
  70. package/src/components/NLPInput/components/NlpDropDown/NlpDropdown.scss +83 -0
  71. package/src/components/NLPInput/components/NlpDropDown/NlpDropdown.tsx +180 -0
  72. package/src/components/NLPInput/index.ts +1 -0
  73. package/src/components/NLPInput/type.tsx +124 -0
  74. package/src/components/Paper/Paper.scss +13 -0
  75. package/src/components/Paper/Paper.stories.tsx +77 -0
  76. package/src/components/Paper/Paper.tsx +14 -0
  77. package/src/components/Paper/index.ts +1 -0
  78. package/src/components/Paper/types.ts +19 -0
  79. package/src/components/Select/components/Dropdown/Dropdown.tsx +1 -1
  80. package/src/components/Table/Table.scss +5 -0
  81. package/src/components/Table/Table.stories.tsx +12 -0
  82. package/src/components/Table/Table.tsx +25 -14
  83. package/src/components/TextArea/Textarea.scss +1 -1
  84. package/src/components/VariableInput/VariableInput.scss +128 -0
  85. package/src/components/VariableInput/VariableInput.stories.tsx +32 -0
  86. package/src/components/VariableInput/VariableInput.tsx +352 -0
  87. package/src/components/VariableInput/index.ts +1 -0
  88. package/src/components/VariableInput/types.ts +56 -0
  89. package/src/index.ts +32 -2
  90. package/src/utils/ffID/ffID.stories.tsx +1 -1
  91. package/src/utils/ffID/ffid.ts +1 -3
  92. package/src/utils/getEncryptedData/getEncryptedData.stories.tsx +55 -0
  93. package/src/utils/getEncryptedData/getEncryptedData.ts +8 -0
  94. package/lib/components/AddButton/AddButton.d.ts +0 -5
  95. package/lib/components/AddButton/AddButton.stories.d.ts +0 -6
  96. package/lib/components/AddButton/index.d.ts +0 -1
  97. package/lib/components/AddButton/types.d.ts +0 -4
  98. /package/src/utils/{find → findAndInsert}/findAndInsert.stories.tsx +0 -0
  99. /package/src/utils/{find → findAndInsert}/findAndInsert.ts +0 -0
@@ -0,0 +1,352 @@
1
+ import classNames from 'classnames';
2
+ import React, { useState, useRef, useEffect } from 'react';
3
+ import './VariableInput.scss';
4
+ import { VariableInputProps } from './types';
5
+ import Typography from '../Typography';
6
+
7
+ interface ParsedPart {
8
+ text: string;
9
+ textType: string;
10
+ }
11
+
12
+ const VariableInput = ({
13
+ type = 'url',
14
+ name = '',
15
+ label,
16
+ disabled = false,
17
+ required = false,
18
+ placeholder = '',
19
+ value = '',
20
+ error,
21
+ className = '',
22
+ onChange,
23
+ onKeyDown,
24
+ onBlur,
25
+ onFocus,
26
+ list=[],
27
+ ...props
28
+ }: VariableInputProps) => {
29
+ const [inputValue, setInputValue] = useState<string>('');
30
+ const [cursorPosition, setCursorPosition] = useState<number>(0);
31
+ const [isAddingText, setIsAddingText] = useState<boolean>(true);
32
+ const [suggestions, setSuggestions] = useState<string[]>([]);
33
+ const [showSuggestions, setShowSuggestions] = useState<boolean>(false);
34
+ const contentEditableRef = useRef<HTMLDivElement>(null);
35
+ const undoStack = useRef<string[]>([]);
36
+ const redoStack = useRef<string[]>([]);
37
+
38
+ useEffect(() => {
39
+ if (value) {
40
+ setInputValue(value);
41
+ }
42
+ }, [value]);
43
+
44
+ const parseUrl = (url: string): ParsedPart[] => {
45
+ const regex = /\$\{(\w+)\}/g; //checking the text variable or not
46
+ const parts: ParsedPart[] = [];
47
+ let lastIndex = 0;
48
+ let match;
49
+
50
+ while ((match = regex.exec(url)) !== null) {
51
+ const [fullMatch, variable] = match;
52
+ const isInList = list?.includes(variable ?? '');
53
+
54
+ if (match.index > lastIndex) {
55
+ parts.push({ text: url.slice(lastIndex, match.index), textType: 'normal' });
56
+ }
57
+
58
+ parts.push({
59
+ text: fullMatch,
60
+ textType: isInList ? 'variable' : 'nonVariable',
61
+ });
62
+
63
+ lastIndex = match.index + fullMatch.length;
64
+ }
65
+
66
+ if (lastIndex < url.length) {
67
+ parts.push({ text: url.slice(lastIndex), textType: 'normal' });
68
+ }
69
+
70
+ return parts;
71
+ };
72
+
73
+ const updateContentEditable = () => {
74
+ const parsedParts = parseUrl(inputValue);
75
+ const contentEditableElement = contentEditableRef.current;
76
+
77
+ if (contentEditableElement) {
78
+ contentEditableElement.innerHTML = parsedParts
79
+ .map((part) => {
80
+ const varClassName = classNames({
81
+ ['ff_var_red']: part.textType === 'nonVariable',
82
+ ['ff_var_green']: part.textType === 'variable',
83
+ ['ff_var_def_textType']:
84
+ part.textType !== 'nonVariable' && part.textType !== 'variable',
85
+ });
86
+
87
+ return `<Typography class="${varClassName}">${part.text}</Typography>`;
88
+ })
89
+ .join('');
90
+ restoreCursorPosition(contentEditableElement);
91
+ }
92
+ };
93
+
94
+ const restoreCursorPosition = (element: HTMLDivElement) => {
95
+ const selection = window.getSelection();
96
+ const range = document.createRange();
97
+ const textNodes = getTextNodes(element);
98
+
99
+ if (textNodes.length > 0) {
100
+ const lastNode = textNodes[textNodes.length - 1];
101
+ const positionAdjustment = isAddingText ? 1 : -1;
102
+
103
+ const newOffset = Math.max(
104
+ 0,
105
+ Math.min(
106
+ cursorPosition + positionAdjustment,
107
+ (lastNode as Text).length || 0
108
+ )
109
+ );
110
+ if (lastNode) {
111
+ range.setStart(lastNode, newOffset);
112
+ }
113
+ range.collapse(true);
114
+ } else {
115
+ range.selectNodeContents(element);
116
+ range.collapse(false);
117
+ }
118
+
119
+ selection?.removeAllRanges();
120
+ selection?.addRange(range);
121
+ element.focus();
122
+ };
123
+
124
+ const getTextNodes = (element: HTMLDivElement): Node[] => {
125
+ const nodes: Node[] = [];
126
+ const walker = document.createTreeWalker(
127
+ element,
128
+ NodeFilter.SHOW_TEXT,
129
+ null
130
+ );
131
+ let node;
132
+ while ((node = walker.nextNode())) {
133
+ nodes.push(node);
134
+ }
135
+ return nodes;
136
+ };
137
+
138
+ const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
139
+ const text = e.currentTarget.innerText.split('\n').join('');
140
+ setInputValue(text);
141
+ undoStack.current.push(text);
142
+ redoStack.current = [];
143
+
144
+ if (required && !text.trim()) {
145
+ e.currentTarget.classList.add('ff_required_empty');
146
+ } else {
147
+ e.currentTarget.classList.remove('ff_required_empty');
148
+ }
149
+
150
+ if (type === 'url') {
151
+ const urlPattern = new RegExp(
152
+ '^(https?://)?([\\w.-]+)\\.([a-zA-Z]{2,})(/([\\w.-]+|\\$\\{[\\w.-]+\\}))*/?$'
153
+ );
154
+
155
+ if (!urlPattern.test(text)) {
156
+ e.currentTarget.classList.add('ff_invalid_input');
157
+ } else {
158
+ e.currentTarget.classList.remove('ff_invalid_input');
159
+ e.currentTarget.classList.remove('ff_required_empty');
160
+ }
161
+ } else {
162
+ e.currentTarget.classList.add('ff_invalid_input');
163
+ }
164
+
165
+ if (onChange) {
166
+ onChange(text);
167
+ }
168
+
169
+ const match = /\$\{(\w*)$/.exec(text);
170
+ if (match) {
171
+ const query = match[1];
172
+ const filteredSuggestions = list?.filter((item: string) =>
173
+ item.startsWith(query ?? '')
174
+ );
175
+ setSuggestions(filteredSuggestions);
176
+ setShowSuggestions(true);
177
+ } else {
178
+ setShowSuggestions(false);
179
+ }
180
+ };
181
+
182
+ const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
183
+ const cursorPos = getCursorPosition();
184
+ setCursorPosition(cursorPos);
185
+ setIsAddingText(true);
186
+
187
+ const currentText = contentEditableRef.current
188
+ ? contentEditableRef.current.textContent || ''
189
+ : '';
190
+
191
+ if (e.key === 'Backspace' || e.key === 'Delete') {
192
+ setIsAddingText(false);
193
+ if (!currentText.trim()) {
194
+ e.preventDefault();
195
+ if (contentEditableRef.current) {
196
+ contentEditableRef.current.textContent = '';
197
+ contentEditableRef.current.blur();
198
+ }
199
+ return;
200
+ }
201
+ }
202
+
203
+ if (e.key === 'Enter') {
204
+ e.preventDefault();
205
+ insertTextAtCursor('\n');
206
+ } else if (e.ctrlKey && e.key === 'z') {
207
+ e.preventDefault();
208
+ undo();
209
+ } else if (e.ctrlKey && e.key === 'y') {
210
+ e.preventDefault();
211
+ redo();
212
+ }
213
+
214
+ if (onKeyDown) {
215
+ onKeyDown(e as React.KeyboardEvent<HTMLInputElement>);
216
+ }
217
+ };
218
+
219
+ const getCursorPosition = (): number => {
220
+ const selection = window.getSelection();
221
+ if (selection && selection.rangeCount > 0) {
222
+ const range = selection.getRangeAt(0);
223
+ return range.startOffset;
224
+ }
225
+ return 0;
226
+ };
227
+
228
+ const undo = () => {
229
+ if (undoStack.current.length > 1) {
230
+ redoStack.current.push(undoStack.current.pop()!);
231
+ setInputValue(undoStack.current[undoStack.current.length - 1] ?? '');
232
+ setIsAddingText(false);
233
+ }
234
+ };
235
+
236
+ const redo = () => {
237
+ if (redoStack.current.length > 0) {
238
+ const textToRedo = redoStack.current.pop()!;
239
+ setInputValue(textToRedo);
240
+ undoStack.current.push(textToRedo);
241
+ setIsAddingText(true);
242
+ }
243
+ };
244
+
245
+ const insertTextAtCursor = (text: string) => {
246
+ const selection = window.getSelection();
247
+ const range = selection?.getRangeAt(0);
248
+ if (range) {
249
+ range.deleteContents();
250
+ const newTextNode = document.createTextNode(text);
251
+ range.insertNode(newTextNode);
252
+
253
+ const lineBreak = document.createElement('br');
254
+ range.insertNode(lineBreak);
255
+
256
+ range.setStartAfter(lineBreak);
257
+ range.collapse(true);
258
+
259
+ selection?.removeAllRanges();
260
+ selection?.addRange(range);
261
+ contentEditableRef.current?.focus();
262
+ setInputValue(contentEditableRef.current?.innerText || '');
263
+ }
264
+ };
265
+
266
+ const handleSuggestionClick = (suggestion: string) => {
267
+ const newText = inputValue.replace(/\$\{\w*$/, `\$\{${suggestion}`);
268
+ setInputValue(newText);
269
+ setShowSuggestions(false);
270
+ };
271
+
272
+ useEffect(() => {
273
+ updateContentEditable();
274
+ }, [inputValue]);
275
+
276
+ const inputClasses = classNames('ff_content_editable', {
277
+ ['ff_placeholder']: !inputValue,
278
+ ['ff_disabled']: disabled,
279
+ ['ff_required']: required,
280
+ ['ff_invalid_input']: error,
281
+ });
282
+
283
+ return (
284
+ <div className={'ff_variable_input_container'}>
285
+ {label && (
286
+ <label
287
+ htmlFor={name}
288
+ className={classNames('ff_label_container', {
289
+ ['ff_labelDanger']: error,
290
+ })}
291
+ >
292
+ {required && (
293
+ <Typography className={'ff_required_asterisk'}>*</Typography>
294
+ )}
295
+ <Typography
296
+ className={classNames('ff_input_label', {
297
+ ['ff_no_hover']: value,
298
+ ['ff_disabled_label']: disabled,
299
+ ['ff_danger_label']: error,
300
+ })}
301
+ >
302
+ {label}
303
+ </Typography>
304
+ </label>
305
+ )}
306
+ <div
307
+ id={name}
308
+ contentEditable={!disabled}
309
+ ref={contentEditableRef}
310
+ onInput={handleInputChange}
311
+ onKeyDown={handleKeyDown}
312
+ onFocus={(e) => {
313
+ e.currentTarget.style.outline = 'none';
314
+ if (onFocus) onFocus(e as React.FocusEvent<HTMLInputElement>);
315
+ }}
316
+ onBlur={(e) => {
317
+ e.currentTarget.style.outline = 'none';
318
+ if (onBlur) onBlur(e as React.FocusEvent<HTMLInputElement>);
319
+
320
+ if (required && !inputValue.trim()) {
321
+ e.currentTarget.classList.add('ff_required_empty');
322
+ } else {
323
+ e.currentTarget.classList.remove('ff_required_empty');
324
+ }
325
+ }}
326
+ className={inputClasses}
327
+ suppressContentEditableWarning
328
+ aria-required={required ? 'true' : 'false'}
329
+ data-name={name}
330
+ data-type={type}
331
+ data-placeholder={placeholder}
332
+ spellCheck={false}
333
+ {...props}
334
+ />
335
+ {showSuggestions && (
336
+ <ul className={'ff_suggestions'}>
337
+ {suggestions.map((suggestion) => (
338
+ <li
339
+ key={suggestion}
340
+ onClick={() => handleSuggestionClick(suggestion)}
341
+ className={'ff_suggestion_item'}
342
+ >
343
+ {suggestion}
344
+ </li>
345
+ ))}
346
+ </ul>
347
+ )}
348
+ </div>
349
+ );
350
+ };
351
+
352
+ export default VariableInput;
@@ -0,0 +1 @@
1
+ export {default} from './VariableInput'
@@ -0,0 +1,56 @@
1
+ export interface VariableInputProps {
2
+ /**
3
+ * Name | name of the input field
4
+ */
5
+ name: string;
6
+ /**
7
+ * Label | field label to be displayed
8
+ */
9
+ label: string;
10
+ /**
11
+ * value | input field value
12
+ */
13
+ value: string | null;
14
+ /**
15
+ * type to set color/style of the input field
16
+ */
17
+ type: 'text' | 'password' | 'number' | 'email' | 'url' | 'time';
18
+ /**
19
+ * error | If true, error message will be displayed
20
+ */
21
+ error?: boolean;
22
+ /**
23
+ * to disable the input field
24
+ */
25
+ disabled?: boolean;
26
+ /**
27
+ * if true, input field will be mandatory
28
+ */
29
+ required?: boolean;
30
+ /**
31
+ * placeholder for the input field
32
+ */
33
+ placeholder?: string;
34
+ /**
35
+ * classnames to style the input field
36
+ */
37
+ className?: string;
38
+ /**
39
+ * onChange, onKeyDown, onBlur, onFocus actions
40
+ */
41
+ onChange?: (value: string) => void | undefined;
42
+
43
+ onKeyDown?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
44
+
45
+ onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
46
+
47
+ onFocus?: (event: React.FocusEvent<HTMLInputElement>) => void;
48
+ /**
49
+ * id to select the input field uniquely
50
+ */
51
+ id?: string;
52
+ /**
53
+ * list of variables
54
+ */
55
+ list?: string[];
56
+ }
package/src/index.ts CHANGED
@@ -38,9 +38,14 @@ import StateDropdown from './components/StateDropdown';
38
38
  import IconButton from './components/IconButton';
39
39
  import Modal from './components/Modal';
40
40
  import DragAndDrop from './components/DragAndDrop/DragAndDrop';
41
+ import VariableInput from './components/VariableInput';
41
42
  import AllProjectsDropdown from './components/AllProjectsDropdown';
43
+ import PieChart from './components/Charts/PieChart';
42
44
  import AppHeader from './components/AppHeader';
45
+ import Paper from './components/Paper';
46
+ import DashboardDonutChart from './components/Charts/DashboardDonutChart';
43
47
  import Recaptcha from './components/FF_Captcha/Recaptcha';
48
+ import NLPInput from './components/NLPInput';
44
49
 
45
50
  // Utils imports
46
51
  import { checkEmpty } from './utils/checkEmpty/checkEmpty';
@@ -49,6 +54,20 @@ import {
49
54
  getExtensionWithPeriod,
50
55
  } from './utils/getExtension/getExtension';
51
56
 
57
+ import { findAndInsert } from './utils/findAndInsert/findAndInsert';
58
+ import { ffid } from './utils/ffID/ffid';
59
+
60
+ import { debounce } from './utils/debounce/debounce';
61
+ import { compareArrays } from './utils/compareArrays/compareArrays';
62
+
63
+ import { compareObjects } from './utils/compareObjects/compareObjects';
64
+
65
+ import { getEncryptedData } from './utils/getEncryptedData/getEncryptedData';
66
+
67
+ import { throttle } from './utils/throttle/throttle';
68
+
69
+ import { truncateText } from './utils/truncateText/truncateText';
70
+
52
71
  export {
53
72
  Button,
54
73
  Tooltip,
@@ -91,14 +110,25 @@ export {
91
110
  StatusButton,
92
111
  IconButton,
93
112
  Modal,
94
-
113
+ PieChart,
114
+ DashboardDonutChart,
95
115
  DragAndDrop,
96
116
  AllProjectsDropdown,
97
117
  AppHeader,
118
+ VariableInput,
119
+ Paper,
98
120
  Recaptcha,
99
-
121
+ NLPInput,
100
122
  // utils exports
101
123
  checkEmpty,
102
124
  getExtension,
103
125
  getExtensionWithPeriod,
126
+ findAndInsert,
127
+ ffid,
128
+ compareArrays,
129
+ compareObjects,
130
+ debounce,
131
+ throttle,
132
+ getEncryptedData,
133
+ truncateText,
104
134
  };
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
- import ffid from './ffid'; // Adjust the import path if needed
2
+ import { ffid } from './ffid'; // Adjust the import path if needed
3
3
  import { useState } from 'react';
4
4
 
5
5
  const meta: Meta<typeof ffid> = {
@@ -1,9 +1,7 @@
1
- const ffid = (): string =>
1
+ export const ffid = (): string =>
2
2
  'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (char) =>
3
3
  (
4
4
  (char === 'x' ? Math.random() * 16 : ((Math.random() * 16) & 0x3) | 0x8) |
5
5
  0
6
6
  ).toString(16)
7
7
  );
8
-
9
- export default ffid;
@@ -0,0 +1,55 @@
1
+ // getEncryptData.stories.tsx
2
+ import { useState } from 'react';
3
+ import { getEncryptedData } from './getEncryptedData';
4
+
5
+ export default {
6
+ title: 'Utils/getEncryptedData',
7
+ component: getEncryptedData,
8
+ };
9
+
10
+ export const InteractivePlayground = () => {
11
+ const [data, setData] = useState<string>('Sensitive information');
12
+ const [publicKey, setPublicKey] = useState<string>(`Add your public key`);
13
+ const [encryptedData, setEncryptedData] = useState<string | null>(null);
14
+
15
+ const handleEncrypt = () => {
16
+ const result = getEncryptedData(data, publicKey);
17
+ setEncryptedData(result.toString());
18
+ };
19
+
20
+ return (
21
+ <div>
22
+ <h1>Interactive Playground for getEncryptData</h1>
23
+
24
+ <div>
25
+ <label htmlFor="data">Data to Encrypt:</label>
26
+ <input
27
+ type="text"
28
+ id="data"
29
+ value={data}
30
+ onChange={(e) => setData(e.target.value)}
31
+ />
32
+ </div>
33
+
34
+ <div>
35
+ <label htmlFor="publicKey">Public Key:</label>
36
+ <textarea
37
+ id="publicKey"
38
+ value={publicKey}
39
+ onChange={(e) => setPublicKey(e.target.value)}
40
+ rows={5}
41
+ cols={50}
42
+ />
43
+ </div>
44
+
45
+ <button onClick={handleEncrypt}>Encrypt Data</button>
46
+
47
+ <h2>Encrypted Data:</h2>
48
+ {encryptedData ? (
49
+ <pre>{encryptedData}</pre>
50
+ ) : (
51
+ <p>No encrypted data yet. Click "Encrypt Data" to generate it.</p>
52
+ )}
53
+ </div>
54
+ );
55
+ };
@@ -0,0 +1,8 @@
1
+ import JSEncrypt from 'jsencrypt';
2
+
3
+ export const getEncryptedData = (data: string, publicKey: string) => {
4
+ const encrypt = new JSEncrypt();
5
+ encrypt.setPublicKey(publicKey);
6
+ const enData = encrypt.encrypt(data);
7
+ return enData;
8
+ };
@@ -1,5 +0,0 @@
1
- import React from 'react';
2
- import './AddButton.scss';
3
- import { AddButtonProps } from './types';
4
- declare const AddButton: React.FC<AddButtonProps>;
5
- export default AddButton;
@@ -1,6 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import AddButton from './AddButton';
3
- declare const meta: Meta<typeof AddButton>;
4
- type Story = StoryObj<typeof AddButton>;
5
- export declare const PrimaryAddButton: Story;
6
- export default meta;
@@ -1 +0,0 @@
1
- export { default } from './AddButton';
@@ -1,4 +0,0 @@
1
- export interface AddButtonProps {
2
- name: string;
3
- onClick?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
4
- }