@trackunit/react-core-hooks 0.2.192 → 0.2.194

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/index.cjs.js CHANGED
@@ -162,6 +162,89 @@ const useFilterBarContext = () => {
162
162
  */
163
163
  const FilterBarProvider = (props) => jsxRuntime.jsx(FilterBarContext.Provider, Object.assign({}, props));
164
164
 
165
+ const TokenContext = React__namespace.createContext(null);
166
+ /**
167
+ * This is a hook to use the TokenContext.
168
+ *
169
+ * @requires TokenProvider
170
+ * @example
171
+ * import { useToken } from "@trackunit/react-core-hooks";
172
+ * const { token } = useToken();
173
+ * @see {@link ITokenContext}
174
+ */
175
+ const useToken = () => {
176
+ const context = React__namespace.useContext(TokenContext);
177
+ if (!context) {
178
+ throw new Error("useToken must be used within the TokenContext");
179
+ }
180
+ return context;
181
+ };
182
+ /**
183
+ * This is a provider for the TokenContext.
184
+ */
185
+ const TokenProvider = (props) => {
186
+ return jsxRuntime.jsx(TokenContext.Provider, Object.assign({}, props));
187
+ };
188
+
189
+ const base64ToBlob = (base64, contentType = "") => {
190
+ const result = base64.split(",");
191
+ if (result.length === 2 && result[1]) {
192
+ const byteCharacters = atob(result[1]);
193
+ const byteArrays = [];
194
+ for (let offset = 0; offset < byteCharacters.length; offset += 512) {
195
+ const slice = byteCharacters.slice(offset, offset + 512);
196
+ const byteNumbers = new Array(slice.length);
197
+ for (let i = 0; i < slice.length; i++) {
198
+ byteNumbers[i] = slice.charCodeAt(i);
199
+ }
200
+ const byteArray = new Uint8Array(byteNumbers);
201
+ byteArrays.push(byteArray);
202
+ }
203
+ return new Blob(byteArrays, { type: contentType });
204
+ }
205
+ throw new Error();
206
+ };
207
+ /**
208
+ * useImageUploader
209
+ *
210
+ * @description Hook for uploading an image
211
+ * @param {Function} uploadImage - function for uploading an image
212
+ * @param {boolean} loading - loading state
213
+ * @returns {object} uploadImage - function for uploading an image, loading - loading state
214
+ */
215
+ const useImageUploader = () => {
216
+ const { token } = useToken();
217
+ const [loading, setLoading] = React.useState(false);
218
+ const uploadImage = React.useCallback(({ postUrl, base64Image, type }) => {
219
+ setLoading(true);
220
+ return new Promise((resolve, reject) => {
221
+ const formData = new FormData();
222
+ const blob = base64ToBlob(base64Image);
223
+ formData.append("file", blob, `file.${type}`);
224
+ fetch(postUrl, {
225
+ method: "POST",
226
+ body: formData,
227
+ headers: {
228
+ Authorization: `Bearer ${token}`,
229
+ },
230
+ }).then(response => {
231
+ setLoading(false);
232
+ if (response.status === 413) {
233
+ reject("status 413 - maximumSizeExceeded");
234
+ }
235
+ if (!response.ok) {
236
+ reject("response not OK - saveError");
237
+ }
238
+ resolve(true);
239
+ });
240
+ });
241
+ }, [token]);
242
+ return {
243
+ uploadImage,
244
+ loading,
245
+ };
246
+ };
247
+
165
248
  const OemBrandingContext = React.createContext(null);
166
249
  /**
167
250
  * This is a hook to use the IOemBrandingContext.
@@ -562,30 +645,6 @@ const useToast = () => {
562
645
  return toastContext;
563
646
  };
564
647
 
565
- const TokenContext = React__namespace.createContext(null);
566
- /**
567
- * This is a hook to use the TokenContext.
568
- *
569
- * @requires TokenProvider
570
- * @example
571
- * import { useToken } from "@trackunit/react-core-hooks";
572
- * const { token } = useToken();
573
- * @see {@link ITokenContext}
574
- */
575
- const useToken = () => {
576
- const context = React__namespace.useContext(TokenContext);
577
- if (!context) {
578
- throw new Error("useToken must be used within the TokenContext");
579
- }
580
- return context;
581
- };
582
- /**
583
- * This is a provider for the TokenContext.
584
- */
585
- const TokenProvider = (props) => {
586
- return jsxRuntime.jsx(TokenContext.Provider, Object.assign({}, props));
587
- };
588
-
589
648
  /**
590
649
  * Hook for filtering a list of items by text search, client side search in a list.
591
650
  *
@@ -743,6 +802,7 @@ exports.useEnvironment = useEnvironment;
743
802
  exports.useEventRuntime = useEventRuntime;
744
803
  exports.useFilterBarContext = useFilterBarContext;
745
804
  exports.useHasAccessTo = useHasAccessTo;
805
+ exports.useImageUploader = useImageUploader;
746
806
  exports.useIrisAppId = useIrisAppId;
747
807
  exports.useIrisAppName = useIrisAppName;
748
808
  exports.useNavigateInHost = useNavigateInHost;
package/index.esm.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { createContext, useContext, useState, useEffect, useMemo } from 'react';
2
+ import { createContext, useContext, useState, useCallback, useEffect, useMemo } from 'react';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
  import { AssetRuntime, CustomerRuntime, EventRuntime, ParamsRuntime, SiteRuntime } from '@trackunit/iris-app-runtime-core';
5
5
  import { filterByMultiple } from '@trackunit/shared-utils';
@@ -139,6 +139,89 @@ const useFilterBarContext = () => {
139
139
  */
140
140
  const FilterBarProvider = (props) => jsx(FilterBarContext.Provider, Object.assign({}, props));
141
141
 
142
+ const TokenContext = React.createContext(null);
143
+ /**
144
+ * This is a hook to use the TokenContext.
145
+ *
146
+ * @requires TokenProvider
147
+ * @example
148
+ * import { useToken } from "@trackunit/react-core-hooks";
149
+ * const { token } = useToken();
150
+ * @see {@link ITokenContext}
151
+ */
152
+ const useToken = () => {
153
+ const context = React.useContext(TokenContext);
154
+ if (!context) {
155
+ throw new Error("useToken must be used within the TokenContext");
156
+ }
157
+ return context;
158
+ };
159
+ /**
160
+ * This is a provider for the TokenContext.
161
+ */
162
+ const TokenProvider = (props) => {
163
+ return jsx(TokenContext.Provider, Object.assign({}, props));
164
+ };
165
+
166
+ const base64ToBlob = (base64, contentType = "") => {
167
+ const result = base64.split(",");
168
+ if (result.length === 2 && result[1]) {
169
+ const byteCharacters = atob(result[1]);
170
+ const byteArrays = [];
171
+ for (let offset = 0; offset < byteCharacters.length; offset += 512) {
172
+ const slice = byteCharacters.slice(offset, offset + 512);
173
+ const byteNumbers = new Array(slice.length);
174
+ for (let i = 0; i < slice.length; i++) {
175
+ byteNumbers[i] = slice.charCodeAt(i);
176
+ }
177
+ const byteArray = new Uint8Array(byteNumbers);
178
+ byteArrays.push(byteArray);
179
+ }
180
+ return new Blob(byteArrays, { type: contentType });
181
+ }
182
+ throw new Error();
183
+ };
184
+ /**
185
+ * useImageUploader
186
+ *
187
+ * @description Hook for uploading an image
188
+ * @param {Function} uploadImage - function for uploading an image
189
+ * @param {boolean} loading - loading state
190
+ * @returns {object} uploadImage - function for uploading an image, loading - loading state
191
+ */
192
+ const useImageUploader = () => {
193
+ const { token } = useToken();
194
+ const [loading, setLoading] = useState(false);
195
+ const uploadImage = useCallback(({ postUrl, base64Image, type }) => {
196
+ setLoading(true);
197
+ return new Promise((resolve, reject) => {
198
+ const formData = new FormData();
199
+ const blob = base64ToBlob(base64Image);
200
+ formData.append("file", blob, `file.${type}`);
201
+ fetch(postUrl, {
202
+ method: "POST",
203
+ body: formData,
204
+ headers: {
205
+ Authorization: `Bearer ${token}`,
206
+ },
207
+ }).then(response => {
208
+ setLoading(false);
209
+ if (response.status === 413) {
210
+ reject("status 413 - maximumSizeExceeded");
211
+ }
212
+ if (!response.ok) {
213
+ reject("response not OK - saveError");
214
+ }
215
+ resolve(true);
216
+ });
217
+ });
218
+ }, [token]);
219
+ return {
220
+ uploadImage,
221
+ loading,
222
+ };
223
+ };
224
+
142
225
  const OemBrandingContext = createContext(null);
143
226
  /**
144
227
  * This is a hook to use the IOemBrandingContext.
@@ -539,30 +622,6 @@ const useToast = () => {
539
622
  return toastContext;
540
623
  };
541
624
 
542
- const TokenContext = React.createContext(null);
543
- /**
544
- * This is a hook to use the TokenContext.
545
- *
546
- * @requires TokenProvider
547
- * @example
548
- * import { useToken } from "@trackunit/react-core-hooks";
549
- * const { token } = useToken();
550
- * @see {@link ITokenContext}
551
- */
552
- const useToken = () => {
553
- const context = React.useContext(TokenContext);
554
- if (!context) {
555
- throw new Error("useToken must be used within the TokenContext");
556
- }
557
- return context;
558
- };
559
- /**
560
- * This is a provider for the TokenContext.
561
- */
562
- const TokenProvider = (props) => {
563
- return jsx(TokenContext.Provider, Object.assign({}, props));
564
- };
565
-
566
625
  /**
567
626
  * Hook for filtering a list of items by text search, client side search in a list.
568
627
  *
@@ -694,4 +753,4 @@ const useCurrentUser = () => {
694
753
  return context;
695
754
  };
696
755
 
697
- export { AnalyticsContext, AnalyticsContextProvider, AssetSortingProvider, ConfirmationDialogProvider, CurrentUserPreferenceProvider, CurrentUserProvider, EnvironmentContextProvider, FilterBarProvider, NavigationContextProvider, OemBrandingContextProvider, ToastProvider, TokenProvider, UserSubscriptionProvider, useAnalytics, useAssetRuntime, useAssetSorting, useConfirmationDialog, useCurrentUser, useCurrentUserLanguage, useCurrentUserSystemOfMeasurement, useCurrentUserTimeZonePreference, useCustomerRuntime, useEnvironment, useEventRuntime, useFilterBarContext, useHasAccessTo, useIrisAppId, useIrisAppName, useNavigateInHost, useOemBrandingContext, useSiteRuntime, useTextSearch, useToast, useToken, useUserSubscription };
756
+ export { AnalyticsContext, AnalyticsContextProvider, AssetSortingProvider, ConfirmationDialogProvider, CurrentUserPreferenceProvider, CurrentUserProvider, EnvironmentContextProvider, FilterBarProvider, NavigationContextProvider, OemBrandingContextProvider, ToastProvider, TokenProvider, UserSubscriptionProvider, useAnalytics, useAssetRuntime, useAssetSorting, useConfirmationDialog, useCurrentUser, useCurrentUserLanguage, useCurrentUserSystemOfMeasurement, useCurrentUserTimeZonePreference, useCustomerRuntime, useEnvironment, useEventRuntime, useFilterBarContext, useHasAccessTo, useImageUploader, useIrisAppId, useIrisAppName, useNavigateInHost, useOemBrandingContext, useSiteRuntime, useTextSearch, useToast, useToken, useUserSubscription };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trackunit/react-core-hooks",
3
- "version": "0.2.192",
3
+ "version": "0.2.194",
4
4
  "repository": "https://github.com/Trackunit/manager",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "engines": {
@@ -0,0 +1,21 @@
1
+ export interface UploadedFile {
2
+ id: string;
3
+ name: string;
4
+ __typename?: string;
5
+ }
6
+ /**
7
+ * useImageUploader
8
+ *
9
+ * @description Hook for uploading an image
10
+ * @param {Function} uploadImage - function for uploading an image
11
+ * @param {boolean} loading - loading state
12
+ * @returns {object} uploadImage - function for uploading an image, loading - loading state
13
+ */
14
+ export declare const useImageUploader: () => {
15
+ uploadImage: ({ postUrl, base64Image, type }: {
16
+ base64Image: string;
17
+ postUrl: URL;
18
+ type: "jpeg" | "png";
19
+ }) => Promise<unknown>;
20
+ loading: boolean;
21
+ };
package/src/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export * from "./assetSorting/AssetSortingProvider";
3
3
  export * from "./confirmationDialog/ConfirmationDialogProvider";
4
4
  export * from "./environment/EnvironmentContextProvider";
5
5
  export * from "./filter-bar/FilterBarProvider";
6
+ export * from "./images/useImageUploader";
6
7
  export * from "./irisOemApp/IrisOemAppContextProvider";
7
8
  export * from "./navigation/NavigationContextProvider";
8
9
  export * from "./runtimes/useAssetRuntime";