@sudobility/di 1.4.32 → 1.5.2
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 +255 -39
- package/dist/rn/analytics/analytics.rn.d.ts +19 -0
- package/dist/rn/analytics/analytics.rn.d.ts.map +1 -0
- package/dist/rn/analytics/analytics.rn.js +103 -0
- package/dist/rn/analytics/analytics.rn.js.map +1 -0
- package/dist/rn/env/env.rn.d.ts +14 -0
- package/dist/rn/env/env.rn.d.ts.map +1 -0
- package/dist/rn/env/env.rn.js +58 -0
- package/dist/rn/env/env.rn.js.map +1 -0
- package/dist/rn/firebase/firebase.rn.d.ts +19 -0
- package/dist/rn/firebase/firebase.rn.d.ts.map +1 -0
- package/dist/rn/firebase/firebase.rn.js +318 -0
- package/dist/rn/firebase/firebase.rn.js.map +1 -0
- package/dist/rn/index.d.ts +29 -0
- package/dist/rn/index.d.ts.map +1 -0
- package/dist/rn/index.js +27 -0
- package/dist/rn/index.js.map +1 -0
- package/dist/rn/logging/logging.rn.d.ts +28 -0
- package/dist/rn/logging/logging.rn.d.ts.map +1 -0
- package/dist/rn/logging/logging.rn.js +78 -0
- package/dist/rn/logging/logging.rn.js.map +1 -0
- package/dist/rn/navigation/navigation.rn.d.ts +29 -0
- package/dist/rn/navigation/navigation.rn.d.ts.map +1 -0
- package/dist/rn/navigation/navigation.rn.js +161 -0
- package/dist/rn/navigation/navigation.rn.js.map +1 -0
- package/dist/rn/network/network-singleton.d.ts +8 -0
- package/dist/rn/network/network-singleton.d.ts.map +1 -0
- package/dist/rn/network/network-singleton.js +36 -0
- package/dist/rn/network/network-singleton.js.map +1 -0
- package/dist/rn/network/network.rn.d.ts +41 -0
- package/dist/rn/network/network.rn.d.ts.map +1 -0
- package/dist/rn/network/network.rn.js +185 -0
- package/dist/rn/network/network.rn.js.map +1 -0
- package/dist/rn/notification/notification.rn.d.ts +26 -0
- package/dist/rn/notification/notification.rn.d.ts.map +1 -0
- package/dist/rn/notification/notification.rn.js +187 -0
- package/dist/rn/notification/notification.rn.js.map +1 -0
- package/dist/rn/storage/storage-singleton.d.ts +25 -0
- package/dist/rn/storage/storage-singleton.d.ts.map +1 -0
- package/dist/rn/storage/storage-singleton.js +68 -0
- package/dist/rn/storage/storage-singleton.js.map +1 -0
- package/dist/rn/storage/storage.rn.d.ts +33 -0
- package/dist/rn/storage/storage.rn.d.ts.map +1 -0
- package/dist/rn/storage/storage.rn.js +113 -0
- package/dist/rn/storage/storage.rn.js.map +1 -0
- package/dist/rn/theme/theme.rn.d.ts +31 -0
- package/dist/rn/theme/theme.rn.d.ts.map +1 -0
- package/dist/rn/theme/theme.rn.js +116 -0
- package/dist/rn/theme/theme.rn.js.map +1 -0
- package/dist/web/firebase/firebase.interface.d.ts +81 -0
- package/dist/web/firebase/firebase.interface.d.ts.map +1 -0
- package/dist/web/firebase/firebase.interface.js +2 -0
- package/dist/web/firebase/firebase.interface.js.map +1 -0
- package/dist/web/firebase/firebase.web.d.ts +22 -0
- package/dist/web/firebase/firebase.web.d.ts.map +1 -0
- package/dist/web/firebase/firebase.web.js +339 -0
- package/dist/web/firebase/firebase.web.js.map +1 -0
- package/dist/web/index.d.ts +20 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +18 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/navigation/navigation.web.d.ts +34 -0
- package/dist/web/navigation/navigation.web.d.ts.map +1 -0
- package/dist/web/navigation/navigation.web.js +176 -0
- package/dist/web/navigation/navigation.web.js.map +1 -0
- package/dist/web/navigation/ui-navigation.d.ts +51 -0
- package/dist/web/navigation/ui-navigation.d.ts.map +1 -0
- package/dist/web/navigation/ui-navigation.js +2 -0
- package/dist/web/navigation/ui-navigation.js.map +1 -0
- package/dist/web/network/network-singleton.d.ts +5 -0
- package/dist/web/network/network-singleton.d.ts.map +1 -0
- package/dist/web/network/network-singleton.js +21 -0
- package/dist/web/network/network-singleton.js.map +1 -0
- package/dist/web/network/network.web.d.ts +12 -0
- package/dist/web/network/network.web.d.ts.map +1 -0
- package/dist/web/network/network.web.js +124 -0
- package/dist/web/network/network.web.js.map +1 -0
- package/dist/web/network/web-network.service.d.ts +24 -0
- package/dist/web/network/web-network.service.d.ts.map +1 -0
- package/dist/web/network/web-network.service.js +150 -0
- package/dist/web/network/web-network.service.js.map +1 -0
- package/dist/web/storage/storage-singleton.d.ts +5 -0
- package/dist/web/storage/storage-singleton.d.ts.map +1 -0
- package/dist/web/storage/storage-singleton.js +19 -0
- package/dist/web/storage/storage-singleton.js.map +1 -0
- package/dist/web/storage/storage.web.d.ts +22 -0
- package/dist/web/storage/storage.web.d.ts.map +1 -0
- package/dist/web/storage/storage.web.js +107 -0
- package/dist/web/storage/storage.web.js.map +1 -0
- package/dist/web/storage/web-storage.service.d.ts +23 -0
- package/dist/web/storage/web-storage.service.d.ts.map +1 -0
- package/dist/web/storage/web-storage.service.js +137 -0
- package/dist/web/storage/web-storage.service.js.map +1 -0
- package/package.json +66 -5
package/README.md
CHANGED
|
@@ -1,67 +1,283 @@
|
|
|
1
|
-
# @
|
|
1
|
+
# @sudobility/di
|
|
2
2
|
|
|
3
|
-
Platform-agnostic dependency injection
|
|
3
|
+
Platform-agnostic dependency injection for React and React Native with automatic platform detection.
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
|
-
This library provides
|
|
7
|
+
This library provides unified DI services that work identically on Web and React Native. The bundler automatically selects the correct platform implementation, so you write the same code for both platforms.
|
|
8
8
|
|
|
9
9
|
## Features
|
|
10
10
|
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
11
|
+
- **Unified API**: Same code works on Web and React Native
|
|
12
|
+
- **Automatic Platform Detection**: Bundler selects correct implementation
|
|
13
|
+
- **TypeScript First**: Fully typed interfaces and implementations
|
|
14
|
+
- **Lazy Loading**: Native modules loaded only when used
|
|
15
|
+
- **Singleton Management**: Built-in service lifecycle management
|
|
16
|
+
- **Modular**: Import only what you need
|
|
16
17
|
|
|
17
18
|
## Installation
|
|
18
19
|
|
|
19
20
|
```bash
|
|
20
|
-
npm install @
|
|
21
|
+
npm install @sudobility/di
|
|
21
22
|
```
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
### Optional Peer Dependencies
|
|
25
|
+
|
|
26
|
+
**Web:**
|
|
27
|
+
```bash
|
|
28
|
+
npm install firebase
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**React Native:**
|
|
32
|
+
```bash
|
|
33
|
+
npm install @react-native-async-storage/async-storage
|
|
34
|
+
npm install @react-native-community/netinfo
|
|
35
|
+
npm install @react-native-firebase/app @react-native-firebase/analytics
|
|
36
|
+
npm install @react-native-firebase/remote-config @react-native-firebase/messaging
|
|
37
|
+
npm install @notifee/react-native
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Quick Start
|
|
41
|
+
|
|
42
|
+
### 1. Initialize Services
|
|
24
43
|
|
|
25
44
|
```typescript
|
|
45
|
+
// main.tsx or App.tsx
|
|
26
46
|
import {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
47
|
+
initializeStorageService,
|
|
48
|
+
initializeNetworkService,
|
|
49
|
+
initializeFirebaseService,
|
|
50
|
+
} from '@sudobility/di';
|
|
51
|
+
|
|
52
|
+
// Call before rendering app
|
|
53
|
+
initializeStorageService();
|
|
54
|
+
initializeNetworkService();
|
|
55
|
+
initializeFirebaseService(firebaseConfig);
|
|
37
56
|
```
|
|
38
57
|
|
|
39
|
-
|
|
58
|
+
### 2. Use Services
|
|
40
59
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
60
|
+
```typescript
|
|
61
|
+
import {
|
|
62
|
+
getStorageService,
|
|
63
|
+
getNetworkService,
|
|
64
|
+
getFirebaseService,
|
|
65
|
+
networkClient,
|
|
66
|
+
} from '@sudobility/di';
|
|
67
|
+
|
|
68
|
+
// Storage
|
|
69
|
+
const storage = getStorageService();
|
|
70
|
+
await storage.setItem('token', 'abc123');
|
|
71
|
+
const token = await storage.getItem('token');
|
|
72
|
+
|
|
73
|
+
// Network requests
|
|
74
|
+
const response = await networkClient.get<User>('/api/user');
|
|
75
|
+
|
|
76
|
+
// Network status
|
|
77
|
+
const network = getNetworkService();
|
|
78
|
+
const isOnline = network.isOnline();
|
|
79
|
+
|
|
80
|
+
// Firebase
|
|
81
|
+
const firebase = getFirebaseService();
|
|
82
|
+
firebase.analytics.logEvent('screen_view', { screen: 'Home' });
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## API Reference
|
|
45
86
|
|
|
46
87
|
### Storage
|
|
47
|
-
- `StorageProvider` - Storage abstraction
|
|
48
|
-
- `PlatformStorage` - Basic storage interface
|
|
49
|
-
- `StorageService` - Enhanced storage service
|
|
50
88
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
89
|
+
```typescript
|
|
90
|
+
import { getStorageService, storage } from '@sudobility/di';
|
|
91
|
+
|
|
92
|
+
const storageService = getStorageService();
|
|
93
|
+
|
|
94
|
+
// Basic operations
|
|
95
|
+
await storageService.setItem('key', 'value');
|
|
96
|
+
const value = await storageService.getItem('key');
|
|
97
|
+
await storageService.removeItem('key');
|
|
98
|
+
await storageService.clear();
|
|
99
|
+
const keys = await storageService.getAllKeys();
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Network Requests
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
import { networkClient } from '@sudobility/di';
|
|
106
|
+
|
|
107
|
+
// GET
|
|
108
|
+
const response = await networkClient.get<User>('/api/user');
|
|
109
|
+
if (response.ok) {
|
|
110
|
+
console.log(response.data);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// POST with body
|
|
114
|
+
const result = await networkClient.post<Result>('/api/submit', {
|
|
115
|
+
name: 'John',
|
|
116
|
+
email: 'john@example.com'
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// PUT and DELETE
|
|
120
|
+
await networkClient.put('/api/user/1', { name: 'Jane' });
|
|
121
|
+
await networkClient.delete('/api/user/1');
|
|
54
122
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
123
|
+
// With options
|
|
124
|
+
const response = await networkClient.get('/api/data', {
|
|
125
|
+
headers: { 'Authorization': 'Bearer token' },
|
|
126
|
+
timeout: 5000,
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Network Status
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
import { getNetworkService } from '@sudobility/di';
|
|
134
|
+
|
|
135
|
+
const network = getNetworkService();
|
|
136
|
+
|
|
137
|
+
// Check connection
|
|
138
|
+
const isOnline = network.isOnline();
|
|
139
|
+
|
|
140
|
+
// Watch for changes
|
|
141
|
+
const unsubscribe = network.watchNetworkStatus((online) => {
|
|
142
|
+
console.log('Connection:', online ? 'Online' : 'Offline');
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// Cleanup when done
|
|
146
|
+
unsubscribe();
|
|
147
|
+
```
|
|
58
148
|
|
|
59
|
-
###
|
|
60
|
-
- Auth interfaces for various providers
|
|
149
|
+
### Firebase
|
|
61
150
|
|
|
62
|
-
|
|
63
|
-
|
|
151
|
+
```typescript
|
|
152
|
+
import { getFirebaseService } from '@sudobility/di';
|
|
153
|
+
|
|
154
|
+
const firebase = getFirebaseService();
|
|
155
|
+
|
|
156
|
+
// Analytics
|
|
157
|
+
firebase.analytics.logEvent('purchase', { item: 'premium', price: 9.99 });
|
|
158
|
+
firebase.analytics.setUserId('user123');
|
|
159
|
+
firebase.analytics.setUserProperties({ plan: 'pro' });
|
|
160
|
+
|
|
161
|
+
// Remote Config
|
|
162
|
+
await firebase.remoteConfig.fetchAndActivate();
|
|
163
|
+
const showFeature = firebase.remoteConfig.getValue('new_feature').asBoolean();
|
|
164
|
+
const apiUrl = firebase.remoteConfig.getValue('api_url').asString();
|
|
165
|
+
const maxItems = firebase.remoteConfig.getValue('max_items').asNumber();
|
|
166
|
+
|
|
167
|
+
// Messaging (FCM)
|
|
168
|
+
const granted = await firebase.messaging.requestPermission();
|
|
169
|
+
if (granted) {
|
|
170
|
+
const token = await firebase.messaging.getToken();
|
|
171
|
+
console.log('FCM Token:', token);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const unsubscribe = firebase.messaging.onMessage((message) => {
|
|
175
|
+
console.log('Push notification:', message.notification?.title);
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### React Native Only Services
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
import {
|
|
183
|
+
getThemeService,
|
|
184
|
+
getNavigationService,
|
|
185
|
+
getNotificationService,
|
|
186
|
+
} from '@sudobility/di';
|
|
187
|
+
|
|
188
|
+
// Theme
|
|
189
|
+
const theme = getThemeService();
|
|
190
|
+
const isDark = theme.isDarkMode();
|
|
191
|
+
theme.applyTheme('dark'); // 'light' | 'dark' | 'system'
|
|
192
|
+
theme.watchSystemTheme((mode) => {
|
|
193
|
+
console.log('System theme:', mode);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// Navigation (call setNavigationRef first in App.tsx)
|
|
197
|
+
const nav = getNavigationService();
|
|
198
|
+
nav.navigate('Profile', { userId: '123' });
|
|
199
|
+
nav.goBack();
|
|
200
|
+
nav.replace('Home');
|
|
201
|
+
|
|
202
|
+
// Notifications
|
|
203
|
+
const notifications = getNotificationService();
|
|
204
|
+
await notifications.requestPermission();
|
|
205
|
+
await notifications.showNotification('Hello', {
|
|
206
|
+
body: 'You have a new message',
|
|
207
|
+
data: { screen: 'inbox' }
|
|
208
|
+
});
|
|
209
|
+
await notifications.setBadgeCount(5);
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Import Paths
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
// Auto-detect platform (recommended)
|
|
216
|
+
import { ... } from '@sudobility/di';
|
|
217
|
+
|
|
218
|
+
// Explicit web imports
|
|
219
|
+
import { ... } from '@sudobility/di/web';
|
|
220
|
+
|
|
221
|
+
// Explicit React Native imports
|
|
222
|
+
import { ... } from '@sudobility/di/rn';
|
|
223
|
+
|
|
224
|
+
// Interfaces only (no implementations)
|
|
225
|
+
import type { ... } from '@sudobility/di/interfaces';
|
|
226
|
+
|
|
227
|
+
// Mocks for testing
|
|
228
|
+
import { MockStorageService, MockNetworkClient } from '@sudobility/di/mocks';
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Unified Exports
|
|
232
|
+
|
|
233
|
+
These exports work identically on both platforms:
|
|
234
|
+
|
|
235
|
+
| Export | Description |
|
|
236
|
+
|--------|-------------|
|
|
237
|
+
| `networkClient` | Pre-configured network client instance |
|
|
238
|
+
| `storage` | Basic storage instance |
|
|
239
|
+
| `advancedStorage` | Storage with TTL support |
|
|
240
|
+
| `getStorageService()` | Get storage service singleton |
|
|
241
|
+
| `getNetworkService()` | Get network service singleton |
|
|
242
|
+
| `getFirebaseService()` | Get Firebase service singleton |
|
|
243
|
+
| `initializeStorageService()` | Initialize storage singleton |
|
|
244
|
+
| `initializeNetworkService()` | Initialize network singleton |
|
|
245
|
+
| `initializeFirebaseService()` | Initialize Firebase singleton |
|
|
246
|
+
| `StorageService` | Storage service class |
|
|
247
|
+
| `NetworkService` | Network service class |
|
|
248
|
+
| `FirebaseService` | Firebase service class |
|
|
249
|
+
|
|
250
|
+
## Platform-Specific Exports
|
|
251
|
+
|
|
252
|
+
### Web Only
|
|
253
|
+
- `WebStorageService`, `WebNetworkService`, `WebFirebaseService`
|
|
254
|
+
- `webStorage`, `webNetworkClient`
|
|
255
|
+
- `WebUINavigationService`
|
|
256
|
+
|
|
257
|
+
### React Native Only
|
|
258
|
+
- `RNStorageService`, `RNNetworkService`, `RNFirebaseService`
|
|
259
|
+
- `rnStorage`, `rnNetworkClient`
|
|
260
|
+
- `getThemeService()`, `getNavigationService()`, `getNotificationService()`
|
|
261
|
+
- `RNThemeService`, `RNNavigationService`, `RNNotificationService`
|
|
262
|
+
|
|
263
|
+
## Testing with Mocks
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
import {
|
|
267
|
+
MockStorageService,
|
|
268
|
+
MockNetworkClient,
|
|
269
|
+
MockAnalyticsClient,
|
|
270
|
+
} from '@sudobility/di/mocks';
|
|
271
|
+
|
|
272
|
+
// In your tests
|
|
273
|
+
const mockStorage = new MockStorageService();
|
|
274
|
+
await mockStorage.setItem('key', 'value');
|
|
275
|
+
expect(await mockStorage.getItem('key')).toBe('value');
|
|
276
|
+
|
|
277
|
+
const mockNetwork = new MockNetworkClient();
|
|
278
|
+
// Configure mock responses...
|
|
279
|
+
```
|
|
64
280
|
|
|
65
281
|
## License
|
|
66
282
|
|
|
67
|
-
MIT
|
|
283
|
+
MIT
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AnalyticsClient, AnalyticsEventData } from '../../analytics/analytics.js';
|
|
2
|
+
import { AnalyticsEvent } from '@sudobility/types';
|
|
3
|
+
import type { Optional } from '@sudobility/types';
|
|
4
|
+
export declare class RNAnalyticsClient implements AnalyticsClient {
|
|
5
|
+
private enabled;
|
|
6
|
+
private userId;
|
|
7
|
+
trackEvent(eventOrData: AnalyticsEvent | AnalyticsEventData): void;
|
|
8
|
+
setUserProperties(properties: Record<string, unknown>): void;
|
|
9
|
+
setUserId(userId: Optional<string>): void;
|
|
10
|
+
setAnalyticsEnabled(enabled: boolean): void;
|
|
11
|
+
setCurrentScreen(screenName: string, screenClass?: Optional<string>): void;
|
|
12
|
+
isEnabled(): boolean;
|
|
13
|
+
getUserId(): Optional<string>;
|
|
14
|
+
}
|
|
15
|
+
export declare function getAnalyticsClient(): RNAnalyticsClient;
|
|
16
|
+
export declare function initializeAnalyticsClient(client?: RNAnalyticsClient): RNAnalyticsClient;
|
|
17
|
+
export declare function resetAnalyticsClient(): void;
|
|
18
|
+
export declare const rnAnalyticsClient: RNAnalyticsClient;
|
|
19
|
+
//# sourceMappingURL=analytics.rn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.rn.d.ts","sourceRoot":"","sources":["../../../src/rn/analytics/analytics.rn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAuBlD,qBAAa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAA0B;IAKxC,UAAU,CAAC,WAAW,EAAE,cAAc,GAAG,kBAAkB,GAAG,IAAI;IAwBlE,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAe5D,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;IAczC,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAa3C,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;IAkB1E,SAAS,IAAI,OAAO;IAOpB,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC;CAG9B;AAKD,wBAAgB,kBAAkB,IAAI,iBAAiB,CAKtD;AAED,wBAAgB,yBAAyB,CACvC,MAAM,CAAC,EAAE,iBAAiB,GACzB,iBAAiB,CAGnB;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
let analyticsModule = null;
|
|
2
|
+
function getAnalytics() {
|
|
3
|
+
if (!analyticsModule) {
|
|
4
|
+
try {
|
|
5
|
+
const mod = require('@react-native-firebase/analytics');
|
|
6
|
+
analyticsModule = mod;
|
|
7
|
+
}
|
|
8
|
+
catch (e) {
|
|
9
|
+
console.warn('Firebase analytics not available:', e);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const analytics = analyticsModule?.default ?? analyticsModule;
|
|
13
|
+
return typeof analytics === 'function' ? analytics() : null;
|
|
14
|
+
}
|
|
15
|
+
export class RNAnalyticsClient {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.enabled = true;
|
|
18
|
+
this.userId = null;
|
|
19
|
+
}
|
|
20
|
+
trackEvent(eventOrData) {
|
|
21
|
+
if (!this.enabled)
|
|
22
|
+
return;
|
|
23
|
+
const analytics = getAnalytics();
|
|
24
|
+
if (!analytics)
|
|
25
|
+
return;
|
|
26
|
+
if (typeof eventOrData === 'object' && 'event' in eventOrData) {
|
|
27
|
+
const { event, parameters } = eventOrData;
|
|
28
|
+
analytics
|
|
29
|
+
.logEvent(event, parameters)
|
|
30
|
+
.catch(() => {
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
analytics.logEvent(eventOrData).catch(() => {
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
setUserProperties(properties) {
|
|
39
|
+
if (!this.enabled)
|
|
40
|
+
return;
|
|
41
|
+
const analytics = getAnalytics();
|
|
42
|
+
if (!analytics)
|
|
43
|
+
return;
|
|
44
|
+
for (const [key, value] of Object.entries(properties)) {
|
|
45
|
+
analytics.setUserProperty(key, String(value)).catch(() => {
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
setUserId(userId) {
|
|
50
|
+
this.userId = userId;
|
|
51
|
+
if (!this.enabled)
|
|
52
|
+
return;
|
|
53
|
+
const analytics = getAnalytics();
|
|
54
|
+
if (!analytics)
|
|
55
|
+
return;
|
|
56
|
+
analytics.setUserId(userId ?? null).catch(() => {
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
setAnalyticsEnabled(enabled) {
|
|
60
|
+
this.enabled = enabled;
|
|
61
|
+
const analytics = getAnalytics();
|
|
62
|
+
if (!analytics)
|
|
63
|
+
return;
|
|
64
|
+
analytics.setAnalyticsCollectionEnabled(enabled).catch(() => {
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
setCurrentScreen(screenName, screenClass) {
|
|
68
|
+
if (!this.enabled)
|
|
69
|
+
return;
|
|
70
|
+
const analytics = getAnalytics();
|
|
71
|
+
if (!analytics)
|
|
72
|
+
return;
|
|
73
|
+
analytics
|
|
74
|
+
.logScreenView({
|
|
75
|
+
screen_name: screenName,
|
|
76
|
+
screen_class: screenClass ?? screenName,
|
|
77
|
+
})
|
|
78
|
+
.catch(() => {
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
isEnabled() {
|
|
82
|
+
return this.enabled;
|
|
83
|
+
}
|
|
84
|
+
getUserId() {
|
|
85
|
+
return this.userId;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
let analyticsClient = null;
|
|
89
|
+
export function getAnalyticsClient() {
|
|
90
|
+
if (!analyticsClient) {
|
|
91
|
+
analyticsClient = new RNAnalyticsClient();
|
|
92
|
+
}
|
|
93
|
+
return analyticsClient;
|
|
94
|
+
}
|
|
95
|
+
export function initializeAnalyticsClient(client) {
|
|
96
|
+
analyticsClient = client ?? new RNAnalyticsClient();
|
|
97
|
+
return analyticsClient;
|
|
98
|
+
}
|
|
99
|
+
export function resetAnalyticsClient() {
|
|
100
|
+
analyticsClient = null;
|
|
101
|
+
}
|
|
102
|
+
export const rnAnalyticsClient = new RNAnalyticsClient();
|
|
103
|
+
//# sourceMappingURL=analytics.rn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.rn.js","sourceRoot":"","sources":["../../../src/rn/analytics/analytics.rn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EnvProvider, AppConfig, EnvironmentVariables, FirebaseConfig } from '../../env.js';
|
|
2
|
+
import type { Optional } from '@sudobility/types';
|
|
3
|
+
export declare class RNEnvProvider implements EnvProvider {
|
|
4
|
+
get<K extends keyof EnvironmentVariables>(key: K, defaultValue?: Optional<string>): Optional<EnvironmentVariables[K] | string>;
|
|
5
|
+
getAll(): EnvironmentVariables;
|
|
6
|
+
isDevelopment(): boolean;
|
|
7
|
+
isProduction(): boolean;
|
|
8
|
+
isTest(): boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function createRNAppConfig(envProvider: RNEnvProvider): AppConfig;
|
|
11
|
+
export declare const rnEnvProvider: RNEnvProvider;
|
|
12
|
+
export declare const rnAppConfig: AppConfig;
|
|
13
|
+
export type { EnvProvider, AppConfig, EnvironmentVariables, FirebaseConfig };
|
|
14
|
+
//# sourceMappingURL=env.rn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.rn.d.ts","sourceRoot":"","sources":["../../../src/rn/env/env.rn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,cAAc,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAsBlD,qBAAa,aAAc,YAAW,WAAW;IAC/C,GAAG,CAAC,CAAC,SAAS,MAAM,oBAAoB,EACtC,GAAG,EAAE,CAAC,EACN,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC9B,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAO7C,MAAM,IAAI,oBAAoB;IAI9B,aAAa,IAAI,OAAO;IAKxB,YAAY,IAAI,OAAO;IAIvB,MAAM,IAAI,OAAO;CAGlB;AAKD,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,aAAa,GAAG,SAAS,CAqBvE;AA8BD,eAAO,MAAM,aAAa,eAAsB,CAAC;AACjD,eAAO,MAAM,WAAW,WAAmC,CAAC;AAG5D,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
let Config = {};
|
|
2
|
+
try {
|
|
3
|
+
const maybeConfig = require('react-native-config');
|
|
4
|
+
Config = (maybeConfig?.default ?? maybeConfig ?? {});
|
|
5
|
+
}
|
|
6
|
+
catch (error) {
|
|
7
|
+
throw new Error(`[di_rn] react-native-config not available; cannot initialize env provider: ${error}`);
|
|
8
|
+
}
|
|
9
|
+
export class RNEnvProvider {
|
|
10
|
+
get(key, defaultValue) {
|
|
11
|
+
const value = Config[key];
|
|
12
|
+
return (value ?? defaultValue ?? null);
|
|
13
|
+
}
|
|
14
|
+
getAll() {
|
|
15
|
+
return Config;
|
|
16
|
+
}
|
|
17
|
+
isDevelopment() {
|
|
18
|
+
return typeof __DEV__ !== 'undefined' && __DEV__ === true;
|
|
19
|
+
}
|
|
20
|
+
isProduction() {
|
|
21
|
+
return !this.isDevelopment();
|
|
22
|
+
}
|
|
23
|
+
isTest() {
|
|
24
|
+
return process.env.NODE_ENV === 'test';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function createRNAppConfig(envProvider) {
|
|
28
|
+
return {
|
|
29
|
+
wildDuckBackendUrl: envProvider.get('VITE_WILDDUCK_URL') ??
|
|
30
|
+
'https://wildduck.0xmail.box',
|
|
31
|
+
indexerBackendUrl: envProvider.get('VITE_INDEXER_URL') ??
|
|
32
|
+
'https://indexer.0xmail.box',
|
|
33
|
+
walletConnectProjectId: envProvider.get('VITE_WALLETCONNECT_PROJECT_ID') ?? '',
|
|
34
|
+
revenueCatApiKey: envProvider.get('VITE_REVENUECAT_API_KEY') ?? '',
|
|
35
|
+
privyAppId: envProvider.get('VITE_PRIVY_APP_ID') ?? '',
|
|
36
|
+
firebase: createFirebaseConfig(envProvider),
|
|
37
|
+
useCloudflareWorker: false,
|
|
38
|
+
cloudflareWorkerUrl: '',
|
|
39
|
+
useMockFallback: envProvider.get('VITE_MOCK_DATA') === 'true',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function createFirebaseConfig(envProvider) {
|
|
43
|
+
return {
|
|
44
|
+
apiKey: envProvider.get('VITE_FIREBASE_API_KEY') ?? '',
|
|
45
|
+
authDomain: envProvider.get('VITE_FIREBASE_AUTH_DOMAIN') ??
|
|
46
|
+
'',
|
|
47
|
+
projectId: envProvider.get('VITE_FIREBASE_PROJECT_ID') ?? '',
|
|
48
|
+
storageBucket: envProvider.get('VITE_FIREBASE_STORAGE_BUCKET') ??
|
|
49
|
+
'',
|
|
50
|
+
messagingSenderId: envProvider.get('VITE_FIREBASE_MESSAGING_SENDER_ID') ?? '',
|
|
51
|
+
appId: envProvider.get('VITE_FIREBASE_APP_ID') ?? '',
|
|
52
|
+
measurementId: envProvider.get('VITE_FIREBASE_MEASUREMENT_ID') ??
|
|
53
|
+
undefined,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export const rnEnvProvider = new RNEnvProvider();
|
|
57
|
+
export const rnAppConfig = createRNAppConfig(rnEnvProvider);
|
|
58
|
+
//# sourceMappingURL=env.rn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.rn.js","sourceRoot":"","sources":["../../../src/rn/env/env.rn.ts"],"names":[],"mappings":"AASA,IAAI,MAAM,GAAuC,EAAE,CAAC;AACpD,IAAI,CAAC;IAGH,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACnD,MAAM,GAAG,CAAC,WAAW,EAAE,OAAO,IAAI,WAAW,IAAI,EAAE,CAGlD,CAAC;AACJ,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,IAAI,KAAK,CACb,8EAA8E,KAAK,EAAE,CACtF,CAAC;AACJ,CAAC;AAMD,MAAM,OAAO,aAAa;IACxB,GAAG,CACD,GAAM,EACN,YAA+B;QAE/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAa,CAAC,CAAC;QACpC,OAAO,CAAC,KAAK,IAAI,YAAY,IAAI,IAAI,CAEpC,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,MAAyC,CAAC;IACnD,CAAC;IAED,aAAa;QAEX,OAAO,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,CAAC;IAC5D,CAAC;IAED,YAAY;QACV,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM;QACJ,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC;IACzC,CAAC;CACF;AAKD,MAAM,UAAU,iBAAiB,CAAC,WAA0B;IAC1D,OAAO;QACL,kBAAkB,EACf,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAwB;YAC5D,6BAA6B;QAC/B,iBAAiB,EACd,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAwB;YAC3D,4BAA4B;QAC9B,sBAAsB,EACnB,WAAW,CAAC,GAAG,CAAC,+BAA+B,CAElC,IAAI,EAAE;QACtB,gBAAgB,EACb,WAAW,CAAC,GAAG,CAAC,yBAAyB,CAAwB,IAAI,EAAE;QAC1E,UAAU,EACP,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAwB,IAAI,EAAE;QACpE,QAAQ,EAAE,oBAAoB,CAAC,WAAW,CAAC;QAC3C,mBAAmB,EAAE,KAAK;QAC1B,mBAAmB,EAAE,EAAE;QACvB,eAAe,EAAE,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,MAAM;KAC9D,CAAC;AACJ,CAAC;AAKD,SAAS,oBAAoB,CAAC,WAA0B;IACtD,OAAO;QACL,MAAM,EACH,WAAW,CAAC,GAAG,CAAC,uBAAuB,CAAwB,IAAI,EAAE;QACxE,UAAU,EACP,WAAW,CAAC,GAAG,CAAC,2BAA2B,CAAwB;YACpE,EAAE;QACJ,SAAS,EACN,WAAW,CAAC,GAAG,CAAC,0BAA0B,CAAwB,IAAI,EAAE;QAC3E,aAAa,EACV,WAAW,CAAC,GAAG,CAAC,8BAA8B,CAAwB;YACvE,EAAE;QACJ,iBAAiB,EACd,WAAW,CAAC,GAAG,CAAC,mCAAmC,CAEtC,IAAI,EAAE;QACtB,KAAK,EACF,WAAW,CAAC,GAAG,CAAC,sBAAsB,CAAwB,IAAI,EAAE;QACvE,aAAa,EACV,WAAW,CAAC,GAAG,CAAC,8BAA8B,CAAwB;YACvE,SAAS;KACZ,CAAC;AACJ,CAAC;AAGD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FirebaseService, AnalyticsService, RemoteConfigService, FCMService, FirebaseInitOptions } from '../../web/firebase/firebase.interface.js';
|
|
2
|
+
export type { FirebaseService, AnalyticsService, RemoteConfigService, FCMService, FirebaseInitOptions, RemoteConfigValue, FCMMessage, FCMPermissionState, FCMNotificationPayload, FCMDataPayload, FCMState, FirebaseConfig, AnalyticsEvent, } from '../../web/firebase/firebase.interface.js';
|
|
3
|
+
export declare class RNFirebaseService implements FirebaseService {
|
|
4
|
+
analytics: AnalyticsService;
|
|
5
|
+
remoteConfig: RemoteConfigService;
|
|
6
|
+
messaging: FCMService;
|
|
7
|
+
private options;
|
|
8
|
+
private configured;
|
|
9
|
+
constructor(options?: FirebaseInitOptions);
|
|
10
|
+
private checkConfiguration;
|
|
11
|
+
isConfigured(): boolean;
|
|
12
|
+
isDevelopment(): boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function createRNFirebaseService(options?: FirebaseInitOptions): FirebaseService;
|
|
15
|
+
export declare function getFirebaseService(): RNFirebaseService;
|
|
16
|
+
export declare function initializeFirebaseService(options?: FirebaseInitOptions): RNFirebaseService;
|
|
17
|
+
export declare function resetFirebaseService(): void;
|
|
18
|
+
export declare const rnFirebaseService: RNFirebaseService;
|
|
19
|
+
//# sourceMappingURL=firebase.rn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebase.rn.d.ts","sourceRoot":"","sources":["../../../src/rn/firebase/firebase.rn.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,mBAAmB,EAIpB,MAAM,0CAA0C,CAAC;AAGlD,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,QAAQ,EACR,cAAc,EACd,cAAc,GACf,MAAM,0CAA0C,CAAC;AA+VlD,qBAAa,iBAAkB,YAAW,eAAe;IAChD,SAAS,EAAE,gBAAgB,CAAC;IAC5B,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,UAAU,CAAC;IAE7B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,UAAU,CAAkB;gBAExB,OAAO,GAAE,mBAAwB;IAY7C,OAAO,CAAC,kBAAkB;IAU1B,YAAY,IAAI,OAAO;IAIvB,aAAa,IAAI,OAAO;CAGzB;AAKD,wBAAgB,uBAAuB,CACrC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,eAAe,CAEjB;AAKD,wBAAgB,kBAAkB,IAAI,iBAAiB,CAKtD;AAED,wBAAgB,yBAAyB,CACvC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,iBAAiB,CAGnB;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|