flet-box 0.0.0-stage → 1.0.2
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 +21 -0
- package/README.md +190 -2
- package/bin/cli.js +394 -0
- package/bin/commands/buildAndroid.js +200 -0
- package/bin/commands/buildIOS.js +237 -0
- package/bin/commands/create.js +406 -0
- package/bin/commands/createBundle.js +375 -0
- package/bin/commands/createComponent.js +115 -0
- package/bin/commands/createScreen.js +161 -0
- package/bin/commands/killServer.js +107 -0
- package/bin/commands/package.js +131 -0
- package/bin/commands/release.js +189 -0
- package/bin/commands/runBundle.js +62 -0
- package/bin/commands/runCloudflare.js +89 -0
- package/bin/commands/runNative.js +109 -0
- package/bin/commands/runServer.js +390 -0
- package/bin/ota/loader.js +361 -0
- package/bin/utils/bundleConfig.js +178 -0
- package/bin/utils/capacitor.js +137 -0
- package/bin/utils/colors.js +215 -0
- package/bin/utils/helpers.js +80 -0
- package/bin/utils/spinner.js +96 -0
- package/bin/utils/templates.js +1824 -0
- package/bin/utils/version.js +108 -0
- package/package.json +58 -4
- package/src/animations/AnimatedBox.js +607 -0
- package/src/animations/AnimatedText.js +105 -0
- package/src/animations/MatrixRain.js +220 -0
- package/src/animations/ParallaxBox.js +369 -0
- package/src/animations/animate.js +332 -0
- package/src/animations/index.js +25 -0
- package/src/app.js +41 -0
- package/src/assets/icon-1024-maskable.png +0 -0
- package/src/assets/icon-192-maskable.png +0 -0
- package/src/assets/icon-192.png +0 -0
- package/src/assets/icon-512-maskable.png +0 -0
- package/src/assets/icon-512.png +0 -0
- package/src/assets/logo.png +0 -0
- package/src/core/App.js +44 -0
- package/src/core/hmr-client.js +142 -0
- package/src/core/index.js +34 -0
- package/src/core/pwa.js +100 -0
- package/src/core/runApp.js +430 -0
- package/src/create-index.sh +237 -0
- package/src/fonts/MaterialIcons-Regular.woff2 +0 -0
- package/src/fonts/icons.css +23 -0
- package/src/index.d.ts +1930 -0
- package/src/index.js +288 -0
- package/src/navigations/AdaptiveScaffold.js +149 -0
- package/src/navigations/AppBar.js +331 -0
- package/src/navigations/BottomNavigation.js +298 -0
- package/src/navigations/CollapsibleSideBar.js +139 -0
- package/src/navigations/Drawer.js +333 -0
- package/src/navigations/DrawerItem.js +260 -0
- package/src/navigations/Router.js +475 -0
- package/src/navigations/Scaffold.js +537 -0
- package/src/navigations/Tabs.js +384 -0
- package/src/navigations/index.js +57 -0
- package/src/services/RamStore.js +213 -0
- package/src/services/Session.js +310 -0
- package/src/services/Storage.js +309 -0
- package/src/services/http.js +350 -0
- package/src/services/index.js +57 -0
- package/src/tools/animation.js +42 -0
- package/src/tools/array.js +95 -0
- package/src/tools/border.js +28 -0
- package/src/tools/clipboard.js +104 -0
- package/src/tools/color.js +329 -0
- package/src/tools/createList.js +215 -0
- package/src/tools/delay.js +55 -0
- package/src/tools/device.js +138 -0
- package/src/tools/dict.js +297 -0
- package/src/tools/dimensions.js +118 -0
- package/src/tools/filter.js +41 -0
- package/src/tools/flex.js +26 -0
- package/src/tools/gradient.js +34 -0
- package/src/tools/grid.js +57 -0
- package/src/tools/index.js +38 -0
- package/src/tools/mapList.js +107 -0
- package/src/tools/margin.js +93 -0
- package/src/tools/memo.js +60 -0
- package/src/tools/os.js +104 -0
- package/src/tools/padding.js +93 -0
- package/src/tools/print.js +69 -0
- package/src/tools/random.js +299 -0
- package/src/tools/ref.js +70 -0
- package/src/tools/rgba.js +4 -0
- package/src/tools/shadow.js +23 -0
- package/src/tools/string.js +85 -0
- package/src/tools/time.js +674 -0
- package/src/tools/transform.js +68 -0
- package/src/tools/transition.js +48 -0
- package/src/tools/useState.js +268 -0
- package/src/tools/uuid.js +42 -0
- package/src/utils/TextInputValidator.js +256 -0
- package/src/utils/composeUpdate.js +65 -0
- package/src/utils/getWidgetProps.js +35 -0
- package/src/utils/index.js +76 -0
- package/src/utils/markdownParser.js +368 -0
- package/src/utils/mediaTime.js +79 -0
- package/src/utils/navigation.js +263 -0
- package/src/utils/scriptInjector.js +73 -0
- package/src/utils/stackPosition.js +31 -0
- package/src/utils/stopWebRefresh.js +77 -0
- package/src/utils/styleInjector.js +38 -0
- package/src/utils/syntaxHighlight.js +339 -0
- package/src/utils/themes.js +347 -0
- package/src/utils/units.js +87 -0
- package/src/utils/visualEffects.js +169 -0
- package/src/widget-factory/addChildren.js +114 -0
- package/src/widget-factory/assignProps.js +256 -0
- package/src/widget-factory/createWidget.js +28 -0
- package/src/widget-factory/effects.js +132 -0
- package/src/widget-factory/index.js +7 -0
- package/src/widget-factory/lifecycle.js +210 -0
- package/src/widget-factory/makeParentable.js +89 -0
- package/src/widget-factory/pixTool.js +40 -0
- package/src/widget-factory/processProps.js +122 -0
- package/src/widget-factory/reactivity.js +98 -0
- package/src/widget-factory/remTool.js +34 -0
- package/src/widget-factory/stackPosition.js +87 -0
- package/src/widget-factory/stringTool.js +26 -0
- package/src/widget-factory/tools.js +249 -0
- package/src/widget-factory/translateProps.js +1049 -0
- package/src/widget-factory/warnings.js +284 -0
- package/src/widget-factory/widgetFactory.js +200 -0
- package/src/widgets/Accordion.js +562 -0
- package/src/widgets/AdMob.js +315 -0
- package/src/widgets/AdSense.js +268 -0
- package/src/widgets/AlertDialog.js +162 -0
- package/src/widgets/Audio.js +311 -0
- package/src/widgets/Avatar.js +210 -0
- package/src/widgets/Badge.js +189 -0
- package/src/widgets/BottomSheet.js +287 -0
- package/src/widgets/Button.js +247 -0
- package/src/widgets/Card.js +33 -0
- package/src/widgets/Carousel.js +301 -0
- package/src/widgets/Chart.js +632 -0
- package/src/widgets/Checkbox.js +106 -0
- package/src/widgets/Chip.js +153 -0
- package/src/widgets/CircularBar.js +352 -0
- package/src/widgets/CircularChart.js +549 -0
- package/src/widgets/CodeViewer.js +236 -0
- package/src/widgets/Column.js +29 -0
- package/src/widgets/Container.js +31 -0
- package/src/widgets/DataTable.js +257 -0
- package/src/widgets/Divider.js +93 -0
- package/src/widgets/DraggBox.js +115 -0
- package/src/widgets/Dropdown.js +505 -0
- package/src/widgets/DroppBox.js +180 -0
- package/src/widgets/FloatingActionButton.js +91 -0
- package/src/widgets/GridView.js +20 -0
- package/src/widgets/Icon.js +33 -0
- package/src/widgets/Image.js +15 -0
- package/src/widgets/Input.js +565 -0
- package/src/widgets/Inspector.js +254 -0
- package/src/widgets/InstallButton.js +110 -0
- package/src/widgets/ListTile.js +224 -0
- package/src/widgets/ListView.js +503 -0
- package/src/widgets/Markdown.js +1236 -0
- package/src/widgets/Modal.js +496 -0
- package/src/widgets/Pagination.js +195 -0
- package/src/widgets/ProgressBar.js +178 -0
- package/src/widgets/QRCode.js +467 -0
- package/src/widgets/Radio.js +132 -0
- package/src/widgets/Rating.js +261 -0
- package/src/widgets/Row.js +29 -0
- package/src/widgets/Skeleton.js +243 -0
- package/src/widgets/Slider.js +527 -0
- package/src/widgets/SnackBar.js +227 -0
- package/src/widgets/Stack.js +29 -0
- package/src/widgets/Stepper.js +296 -0
- package/src/widgets/Switch.js +102 -0
- package/src/widgets/Text.js +98 -0
- package/src/widgets/Tooltip.js +267 -0
- package/src/widgets/TreeView.js +370 -0
- package/src/widgets/Video.js +92 -0
- package/src/widgets/index.js +52 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
// src/modules/FletBox/services/Session.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Session - Temporary DOM storage (synchronous, similar to sessionStorage)
|
|
5
|
+
*
|
|
6
|
+
* @description Uses the browser's sessionStorage to persist data only during the session.
|
|
7
|
+
* Data is removed when the tab or browser is closed.
|
|
8
|
+
* Supports strings, objects, arrays, numbers, booleans.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { saveSession, getSession, deleteSession, clearAllSession, getAllSessionKeys, getAllSessionData } from './services/Session.js';
|
|
12
|
+
*
|
|
13
|
+
* // Save
|
|
14
|
+
* saveSession('user', { name: 'Juan', age: 30 });
|
|
15
|
+
*
|
|
16
|
+
* // Read
|
|
17
|
+
* const user = getSession('user');
|
|
18
|
+
*
|
|
19
|
+
* // Delete
|
|
20
|
+
* deleteSession('user');
|
|
21
|
+
*
|
|
22
|
+
* // Clear everything
|
|
23
|
+
* clearAllSession();
|
|
24
|
+
*
|
|
25
|
+
* // Get all keys
|
|
26
|
+
* const keys = getAllSessionKeys();
|
|
27
|
+
*
|
|
28
|
+
* // Get all data
|
|
29
|
+
* const allData = getAllSessionData();
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
// ========== CREATE / UPDATE ==========
|
|
33
|
+
/**
|
|
34
|
+
* Saves or updates a value in sessionStorage
|
|
35
|
+
* @param {string} key - Data key
|
|
36
|
+
* @param {any} value - Value to save (string, object, array, number, boolean)
|
|
37
|
+
* @returns {boolean} - true if saved successfully
|
|
38
|
+
*/
|
|
39
|
+
export const saveSession = (key, value) => {
|
|
40
|
+
try {
|
|
41
|
+
const serialized = JSON.stringify(value);
|
|
42
|
+
sessionStorage.setItem(key, serialized);
|
|
43
|
+
return true;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error("Error saving session data:", error);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// ========== READ ==========
|
|
51
|
+
/**
|
|
52
|
+
* Gets a value from sessionStorage
|
|
53
|
+
* @param {string} key - Data key
|
|
54
|
+
* @returns {any} - The saved value or null if it does not exist
|
|
55
|
+
*/
|
|
56
|
+
export const getSession = (key) => {
|
|
57
|
+
try {
|
|
58
|
+
const value = sessionStorage.getItem(key);
|
|
59
|
+
return value !== null ? JSON.parse(value) : null;
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.error("Error reading session data:", error);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// ========== READ (direct synchronous) ==========
|
|
67
|
+
/**
|
|
68
|
+
* Gets a value from sessionStorage synchronously (alias of getSession)
|
|
69
|
+
* @param {string} key - Data key
|
|
70
|
+
* @returns {any} - The saved value or null if it does not exist
|
|
71
|
+
*/
|
|
72
|
+
export const getSessionSync = (key) => {
|
|
73
|
+
return getSession(key);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// ========== UPDATE ==========
|
|
77
|
+
/**
|
|
78
|
+
* Updates an existing value (only if it exists)
|
|
79
|
+
* @param {string} key - Data key
|
|
80
|
+
* @param {any} newValue - New value
|
|
81
|
+
* @returns {boolean} - true if updated, false if it did not exist
|
|
82
|
+
*/
|
|
83
|
+
export const updateSession = (key, newValue) => {
|
|
84
|
+
try {
|
|
85
|
+
const exists = sessionStorage.getItem(key);
|
|
86
|
+
if (exists === null) return false;
|
|
87
|
+
|
|
88
|
+
sessionStorage.setItem(key, JSON.stringify(newValue));
|
|
89
|
+
return true;
|
|
90
|
+
} catch (error) {
|
|
91
|
+
console.error("Error updating session data:", error);
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
// ========== DELETE ==========
|
|
97
|
+
/**
|
|
98
|
+
* Deletes a value from sessionStorage
|
|
99
|
+
* @param {string} key - Data key
|
|
100
|
+
* @returns {boolean} - true if removed successfully
|
|
101
|
+
*/
|
|
102
|
+
export const deleteSession = (key) => {
|
|
103
|
+
try {
|
|
104
|
+
sessionStorage.removeItem(key);
|
|
105
|
+
return true;
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error("Error deleting session data:", error);
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// ========== DELETE ALL ==========
|
|
113
|
+
/**
|
|
114
|
+
* Deletes ALL data from sessionStorage
|
|
115
|
+
* @returns {boolean} - true if cleared successfully
|
|
116
|
+
*/
|
|
117
|
+
export const clearAllSession = () => {
|
|
118
|
+
try {
|
|
119
|
+
sessionStorage.clear();
|
|
120
|
+
return true;
|
|
121
|
+
} catch (error) {
|
|
122
|
+
console.error("Error clearing session data:", error);
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
// ========== UTILS ==========
|
|
128
|
+
/**
|
|
129
|
+
* Checks whether a key exists in sessionStorage
|
|
130
|
+
* @param {string} key - Key to check
|
|
131
|
+
* @returns {boolean} - true if it exists
|
|
132
|
+
*/
|
|
133
|
+
export const hasSession = (key) => {
|
|
134
|
+
try {
|
|
135
|
+
return sessionStorage.getItem(key) !== null;
|
|
136
|
+
} catch (error) {
|
|
137
|
+
console.error("Error checking session data:", error);
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Gets all keys saved in sessionStorage
|
|
144
|
+
* @returns {string[]} - Array of keys
|
|
145
|
+
*/
|
|
146
|
+
export const getAllSessionKeys = () => {
|
|
147
|
+
try {
|
|
148
|
+
const keys = [];
|
|
149
|
+
for (let i = 0; i < sessionStorage.length; i++) {
|
|
150
|
+
const key = sessionStorage.key(i);
|
|
151
|
+
if (key) keys.push(key);
|
|
152
|
+
}
|
|
153
|
+
return keys;
|
|
154
|
+
} catch (error) {
|
|
155
|
+
console.error("Error getting all session keys:", error);
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Gets all data saved in sessionStorage
|
|
162
|
+
* @returns {Object} - Object with all keys and values
|
|
163
|
+
*/
|
|
164
|
+
export const getAllSessionData = () => {
|
|
165
|
+
try {
|
|
166
|
+
const result = {};
|
|
167
|
+
for (let i = 0; i < sessionStorage.length; i++) {
|
|
168
|
+
const key = sessionStorage.key(i);
|
|
169
|
+
if (key) {
|
|
170
|
+
try {
|
|
171
|
+
const value = sessionStorage.getItem(key);
|
|
172
|
+
result[key] = value !== null ? JSON.parse(value) : null;
|
|
173
|
+
} catch {
|
|
174
|
+
result[key] = sessionStorage.getItem(key);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return result;
|
|
179
|
+
} catch (error) {
|
|
180
|
+
console.error("Error getting all session data:", error);
|
|
181
|
+
return {};
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Gets the approximate size used in sessionStorage (in bytes)
|
|
187
|
+
* @returns {number} - Size in bytes
|
|
188
|
+
*/
|
|
189
|
+
export const getSessionSize = () => {
|
|
190
|
+
try {
|
|
191
|
+
let total = 0;
|
|
192
|
+
for (let i = 0; i < sessionStorage.length; i++) {
|
|
193
|
+
const key = sessionStorage.key(i);
|
|
194
|
+
if (key) {
|
|
195
|
+
const value = sessionStorage.getItem(key);
|
|
196
|
+
total += (key.length + (value?.length || 0)) * 2;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return total;
|
|
200
|
+
} catch (error) {
|
|
201
|
+
console.error("Error getting session size:", error);
|
|
202
|
+
return 0;
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Deletes data by key prefix
|
|
208
|
+
* @param {string} prefix - Prefix of the keys to delete
|
|
209
|
+
* @returns {number} - Number of deleted items
|
|
210
|
+
*/
|
|
211
|
+
export const deleteSessionByPrefix = (prefix) => {
|
|
212
|
+
try {
|
|
213
|
+
let deleted = 0;
|
|
214
|
+
const keysToRemove = [];
|
|
215
|
+
|
|
216
|
+
for (let i = 0; i < sessionStorage.length; i++) {
|
|
217
|
+
const key = sessionStorage.key(i);
|
|
218
|
+
if (key && key.startsWith(prefix)) {
|
|
219
|
+
keysToRemove.push(key);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
keysToRemove.forEach((key) => {
|
|
224
|
+
sessionStorage.removeItem(key);
|
|
225
|
+
deleted++;
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
return deleted;
|
|
229
|
+
} catch (error) {
|
|
230
|
+
console.error("Error deleting session by prefix:", error);
|
|
231
|
+
return 0;
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Deletes data by key suffix
|
|
237
|
+
* @param {string} suffix - Suffix of the keys to delete
|
|
238
|
+
* @returns {number} - Number of deleted items
|
|
239
|
+
*/
|
|
240
|
+
export const deleteSessionBySuffix = (suffix) => {
|
|
241
|
+
try {
|
|
242
|
+
let deleted = 0;
|
|
243
|
+
const keysToRemove = [];
|
|
244
|
+
|
|
245
|
+
for (let i = 0; i < sessionStorage.length; i++) {
|
|
246
|
+
const key = sessionStorage.key(i);
|
|
247
|
+
if (key && key.endsWith(suffix)) {
|
|
248
|
+
keysToRemove.push(key);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
keysToRemove.forEach((key) => {
|
|
253
|
+
sessionStorage.removeItem(key);
|
|
254
|
+
deleted++;
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
return deleted;
|
|
258
|
+
} catch (error) {
|
|
259
|
+
console.error("Error deleting session by suffix:", error);
|
|
260
|
+
return 0;
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Gets the total number of items in sessionStorage
|
|
266
|
+
* @returns {number} - Number of items
|
|
267
|
+
*/
|
|
268
|
+
export const getSessionItemCount = () => {
|
|
269
|
+
try {
|
|
270
|
+
return sessionStorage.length;
|
|
271
|
+
} catch (error) {
|
|
272
|
+
console.error("Error getting session item count:", error);
|
|
273
|
+
return 0;
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Checks whether sessionStorage is available
|
|
279
|
+
* @returns {boolean} - true if available
|
|
280
|
+
*/
|
|
281
|
+
export const isSessionAvailable = () => {
|
|
282
|
+
try {
|
|
283
|
+
const test = "__session_test__";
|
|
284
|
+
sessionStorage.setItem(test, test);
|
|
285
|
+
sessionStorage.removeItem(test);
|
|
286
|
+
return true;
|
|
287
|
+
} catch (e) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
// ========== EXPORT DEFAULT ==========
|
|
293
|
+
const Session = {
|
|
294
|
+
saveSession,
|
|
295
|
+
getSession,
|
|
296
|
+
getSessionSync,
|
|
297
|
+
updateSession,
|
|
298
|
+
deleteSession,
|
|
299
|
+
clearAllSession,
|
|
300
|
+
hasSession,
|
|
301
|
+
getAllSessionKeys,
|
|
302
|
+
getAllSessionData,
|
|
303
|
+
getSessionSize,
|
|
304
|
+
deleteSessionByPrefix,
|
|
305
|
+
deleteSessionBySuffix,
|
|
306
|
+
getSessionItemCount,
|
|
307
|
+
isSessionAvailable,
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
export default Session;
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
// src/modules/FletBox/services/Storage.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Storage - Local DOM storage (synchronous, similar to localStorage)
|
|
5
|
+
*
|
|
6
|
+
* @description Uses the browser's localStorage to persist data.
|
|
7
|
+
* Supports strings, objects, arrays, numbers, booleans.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import { saveData, getData, deleteData, clearAllData, getAllKeys, getAllData } from './services/Storage.js';
|
|
11
|
+
*
|
|
12
|
+
* // Save
|
|
13
|
+
* saveData('user', { name: 'Juan', age: 30 });
|
|
14
|
+
*
|
|
15
|
+
* // Read
|
|
16
|
+
* const user = getData('user');
|
|
17
|
+
*
|
|
18
|
+
* // Delete
|
|
19
|
+
* deleteData('user');
|
|
20
|
+
*
|
|
21
|
+
* // Clear everything
|
|
22
|
+
* clearAllData();
|
|
23
|
+
*
|
|
24
|
+
* // Get all keys
|
|
25
|
+
* const keys = getAllKeys();
|
|
26
|
+
*
|
|
27
|
+
* // Get all data
|
|
28
|
+
* const allData = getAllData();
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
// ========== CREATE / UPDATE ==========
|
|
32
|
+
/**
|
|
33
|
+
* Saves or updates a value in localStorage
|
|
34
|
+
* @param {string} key - Data key
|
|
35
|
+
* @param {any} value - Value to save (string, object, array, number, boolean)
|
|
36
|
+
* @returns {boolean} - true if saved successfully
|
|
37
|
+
*/
|
|
38
|
+
export const saveData = (key, value) => {
|
|
39
|
+
try {
|
|
40
|
+
const serialized = JSON.stringify(value);
|
|
41
|
+
localStorage.setItem(key, serialized);
|
|
42
|
+
return true;
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error("Error saving data:", error);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// ========== READ ==========
|
|
50
|
+
/**
|
|
51
|
+
* Gets a value from localStorage
|
|
52
|
+
* @param {string} key - Data key
|
|
53
|
+
* @returns {any} - The saved value or null if it does not exist
|
|
54
|
+
*/
|
|
55
|
+
export const getData = (key) => {
|
|
56
|
+
try {
|
|
57
|
+
const value = localStorage.getItem(key);
|
|
58
|
+
return value !== null ? JSON.parse(value) : null;
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.error("Error reading data:", error);
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// ========== READ (direct synchronous) ==========
|
|
66
|
+
/**
|
|
67
|
+
* Gets a value from localStorage synchronously (alias of getData)
|
|
68
|
+
* @param {string} key - Data key
|
|
69
|
+
* @returns {any} - The saved value or null if it does not exist
|
|
70
|
+
*/
|
|
71
|
+
export const getDataSync = (key) => {
|
|
72
|
+
return getData(key);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// ========== UPDATE ==========
|
|
76
|
+
/**
|
|
77
|
+
* Updates an existing value (only if it exists)
|
|
78
|
+
* @param {string} key - Data key
|
|
79
|
+
* @param {any} newValue - New value
|
|
80
|
+
* @returns {boolean} - true if updated, false if it did not exist
|
|
81
|
+
*/
|
|
82
|
+
export const updateData = (key, newValue) => {
|
|
83
|
+
try {
|
|
84
|
+
const exists = localStorage.getItem(key);
|
|
85
|
+
if (exists === null) return false;
|
|
86
|
+
|
|
87
|
+
localStorage.setItem(key, JSON.stringify(newValue));
|
|
88
|
+
return true;
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error("Error updating data:", error);
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// ========== DELETE ==========
|
|
96
|
+
/**
|
|
97
|
+
* Deletes a value from localStorage
|
|
98
|
+
* @param {string} key - Data key
|
|
99
|
+
* @returns {boolean} - true if removed successfully
|
|
100
|
+
*/
|
|
101
|
+
export const deleteData = (key) => {
|
|
102
|
+
try {
|
|
103
|
+
localStorage.removeItem(key);
|
|
104
|
+
return true;
|
|
105
|
+
} catch (error) {
|
|
106
|
+
console.error("Error deleting data:", error);
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// ========== DELETE ALL ==========
|
|
112
|
+
/**
|
|
113
|
+
* Deletes ALL data from localStorage
|
|
114
|
+
* @returns {boolean} - true if cleared successfully
|
|
115
|
+
*/
|
|
116
|
+
export const clearAllData = () => {
|
|
117
|
+
try {
|
|
118
|
+
localStorage.clear();
|
|
119
|
+
return true;
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.error("Error clearing data:", error);
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
// ========== UTILS ==========
|
|
127
|
+
/**
|
|
128
|
+
* Checks whether a key exists in localStorage
|
|
129
|
+
* @param {string} key - Key to check
|
|
130
|
+
* @returns {boolean} - true if it exists
|
|
131
|
+
*/
|
|
132
|
+
export const hasData = (key) => {
|
|
133
|
+
try {
|
|
134
|
+
return localStorage.getItem(key) !== null;
|
|
135
|
+
} catch (error) {
|
|
136
|
+
console.error("Error checking data:", error);
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Gets all keys saved in localStorage
|
|
143
|
+
* @returns {string[]} - Array of keys
|
|
144
|
+
*/
|
|
145
|
+
export const getAllKeys = () => {
|
|
146
|
+
try {
|
|
147
|
+
const keys = [];
|
|
148
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
149
|
+
const key = localStorage.key(i);
|
|
150
|
+
if (key) keys.push(key);
|
|
151
|
+
}
|
|
152
|
+
return keys;
|
|
153
|
+
} catch (error) {
|
|
154
|
+
console.error("Error getting all keys:", error);
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Gets all data saved in localStorage
|
|
161
|
+
* @returns {Object} - Object with all keys and values
|
|
162
|
+
*/
|
|
163
|
+
export const getAllData = () => {
|
|
164
|
+
try {
|
|
165
|
+
const result = {};
|
|
166
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
167
|
+
const key = localStorage.key(i);
|
|
168
|
+
if (key) {
|
|
169
|
+
try {
|
|
170
|
+
const value = localStorage.getItem(key);
|
|
171
|
+
result[key] = value !== null ? JSON.parse(value) : null;
|
|
172
|
+
} catch {
|
|
173
|
+
result[key] = localStorage.getItem(key);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return result;
|
|
178
|
+
} catch (error) {
|
|
179
|
+
console.error("Error getting all data:", error);
|
|
180
|
+
return {};
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Gets the approximate size used in localStorage (in bytes)
|
|
186
|
+
* @returns {number} - Size in bytes
|
|
187
|
+
*/
|
|
188
|
+
export const getStorageSize = () => {
|
|
189
|
+
try {
|
|
190
|
+
let total = 0;
|
|
191
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
192
|
+
const key = localStorage.key(i);
|
|
193
|
+
if (key) {
|
|
194
|
+
const value = localStorage.getItem(key);
|
|
195
|
+
total += (key.length + (value?.length || 0)) * 2;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return total;
|
|
199
|
+
} catch (error) {
|
|
200
|
+
console.error("Error getting storage size:", error);
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Deletes data by key prefix
|
|
207
|
+
* @param {string} prefix - Prefix of the keys to delete
|
|
208
|
+
* @returns {number} - Number of deleted items
|
|
209
|
+
*/
|
|
210
|
+
export const deleteDataByPrefix = (prefix) => {
|
|
211
|
+
try {
|
|
212
|
+
let deleted = 0;
|
|
213
|
+
const keysToRemove = [];
|
|
214
|
+
|
|
215
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
216
|
+
const key = localStorage.key(i);
|
|
217
|
+
if (key && key.startsWith(prefix)) {
|
|
218
|
+
keysToRemove.push(key);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
keysToRemove.forEach((key) => {
|
|
223
|
+
localStorage.removeItem(key);
|
|
224
|
+
deleted++;
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
return deleted;
|
|
228
|
+
} catch (error) {
|
|
229
|
+
console.error("Error deleting data by prefix:", error);
|
|
230
|
+
return 0;
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Deletes data by key suffix
|
|
236
|
+
* @param {string} suffix - Suffix of the keys to delete
|
|
237
|
+
* @returns {number} - Number of deleted items
|
|
238
|
+
*/
|
|
239
|
+
export const deleteDataBySuffix = (suffix) => {
|
|
240
|
+
try {
|
|
241
|
+
let deleted = 0;
|
|
242
|
+
const keysToRemove = [];
|
|
243
|
+
|
|
244
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
245
|
+
const key = localStorage.key(i);
|
|
246
|
+
if (key && key.endsWith(suffix)) {
|
|
247
|
+
keysToRemove.push(key);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
keysToRemove.forEach((key) => {
|
|
252
|
+
localStorage.removeItem(key);
|
|
253
|
+
deleted++;
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
return deleted;
|
|
257
|
+
} catch (error) {
|
|
258
|
+
console.error("Error deleting data by suffix:", error);
|
|
259
|
+
return 0;
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Gets the total number of items in localStorage
|
|
265
|
+
* @returns {number} - Number of items
|
|
266
|
+
*/
|
|
267
|
+
export const getItemCount = () => {
|
|
268
|
+
try {
|
|
269
|
+
return localStorage.length;
|
|
270
|
+
} catch (error) {
|
|
271
|
+
console.error("Error getting item count:", error);
|
|
272
|
+
return 0;
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Checks whether localStorage is available
|
|
278
|
+
* @returns {boolean} - true if available
|
|
279
|
+
*/
|
|
280
|
+
export const isStorageAvailable = () => {
|
|
281
|
+
try {
|
|
282
|
+
const test = "__storage_test__";
|
|
283
|
+
localStorage.setItem(test, test);
|
|
284
|
+
localStorage.removeItem(test);
|
|
285
|
+
return true;
|
|
286
|
+
} catch (e) {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
// ========== EXPORT DEFAULT ==========
|
|
292
|
+
const Storage = {
|
|
293
|
+
saveData,
|
|
294
|
+
getData,
|
|
295
|
+
getDataSync,
|
|
296
|
+
updateData,
|
|
297
|
+
deleteData,
|
|
298
|
+
clearAllData,
|
|
299
|
+
hasData,
|
|
300
|
+
getAllKeys,
|
|
301
|
+
getAllData,
|
|
302
|
+
getStorageSize,
|
|
303
|
+
deleteDataByPrefix,
|
|
304
|
+
deleteDataBySuffix,
|
|
305
|
+
getItemCount,
|
|
306
|
+
isStorageAvailable,
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
export default Storage;
|