pi-kiosk-shared 2.1.10 → 2.1.13
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 +80 -80
- package/dist/api.d.ts +1 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +1 -0
- package/dist/api.js.map +1 -1
- package/dist/components/DatabaseUnavailable.d.ts +14 -0
- package/dist/components/DatabaseUnavailable.d.ts.map +1 -0
- package/dist/components/DatabaseUnavailable.js +96 -0
- package/dist/components/DatabaseUnavailable.js.map +1 -0
- package/dist/config/environments.d.ts +42 -0
- package/dist/config/environments.d.ts.map +1 -0
- package/dist/config/environments.js +191 -0
- package/dist/config/environments.js.map +1 -0
- package/dist/hooks/useDatabaseHealth.d.ts +22 -0
- package/dist/hooks/useDatabaseHealth.d.ts.map +1 -0
- package/dist/hooks/useDatabaseHealth.js +146 -0
- package/dist/hooks/useDatabaseHealth.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +54 -54
package/README.md
CHANGED
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
# @pi-kiosk/shared
|
|
2
|
-
|
|
3
|
-
Shared types, API contracts, and error classes for the Pi Kiosk system.
|
|
4
|
-
|
|
5
|
-
This package contains only **contracts** - types, API endpoints, and error classes that are shared between the backend and frontend applications. All implementation details (components, hooks, utilities, config) have been moved to individual apps.
|
|
6
|
-
|
|
7
|
-
## Installation
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm install pi-kiosk-shared
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Usage
|
|
14
|
-
|
|
15
|
-
### Types
|
|
16
|
-
|
|
17
|
-
```tsx
|
|
18
|
-
import type { Product, ApiResponse, KioskStatus, TransactionStatus } from 'pi-kiosk-shared';
|
|
19
|
-
|
|
20
|
-
const product: Product = {
|
|
21
|
-
id: 1,
|
|
22
|
-
name: 'Coffee',
|
|
23
|
-
price: 25.0,
|
|
24
|
-
description: 'Fresh coffee',
|
|
25
|
-
image: '☕',
|
|
26
|
-
clickedOn: 0,
|
|
27
|
-
numberOfPurchases: 0,
|
|
28
|
-
};
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### API Client
|
|
32
|
-
|
|
33
|
-
```tsx
|
|
34
|
-
import { APIClient, createAPIClient, API_ENDPOINTS } from 'pi-kiosk-shared';
|
|
35
|
-
|
|
36
|
-
const apiClient = createAPIClient('http://localhost:3015');
|
|
37
|
-
const products = await apiClient.get(API_ENDPOINTS.PRODUCTS);
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### Error Classes
|
|
41
|
-
|
|
42
|
-
```tsx
|
|
43
|
-
import { NetworkError, ValidationError, AppError, getErrorMessage } from 'pi-kiosk-shared';
|
|
44
|
-
|
|
45
|
-
try {
|
|
46
|
-
// ... some operation
|
|
47
|
-
} catch (error) {
|
|
48
|
-
if (error instanceof NetworkError) {
|
|
49
|
-
console.error('Network error:', getErrorMessage(error));
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## What's NOT in this package
|
|
55
|
-
|
|
56
|
-
- **Components**: Moved to `rpapp-kiosk/src/shared/components` and `admin-app/src/shared/components`
|
|
57
|
-
- **Hooks**: Moved to `rpapp-kiosk/src/shared/hooks` and `admin-app/src/shared/hooks`
|
|
58
|
-
- **Utilities**: Moved to `rpapp-kiosk/src/shared/utils` and `admin-app/src/shared/utils`
|
|
59
|
-
- **Validation**: Moved to `admin-app/src/shared/validation`
|
|
60
|
-
- **Config**: Moved to `rpapp-kiosk/src/config` and `admin-app/src/config`
|
|
61
|
-
|
|
62
|
-
## Development
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
# Install dependencies
|
|
66
|
-
npm install
|
|
67
|
-
|
|
68
|
-
# Build the package
|
|
69
|
-
npm run build
|
|
70
|
-
|
|
71
|
-
# Run tests
|
|
72
|
-
npm test
|
|
73
|
-
|
|
74
|
-
# Watch mode for development
|
|
75
|
-
npm run dev
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
## License
|
|
79
|
-
|
|
80
|
-
MIT
|
|
1
|
+
# @pi-kiosk/shared
|
|
2
|
+
|
|
3
|
+
Shared types, API contracts, and error classes for the Pi Kiosk system.
|
|
4
|
+
|
|
5
|
+
This package contains only **contracts** - types, API endpoints, and error classes that are shared between the backend and frontend applications. All implementation details (components, hooks, utilities, config) have been moved to individual apps.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install pi-kiosk-shared
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
### Types
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import type { Product, ApiResponse, KioskStatus, TransactionStatus } from 'pi-kiosk-shared';
|
|
19
|
+
|
|
20
|
+
const product: Product = {
|
|
21
|
+
id: 1,
|
|
22
|
+
name: 'Coffee',
|
|
23
|
+
price: 25.0,
|
|
24
|
+
description: 'Fresh coffee',
|
|
25
|
+
image: '☕',
|
|
26
|
+
clickedOn: 0,
|
|
27
|
+
numberOfPurchases: 0,
|
|
28
|
+
};
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### API Client
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import { APIClient, createAPIClient, API_ENDPOINTS } from 'pi-kiosk-shared';
|
|
35
|
+
|
|
36
|
+
const apiClient = createAPIClient('http://localhost:3015');
|
|
37
|
+
const products = await apiClient.get(API_ENDPOINTS.PRODUCTS);
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Error Classes
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
import { NetworkError, ValidationError, AppError, getErrorMessage } from 'pi-kiosk-shared';
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
// ... some operation
|
|
47
|
+
} catch (error) {
|
|
48
|
+
if (error instanceof NetworkError) {
|
|
49
|
+
console.error('Network error:', getErrorMessage(error));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## What's NOT in this package
|
|
55
|
+
|
|
56
|
+
- **Components**: Moved to `rpapp-kiosk/src/shared/components` and `admin-app/src/shared/components`
|
|
57
|
+
- **Hooks**: Moved to `rpapp-kiosk/src/shared/hooks` and `admin-app/src/shared/hooks`
|
|
58
|
+
- **Utilities**: Moved to `rpapp-kiosk/src/shared/utils` and `admin-app/src/shared/utils`
|
|
59
|
+
- **Validation**: Moved to `admin-app/src/shared/validation`
|
|
60
|
+
- **Config**: Moved to `rpapp-kiosk/src/config` and `admin-app/src/config`
|
|
61
|
+
|
|
62
|
+
## Development
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Install dependencies
|
|
66
|
+
npm install
|
|
67
|
+
|
|
68
|
+
# Build the package
|
|
69
|
+
npm run build
|
|
70
|
+
|
|
71
|
+
# Run tests
|
|
72
|
+
npm test
|
|
73
|
+
|
|
74
|
+
# Watch mode for development
|
|
75
|
+
npm run dev
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## License
|
|
79
|
+
|
|
80
|
+
MIT
|
package/dist/api.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export declare const API_ENDPOINTS: {
|
|
2
2
|
readonly PRODUCTS: "/api/products";
|
|
3
3
|
readonly PRODUCT_CLICK: "/api/products/:id/click";
|
|
4
|
+
readonly PRODUCT_LOOKUP_BARCODE: "/api/products/lookup-barcode";
|
|
4
5
|
readonly PAYMENT_CREATE_QR: "/api/payments/create-qr";
|
|
5
6
|
readonly PAYMENT_CHECK_STATUS: "/api/payments/check-status/:paymentId";
|
|
6
7
|
readonly PAYMENT_COMPLETE: "/api/payments/complete";
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ChB,CAAC;AAEX,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAStE,OAAO,CAAC,wBAAwB;YAalB,OAAO;IAyCf,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIpC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAOjD,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAOhD,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAG9C;AAED,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,cAAc,MAAM,EAAE,aAAa,MAAM,cAK1F,CAAC"}
|
package/dist/api.js
CHANGED
|
@@ -3,6 +3,7 @@ export const API_ENDPOINTS = {
|
|
|
3
3
|
// Product endpoints
|
|
4
4
|
PRODUCTS: '/api/products',
|
|
5
5
|
PRODUCT_CLICK: '/api/products/:id/click',
|
|
6
|
+
PRODUCT_LOOKUP_BARCODE: '/api/products/lookup-barcode',
|
|
6
7
|
// Payment endpoints
|
|
7
8
|
PAYMENT_CREATE_QR: '/api/payments/create-qr',
|
|
8
9
|
PAYMENT_CHECK_STATUS: '/api/payments/check-status/:paymentId',
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,uBAAuB;AAEvB,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,oBAAoB;IACpB,QAAQ,EAAE,eAAe;IACzB,aAAa,EAAE,yBAAyB;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface DatabaseUnavailableProps {
|
|
2
|
+
retryCount?: number;
|
|
3
|
+
maxRetries?: number;
|
|
4
|
+
nextRetryDelay?: number;
|
|
5
|
+
onRetry?: () => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Database Unavailable Screen
|
|
9
|
+
* Shows when the backend database is unavailable
|
|
10
|
+
* Displays exponential backoff retry information
|
|
11
|
+
*/
|
|
12
|
+
export declare function DatabaseUnavailable({ retryCount, maxRetries, nextRetryDelay, onRetry, }: DatabaseUnavailableProps): JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=DatabaseUnavailable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatabaseUnavailable.d.ts","sourceRoot":"","sources":["../../src/components/DatabaseUnavailable.tsx"],"names":[],"mappings":"AAEA,UAAU,wBAAwB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,UAAc,EACd,UAAc,EACd,cAAkB,EAClB,OAAO,GACR,EAAE,wBAAwB,GAAG,GAAG,CAAC,OAAO,CAuKxC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Database Unavailable Screen
|
|
5
|
+
* Shows when the backend database is unavailable
|
|
6
|
+
* Displays exponential backoff retry information
|
|
7
|
+
*/
|
|
8
|
+
export function DatabaseUnavailable({ retryCount = 0, maxRetries = 5, nextRetryDelay = 0, onRetry, }) {
|
|
9
|
+
const [countdown, setCountdown] = useState(Math.ceil(nextRetryDelay / 1000));
|
|
10
|
+
// Update countdown every second
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (nextRetryDelay <= 0)
|
|
13
|
+
return;
|
|
14
|
+
const interval = setInterval(() => {
|
|
15
|
+
setCountdown((prev) => {
|
|
16
|
+
const newCount = prev - 1;
|
|
17
|
+
return newCount > 0 ? newCount : 0;
|
|
18
|
+
});
|
|
19
|
+
}, 1000);
|
|
20
|
+
return () => clearInterval(interval);
|
|
21
|
+
}, [nextRetryDelay]);
|
|
22
|
+
// Reset countdown when nextRetryDelay changes
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
setCountdown(Math.ceil(nextRetryDelay / 1000));
|
|
25
|
+
}, [nextRetryDelay]);
|
|
26
|
+
const formatDelay = (ms) => {
|
|
27
|
+
const seconds = Math.ceil(ms / 1000);
|
|
28
|
+
if (seconds < 60) {
|
|
29
|
+
return `${seconds} sekund`;
|
|
30
|
+
}
|
|
31
|
+
const minutes = Math.floor(seconds / 60);
|
|
32
|
+
const remainingSeconds = seconds % 60;
|
|
33
|
+
if (remainingSeconds === 0) {
|
|
34
|
+
return `${minutes} ${minutes === 1 ? 'minuta' : minutes < 5 ? 'minuty' : 'minut'}`;
|
|
35
|
+
}
|
|
36
|
+
return `${minutes} ${minutes === 1 ? 'minuta' : minutes < 5 ? 'minuty' : 'minut'} ${remainingSeconds} sekund`;
|
|
37
|
+
};
|
|
38
|
+
return (_jsx("div", { style: {
|
|
39
|
+
display: 'flex',
|
|
40
|
+
flexDirection: 'column',
|
|
41
|
+
alignItems: 'center',
|
|
42
|
+
justifyContent: 'center',
|
|
43
|
+
minHeight: '100vh',
|
|
44
|
+
padding: '2rem',
|
|
45
|
+
backgroundColor: '#f5f5f5',
|
|
46
|
+
textAlign: 'center',
|
|
47
|
+
}, role: "alert", "aria-live": "assertive", children: _jsxs("div", { style: {
|
|
48
|
+
maxWidth: '600px',
|
|
49
|
+
backgroundColor: 'white',
|
|
50
|
+
padding: '3rem',
|
|
51
|
+
borderRadius: '8px',
|
|
52
|
+
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',
|
|
53
|
+
}, children: [_jsx("div", { style: { fontSize: '4rem', marginBottom: '1rem' }, children: "\uD83D\uDDC4\uFE0F" }), _jsx("h1", { style: {
|
|
54
|
+
fontSize: '2rem',
|
|
55
|
+
fontWeight: 'bold',
|
|
56
|
+
marginBottom: '1rem',
|
|
57
|
+
color: '#333',
|
|
58
|
+
}, children: "Datab\u00E1ze nen\u00ED dostupn\u00E1" }), _jsxs("p", { style: {
|
|
59
|
+
fontSize: '1.1rem',
|
|
60
|
+
color: '#666',
|
|
61
|
+
marginBottom: '2rem',
|
|
62
|
+
lineHeight: '1.6',
|
|
63
|
+
}, children: ["Server se pokou\u0161\u00ED p\u0159ipojit k datab\u00E1zi s exponenci\u00E1ln\u00EDm backoff.", _jsx("br", {}), "Aplikace se automaticky znovu p\u0159ipoj\u00ED, jakmile bude datab\u00E1ze dostupn\u00E1."] }), _jsxs("div", { style: {
|
|
64
|
+
backgroundColor: '#f8f9fa',
|
|
65
|
+
padding: '1.5rem',
|
|
66
|
+
borderRadius: '6px',
|
|
67
|
+
marginBottom: '2rem',
|
|
68
|
+
border: '1px solid #dee2e6',
|
|
69
|
+
}, children: [_jsxs("div", { style: { marginBottom: '0.5rem' }, children: [_jsx("strong", { children: "Pokus:" }), " ", retryCount, " / ", maxRetries] }), nextRetryDelay > 0 && (_jsxs("div", { children: [_jsx("strong", { children: "Dal\u0161\u00ED pokus za:" }), ' ', _jsx("span", { style: { color: '#007bff', fontWeight: 'bold' }, children: countdown > 0 ? `${countdown} sekund` : 'právě teď...' })] })), retryCount > 0 && (_jsxs("div", { style: { marginTop: '0.5rem', fontSize: '0.9rem', color: '#666' }, children: ["Zpo\u017Ed\u011Bn\u00ED: ", formatDelay(nextRetryDelay)] }))] }), onRetry && (_jsx("button", { onClick: onRetry, style: {
|
|
70
|
+
padding: '0.75rem 2rem',
|
|
71
|
+
fontSize: '1rem',
|
|
72
|
+
backgroundColor: '#007bff',
|
|
73
|
+
color: 'white',
|
|
74
|
+
border: 'none',
|
|
75
|
+
borderRadius: '6px',
|
|
76
|
+
cursor: 'pointer',
|
|
77
|
+
fontWeight: '500',
|
|
78
|
+
transition: 'background-color 0.2s',
|
|
79
|
+
}, onMouseOver: (e) => {
|
|
80
|
+
e.currentTarget.style.backgroundColor = '#0056b3';
|
|
81
|
+
}, onMouseOut: (e) => {
|
|
82
|
+
e.currentTarget.style.backgroundColor = '#007bff';
|
|
83
|
+
}, type: "button", children: "\uD83D\uDD04 Zkusit znovu" })), _jsxs("div", { style: {
|
|
84
|
+
marginTop: '2rem',
|
|
85
|
+
paddingTop: '2rem',
|
|
86
|
+
borderTop: '1px solid #dee2e6',
|
|
87
|
+
fontSize: '0.9rem',
|
|
88
|
+
color: '#999',
|
|
89
|
+
}, children: [_jsx("p", { style: { margin: 0 }, children: "Pokud probl\u00E9m p\u0159etrv\u00E1v\u00E1, zkontrolujte:" }), _jsxs("ul", { style: {
|
|
90
|
+
textAlign: 'left',
|
|
91
|
+
display: 'inline-block',
|
|
92
|
+
marginTop: '0.5rem',
|
|
93
|
+
paddingLeft: '1.5rem',
|
|
94
|
+
}, children: [_jsx("li", { children: "Zda je datab\u00E1zov\u00FD server spu\u0161t\u011Bn\u00FD" }), _jsx("li", { children: "Zda je DATABASE_URL spr\u00E1vn\u011B nakonfigurovan\u00E1" }), _jsx("li", { children: "Zda je s\u00ED\u0165ov\u00E9 p\u0159ipojen\u00ED dostupn\u00E9" }), _jsx("li", { children: "Zda firewall umo\u017E\u0148uje p\u0159ipojen\u00ED" })] })] })] }) }));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=DatabaseUnavailable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatabaseUnavailable.js","sourceRoot":"","sources":["../../src/components/DatabaseUnavailable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export type Environment = 'development' | 'production';
|
|
2
|
+
export interface EnvironmentConfig {
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
wsUrl: string;
|
|
5
|
+
enableMockPayments: boolean;
|
|
6
|
+
paymentAccountNumber: string;
|
|
7
|
+
paymentMode: 'mock' | 'sandbox' | 'production';
|
|
8
|
+
showDebugInfo: boolean;
|
|
9
|
+
logLevel: 'debug' | 'info' | 'warn' | 'error';
|
|
10
|
+
kioskUrl: string;
|
|
11
|
+
adminUrl: string;
|
|
12
|
+
backendUrl: string;
|
|
13
|
+
sseHealthCheckInitialInterval: number;
|
|
14
|
+
sseHealthCheckBackoffMultiplier: number;
|
|
15
|
+
sseHealthCheckMaxInterval: number;
|
|
16
|
+
sseHealthCheckMaxAttempts: number;
|
|
17
|
+
sseHealthCheckMaxTotalTime: number;
|
|
18
|
+
}
|
|
19
|
+
declare global {
|
|
20
|
+
interface Window {
|
|
21
|
+
__RUNTIME_CONFIG__?: Partial<EnvironmentConfig>;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export declare const getCurrentEnvironment: () => Environment;
|
|
25
|
+
export declare const getEnvironmentConfig: () => EnvironmentConfig;
|
|
26
|
+
export declare const isDevelopment: () => boolean;
|
|
27
|
+
export declare const isProduction: () => boolean;
|
|
28
|
+
export declare const getBackendUrl: () => string;
|
|
29
|
+
export declare const getKioskUrl: () => string;
|
|
30
|
+
export declare const getAdminUrl: () => string;
|
|
31
|
+
export declare const getApiUrl: () => string;
|
|
32
|
+
export declare const getWsUrl: () => string;
|
|
33
|
+
export declare const getPaymentConfig: () => {
|
|
34
|
+
enableMockPayments: boolean;
|
|
35
|
+
paymentAccountNumber: string;
|
|
36
|
+
paymentMode: "production" | "mock" | "sandbox";
|
|
37
|
+
};
|
|
38
|
+
export declare const getUIConfig: () => {
|
|
39
|
+
showDebugInfo: boolean;
|
|
40
|
+
logLevel: "debug" | "info" | "warn" | "error";
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=environments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../src/config/environments.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,YAAY,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAEhC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IAGd,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;IAG/C,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAG9C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IAGnB,6BAA6B,EAAE,MAAM,CAAC;IACtC,+BAA+B,EAAE,MAAM,CAAC;IACxC,yBAAyB,EAAE,MAAM,CAAC;IAClC,yBAAyB,EAAE,MAAM,CAAC;IAClC,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,kBAAkB,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;KACjD;CACF;AA+HD,eAAO,MAAM,qBAAqB,QAAO,WA4CxC,CAAC;AAGF,eAAO,MAAM,oBAAoB,QAAO,iBAavC,CAAC;AAGF,eAAO,MAAM,aAAa,eAAkD,CAAC;AAC7E,eAAO,MAAM,YAAY,eAAiD,CAAC;AAG3E,eAAO,MAAM,aAAa,cAA0C,CAAC;AACrE,eAAO,MAAM,WAAW,cAAwC,CAAC;AACjE,eAAO,MAAM,WAAW,cAAwC,CAAC;AACjE,eAAO,MAAM,SAAS,cAAsC,CAAC;AAC7D,eAAO,MAAM,QAAQ,cAAqC,CAAC;AAG3D,eAAO,MAAM,gBAAgB;;;;CAO5B,CAAC;AAEF,eAAO,MAAM,WAAW;;;CAMvB,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// Centralized environment configuration for all services
|
|
2
|
+
// This ensures consistency across backend, kiosk, and admin apps
|
|
3
|
+
// Simplified environment variable helper
|
|
4
|
+
function getEnvVar(key, defaultValue) {
|
|
5
|
+
// Check for process.env (Node.js environment)
|
|
6
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
7
|
+
return process.env[key] || defaultValue;
|
|
8
|
+
}
|
|
9
|
+
// Check for import.meta.env (Vite environment)
|
|
10
|
+
if (typeof window !== 'undefined') {
|
|
11
|
+
try {
|
|
12
|
+
// @ts-ignore - Vite environment
|
|
13
|
+
const meta = globalThis.import?.meta;
|
|
14
|
+
if (meta && meta.env) {
|
|
15
|
+
return meta.env[key] || defaultValue;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
// Fallback for test environments
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return defaultValue;
|
|
23
|
+
}
|
|
24
|
+
function getEnvBool(key, defaultValue) {
|
|
25
|
+
const value = getEnvVar(key, defaultValue.toString());
|
|
26
|
+
return value === 'true';
|
|
27
|
+
}
|
|
28
|
+
function getEnvNumber(key, defaultValue) {
|
|
29
|
+
const value = getEnvVar(key, defaultValue.toString());
|
|
30
|
+
const parsed = parseInt(value, 10);
|
|
31
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
32
|
+
}
|
|
33
|
+
// Centralized service URLs configuration
|
|
34
|
+
const SERVICE_URLS = {
|
|
35
|
+
development: {
|
|
36
|
+
backend: 'http://localhost:3015',
|
|
37
|
+
kiosk: 'http://localhost:3000',
|
|
38
|
+
admin: 'http://localhost:3001',
|
|
39
|
+
},
|
|
40
|
+
production: {
|
|
41
|
+
backend: 'https://rpapp-bckend-production.up.railway.app',
|
|
42
|
+
kiosk: 'https://rpapp-kiosk-production.up.railway.app',
|
|
43
|
+
admin: 'https://extraordinary-healing-production-88f4.up.railway.app',
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
function getRuntimeConfigOverride() {
|
|
47
|
+
if (typeof globalThis === 'undefined') {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
const maybeWindow = globalThis;
|
|
51
|
+
const runtimeConfig = maybeWindow.__RUNTIME_CONFIG__;
|
|
52
|
+
if (!runtimeConfig || typeof runtimeConfig !== 'object') {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return runtimeConfig;
|
|
56
|
+
}
|
|
57
|
+
// Get environment configuration dynamically
|
|
58
|
+
function getConfigForEnvironment(env) {
|
|
59
|
+
const urls = SERVICE_URLS[env];
|
|
60
|
+
if (env === 'development') {
|
|
61
|
+
return {
|
|
62
|
+
// API Configuration
|
|
63
|
+
apiUrl: getEnvVar('REACT_APP_API_URL', urls.backend),
|
|
64
|
+
wsUrl: getEnvVar('REACT_APP_WS_URL', urls.backend.replace('http', 'ws')),
|
|
65
|
+
// Payment Configuration
|
|
66
|
+
enableMockPayments: getEnvBool('REACT_APP_ENABLE_MOCK_PAYMENTS', true),
|
|
67
|
+
paymentAccountNumber: getEnvVar('REACT_APP_PAYMENT_ACCOUNT', '1234567890'),
|
|
68
|
+
paymentMode: getEnvVar('REACT_APP_PAYMENT_MODE', 'mock'),
|
|
69
|
+
// UI Configuration
|
|
70
|
+
showDebugInfo: getEnvBool('REACT_APP_SHOW_DEBUG_INFO', true),
|
|
71
|
+
logLevel: getEnvVar('REACT_APP_LOG_LEVEL', 'debug'),
|
|
72
|
+
// Service URLs
|
|
73
|
+
kioskUrl: getEnvVar('REACT_APP_KIOSK_URL', urls.kiosk),
|
|
74
|
+
adminUrl: getEnvVar('REACT_APP_ADMIN_URL', urls.admin),
|
|
75
|
+
backendUrl: getEnvVar('REACT_APP_BACKEND_URL', urls.backend),
|
|
76
|
+
// SSE Health Check Configuration
|
|
77
|
+
sseHealthCheckInitialInterval: getEnvNumber('REACT_APP_SSE_HEALTH_CHECK_INITIAL_INTERVAL', 300000), // 5 minutes
|
|
78
|
+
sseHealthCheckBackoffMultiplier: getEnvNumber('REACT_APP_SSE_HEALTH_CHECK_BACKOFF_MULTIPLIER', 2),
|
|
79
|
+
sseHealthCheckMaxInterval: getEnvNumber('REACT_APP_SSE_HEALTH_CHECK_MAX_INTERVAL', 900000), // 15 minutes
|
|
80
|
+
sseHealthCheckMaxAttempts: getEnvNumber('REACT_APP_SSE_HEALTH_CHECK_MAX_ATTEMPTS', 8),
|
|
81
|
+
sseHealthCheckMaxTotalTime: getEnvNumber('REACT_APP_SSE_HEALTH_CHECK_MAX_TOTAL_TIME', 1800000), // 30 minutes
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return {
|
|
86
|
+
// API Configuration
|
|
87
|
+
apiUrl: getEnvVar('REACT_APP_API_URL', urls.backend),
|
|
88
|
+
wsUrl: getEnvVar('REACT_APP_WS_URL', urls.backend.replace('https', 'wss')),
|
|
89
|
+
// Payment Configuration
|
|
90
|
+
enableMockPayments: getEnvBool('REACT_APP_ENABLE_MOCK_PAYMENTS', false),
|
|
91
|
+
paymentAccountNumber: getEnvVar('REACT_APP_PAYMENT_ACCOUNT', '1234567890'),
|
|
92
|
+
paymentMode: getEnvVar('REACT_APP_PAYMENT_MODE', 'production'),
|
|
93
|
+
// UI Configuration
|
|
94
|
+
showDebugInfo: getEnvBool('REACT_APP_SHOW_DEBUG_INFO', false),
|
|
95
|
+
logLevel: getEnvVar('REACT_APP_LOG_LEVEL', 'warn'),
|
|
96
|
+
// Service URLs
|
|
97
|
+
kioskUrl: getEnvVar('REACT_APP_KIOSK_URL', urls.kiosk),
|
|
98
|
+
adminUrl: getEnvVar('REACT_APP_ADMIN_URL', urls.admin),
|
|
99
|
+
backendUrl: getEnvVar('REACT_APP_BACKEND_URL', urls.backend),
|
|
100
|
+
// SSE Health Check Configuration
|
|
101
|
+
sseHealthCheckInitialInterval: getEnvNumber('REACT_APP_SSE_HEALTH_CHECK_INITIAL_INTERVAL', 300000), // 5 minutes
|
|
102
|
+
sseHealthCheckBackoffMultiplier: getEnvNumber('REACT_APP_SSE_HEALTH_CHECK_BACKOFF_MULTIPLIER', 2),
|
|
103
|
+
sseHealthCheckMaxInterval: getEnvNumber('REACT_APP_SSE_HEALTH_CHECK_MAX_INTERVAL', 900000), // 15 minutes
|
|
104
|
+
sseHealthCheckMaxAttempts: getEnvNumber('REACT_APP_SSE_HEALTH_CHECK_MAX_ATTEMPTS', 8),
|
|
105
|
+
sseHealthCheckMaxTotalTime: getEnvNumber('REACT_APP_SSE_HEALTH_CHECK_MAX_TOTAL_TIME', 1800000), // 30 minutes
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Simplified environment detection
|
|
110
|
+
export const getCurrentEnvironment = () => {
|
|
111
|
+
// Check for process.env (Node.js environment)
|
|
112
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
113
|
+
return process.env.NODE_ENV === 'production' ? 'production' : 'development';
|
|
114
|
+
}
|
|
115
|
+
// Check if we're on Railway domain (most reliable for production detection)
|
|
116
|
+
if (typeof window !== 'undefined' && window.location) {
|
|
117
|
+
if (window.location.hostname.includes('railway.app') ||
|
|
118
|
+
window.location.hostname.includes('up.railway.app')) {
|
|
119
|
+
return 'production';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Check for import.meta.env (Vite environment)
|
|
123
|
+
if (typeof window !== 'undefined') {
|
|
124
|
+
try {
|
|
125
|
+
// @ts-ignore - Vite environment
|
|
126
|
+
const meta = globalThis.import?.meta;
|
|
127
|
+
if (meta && meta.env) {
|
|
128
|
+
return meta.env.MODE === 'production' ? 'production' : 'development';
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
// Ignore errors
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Additional fallback: check for production URLs in environment variables
|
|
136
|
+
if (typeof window !== 'undefined') {
|
|
137
|
+
try {
|
|
138
|
+
// @ts-ignore - Vite environment
|
|
139
|
+
const meta = globalThis.import?.meta;
|
|
140
|
+
if (meta && meta.env) {
|
|
141
|
+
const apiUrl = meta.env.VITE_API_URL || meta.env.REACT_APP_API_URL;
|
|
142
|
+
if (apiUrl && apiUrl.includes('railway.app')) {
|
|
143
|
+
return 'production';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
// Ignore errors
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return 'development';
|
|
152
|
+
};
|
|
153
|
+
// Get current environment configuration
|
|
154
|
+
export const getEnvironmentConfig = () => {
|
|
155
|
+
const env = getCurrentEnvironment();
|
|
156
|
+
const baseConfig = getConfigForEnvironment(env);
|
|
157
|
+
const runtimeOverride = getRuntimeConfigOverride();
|
|
158
|
+
if (!runtimeOverride) {
|
|
159
|
+
return baseConfig;
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
...baseConfig,
|
|
163
|
+
...runtimeOverride,
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
// Simple environment checks
|
|
167
|
+
export const isDevelopment = () => getCurrentEnvironment() === 'development';
|
|
168
|
+
export const isProduction = () => getCurrentEnvironment() === 'production';
|
|
169
|
+
// Utility functions for easy access to service URLs
|
|
170
|
+
export const getBackendUrl = () => getEnvironmentConfig().backendUrl;
|
|
171
|
+
export const getKioskUrl = () => getEnvironmentConfig().kioskUrl;
|
|
172
|
+
export const getAdminUrl = () => getEnvironmentConfig().adminUrl;
|
|
173
|
+
export const getApiUrl = () => getEnvironmentConfig().apiUrl;
|
|
174
|
+
export const getWsUrl = () => getEnvironmentConfig().wsUrl;
|
|
175
|
+
// Service-specific configuration helpers
|
|
176
|
+
export const getPaymentConfig = () => {
|
|
177
|
+
const config = getEnvironmentConfig();
|
|
178
|
+
return {
|
|
179
|
+
enableMockPayments: config.enableMockPayments,
|
|
180
|
+
paymentAccountNumber: config.paymentAccountNumber,
|
|
181
|
+
paymentMode: config.paymentMode,
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
export const getUIConfig = () => {
|
|
185
|
+
const config = getEnvironmentConfig();
|
|
186
|
+
return {
|
|
187
|
+
showDebugInfo: config.showDebugInfo,
|
|
188
|
+
logLevel: config.logLevel,
|
|
189
|
+
};
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=environments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/config/environments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface UseDatabaseHealthOptions {
|
|
2
|
+
healthEndpoint?: string;
|
|
3
|
+
pollInterval?: number;
|
|
4
|
+
maxRetries?: number;
|
|
5
|
+
retryDelay?: number;
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
}
|
|
8
|
+
interface UseDatabaseHealthReturn {
|
|
9
|
+
isDatabaseAvailable: boolean;
|
|
10
|
+
isChecking: boolean;
|
|
11
|
+
retryCount: number;
|
|
12
|
+
nextRetryDelay: number;
|
|
13
|
+
error: Error | null;
|
|
14
|
+
checkHealth: () => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Hook to monitor database health via backend health endpoint
|
|
18
|
+
* Implements exponential backoff retry logic
|
|
19
|
+
*/
|
|
20
|
+
export declare function useDatabaseHealth(options?: UseDatabaseHealthOptions): UseDatabaseHealthReturn;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=useDatabaseHealth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDatabaseHealth.d.ts","sourceRoot":"","sources":["../../src/hooks/useDatabaseHealth.ts"],"names":[],"mappings":"AAaA,UAAU,wBAAwB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,uBAAuB;IAC/B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,wBAA6B,GACrC,uBAAuB,CAkKzB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Hook to monitor database health via backend health endpoint
|
|
4
|
+
* Implements exponential backoff retry logic
|
|
5
|
+
*/
|
|
6
|
+
export function useDatabaseHealth(options = {}) {
|
|
7
|
+
const { healthEndpoint = '/health', pollInterval = 5000, // Poll every 5 seconds
|
|
8
|
+
maxRetries = 5, retryDelay = 1000, // Initial delay: 1 second
|
|
9
|
+
enabled = true, } = options;
|
|
10
|
+
const [isDatabaseAvailable, setIsDatabaseAvailable] = useState(true);
|
|
11
|
+
const [isChecking, setIsChecking] = useState(false);
|
|
12
|
+
const [retryCount, setRetryCount] = useState(0);
|
|
13
|
+
const [nextRetryDelay, setNextRetryDelay] = useState(0);
|
|
14
|
+
const [error, setError] = useState(null);
|
|
15
|
+
const pollTimeoutRef = useRef(null);
|
|
16
|
+
const retryTimeoutRef = useRef(null);
|
|
17
|
+
const currentRetryCountRef = useRef(0);
|
|
18
|
+
const backoffMultiplierRef = useRef(2);
|
|
19
|
+
const currentDelayRef = useRef(retryDelay);
|
|
20
|
+
const checkHealth = useCallback(async () => {
|
|
21
|
+
if (!enabled)
|
|
22
|
+
return;
|
|
23
|
+
setIsChecking(true);
|
|
24
|
+
setError(null);
|
|
25
|
+
try {
|
|
26
|
+
const response = await fetch(healthEndpoint, {
|
|
27
|
+
method: 'GET',
|
|
28
|
+
headers: {
|
|
29
|
+
'Content-Type': 'application/json',
|
|
30
|
+
},
|
|
31
|
+
// Add cache-busting to prevent stale responses
|
|
32
|
+
cache: 'no-cache',
|
|
33
|
+
});
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
throw new Error(`Health check failed: ${response.status} ${response.statusText}`);
|
|
36
|
+
}
|
|
37
|
+
const data = (await response.json());
|
|
38
|
+
// Check if database service is healthy
|
|
39
|
+
const dbStatus = data.services?.database?.status;
|
|
40
|
+
const isDbHealthy = dbStatus === 'healthy' || (dbStatus === undefined && data.success);
|
|
41
|
+
if (isDbHealthy) {
|
|
42
|
+
// Database is available - reset retry state
|
|
43
|
+
setIsDatabaseAvailable(true);
|
|
44
|
+
setRetryCount(0);
|
|
45
|
+
setNextRetryDelay(0);
|
|
46
|
+
currentRetryCountRef.current = 0;
|
|
47
|
+
currentDelayRef.current = retryDelay;
|
|
48
|
+
backoffMultiplierRef.current = 2;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Database is unavailable
|
|
52
|
+
setIsDatabaseAvailable(false);
|
|
53
|
+
// Increment retry count
|
|
54
|
+
const newRetryCount = currentRetryCountRef.current + 1;
|
|
55
|
+
currentRetryCountRef.current = newRetryCount;
|
|
56
|
+
setRetryCount(newRetryCount);
|
|
57
|
+
if (newRetryCount < maxRetries) {
|
|
58
|
+
// Calculate next delay with exponential backoff
|
|
59
|
+
const nextDelay = Math.min(currentDelayRef.current * backoffMultiplierRef.current, retryDelay * 30 // Cap at 30x initial delay
|
|
60
|
+
);
|
|
61
|
+
currentDelayRef.current = nextDelay;
|
|
62
|
+
setNextRetryDelay(nextDelay);
|
|
63
|
+
// Schedule next retry
|
|
64
|
+
retryTimeoutRef.current = setTimeout(() => {
|
|
65
|
+
void checkHealth();
|
|
66
|
+
}, nextDelay);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Max retries reached - continue polling at regular interval
|
|
70
|
+
setNextRetryDelay(pollInterval);
|
|
71
|
+
retryTimeoutRef.current = setTimeout(() => {
|
|
72
|
+
void checkHealth();
|
|
73
|
+
}, pollInterval);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
// Network error or other failure
|
|
79
|
+
const error = err instanceof Error ? err : new Error('Failed to check database health');
|
|
80
|
+
setError(error);
|
|
81
|
+
setIsDatabaseAvailable(false);
|
|
82
|
+
// Increment retry count
|
|
83
|
+
const newRetryCount = currentRetryCountRef.current + 1;
|
|
84
|
+
currentRetryCountRef.current = newRetryCount;
|
|
85
|
+
setRetryCount(newRetryCount);
|
|
86
|
+
if (newRetryCount < maxRetries) {
|
|
87
|
+
// Calculate next delay with exponential backoff
|
|
88
|
+
const nextDelay = Math.min(currentDelayRef.current * backoffMultiplierRef.current, retryDelay * 30 // Cap at 30x initial delay
|
|
89
|
+
);
|
|
90
|
+
currentDelayRef.current = nextDelay;
|
|
91
|
+
setNextRetryDelay(nextDelay);
|
|
92
|
+
// Schedule next retry
|
|
93
|
+
retryTimeoutRef.current = setTimeout(() => {
|
|
94
|
+
void checkHealth();
|
|
95
|
+
}, nextDelay);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// Max retries reached - continue polling at regular interval
|
|
99
|
+
setNextRetryDelay(pollInterval);
|
|
100
|
+
retryTimeoutRef.current = setTimeout(() => {
|
|
101
|
+
void checkHealth();
|
|
102
|
+
}, pollInterval);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
setIsChecking(false);
|
|
107
|
+
}
|
|
108
|
+
}, [enabled, healthEndpoint, maxRetries, retryDelay, pollInterval]);
|
|
109
|
+
// Initial health check and polling
|
|
110
|
+
useEffect(() => {
|
|
111
|
+
if (!enabled)
|
|
112
|
+
return;
|
|
113
|
+
// Initial check
|
|
114
|
+
void checkHealth();
|
|
115
|
+
// Set up polling interval (only when database is available)
|
|
116
|
+
const startPolling = () => {
|
|
117
|
+
if (pollTimeoutRef.current) {
|
|
118
|
+
clearTimeout(pollTimeoutRef.current);
|
|
119
|
+
}
|
|
120
|
+
pollTimeoutRef.current = setTimeout(() => {
|
|
121
|
+
if (isDatabaseAvailable) {
|
|
122
|
+
void checkHealth();
|
|
123
|
+
}
|
|
124
|
+
startPolling();
|
|
125
|
+
}, pollInterval);
|
|
126
|
+
};
|
|
127
|
+
startPolling();
|
|
128
|
+
return () => {
|
|
129
|
+
if (pollTimeoutRef.current) {
|
|
130
|
+
clearTimeout(pollTimeoutRef.current);
|
|
131
|
+
}
|
|
132
|
+
if (retryTimeoutRef.current) {
|
|
133
|
+
clearTimeout(retryTimeoutRef.current);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
}, [enabled, checkHealth, isDatabaseAvailable, pollInterval]);
|
|
137
|
+
return {
|
|
138
|
+
isDatabaseAvailable,
|
|
139
|
+
isChecking,
|
|
140
|
+
retryCount,
|
|
141
|
+
nextRetryDelay,
|
|
142
|
+
error,
|
|
143
|
+
checkHealth,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=useDatabaseHealth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDatabaseHealth.js","sourceRoot":"","sources":["../../src/hooks/useDatabaseHealth.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,kCAAkC,CAAC;AACjD,cAAc,2BAA2B,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kEAAkE;AAClE,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kEAAkE;AAClE,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,kCAAkC,CAAC;AACjD,cAAc,2BAA2B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "pi-kiosk-shared",
|
|
3
|
-
"version": "2.1.
|
|
4
|
-
"private": false,
|
|
5
|
-
"description": "Shared types, API contracts, and error classes for Pi Kiosk system",
|
|
6
|
-
"keywords": [
|
|
7
|
-
"kiosk",
|
|
8
|
-
"typescript",
|
|
9
|
-
"types",
|
|
10
|
-
"api"
|
|
11
|
-
],
|
|
12
|
-
"author": "tehacko@seznam.cz",
|
|
13
|
-
"license": "MIT",
|
|
14
|
-
"repository": {
|
|
15
|
-
"type": "git",
|
|
16
|
-
"url": "https://github.com/tehacko/pi-kiosk-shared"
|
|
17
|
-
},
|
|
18
|
-
"main": "dist/index.js",
|
|
19
|
-
"module": "dist/index.js",
|
|
20
|
-
"types": "dist/index.d.ts",
|
|
21
|
-
"exports": {
|
|
22
|
-
".": {
|
|
23
|
-
"import": "./dist/index.js",
|
|
24
|
-
"require": "./dist/index.js",
|
|
25
|
-
"types": "./dist/index.d.ts"
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
"scripts": {
|
|
29
|
-
"build": "tsc",
|
|
30
|
-
"dev": "tsc --watch",
|
|
31
|
-
"test": "jest --config jest.config.cjs",
|
|
32
|
-
"test:watch": "jest --config jest.config.cjs --watch",
|
|
33
|
-
"test:coverage": "jest --config jest.config.cjs --coverage",
|
|
34
|
-
"clean": "rimraf dist",
|
|
35
|
-
"publish:local": "npm run build && npm pack --pack-destination ../",
|
|
36
|
-
"prepublishOnly": "npm run build",
|
|
37
|
-
"preversion": "npm run test -- --passWithNoTests",
|
|
38
|
-
"postversion": "echo 'Version updated. Run git push && git push --tags manually if needed.'"
|
|
39
|
-
},
|
|
40
|
-
"files": [
|
|
41
|
-
"dist",
|
|
42
|
-
"README.md"
|
|
43
|
-
],
|
|
44
|
-
"dependencies": {},
|
|
45
|
-
"devDependencies": {
|
|
46
|
-
"typescript": "^5.0.0",
|
|
47
|
-
"@types/jest": "^29.5.0",
|
|
48
|
-
"@types/node": "^20.0.0",
|
|
49
|
-
"@types/react": "^18.2.0",
|
|
50
|
-
"jest": "^29.5.0",
|
|
51
|
-
"ts-jest": "^29.1.0",
|
|
52
|
-
"rimraf": "^5.0.0"
|
|
53
|
-
}
|
|
54
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "pi-kiosk-shared",
|
|
3
|
+
"version": "2.1.13",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "Shared types, API contracts, and error classes for Pi Kiosk system",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"kiosk",
|
|
8
|
+
"typescript",
|
|
9
|
+
"types",
|
|
10
|
+
"api"
|
|
11
|
+
],
|
|
12
|
+
"author": "tehacko@seznam.cz",
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/tehacko/pi-kiosk-shared.git"
|
|
17
|
+
},
|
|
18
|
+
"main": "dist/index.js",
|
|
19
|
+
"module": "dist/index.js",
|
|
20
|
+
"types": "dist/index.d.ts",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"import": "./dist/index.js",
|
|
24
|
+
"require": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc",
|
|
30
|
+
"dev": "tsc --watch",
|
|
31
|
+
"test": "jest --config jest.config.cjs",
|
|
32
|
+
"test:watch": "jest --config jest.config.cjs --watch",
|
|
33
|
+
"test:coverage": "jest --config jest.config.cjs --coverage",
|
|
34
|
+
"clean": "rimraf dist",
|
|
35
|
+
"publish:local": "npm run build && npm pack --pack-destination ../",
|
|
36
|
+
"prepublishOnly": "npm run build",
|
|
37
|
+
"preversion": "npm run test -- --passWithNoTests",
|
|
38
|
+
"postversion": "echo 'Version updated. Run git push && git push --tags manually if needed.'"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"README.md"
|
|
43
|
+
],
|
|
44
|
+
"dependencies": {},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"typescript": "^5.0.0",
|
|
47
|
+
"@types/jest": "^29.5.0",
|
|
48
|
+
"@types/node": "^20.0.0",
|
|
49
|
+
"@types/react": "^18.2.0",
|
|
50
|
+
"jest": "^29.5.0",
|
|
51
|
+
"ts-jest": "^29.1.0",
|
|
52
|
+
"rimraf": "^5.0.0"
|
|
53
|
+
}
|
|
54
|
+
}
|