pi-kiosk-shared 2.1.4 → 2.1.5

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 (60) hide show
  1. package/README.md +80 -85
  2. package/dist/api.d.ts +1 -0
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +16 -2
  5. package/dist/api.js.map +1 -1
  6. package/dist/index.d.ts +0 -10
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1 -11
  9. package/dist/index.js.map +1 -1
  10. package/dist/types.d.ts +11 -7
  11. package/dist/types.d.ts.map +1 -1
  12. package/package.json +5 -7
  13. package/dist/components/ErrorDisplay.d.ts +0 -13
  14. package/dist/components/ErrorDisplay.d.ts.map +0 -1
  15. package/dist/components/ErrorDisplay.js +0 -9
  16. package/dist/components/ErrorDisplay.js.map +0 -1
  17. package/dist/components/LoadingSpinner.d.ts +0 -9
  18. package/dist/components/LoadingSpinner.d.ts.map +0 -1
  19. package/dist/components/LoadingSpinner.js +0 -11
  20. package/dist/components/LoadingSpinner.js.map +0 -1
  21. package/dist/config/deployment.d.ts +0 -97
  22. package/dist/config/deployment.d.ts.map +0 -1
  23. package/dist/config/deployment.js +0 -154
  24. package/dist/config/deployment.js.map +0 -1
  25. package/dist/config/environments.d.ts +0 -42
  26. package/dist/config/environments.d.ts.map +0 -1
  27. package/dist/config/environments.js +0 -191
  28. package/dist/config/environments.js.map +0 -1
  29. package/dist/config/environments.test.d.ts +0 -1
  30. package/dist/config/environments.test.js +0 -49
  31. package/dist/config/logger.d.ts +0 -41
  32. package/dist/config/logger.d.ts.map +0 -1
  33. package/dist/config/logger.js +0 -119
  34. package/dist/config/logger.js.map +0 -1
  35. package/dist/constants.d.ts +0 -91
  36. package/dist/constants.d.ts.map +0 -1
  37. package/dist/constants.js +0 -113
  38. package/dist/constants.js.map +0 -1
  39. package/dist/hooks/useApi.d.ts +0 -21
  40. package/dist/hooks/useApi.d.ts.map +0 -1
  41. package/dist/hooks/useApi.js +0 -52
  42. package/dist/hooks/useApi.js.map +0 -1
  43. package/dist/hooks/useAsyncOperation.d.ts +0 -22
  44. package/dist/hooks/useAsyncOperation.d.ts.map +0 -1
  45. package/dist/hooks/useAsyncOperation.js +0 -59
  46. package/dist/hooks/useAsyncOperation.js.map +0 -1
  47. package/dist/hooks/useErrorHandler.d.ts +0 -15
  48. package/dist/hooks/useErrorHandler.d.ts.map +0 -1
  49. package/dist/hooks/useErrorHandler.js +0 -55
  50. package/dist/hooks/useErrorHandler.js.map +0 -1
  51. package/dist/utils/simple.test.d.ts +0 -1
  52. package/dist/utils/simple.test.js +0 -45
  53. package/dist/utils.d.ts +0 -24
  54. package/dist/utils.d.ts.map +0 -1
  55. package/dist/utils.js +0 -159
  56. package/dist/utils.js.map +0 -1
  57. package/dist/validation.d.ts +0 -46
  58. package/dist/validation.d.ts.map +0 -1
  59. package/dist/validation.js +0 -173
  60. package/dist/validation.js.map +0 -1
@@ -1,91 +0,0 @@
1
- export declare const APP_CONFIG: {
2
- readonly DEFAULT_API_URL: "http://localhost:3015";
3
- readonly DEFAULT_WS_URL: "ws://localhost:3015";
4
- readonly API_TIMEOUT: 10000;
5
- readonly RETRY_ATTEMPTS: 3;
6
- readonly RETRY_DELAY: 1000;
7
- readonly WS_RECONNECT_ATTEMPTS: 5;
8
- readonly WS_RECONNECT_INTERVAL: 3000;
9
- readonly WS_HEARTBEAT_INTERVAL: 30000;
10
- readonly LOADING_DEBOUNCE: 300;
11
- readonly ERROR_DISPLAY_DURATION: 5000;
12
- readonly MIN_USERNAME_LENGTH: 3;
13
- readonly MIN_PASSWORD_LENGTH: 6;
14
- readonly MAX_PRODUCT_NAME_LENGTH: 100;
15
- readonly MAX_DESCRIPTION_LENGTH: 500;
16
- readonly DEFAULT_KIOSK_ID: 1;
17
- readonly PAYMENT_POLLING_INTERVAL: 3000;
18
- readonly PRODUCT_CACHE_TTL: 300000;
19
- readonly PAYMENT_ACCOUNT_NUMBER: "1234567890";
20
- readonly PAYMENT_CURRENCY: "CZK";
21
- readonly QR_CODE_WIDTH: 300;
22
- readonly QR_CODE_FORMAT: "SPD*1.0";
23
- };
24
- export declare const UI_MESSAGES: {
25
- readonly LOADING_PRODUCTS: "Načítání produktů...";
26
- readonly LOADING_PAYMENT: "Zpracovávám platbu...";
27
- readonly GENERATING_QR: "Generuji QR kód...";
28
- readonly PAYMENT_INITIALIZING: "Inicializuji platbu...";
29
- readonly PAYMENT_SUCCESS: "Platba byla úspěšně zpracována!";
30
- readonly PRODUCT_SAVED: "Produkt byl úspěšně uložen!";
31
- readonly NETWORK_ERROR: "Problém s připojením. Zkuste to znovu.";
32
- readonly VALIDATION_ERROR: "Zkontrolujte zadané údaje.";
33
- readonly UNKNOWN_ERROR: "Něco se pokazilo. Zkuste to znovu.";
34
- readonly PAYMENT_ERROR: "Chyba při zpracování platby";
35
- readonly NO_PRODUCTS: "Žádné produkty nejsou k dispozici";
36
- readonly NO_TRANSACTIONS: "Žádné transakce";
37
- readonly COMING_SOON: "Připravujeme pro vás...";
38
- readonly REQUIRED_FIELD: "Toto pole je povinné";
39
- readonly INVALID_EMAIL: "Zadejte platnou emailovou adresu";
40
- readonly INVALID_PRICE: "Cena musí být větší než 0";
41
- readonly EMAIL_LABEL: "Váš email:";
42
- readonly SELECT_PRODUCT: "Vyberte si produkt";
43
- readonly PAYMENT_WAITING: "Čekám na platbu...";
44
- readonly PAYMENT_CONFIRMED: "Platba potvrzena!";
45
- readonly CONTINUE_SHOPPING: "Pokračovat v nákupu";
46
- readonly BACK_TO_PRODUCTS: "Zpět na produkty";
47
- readonly RETRY: "Zkusit znovu";
48
- readonly CANCEL: "Zrušit";
49
- };
50
- export declare const CSS_CLASSES: {
51
- readonly CONTAINER: "container";
52
- readonly GRID: "grid";
53
- readonly FLEX: "flex";
54
- readonly APP: "kiosk-app";
55
- readonly SCREEN: "screen";
56
- readonly LOADING: "loading";
57
- readonly ERROR: "error";
58
- readonly SUCCESS: "success";
59
- readonly DISABLED: "disabled";
60
- readonly ACTIVE: "active";
61
- readonly BUTTON_PRIMARY: "btn-primary";
62
- readonly BUTTON_SECONDARY: "btn-secondary";
63
- readonly BUTTON_SUCCESS: "btn-success";
64
- readonly INPUT: "input";
65
- readonly CARD: "card";
66
- readonly PAYMENT_CONTAINER: "payment-container";
67
- readonly PAYMENT_HEADER: "payment-header";
68
- readonly PAYMENT_METHODS: "payment-methods";
69
- readonly PAYMENT_METHOD: "payment-method";
70
- readonly PAYMENT_DETAILS: "payment-details";
71
- readonly PAYMENT_ACTIONS: "payment-actions";
72
- readonly LOADING_CONTAINER: "loading-container";
73
- readonly LOADING_SPINNER: "loading-spinner";
74
- readonly ERROR_CONTAINER: "error-container";
75
- readonly BUTTON_GROUP: "button-group";
76
- readonly BADGE_SUCCESS: "badge-success";
77
- readonly ONLINE: "online";
78
- readonly OFFLINE: "offline";
79
- readonly CONNECTED: "connected";
80
- readonly DISCONNECTED: "disconnected";
81
- };
82
- export declare const ROUTES: {
83
- readonly KIOSK_HOME: "/";
84
- readonly KIOSK_PAYMENT: "/payment";
85
- readonly KIOSK_CONFIRMATION: "/confirmation";
86
- readonly ADMIN_LOGIN: "/admin/login";
87
- readonly ADMIN_DASHBOARD: "/admin";
88
- readonly ADMIN_PRODUCTS: "/admin/products";
89
- readonly ADMIN_KIOSKS: "/admin/kiosks";
90
- };
91
- //# sourceMappingURL=constants.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;CAmCb,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;CAsCd,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCd,CAAC;AAEX,eAAO,MAAM,MAAM;;;;;;;;CAWT,CAAC"}
package/dist/constants.js DELETED
@@ -1,113 +0,0 @@
1
- // Shared constants across all packages
2
- export const APP_CONFIG = {
3
- // API Configuration
4
- DEFAULT_API_URL: 'http://localhost:3015',
5
- DEFAULT_WS_URL: 'ws://localhost:3015',
6
- // Timeouts
7
- API_TIMEOUT: 10000, // 10 seconds
8
- RETRY_ATTEMPTS: 3,
9
- RETRY_DELAY: 1000, // 1 second
10
- // WebSocket
11
- WS_RECONNECT_ATTEMPTS: 5,
12
- WS_RECONNECT_INTERVAL: 3000,
13
- WS_HEARTBEAT_INTERVAL: 30000,
14
- // UI
15
- LOADING_DEBOUNCE: 300,
16
- ERROR_DISPLAY_DURATION: 5000,
17
- // Validation
18
- MIN_USERNAME_LENGTH: 3,
19
- MIN_PASSWORD_LENGTH: 6,
20
- MAX_PRODUCT_NAME_LENGTH: 100,
21
- MAX_DESCRIPTION_LENGTH: 500,
22
- // Business Rules
23
- DEFAULT_KIOSK_ID: 1,
24
- PAYMENT_POLLING_INTERVAL: 3000,
25
- PRODUCT_CACHE_TTL: 300000, // 5 minutes
26
- // Payment Configuration
27
- PAYMENT_ACCOUNT_NUMBER: '1234567890',
28
- PAYMENT_CURRENCY: 'CZK',
29
- QR_CODE_WIDTH: 300,
30
- QR_CODE_FORMAT: 'SPD*1.0', // Czech QR payment standard
31
- };
32
- export const UI_MESSAGES = {
33
- // Loading states
34
- LOADING_PRODUCTS: 'Načítání produktů...',
35
- LOADING_PAYMENT: 'Zpracovávám platbu...',
36
- GENERATING_QR: 'Generuji QR kód...',
37
- PAYMENT_INITIALIZING: 'Inicializuji platbu...',
38
- // Success messages
39
- PAYMENT_SUCCESS: 'Platba byla úspěšně zpracována!',
40
- PRODUCT_SAVED: 'Produkt byl úspěšně uložen!',
41
- // Error messages
42
- NETWORK_ERROR: 'Problém s připojením. Zkuste to znovu.',
43
- VALIDATION_ERROR: 'Zkontrolujte zadané údaje.',
44
- UNKNOWN_ERROR: 'Něco se pokazilo. Zkuste to znovu.',
45
- PAYMENT_ERROR: 'Chyba při zpracování platby',
46
- // Empty states
47
- NO_PRODUCTS: 'Žádné produkty nejsou k dispozici',
48
- NO_TRANSACTIONS: 'Žádné transakce',
49
- COMING_SOON: 'Připravujeme pro vás...',
50
- // Form validation
51
- REQUIRED_FIELD: 'Toto pole je povinné',
52
- INVALID_EMAIL: 'Zadejte platnou emailovou adresu',
53
- INVALID_PRICE: 'Cena musí být větší než 0',
54
- EMAIL_LABEL: 'Váš email:',
55
- // Kiosk specific
56
- SELECT_PRODUCT: 'Vyberte si produkt',
57
- PAYMENT_WAITING: 'Čekám na platbu...',
58
- PAYMENT_CONFIRMED: 'Platba potvrzena!',
59
- CONTINUE_SHOPPING: 'Pokračovat v nákupu',
60
- BACK_TO_PRODUCTS: 'Zpět na produkty',
61
- // Action buttons
62
- RETRY: 'Zkusit znovu',
63
- CANCEL: 'Zrušit',
64
- };
65
- export const CSS_CLASSES = {
66
- // Layout
67
- CONTAINER: 'container',
68
- GRID: 'grid',
69
- FLEX: 'flex',
70
- APP: 'kiosk-app',
71
- SCREEN: 'screen',
72
- // States
73
- LOADING: 'loading',
74
- ERROR: 'error',
75
- SUCCESS: 'success',
76
- DISABLED: 'disabled',
77
- ACTIVE: 'active',
78
- // Components
79
- BUTTON_PRIMARY: 'btn-primary',
80
- BUTTON_SECONDARY: 'btn-secondary',
81
- BUTTON_SUCCESS: 'btn-success',
82
- INPUT: 'input',
83
- CARD: 'card',
84
- // Payment specific
85
- PAYMENT_CONTAINER: 'payment-container',
86
- PAYMENT_HEADER: 'payment-header',
87
- PAYMENT_METHODS: 'payment-methods',
88
- PAYMENT_METHOD: 'payment-method',
89
- PAYMENT_DETAILS: 'payment-details',
90
- PAYMENT_ACTIONS: 'payment-actions',
91
- LOADING_CONTAINER: 'loading-container',
92
- LOADING_SPINNER: 'loading-spinner',
93
- ERROR_CONTAINER: 'error-container',
94
- BUTTON_GROUP: 'button-group',
95
- BADGE_SUCCESS: 'badge-success',
96
- // Status indicators
97
- ONLINE: 'online',
98
- OFFLINE: 'offline',
99
- CONNECTED: 'connected',
100
- DISCONNECTED: 'disconnected',
101
- };
102
- export const ROUTES = {
103
- // Kiosk routes
104
- KIOSK_HOME: '/',
105
- KIOSK_PAYMENT: '/payment',
106
- KIOSK_CONFIRMATION: '/confirmation',
107
- // Admin routes
108
- ADMIN_LOGIN: '/admin/login',
109
- ADMIN_DASHBOARD: '/admin',
110
- ADMIN_PRODUCTS: '/admin/products',
111
- ADMIN_KIOSKS: '/admin/kiosks',
112
- };
113
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import { APIClient } from '../api';
2
- export interface ApiState<T> {
3
- data: T | null;
4
- loading: boolean;
5
- error: Error | null;
6
- }
7
- export declare function useApi<T = any>(_apiClient: APIClient): {
8
- execute: (apiCall: () => Promise<T>, options?: {
9
- onSuccess?: (data: T) => void;
10
- onError?: (error: Error) => void;
11
- skipLoading?: boolean;
12
- }) => Promise<T>;
13
- reset: () => void;
14
- isLoading: boolean;
15
- hasError: boolean;
16
- hasData: boolean;
17
- data: T | null;
18
- loading: boolean;
19
- error: Error | null;
20
- };
21
- //# sourceMappingURL=useApi.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useApi.d.ts","sourceRoot":"","sources":["../../src/hooks/useApi.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGnC,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,wBAAgB,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,SAAS;uBAQxC,MAAM,OAAO,CAAC,CAAC,CAAC,YACf;QACR,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;QAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACjC,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB;;;;;;aAjBM,OAAO;WACT,KAAK,GAAG,IAAI;EAkEpB"}
@@ -1,52 +0,0 @@
1
- import { useState, useCallback } from 'react';
2
- import { NetworkError, AppError } from '../errors';
3
- export function useApi(_apiClient) {
4
- const [state, setState] = useState({
5
- data: null,
6
- loading: false,
7
- error: null
8
- });
9
- const execute = useCallback(async (apiCall, options) => {
10
- try {
11
- if (!options?.skipLoading) {
12
- setState(prev => ({ ...prev, loading: true, error: null }));
13
- }
14
- const data = await apiCall();
15
- setState({
16
- data,
17
- loading: false,
18
- error: null
19
- });
20
- options?.onSuccess?.(data);
21
- return data;
22
- }
23
- catch (error) {
24
- const appError = error instanceof AppError
25
- ? error
26
- : new NetworkError('Chyba při komunikaci se serverem');
27
- setState(prev => ({
28
- ...prev,
29
- loading: false,
30
- error: appError
31
- }));
32
- options?.onError?.(appError);
33
- throw appError;
34
- }
35
- }, []);
36
- const reset = useCallback(() => {
37
- setState({
38
- data: null,
39
- loading: false,
40
- error: null
41
- });
42
- }, []);
43
- return {
44
- ...state,
45
- execute,
46
- reset,
47
- isLoading: state.loading,
48
- hasError: !!state.error,
49
- hasData: !!state.data
50
- };
51
- }
52
- //# sourceMappingURL=useApi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useApi.js","sourceRoot":"","sources":["../../src/hooks/useApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAQnD,MAAM,UAAU,MAAM,CAAU,UAAqB;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAc;QAC9C,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAC/B,OAAyB,EACzB,OAIC,EACD,EAAE;QACF,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;YAE7B,QAAQ,CAAC;gBACP,IAAI;gBACJ,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YAEH,OAAO,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QAEd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,YAAY,QAAQ;gBACxC,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI,YAAY,CAAC,kCAAkC,CAAC,CAAC;YAEzD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,GAAG,IAAI;gBACP,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC,CAAC;YAEJ,OAAO,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC7B,MAAM,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC;YACP,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,GAAG,KAAK;QACR,OAAO;QACP,KAAK;QACL,SAAS,EAAE,KAAK,CAAC,OAAO;QACxB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK;QACvB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;KACtB,CAAC;AACJ,CAAC"}
@@ -1,22 +0,0 @@
1
- interface UseAsyncOperationOptions<T> {
2
- onSuccess?: (data: T) => void;
3
- onError?: (error: Error) => void;
4
- initialData?: T;
5
- }
6
- /**
7
- * Consistent hook for handling async operations with loading states and error handling
8
- */
9
- export declare function useAsyncOperation<T = any>(options?: UseAsyncOperationOptions<T>): {
10
- execute: (operation: () => Promise<T>, context?: string) => Promise<T | null>;
11
- reset: () => void;
12
- setData: (data: T) => void;
13
- isLoading: boolean;
14
- hasError: boolean;
15
- hasData: boolean;
16
- isIdle: boolean;
17
- data: T | null;
18
- loading: boolean;
19
- error: Error | null;
20
- };
21
- export {};
22
- //# sourceMappingURL=useAsyncOperation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAsyncOperation.d.ts","sourceRoot":"","sources":["../../src/hooks/useAsyncOperation.ts"],"names":[],"mappings":"AASA,UAAU,wBAAwB,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,CAAC,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,GAAE,wBAAwB,CAAC,CAAC,CAAM;yBAUrE,MAAM,OAAO,CAAC,CAAC,CAAC,YACjB,MAAM,KACf,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;;oBAuCe,CAAC;;;;;;aAhE3B,OAAO;WACT,KAAK,GAAG,IAAI;EA8EpB"}
@@ -1,59 +0,0 @@
1
- import { useState, useCallback } from 'react';
2
- import { useErrorHandler } from './useErrorHandler';
3
- /**
4
- * Consistent hook for handling async operations with loading states and error handling
5
- */
6
- export function useAsyncOperation(options = {}) {
7
- const [state, setState] = useState({
8
- data: options.initialData || null,
9
- loading: false,
10
- error: null
11
- });
12
- const { handleError } = useErrorHandler();
13
- const execute = useCallback(async (operation, context) => {
14
- setState(prev => ({ ...prev, loading: true, error: null }));
15
- try {
16
- const result = await operation();
17
- setState({
18
- data: result,
19
- loading: false,
20
- error: null
21
- });
22
- options.onSuccess?.(result);
23
- return result;
24
- }
25
- catch (error) {
26
- const errorObj = error instanceof Error ? error : new Error(String(error));
27
- setState(prev => ({
28
- ...prev,
29
- loading: false,
30
- error: errorObj
31
- }));
32
- handleError(errorObj, context || 'useAsyncOperation');
33
- options.onError?.(errorObj);
34
- return null;
35
- }
36
- }, [handleError, options]);
37
- const reset = useCallback(() => {
38
- setState({
39
- data: options.initialData || null,
40
- loading: false,
41
- error: null
42
- });
43
- }, [options.initialData]);
44
- const setData = useCallback((data) => {
45
- setState(prev => ({ ...prev, data }));
46
- }, []);
47
- return {
48
- ...state,
49
- execute,
50
- reset,
51
- setData,
52
- // Computed properties
53
- isLoading: state.loading,
54
- hasError: !!state.error,
55
- hasData: !!state.data,
56
- isIdle: !state.loading && !state.error && !state.data
57
- };
58
- }
59
- //# sourceMappingURL=useAsyncOperation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAsyncOperation.js","sourceRoot":"","sources":["../../src/hooks/useAsyncOperation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAcpD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAU,UAAuC,EAAE;IAClF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAyB;QACzD,IAAI,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACjC,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,MAAM,EAAE,WAAW,EAAE,GAAG,eAAe,EAAE,CAAC;IAE1C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAC/B,SAA2B,EAC3B,OAAgB,EACG,EAAE;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YAEjC,QAAQ,CAAC;gBACP,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YAEH,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;YAC5B,OAAO,MAAM,CAAC;QAEhB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAE3E,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,GAAG,IAAI;gBACP,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC,CAAC;YAEJ,WAAW,CAAC,QAAQ,EAAE,OAAO,IAAI,mBAAmB,CAAC,CAAC;YACtD,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;YAE5B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAE3B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC;YACP,IAAI,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;YACjC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAE1B,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,IAAO,EAAE,EAAE;QACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,GAAG,KAAK;QACR,OAAO;QACP,KAAK;QACL,OAAO;QACP,sBAAsB;QACtB,SAAS,EAAE,KAAK,CAAC,OAAO;QACxB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK;QACvB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;QACrB,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI;KACtD,CAAC;AACJ,CAAC"}
@@ -1,15 +0,0 @@
1
- import { AppError } from '../errors';
2
- export interface ErrorState {
3
- error: AppError | Error | null;
4
- message: string;
5
- isVisible: boolean;
6
- }
7
- export declare function useErrorHandler(): {
8
- error: Error | AppError | null;
9
- errorMessage: string;
10
- isErrorVisible: boolean;
11
- handleError: (error: Error | AppError, context?: string) => void;
12
- clearError: () => void;
13
- retryAction: (action: () => Promise<void> | void) => void;
14
- };
15
- //# sourceMappingURL=useErrorHandler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useErrorHandler.d.ts","sourceRoot":"","sources":["../../src/hooks/useErrorHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAgC,MAAM,WAAW,CAAC;AAEnE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,eAAe;;;;yBAOW,KAAK,GAAG,QAAQ,YAAY,MAAM;;0BA+BjC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;EAoBpE"}
@@ -1,55 +0,0 @@
1
- import { useCallback, useState } from 'react';
2
- import { getErrorMessage, formatError } from '../errors';
3
- export function useErrorHandler() {
4
- const [errorState, setErrorState] = useState({
5
- error: null,
6
- message: '',
7
- isVisible: false
8
- });
9
- const handleError = useCallback((error, context) => {
10
- console.error(`Error in ${context || 'unknown context'}:`, error);
11
- const userMessage = getErrorMessage(error);
12
- setErrorState({
13
- error,
14
- message: userMessage,
15
- isVisible: true
16
- });
17
- // Auto-hide error after 5 seconds
18
- setTimeout(() => {
19
- setErrorState(prev => ({ ...prev, isVisible: false }));
20
- }, 5000);
21
- // Send to monitoring service in production
22
- if (process.env.NODE_ENV === 'production') {
23
- // TODO: Integrate with monitoring service (Sentry, LogRocket, etc.)
24
- console.warn('Production error logged:', formatError(error));
25
- }
26
- }, []);
27
- const clearError = useCallback(() => {
28
- setErrorState({
29
- error: null,
30
- message: '',
31
- isVisible: false
32
- });
33
- }, []);
34
- const retryAction = useCallback((action) => {
35
- clearError();
36
- try {
37
- const result = action();
38
- if (result instanceof Promise) {
39
- result.catch(handleError);
40
- }
41
- }
42
- catch (error) {
43
- handleError(error);
44
- }
45
- }, [handleError, clearError]);
46
- return {
47
- error: errorState.error,
48
- errorMessage: errorState.message,
49
- isErrorVisible: errorState.isVisible,
50
- handleError,
51
- clearError,
52
- retryAction
53
- };
54
- }
55
- //# sourceMappingURL=useErrorHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useErrorHandler.js","sourceRoot":"","sources":["../../src/hooks/useErrorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAY,eAAe,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAQnE,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAa;QACvD,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAuB,EAAE,OAAgB,EAAE,EAAE;QAC5E,OAAO,CAAC,KAAK,CAAC,YAAY,OAAO,IAAI,iBAAiB,GAAG,EAAE,KAAK,CAAC,CAAC;QAElE,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAE3C,aAAa,CAAC;YACZ,KAAK;YACL,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,kCAAkC;QAClC,UAAU,CAAC,GAAG,EAAE;YACd,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,2CAA2C;QAC3C,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC1C,oEAAoE;YACpE,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,aAAa,CAAC;YACZ,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,MAAkC,EAAE,EAAE;QACrE,UAAU,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;YACxB,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC9B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAc,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IAE9B,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,YAAY,EAAE,UAAU,CAAC,OAAO;QAChC,cAAc,EAAE,UAAU,CAAC,SAAS;QACpC,WAAW;QACX,UAAU;QACV,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,45 +0,0 @@
1
- // Tests for shared utilities
2
- import { validateEmail, formatPrice, generatePaymentId, getErrorMessage } from '../utils';
3
- describe('Shared Utilities', () => {
4
- describe('validateEmail', () => {
5
- test('validates correct email addresses', () => {
6
- expect(validateEmail('test@example.com')).toBe(true);
7
- expect(validateEmail('user.name+tag@domain.co.uk')).toBe(true);
8
- });
9
- test('rejects invalid email addresses', () => {
10
- expect(validateEmail('')).toBe(false);
11
- expect(validateEmail('invalid')).toBe(false);
12
- expect(validateEmail('test@')).toBe(false);
13
- expect(validateEmail('@domain.com')).toBe(false);
14
- expect(validateEmail('test..test@domain.com')).toBe(false);
15
- });
16
- });
17
- describe('formatPrice', () => {
18
- test('formats prices correctly', () => {
19
- expect(formatPrice(100)).toBe('100 Kč');
20
- expect(formatPrice(25.5)).toBe('25.5 Kč');
21
- expect(formatPrice(0)).toBe('0 Kč');
22
- });
23
- });
24
- describe('generatePaymentId', () => {
25
- test('generates unique payment IDs', () => {
26
- const id1 = generatePaymentId();
27
- const id2 = generatePaymentId();
28
- expect(id1).toMatch(/^pay-\d+$/);
29
- expect(id2).toMatch(/^pay-\d+$/);
30
- expect(id1).not.toBe(id2);
31
- });
32
- });
33
- describe('getErrorMessage', () => {
34
- test('returns user-friendly error messages', () => {
35
- const fetchError = new Error('Failed to fetch');
36
- expect(getErrorMessage(fetchError)).toBe('Problém s připojením. Zkuste to znovu.');
37
- const authError = new Error('401 Unauthorized');
38
- expect(getErrorMessage(authError)).toBe('Neplatné přihlašovací údaje.');
39
- const genericError = new Error('Something went wrong');
40
- expect(getErrorMessage(genericError)).toBe('Something went wrong');
41
- const emptyError = new Error('');
42
- expect(getErrorMessage(emptyError)).toBe('Něco se pokazilo. Zkuste to znovu.');
43
- });
44
- });
45
- });
package/dist/utils.d.ts DELETED
@@ -1,24 +0,0 @@
1
- export declare const validateEmail: (email: string) => boolean;
2
- export declare const formatPrice: (price: number) => string;
3
- export declare const PRICE_PRECISION = 2;
4
- export declare const roundPrice: (price: number) => number;
5
- export declare const parsePrice: (value: string | number) => number;
6
- export declare const validatePrice: (price: number) => boolean;
7
- export declare const priceToString: (price: number) => string;
8
- export declare const stringToPrice: (priceStr: string) => number;
9
- export declare const getKioskIdFromUrl: () => number;
10
- export declare const getKioskSecretFromUrl: () => string | undefined;
11
- export declare const formatDate: (date: Date | string) => string;
12
- export declare const debounce: <T extends (...args: any[]) => any>(func: T, delay: number) => ((...args: Parameters<T>) => void);
13
- export declare const generatePaymentId: () => string;
14
- export declare const validateKioskId: (kioskId: number) => boolean;
15
- export declare const createEmptyCart: () => {
16
- items: never[];
17
- totalAmount: number;
18
- totalItems: number;
19
- };
20
- export declare const addToCart: (cart: any, product: any, quantity?: number) => any;
21
- export declare const removeFromCart: (cart: any, productId: number) => any;
22
- export declare const updateCartItemQuantity: (cart: any, productId: number, quantity: number) => any;
23
- export declare const clearCart: (cart: any) => any;
24
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,OAK7C,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,MAO3C,CAAC;AAGF,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAE1C,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,GAAG,MAAM,KAAG,MAGnD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,OAE7C,CAAC;AAGF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,MAE7C,CAAC;AAGF,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,KAAG,MAEhD,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAO,MAcpC,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAO,MAAM,GAAG,SAGjD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,GAAG,MAAM,KAAG,MAShD,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,MAAM,CAAC,EACP,OAAO,MAAM,KACZ,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAOnC,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAO,MAEpC,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,KAAG,OAEjD,CAAC;AAGF,eAAO,MAAM,eAAe;;;;CAI1B,CAAC;AAEH,eAAO,MAAM,SAAS,GAAI,MAAM,GAAG,EAAE,SAAS,GAAG,EAAE,WAAU,MAAU,QA6BtE,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,GAAG,EAAE,WAAW,MAAM,QAe1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,MAAM,GAAG,EAAE,WAAW,MAAM,EAAE,UAAU,MAAM,QA6BpF,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,MAAM,GAAG,QAQlC,CAAC"}