pi-kiosk-shared 2.1.3 → 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.
- package/README.md +27 -32
- package/dist/api.d.ts +2 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +17 -2
- package/dist/api.js.map +1 -1
- package/dist/index.d.ts +0 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -11
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +11 -7
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -7
- package/dist/components/ErrorDisplay.d.ts +0 -13
- package/dist/components/ErrorDisplay.d.ts.map +0 -1
- package/dist/components/ErrorDisplay.js +0 -9
- package/dist/components/ErrorDisplay.js.map +0 -1
- package/dist/components/LoadingSpinner.d.ts +0 -9
- package/dist/components/LoadingSpinner.d.ts.map +0 -1
- package/dist/components/LoadingSpinner.js +0 -11
- package/dist/components/LoadingSpinner.js.map +0 -1
- package/dist/config/deployment.d.ts +0 -97
- package/dist/config/deployment.d.ts.map +0 -1
- package/dist/config/deployment.js +0 -154
- package/dist/config/deployment.js.map +0 -1
- package/dist/config/environments.d.ts +0 -37
- package/dist/config/environments.d.ts.map +0 -1
- package/dist/config/environments.js +0 -172
- package/dist/config/environments.js.map +0 -1
- package/dist/config/environments.test.d.ts +0 -1
- package/dist/config/environments.test.js +0 -49
- package/dist/config/logger.d.ts +0 -41
- package/dist/config/logger.d.ts.map +0 -1
- package/dist/config/logger.js +0 -119
- package/dist/config/logger.js.map +0 -1
- package/dist/constants.d.ts +0 -91
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -113
- package/dist/constants.js.map +0 -1
- package/dist/hooks/useApi.d.ts +0 -21
- package/dist/hooks/useApi.d.ts.map +0 -1
- package/dist/hooks/useApi.js +0 -52
- package/dist/hooks/useApi.js.map +0 -1
- package/dist/hooks/useAsyncOperation.d.ts +0 -22
- package/dist/hooks/useAsyncOperation.d.ts.map +0 -1
- package/dist/hooks/useAsyncOperation.js +0 -59
- package/dist/hooks/useAsyncOperation.js.map +0 -1
- package/dist/hooks/useErrorHandler.d.ts +0 -15
- package/dist/hooks/useErrorHandler.d.ts.map +0 -1
- package/dist/hooks/useErrorHandler.js +0 -55
- package/dist/hooks/useErrorHandler.js.map +0 -1
- package/dist/utils/simple.test.d.ts +0 -1
- package/dist/utils/simple.test.js +0 -45
- package/dist/utils.d.ts +0 -24
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -159
- package/dist/utils.js.map +0 -1
- package/dist/validation.d.ts +0 -46
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js +0 -173
- package/dist/validation.js.map +0 -1
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
|
package/dist/constants.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/useApi.d.ts
DELETED
|
@@ -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"}
|
package/dist/hooks/useApi.js
DELETED
|
@@ -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
|
package/dist/hooks/useApi.js.map
DELETED
|
@@ -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
|
package/dist/utils.d.ts.map
DELETED
|
@@ -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"}
|
package/dist/utils.js
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
// Shared utility functions - consolidated from utils/simple.ts
|
|
2
|
-
export const validateEmail = (email) => {
|
|
3
|
-
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
4
|
-
// Additional check for consecutive dots which are invalid
|
|
5
|
-
if (email.includes('..'))
|
|
6
|
-
return false;
|
|
7
|
-
return emailRegex.test(email);
|
|
8
|
-
};
|
|
9
|
-
export const formatPrice = (price) => {
|
|
10
|
-
return new Intl.NumberFormat('cs-CZ', {
|
|
11
|
-
style: 'currency',
|
|
12
|
-
currency: 'CZK',
|
|
13
|
-
minimumFractionDigits: 2,
|
|
14
|
-
maximumFractionDigits: 2
|
|
15
|
-
}).format(price);
|
|
16
|
-
};
|
|
17
|
-
// Price precision handling utilities
|
|
18
|
-
export const PRICE_PRECISION = 2; // 2 decimal places for CZK
|
|
19
|
-
export const roundPrice = (price) => {
|
|
20
|
-
return Math.round(price * 100) / 100;
|
|
21
|
-
};
|
|
22
|
-
export const parsePrice = (value) => {
|
|
23
|
-
const num = typeof value === 'string' ? parseFloat(value) : value;
|
|
24
|
-
return roundPrice(num);
|
|
25
|
-
};
|
|
26
|
-
export const validatePrice = (price) => {
|
|
27
|
-
return !isNaN(price) && price > 0 && price <= 999999.99;
|
|
28
|
-
};
|
|
29
|
-
// Convert decimal to string for API calls to avoid precision issues
|
|
30
|
-
export const priceToString = (price) => {
|
|
31
|
-
return price.toFixed(PRICE_PRECISION);
|
|
32
|
-
};
|
|
33
|
-
// Convert string back to number for calculations
|
|
34
|
-
export const stringToPrice = (priceStr) => {
|
|
35
|
-
return parseFloat(priceStr);
|
|
36
|
-
};
|
|
37
|
-
export const getKioskIdFromUrl = () => {
|
|
38
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
39
|
-
const kioskId = urlParams.get('kioskId');
|
|
40
|
-
if (!kioskId) {
|
|
41
|
-
throw new Error('Kiosk ID is required. Please add ?kioskId=X to the URL where X is your kiosk number.');
|
|
42
|
-
}
|
|
43
|
-
const parsedId = parseInt(kioskId);
|
|
44
|
-
if (isNaN(parsedId) || parsedId <= 0) {
|
|
45
|
-
throw new Error(`Invalid kiosk ID: ${kioskId}. Kiosk ID must be a positive number.`);
|
|
46
|
-
}
|
|
47
|
-
return parsedId;
|
|
48
|
-
};
|
|
49
|
-
export const getKioskSecretFromUrl = () => {
|
|
50
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
51
|
-
return urlParams.get('secret') || undefined;
|
|
52
|
-
};
|
|
53
|
-
export const formatDate = (date) => {
|
|
54
|
-
const d = typeof date === 'string' ? new Date(date) : date;
|
|
55
|
-
return d.toLocaleDateString('cs-CZ', {
|
|
56
|
-
year: 'numeric',
|
|
57
|
-
month: 'short',
|
|
58
|
-
day: 'numeric',
|
|
59
|
-
hour: '2-digit',
|
|
60
|
-
minute: '2-digit'
|
|
61
|
-
});
|
|
62
|
-
};
|
|
63
|
-
export const debounce = (func, delay) => {
|
|
64
|
-
let timeoutId;
|
|
65
|
-
return (...args) => {
|
|
66
|
-
clearTimeout(timeoutId);
|
|
67
|
-
timeoutId = setTimeout(() => func(...args), delay);
|
|
68
|
-
};
|
|
69
|
-
};
|
|
70
|
-
export const generatePaymentId = () => {
|
|
71
|
-
return `pay-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
72
|
-
};
|
|
73
|
-
export const validateKioskId = (kioskId) => {
|
|
74
|
-
return Number.isInteger(kioskId) && kioskId > 0;
|
|
75
|
-
};
|
|
76
|
-
// Cart utility functions
|
|
77
|
-
export const createEmptyCart = () => ({
|
|
78
|
-
items: [],
|
|
79
|
-
totalAmount: 0,
|
|
80
|
-
totalItems: 0
|
|
81
|
-
});
|
|
82
|
-
export const addToCart = (cart, product, quantity = 1) => {
|
|
83
|
-
const existingItemIndex = cart.items.findIndex((item) => item.product.id === product.id);
|
|
84
|
-
// Create a new items array
|
|
85
|
-
const newItems = [...cart.items];
|
|
86
|
-
if (existingItemIndex !== -1) {
|
|
87
|
-
// Create a new item object with updated quantity (immutable update)
|
|
88
|
-
const existingItem = cart.items[existingItemIndex];
|
|
89
|
-
newItems[existingItemIndex] = {
|
|
90
|
-
...existingItem,
|
|
91
|
-
quantity: existingItem.quantity + quantity
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
// Add new item to the array
|
|
96
|
-
newItems.push({ product, quantity });
|
|
97
|
-
}
|
|
98
|
-
// Calculate totals
|
|
99
|
-
const totalAmount = roundPrice(newItems.reduce((sum, item) => sum + (item.product.price * item.quantity), 0));
|
|
100
|
-
const totalItems = newItems.reduce((sum, item) => sum + item.quantity, 0);
|
|
101
|
-
// Return a new cart object (immutable)
|
|
102
|
-
return {
|
|
103
|
-
...cart,
|
|
104
|
-
items: newItems,
|
|
105
|
-
totalAmount,
|
|
106
|
-
totalItems
|
|
107
|
-
};
|
|
108
|
-
};
|
|
109
|
-
export const removeFromCart = (cart, productId) => {
|
|
110
|
-
// Create a new items array (immutable)
|
|
111
|
-
const newItems = cart.items.filter((item) => item.product.id !== productId);
|
|
112
|
-
// Calculate totals
|
|
113
|
-
const totalAmount = roundPrice(newItems.reduce((sum, item) => sum + (item.product.price * item.quantity), 0));
|
|
114
|
-
const totalItems = newItems.reduce((sum, item) => sum + item.quantity, 0);
|
|
115
|
-
// Return a new cart object (immutable)
|
|
116
|
-
return {
|
|
117
|
-
...cart,
|
|
118
|
-
items: newItems,
|
|
119
|
-
totalAmount,
|
|
120
|
-
totalItems
|
|
121
|
-
};
|
|
122
|
-
};
|
|
123
|
-
export const updateCartItemQuantity = (cart, productId, quantity) => {
|
|
124
|
-
if (quantity <= 0) {
|
|
125
|
-
return removeFromCart(cart, productId);
|
|
126
|
-
}
|
|
127
|
-
const itemIndex = cart.items.findIndex((item) => item.product.id === productId);
|
|
128
|
-
if (itemIndex === -1) {
|
|
129
|
-
return cart;
|
|
130
|
-
}
|
|
131
|
-
// Create a new items array with updated item (immutable)
|
|
132
|
-
const newItems = [...cart.items];
|
|
133
|
-
const existingItem = cart.items[itemIndex];
|
|
134
|
-
newItems[itemIndex] = {
|
|
135
|
-
...existingItem,
|
|
136
|
-
quantity
|
|
137
|
-
};
|
|
138
|
-
// Calculate totals
|
|
139
|
-
const totalAmount = roundPrice(newItems.reduce((sum, item) => sum + (item.product.price * item.quantity), 0));
|
|
140
|
-
const totalItems = newItems.reduce((sum, item) => sum + item.quantity, 0);
|
|
141
|
-
// Return a new cart object (immutable)
|
|
142
|
-
return {
|
|
143
|
-
...cart,
|
|
144
|
-
items: newItems,
|
|
145
|
-
totalAmount,
|
|
146
|
-
totalItems
|
|
147
|
-
};
|
|
148
|
-
};
|
|
149
|
-
export const clearCart = (cart) => {
|
|
150
|
-
// Return a new cart object (immutable)
|
|
151
|
-
return {
|
|
152
|
-
...cart,
|
|
153
|
-
items: [],
|
|
154
|
-
totalAmount: 0,
|
|
155
|
-
totalItems: 0
|
|
156
|
-
};
|
|
157
|
-
};
|
|
158
|
-
// Note: getErrorMessage is now exported from ./errors.ts instead
|
|
159
|
-
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|