@bit.rhplus/data 0.0.26 → 0.0.28

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/dist/index.d.ts CHANGED
@@ -1,7 +1,4 @@
1
- export default function useData(): {
2
- fetchData: (api: any, data: any, accessToken: any) => Promise<any>;
3
- fetchDataUIAsync: (api: any, data: any, accessToken: any) => Promise<any>;
4
- getFileURL: (content: any, type: any) => string;
5
- downloadFileURL: (content: any, type: any, fileName: any) => void;
6
- };
1
+ export default useData;
2
+ export { useFileDownload } from "./useFileDownload";
3
+ import useData from './useData';
7
4
  export { useApiQuery, useApiQuerySilence, useStaticQuery } from "./reactQuery";
package/dist/index.js CHANGED
@@ -1,66 +1,5 @@
1
- import { FetchData, errorNotification } from '@bit.rhplus/api';
2
- // import { useOidcAccessToken } from "@axa-fr/react-oidc";
3
- export default function useData() {
4
- // let accessToken = null;
5
- // try {
6
- // const oidcToken = useOidcAccessToken();
7
- // accessToken = oidcToken?.accessToken || null;
8
- // console.log("🚀 ~ useData ~ accessToken:", accessToken)
9
- // } catch (err) {
10
- // // Kontext OIDC není dostupný – pokračujeme bez tokenu
11
- // errorNotification('OIDC není dostupné. Pravděpodobně chybí OidcProvider.', err);
12
- // }
13
- /* eslint-disable */
14
- const fetchData = (api, data, accessToken) => FetchData(api, data, accessToken);
15
- const fetchDataUIAsync = async (api, data, accessToken) => {
16
- try {
17
- const result = await fetchData(api, data, accessToken);
18
- return {
19
- ...result,
20
- result: 'success',
21
- success: true
22
- };
23
- }
24
- catch (error) {
25
- errorNotification(error);
26
- return {
27
- result: 'fail',
28
- success: false,
29
- error
30
- };
31
- }
32
- };
33
- const getFileURL = (content, type) => {
34
- const isBase64 = typeof content === 'string' && /^[A-Za-z0-9+/=]+$/.test(content);
35
- let byteArray;
36
- if (isBase64) {
37
- const byteCharacters = atob(content);
38
- const byteNumbers = new Array(byteCharacters.length);
39
- for (let i = 0; i < byteCharacters.length; i += 1) {
40
- byteNumbers[i] = byteCharacters.charCodeAt(i);
41
- }
42
- byteArray = new Uint8Array(byteNumbers);
43
- }
44
- else {
45
- byteArray = new Uint8Array(content);
46
- }
47
- const blob = new Blob([byteArray], { type });
48
- const fileUrl = window.URL.createObjectURL(blob);
49
- return fileUrl;
50
- };
51
- const downloadFileURL = (content, type, fileName) => {
52
- const fileURL = getFileURL(content, type);
53
- const tempLink = document.createElement("a");
54
- tempLink.href = fileURL;
55
- tempLink.download = fileName;
56
- tempLink.click();
57
- };
58
- return {
59
- fetchData,
60
- fetchDataUIAsync,
61
- getFileURL,
62
- downloadFileURL
63
- };
64
- }
1
+ import useData from './useData';
2
+ export default useData;
3
+ export { useFileDownload } from './useFileDownload';
65
4
  export { useApiQuery, useApiQuerySilence, useStaticQuery } from './reactQuery';
66
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,2DAA2D;AAE3D,MAAM,CAAC,OAAO,UAAU,OAAO;IAE7B,0BAA0B;IAE1B,QAAQ;IACR,4CAA4C;IAC5C,kDAAkD;IAClD,4DAA4D;IAC5D,kBAAkB;IAClB,2DAA2D;IAC3D,qFAAqF;IACrF,IAAI;IAEJ,oBAAoB;IACpB,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAEhF,MAAM,gBAAgB,GAAG,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE;QACxD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YACvD,OAAO;gBACL,GAAG,MAAM;gBACT,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,KAAK;gBACd,KAAK;aACN,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;QACnC,MAAM,QAAQ,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAElF,IAAI,SAAS,CAAC;QACd,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,WAAW,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAChD,CAAC;YACD,SAAS,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QAClD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC7C,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC;QACxB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO;QACL,SAAS;QACT,gBAAgB;QAChB,UAAU;QACV,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.js"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,eAAe,OAAO,CAAC;AACvB,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC"}
@@ -0,0 +1,7 @@
1
+ export default function useData(): {
2
+ fetchData: (api: any, data: any, accessToken: any) => Promise<any>;
3
+ fetchDataUIAsync: (api: any, data: any, accessToken: any) => Promise<any>;
4
+ getFileURL: (content: any, type: any) => string;
5
+ downloadFileURL: (content: any, type: any, fileName: any) => void;
6
+ };
7
+ export { useApiQuery, useApiQuerySilence, useStaticQuery } from "./reactQuery";
@@ -0,0 +1,125 @@
1
+ /* eslint-disable */
2
+ import { useState } from 'react';
3
+ import { FetchData, errorNotification } from '@bit.rhplus/api';
4
+ // import { useOidcAccessToken } from "@axa-fr/react-oidc";
5
+ export default function useData() {
6
+ const [isDownloading, setIsDownloading] = useState(false);
7
+ const [error, setError] = useState('');
8
+ // let accessToken = null;
9
+ // try {
10
+ // const oidcToken = useOidcAccessToken();
11
+ // accessToken = oidcToken?.accessToken || null;
12
+ // console.log("🚀 ~ useData ~ accessToken:", accessToken)
13
+ // } catch (err) {
14
+ // // Kontext OIDC není dostupný – pokračujeme bez tokenu
15
+ // errorNotification('OIDC není dostupné. Pravděpodobně chybí OidcProvider.', err);
16
+ // }
17
+ /* eslint-disable */
18
+ const fetchData = (api, data, accessToken) => FetchData(api, data, accessToken);
19
+ const fetchDataUIAsync = async (api, data, accessToken) => {
20
+ try {
21
+ const result = await fetchData(api, data, accessToken);
22
+ return {
23
+ ...result,
24
+ result: 'success',
25
+ success: true,
26
+ };
27
+ }
28
+ catch (error) {
29
+ errorNotification(error);
30
+ return {
31
+ result: 'fail',
32
+ success: false,
33
+ error,
34
+ };
35
+ }
36
+ };
37
+ const getFileURL = (content, type) => {
38
+ const isBase64 = typeof content === 'string' && /^[A-Za-z0-9+/=]+$/.test(content);
39
+ let byteArray;
40
+ if (isBase64) {
41
+ const byteCharacters = atob(content);
42
+ const byteNumbers = new Array(byteCharacters.length);
43
+ for (let i = 0; i < byteCharacters.length; i += 1) {
44
+ byteNumbers[i] = byteCharacters.charCodeAt(i);
45
+ }
46
+ byteArray = new Uint8Array(byteNumbers);
47
+ }
48
+ else {
49
+ byteArray = new Uint8Array(content);
50
+ }
51
+ const blob = new Blob([byteArray], { type });
52
+ const fileUrl = window.URL.createObjectURL(blob);
53
+ return fileUrl;
54
+ };
55
+ const downloadFileURL = (content, type, fileName) => {
56
+ setIsDownloading(true);
57
+ setError('');
58
+ try {
59
+ const fileURL = getFileURL(content, type);
60
+ const tempLink = document.createElement('a');
61
+ tempLink.href = fileURL;
62
+ tempLink.download = fileName;
63
+ tempLink.click();
64
+ }
65
+ catch (err) {
66
+ console.error('Chyba při stahování:', err);
67
+ setError(`Chyba při stahování souboru: ${err.message}`);
68
+ }
69
+ finally {
70
+ setIsDownloading(false);
71
+ }
72
+ };
73
+ // const downloadFile = async () => {
74
+ // setIsDownloading(true);
75
+ // setError('');
76
+ // try {
77
+ // const response = await fetch(`/api/document/download/${documentId}`, {
78
+ // method: 'GET',
79
+ // headers: {
80
+ // Accept: '*/*',
81
+ // },
82
+ // });
83
+ // if (!response.ok) {
84
+ // throw new Error(`Chyba serveru: ${response.status}`);
85
+ // }
86
+ // // Získáme blob z odpovědi
87
+ // const blob = await response.blob();
88
+ // // Získáme název souboru z Content-Disposition hlavičky nebo použijeme předaný název
89
+ // const contentDisposition = response.headers.get('content-disposition');
90
+ // let downloadFileName = fileName;
91
+ // if (contentDisposition) {
92
+ // const fileNameMatch = contentDisposition.match(
93
+ // /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/
94
+ // );
95
+ // if (fileNameMatch && fileNameMatch[1]) {
96
+ // // Odstraníme uvozovky pokud jsou
97
+ // downloadFileName = fileNameMatch[1].replace(/['"]/g, '');
98
+ // }
99
+ // }
100
+ // // Vytvoříme URL pro blob a spustíme stahování
101
+ // const url = window.URL.createObjectURL(blob);
102
+ // const link = document.createElement('a');
103
+ // link.href = url;
104
+ // link.download = downloadFileName || `soubor_${documentId}`;
105
+ // document.body.appendChild(link);
106
+ // link.click();
107
+ // // Vyčistíme po sobě
108
+ // window.URL.revokeObjectURL(url);
109
+ // document.body.removeChild(link);
110
+ // } catch (err) {
111
+ // console.error('Chyba při stahování:', err);
112
+ // setError(`Chyba při stahování souboru: ${err.message}`);
113
+ // } finally {
114
+ // setIsDownloading(false);
115
+ // }
116
+ // };
117
+ return {
118
+ fetchData,
119
+ fetchDataUIAsync,
120
+ getFileURL,
121
+ downloadFileURL,
122
+ };
123
+ }
124
+ export { useApiQuery, useApiQuerySilence, useStaticQuery } from './reactQuery';
125
+ //# sourceMappingURL=useData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useData.js","sourceRoot":"","sources":["../useData.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export function useFileDownload(options?: {}): {
2
+ isDownloading: boolean;
3
+ error: string;
4
+ downloadFile: (api: any, data: any, fileName?: null) => Promise<{
5
+ success: boolean;
6
+ error: string;
7
+ fileName?: undefined;
8
+ size?: undefined;
9
+ errorMessage?: undefined;
10
+ } | {
11
+ success: boolean;
12
+ fileName: null;
13
+ size: any;
14
+ error?: undefined;
15
+ errorMessage?: undefined;
16
+ } | {
17
+ success: boolean;
18
+ error: unknown;
19
+ errorMessage: string;
20
+ fileName?: undefined;
21
+ size?: undefined;
22
+ }>;
23
+ reset: () => void;
24
+ };
@@ -0,0 +1,131 @@
1
+ /* eslint-disable */
2
+ // hooks/useFileDownload.js
3
+ import { useState, useCallback } from 'react';
4
+ import useData from '.';
5
+ export const useFileDownload = (options = {}) => {
6
+ const { onDownloadStart, onDownloadEnd, onDownloadSuccess, onDownloadError, onLoadingChange, accessToken, } = options;
7
+ const { fetchData } = useData();
8
+ const [isDownloading, setIsDownloading] = useState(false);
9
+ const [error, setError] = useState('');
10
+ const downloadFile = useCallback(async (api, data, fileName = null) => {
11
+ if (isDownloading) {
12
+ console.warn('Download already in progress');
13
+ return { success: false, error: 'Download already in progress' };
14
+ }
15
+ setIsDownloading(true);
16
+ setError('');
17
+ // Notify o začátku stahování
18
+ onDownloadStart?.();
19
+ onLoadingChange?.(true);
20
+ try {
21
+ const response = await fetchData(api, data, accessToken);
22
+ const blob = response.data;
23
+ // Získáme název souboru z Content-Disposition hlavičky nebo použijeme předaný název
24
+ let downloadFileName = fileName;
25
+ // Zkus získat filename ze serverových headers
26
+ if (response.headers) {
27
+ let contentDisposition;
28
+ // Různé způsoby jak získat header (záleží na struktuře response)
29
+ if (typeof response.headers.get === 'function') {
30
+ contentDisposition = response.headers.get('content-disposition');
31
+ }
32
+ else if (response.headers['content-disposition']) {
33
+ contentDisposition = response.headers['content-disposition'];
34
+ }
35
+ if (contentDisposition) {
36
+ const fileNameMatch = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);
37
+ if (fileNameMatch && fileNameMatch[1]) {
38
+ downloadFileName = fileNameMatch[1].replace(/['"]/g, '');
39
+ }
40
+ }
41
+ }
42
+ // Vytvoříme URL pro blob
43
+ const objectUrl = window.URL.createObjectURL(blob);
44
+ // METODA: Pouze Save As dialog bez otevření PDF
45
+ const newWindow = window.open('', '_blank');
46
+ if (newWindow) {
47
+ // Okamžitě vytvoř download link v prázdném okně
48
+ const link = newWindow.document.createElement('a');
49
+ link.href = objectUrl;
50
+ link.download = downloadFileName || 'soubor.pdf';
51
+ newWindow.document.body.appendChild(link);
52
+ link.click();
53
+ // Zavři prázdné okno okamžitě
54
+ setTimeout(() => {
55
+ newWindow.close();
56
+ }, 100);
57
+ }
58
+ else {
59
+ // Fallback pokud jsou zablokovány popup okna
60
+ console.warn('⚠️ Popup blokováno, zkouším fallback metodu');
61
+ const link = document.createElement('a');
62
+ link.style.display = 'none';
63
+ link.href = objectUrl;
64
+ link.download = downloadFileName || 'soubor.pdf';
65
+ document.body.appendChild(link);
66
+ // Zkus více způsobů kliknutí
67
+ try {
68
+ link.click();
69
+ }
70
+ catch (e) {
71
+ const event = new MouseEvent('click', {
72
+ view: window,
73
+ bubbles: true,
74
+ cancelable: true,
75
+ });
76
+ link.dispatchEvent(event);
77
+ }
78
+ // Cleanup
79
+ setTimeout(() => {
80
+ document.body.removeChild(link);
81
+ }, 100);
82
+ }
83
+ // Cleanup URL s kratším delayem
84
+ setTimeout(() => {
85
+ window.URL.revokeObjectURL(objectUrl);
86
+ }, 1000);
87
+ // Success callback
88
+ onDownloadSuccess?.(downloadFileName, blob.size);
89
+ return {
90
+ success: true,
91
+ fileName: downloadFileName,
92
+ size: blob.size,
93
+ };
94
+ }
95
+ catch (err) {
96
+ console.error('Chyba při stahování:', err);
97
+ const errorMessage = `Chyba při stahování souboru: ${err.message}`;
98
+ setError(errorMessage);
99
+ onDownloadError?.(err, errorMessage);
100
+ return {
101
+ success: false,
102
+ error: err,
103
+ errorMessage,
104
+ };
105
+ }
106
+ finally {
107
+ setIsDownloading(false);
108
+ onDownloadEnd?.();
109
+ onLoadingChange?.(false);
110
+ }
111
+ }, [
112
+ isDownloading,
113
+ onDownloadStart,
114
+ onDownloadEnd,
115
+ onDownloadSuccess,
116
+ onDownloadError,
117
+ onLoadingChange,
118
+ accessToken,
119
+ fetchData,
120
+ ]);
121
+ const reset = useCallback(() => {
122
+ setError('');
123
+ }, []);
124
+ return {
125
+ isDownloading,
126
+ error,
127
+ downloadFile,
128
+ reset,
129
+ };
130
+ };
131
+ //# sourceMappingURL=useFileDownload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFileDownload.js","sourceRoot":"","sources":["../useFileDownload.js"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,2BAA2B;AAC3B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,OAAO,MAAM,GAAG,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE;IAC9C,MAAM,EACJ,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,WAAW,GACZ,GAAG,OAAO,CAAC;IACZ,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,CAAC;IAChC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,EAAE;QACnC,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;QACnE,CAAC;QACD,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,6BAA6B;QAC7B,eAAe,EAAE,EAAE,CAAC;QACpB,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAE3B,oFAAoF;YACpF,IAAI,gBAAgB,GAAG,QAAQ,CAAC;YAEhC,8CAA8C;YAC9C,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAI,kBAAkB,CAAC;gBAEvB,iEAAiE;gBACjE,IAAI,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;oBAC/C,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBACnE,CAAC;qBAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC;oBACnD,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;gBAC/D,CAAC;gBAED,IAAI,kBAAkB,EAAE,CAAC;oBACvB,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAC5C,wCAAwC,CACzC,CAAC;oBACF,IAAI,aAAa,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;wBACtC,gBAAgB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAC3D,CAAC;gBACH,CAAC;YACH,CAAC;YACD,yBAAyB;YACzB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAEnD,gDAAgD;YAChD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE5C,IAAI,SAAS,EAAE,CAAC;gBACd,gDAAgD;gBAChD,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBACnD,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;gBACtB,IAAI,CAAC,QAAQ,GAAG,gBAAgB,IAAI,YAAY,CAAC;gBACjD,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;gBAEb,8BAA8B;gBAC9B,UAAU,CAAC,GAAG,EAAE;oBACd,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,CAAC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC;iBAAM,CAAC;gBACN,6CAA6C;gBAC7C,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAE5D,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;gBAC5B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;gBACtB,IAAI,CAAC,QAAQ,GAAG,gBAAgB,IAAI,YAAY,CAAC;gBAEjD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAEhC,6BAA6B;gBAC7B,IAAI,CAAC;oBACH,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE;wBACpC,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,IAAI;wBACb,UAAU,EAAE,IAAI;qBACjB,CAAC,CAAC;oBACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;gBAED,UAAU;gBACV,UAAU,CAAC,GAAG,EAAE;oBACd,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC;YAED,gCAAgC;YAChC,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,mBAAmB;YACnB,iBAAiB,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEjD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,gBAAgB;gBAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;YAC3C,MAAM,YAAY,GAAG,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC;YACnE,QAAQ,CAAC,YAAY,CAAC,CAAC;YACvB,eAAe,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAErC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG;gBACV,YAAY;aACb,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACxB,aAAa,EAAE,EAAE,CAAC;YAClB,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,EACD;QACE,aAAa;QACb,eAAe;QACf,aAAa;QACb,iBAAiB;QACjB,eAAe;QACf,eAAe;QACf,WAAW;QACX,SAAS;KACV,CACF,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC,EAAE,CAAC,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,aAAa;QACb,KAAK;QACL,YAAY;QACZ,KAAK;KACN,CAAC;AACJ,CAAC,CAAC"}
package/index.js CHANGED
@@ -1,74 +1,5 @@
1
- import { FetchData, errorNotification } from '@bit.rhplus/api';
2
- // import { useOidcAccessToken } from "@axa-fr/react-oidc";
1
+ import useData from './useData';
3
2
 
4
- export default function useData() {
5
-
6
- // let accessToken = null;
7
-
8
- // try {
9
- // const oidcToken = useOidcAccessToken();
10
- // accessToken = oidcToken?.accessToken || null;
11
- // console.log("🚀 ~ useData ~ accessToken:", accessToken)
12
- // } catch (err) {
13
- // // Kontext OIDC není dostupný – pokračujeme bez tokenu
14
- // errorNotification('OIDC není dostupné. Pravděpodobně chybí OidcProvider.', err);
15
- // }
16
-
17
- /* eslint-disable */
18
- const fetchData = (api, data, accessToken) => FetchData(api, data, accessToken);
19
-
20
- const fetchDataUIAsync = async (api, data, accessToken) => {
21
- try {
22
- const result = await fetchData(api, data, accessToken);
23
- return {
24
- ...result,
25
- result: 'success',
26
- success: true
27
- };
28
- } catch (error) {
29
- errorNotification(error);
30
- return {
31
- result: 'fail',
32
- success: false,
33
- error
34
- };
35
- }
36
- };
37
-
38
- const getFileURL = (content, type) => {
39
- const isBase64 = typeof content === 'string' && /^[A-Za-z0-9+/=]+$/.test(content);
40
-
41
- let byteArray;
42
- if (isBase64) {
43
- const byteCharacters = atob(content);
44
- const byteNumbers = new Array(byteCharacters.length);
45
- for (let i = 0; i < byteCharacters.length; i += 1) {
46
- byteNumbers[i] = byteCharacters.charCodeAt(i);
47
- }
48
- byteArray = new Uint8Array(byteNumbers);
49
- } else {
50
- byteArray = new Uint8Array(content);
51
- }
52
-
53
- const blob = new Blob([byteArray], { type });
54
- const fileUrl = window.URL.createObjectURL(blob);
55
- return fileUrl;
56
- };
57
-
58
- const downloadFileURL = (content, type, fileName) => {
59
- const fileURL = getFileURL(content, type);
60
- const tempLink = document.createElement("a");
61
- tempLink.href = fileURL;
62
- tempLink.download = fileName;
63
- tempLink.click();
64
- };
65
-
66
- return {
67
- fetchData,
68
- fetchDataUIAsync,
69
- getFileURL,
70
- downloadFileURL
71
- };
72
- }
73
-
74
- export { useApiQuery, useApiQuerySilence, useStaticQuery } from './reactQuery';
3
+ export default useData;
4
+ export {useFileDownload} from './useFileDownload';
5
+ export {useApiQuery, useApiQuerySilence, useStaticQuery} from './reactQuery';
package/package.json CHANGED
@@ -1,21 +1,22 @@
1
1
  {
2
2
  "name": "@bit.rhplus/data",
3
- "version": "0.0.26",
3
+ "version": "0.0.28",
4
4
  "homepage": "https://bit.cloud/remote-scope/data",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "remote-scope",
8
8
  "name": "data",
9
- "version": "0.0.26"
9
+ "version": "0.0.28"
10
10
  },
11
11
  "dependencies": {
12
12
  "@tanstack/react-query": "^5.66.9",
13
- "@bit.rhplus/api": "0.0.2"
13
+ "@bit.rhplus/api": "0.0.27"
14
14
  },
15
15
  "devDependencies": {
16
16
  "@teambit/react.react-env": "1.0.129"
17
17
  },
18
18
  "peerDependencies": {
19
+ "react": "^17.0.0 || ^18.0.0",
19
20
  "@axa-fr/react-oidc": "7.24.1"
20
21
  },
21
22
  "license": "SEE LICENSE IN UNLICENSED",
package/useData.js ADDED
@@ -0,0 +1,142 @@
1
+ /* eslint-disable */
2
+ import { useState } from 'react';
3
+ import { FetchData, errorNotification } from '@bit.rhplus/api';
4
+ // import { useOidcAccessToken } from "@axa-fr/react-oidc";
5
+
6
+ export default function useData() {
7
+ const [isDownloading, setIsDownloading] = useState(false);
8
+ const [error, setError] = useState('');
9
+
10
+ // let accessToken = null;
11
+
12
+ // try {
13
+ // const oidcToken = useOidcAccessToken();
14
+ // accessToken = oidcToken?.accessToken || null;
15
+ // console.log("🚀 ~ useData ~ accessToken:", accessToken)
16
+ // } catch (err) {
17
+ // // Kontext OIDC není dostupný – pokračujeme bez tokenu
18
+ // errorNotification('OIDC není dostupné. Pravděpodobně chybí OidcProvider.', err);
19
+ // }
20
+
21
+ /* eslint-disable */
22
+ const fetchData = (api, data, accessToken) =>
23
+ FetchData(api, data, accessToken);
24
+
25
+ const fetchDataUIAsync = async (api, data, accessToken) => {
26
+ try {
27
+ const result = await fetchData(api, data, accessToken);
28
+ return {
29
+ ...result,
30
+ result: 'success',
31
+ success: true,
32
+ };
33
+ } catch (error) {
34
+ errorNotification(error);
35
+ return {
36
+ result: 'fail',
37
+ success: false,
38
+ error,
39
+ };
40
+ }
41
+ };
42
+
43
+ const getFileURL = (content, type) => {
44
+ const isBase64 =
45
+ typeof content === 'string' && /^[A-Za-z0-9+/=]+$/.test(content);
46
+
47
+ let byteArray;
48
+ if (isBase64) {
49
+ const byteCharacters = atob(content);
50
+ const byteNumbers = new Array(byteCharacters.length);
51
+ for (let i = 0; i < byteCharacters.length; i += 1) {
52
+ byteNumbers[i] = byteCharacters.charCodeAt(i);
53
+ }
54
+ byteArray = new Uint8Array(byteNumbers);
55
+ } else {
56
+ byteArray = new Uint8Array(content);
57
+ }
58
+
59
+ const blob = new Blob([byteArray], { type });
60
+ const fileUrl = window.URL.createObjectURL(blob);
61
+ return fileUrl;
62
+ };
63
+
64
+ const downloadFileURL = (content, type, fileName) => {
65
+ setIsDownloading(true);
66
+ setError('');
67
+
68
+ try {
69
+ const fileURL = getFileURL(content, type);
70
+ const tempLink = document.createElement('a');
71
+ tempLink.href = fileURL;
72
+ tempLink.download = fileName;
73
+ tempLink.click();
74
+ } catch (err) {
75
+ console.error('Chyba při stahování:', err);
76
+ setError(`Chyba při stahování souboru: ${err.message}`);
77
+ } finally {
78
+ setIsDownloading(false);
79
+ }
80
+ };
81
+
82
+ // const downloadFile = async () => {
83
+ // setIsDownloading(true);
84
+ // setError('');
85
+
86
+ // try {
87
+ // const response = await fetch(`/api/document/download/${documentId}`, {
88
+ // method: 'GET',
89
+ // headers: {
90
+ // Accept: '*/*',
91
+ // },
92
+ // });
93
+
94
+ // if (!response.ok) {
95
+ // throw new Error(`Chyba serveru: ${response.status}`);
96
+ // }
97
+
98
+ // // Získáme blob z odpovědi
99
+ // const blob = await response.blob();
100
+
101
+ // // Získáme název souboru z Content-Disposition hlavičky nebo použijeme předaný název
102
+ // const contentDisposition = response.headers.get('content-disposition');
103
+ // let downloadFileName = fileName;
104
+
105
+ // if (contentDisposition) {
106
+ // const fileNameMatch = contentDisposition.match(
107
+ // /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/
108
+ // );
109
+ // if (fileNameMatch && fileNameMatch[1]) {
110
+ // // Odstraníme uvozovky pokud jsou
111
+ // downloadFileName = fileNameMatch[1].replace(/['"]/g, '');
112
+ // }
113
+ // }
114
+
115
+ // // Vytvoříme URL pro blob a spustíme stahování
116
+ // const url = window.URL.createObjectURL(blob);
117
+ // const link = document.createElement('a');
118
+ // link.href = url;
119
+ // link.download = downloadFileName || `soubor_${documentId}`;
120
+ // document.body.appendChild(link);
121
+ // link.click();
122
+
123
+ // // Vyčistíme po sobě
124
+ // window.URL.revokeObjectURL(url);
125
+ // document.body.removeChild(link);
126
+ // } catch (err) {
127
+ // console.error('Chyba při stahování:', err);
128
+ // setError(`Chyba při stahování souboru: ${err.message}`);
129
+ // } finally {
130
+ // setIsDownloading(false);
131
+ // }
132
+ // };
133
+
134
+ return {
135
+ fetchData,
136
+ fetchDataUIAsync,
137
+ getFileURL,
138
+ downloadFileURL,
139
+ };
140
+ }
141
+
142
+ export { useApiQuery, useApiQuerySilence, useStaticQuery } from './reactQuery';
@@ -0,0 +1,157 @@
1
+ /* eslint-disable */
2
+ // hooks/useFileDownload.js
3
+ import { useState, useCallback } from 'react';
4
+ import useData from '.';
5
+
6
+ export const useFileDownload = (options = {}) => {
7
+ const {
8
+ onDownloadStart,
9
+ onDownloadEnd,
10
+ onDownloadSuccess,
11
+ onDownloadError,
12
+ onLoadingChange,
13
+ accessToken,
14
+ } = options;
15
+ const { fetchData } = useData();
16
+ const [isDownloading, setIsDownloading] = useState(false);
17
+ const [error, setError] = useState('');
18
+
19
+ const downloadFile = useCallback(
20
+ async (api, data, fileName = null) => {
21
+ if (isDownloading) {
22
+ console.warn('Download already in progress');
23
+ return { success: false, error: 'Download already in progress' };
24
+ }
25
+ setIsDownloading(true);
26
+ setError('');
27
+ // Notify o začátku stahování
28
+ onDownloadStart?.();
29
+ onLoadingChange?.(true);
30
+
31
+ try {
32
+ const response = await fetchData(api, data, accessToken);
33
+ const blob = response.data;
34
+
35
+ // Získáme název souboru z Content-Disposition hlavičky nebo použijeme předaný název
36
+ let downloadFileName = fileName;
37
+
38
+ // Zkus získat filename ze serverových headers
39
+ if (response.headers) {
40
+ let contentDisposition;
41
+
42
+ // Různé způsoby jak získat header (záleží na struktuře response)
43
+ if (typeof response.headers.get === 'function') {
44
+ contentDisposition = response.headers.get('content-disposition');
45
+ } else if (response.headers['content-disposition']) {
46
+ contentDisposition = response.headers['content-disposition'];
47
+ }
48
+
49
+ if (contentDisposition) {
50
+ const fileNameMatch = contentDisposition.match(
51
+ /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/
52
+ );
53
+ if (fileNameMatch && fileNameMatch[1]) {
54
+ downloadFileName = fileNameMatch[1].replace(/['"]/g, '');
55
+ }
56
+ }
57
+ }
58
+ // Vytvoříme URL pro blob
59
+ const objectUrl = window.URL.createObjectURL(blob);
60
+
61
+ // METODA: Pouze Save As dialog bez otevření PDF
62
+ const newWindow = window.open('', '_blank');
63
+
64
+ if (newWindow) {
65
+ // Okamžitě vytvoř download link v prázdném okně
66
+ const link = newWindow.document.createElement('a');
67
+ link.href = objectUrl;
68
+ link.download = downloadFileName || 'soubor.pdf';
69
+ newWindow.document.body.appendChild(link);
70
+ link.click();
71
+
72
+ // Zavři prázdné okno okamžitě
73
+ setTimeout(() => {
74
+ newWindow.close();
75
+ }, 100);
76
+ } else {
77
+ // Fallback pokud jsou zablokovány popup okna
78
+ console.warn('⚠️ Popup blokováno, zkouším fallback metodu');
79
+
80
+ const link = document.createElement('a');
81
+ link.style.display = 'none';
82
+ link.href = objectUrl;
83
+ link.download = downloadFileName || 'soubor.pdf';
84
+
85
+ document.body.appendChild(link);
86
+
87
+ // Zkus více způsobů kliknutí
88
+ try {
89
+ link.click();
90
+ } catch (e) {
91
+ const event = new MouseEvent('click', {
92
+ view: window,
93
+ bubbles: true,
94
+ cancelable: true,
95
+ });
96
+ link.dispatchEvent(event);
97
+ }
98
+
99
+ // Cleanup
100
+ setTimeout(() => {
101
+ document.body.removeChild(link);
102
+ }, 100);
103
+ }
104
+
105
+ // Cleanup URL s kratším delayem
106
+ setTimeout(() => {
107
+ window.URL.revokeObjectURL(objectUrl);
108
+ }, 1000);
109
+
110
+ // Success callback
111
+ onDownloadSuccess?.(downloadFileName, blob.size);
112
+
113
+ return {
114
+ success: true,
115
+ fileName: downloadFileName,
116
+ size: blob.size,
117
+ };
118
+ } catch (err) {
119
+ console.error('Chyba při stahování:', err);
120
+ const errorMessage = `Chyba při stahování souboru: ${err.message}`;
121
+ setError(errorMessage);
122
+ onDownloadError?.(err, errorMessage);
123
+
124
+ return {
125
+ success: false,
126
+ error: err,
127
+ errorMessage,
128
+ };
129
+ } finally {
130
+ setIsDownloading(false);
131
+ onDownloadEnd?.();
132
+ onLoadingChange?.(false);
133
+ }
134
+ },
135
+ [
136
+ isDownloading,
137
+ onDownloadStart,
138
+ onDownloadEnd,
139
+ onDownloadSuccess,
140
+ onDownloadError,
141
+ onLoadingChange,
142
+ accessToken,
143
+ fetchData,
144
+ ]
145
+ );
146
+
147
+ const reset = useCallback(() => {
148
+ setError('');
149
+ }, []);
150
+
151
+ return {
152
+ isDownloading,
153
+ error,
154
+ downloadFile,
155
+ reset,
156
+ };
157
+ };