@kiosinc/commons-rn 0.15.7 → 0.17.0
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 +20 -0
- package/lib/commonjs/constants/index.js +1 -1
- package/lib/commonjs/constants/index.js.map +1 -1
- package/lib/commonjs/hooks/index.js +0 -7
- package/lib/commonjs/hooks/index.js.map +1 -1
- package/lib/commonjs/hooks/useAuth.js +6 -0
- package/lib/commonjs/hooks/useAuth.js.map +1 -1
- package/lib/commonjs/hooks/useCustomer.js +0 -86
- package/lib/commonjs/hooks/useCustomer.js.map +1 -1
- package/lib/commonjs/providers/customer/CustomerProvider.js +214 -0
- package/lib/commonjs/providers/customer/CustomerProvider.js.map +1 -0
- package/lib/commonjs/providers/customer/README.md +122 -0
- package/lib/commonjs/providers/customer/classifyLoyaltyError.js +19 -0
- package/lib/commonjs/providers/customer/classifyLoyaltyError.js.map +1 -0
- package/lib/commonjs/providers/customer/index.js +27 -0
- package/lib/commonjs/providers/customer/index.js.map +1 -0
- package/lib/commonjs/providers/customer/types.js +2 -0
- package/lib/commonjs/providers/customer/types.js.map +1 -0
- package/lib/commonjs/providers/customer/useLoyalty.js +25 -0
- package/lib/commonjs/providers/customer/useLoyalty.js.map +1 -0
- package/lib/commonjs/providers/customer/useSquareCustomer.js +21 -0
- package/lib/commonjs/providers/customer/useSquareCustomer.js.map +1 -0
- package/lib/commonjs/providers/index.js +19 -0
- package/lib/commonjs/providers/index.js.map +1 -1
- package/lib/commonjs/screens/SavedCards/SavedCards.js +9 -4
- package/lib/commonjs/screens/SavedCards/SavedCards.js.map +1 -1
- package/lib/commonjs/utils/analytics.js +21 -0
- package/lib/commonjs/utils/analytics.js.map +1 -1
- package/lib/module/constants/index.js +1 -1
- package/lib/module/constants/index.js.map +1 -1
- package/lib/module/hooks/index.js +0 -1
- package/lib/module/hooks/index.js.map +1 -1
- package/lib/module/hooks/useAuth.js +6 -0
- package/lib/module/hooks/useAuth.js.map +1 -1
- package/lib/module/hooks/useCustomer.js +1 -87
- package/lib/module/hooks/useCustomer.js.map +1 -1
- package/lib/module/providers/customer/CustomerProvider.js +204 -0
- package/lib/module/providers/customer/CustomerProvider.js.map +1 -0
- package/lib/module/providers/customer/README.md +122 -0
- package/lib/module/providers/customer/classifyLoyaltyError.js +13 -0
- package/lib/module/providers/customer/classifyLoyaltyError.js.map +1 -0
- package/lib/module/providers/customer/index.js +4 -0
- package/lib/module/providers/customer/index.js.map +1 -0
- package/lib/module/providers/customer/types.js +2 -0
- package/lib/module/providers/customer/types.js.map +1 -0
- package/lib/module/providers/customer/useLoyalty.js +18 -0
- package/lib/module/providers/customer/useLoyalty.js.map +1 -0
- package/lib/module/providers/customer/useSquareCustomer.js +14 -0
- package/lib/module/providers/customer/useSquareCustomer.js.map +1 -0
- package/lib/module/providers/index.js +1 -0
- package/lib/module/providers/index.js.map +1 -1
- package/lib/module/screens/SavedCards/SavedCards.js +10 -5
- package/lib/module/screens/SavedCards/SavedCards.js.map +1 -1
- package/lib/module/utils/analytics.js +22 -0
- package/lib/module/utils/analytics.js.map +1 -1
- package/lib/typescript/src/constants/index.d.ts.map +1 -1
- package/lib/typescript/src/hooks/index.d.ts +0 -1
- package/lib/typescript/src/hooks/index.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useAuth.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useCustomer.d.ts +0 -13
- package/lib/typescript/src/hooks/useCustomer.d.ts.map +1 -1
- package/lib/typescript/src/providers/customer/CustomerProvider.d.ts +9 -0
- package/lib/typescript/src/providers/customer/CustomerProvider.d.ts.map +1 -0
- package/lib/typescript/src/providers/customer/classifyLoyaltyError.d.ts +3 -0
- package/lib/typescript/src/providers/customer/classifyLoyaltyError.d.ts.map +1 -0
- package/lib/typescript/src/providers/customer/index.d.ts +5 -0
- package/lib/typescript/src/providers/customer/index.d.ts.map +1 -0
- package/lib/typescript/src/providers/customer/types.d.ts +25 -0
- package/lib/typescript/src/providers/customer/types.d.ts.map +1 -0
- package/lib/typescript/src/providers/customer/useLoyalty.d.ts +11 -0
- package/lib/typescript/src/providers/customer/useLoyalty.d.ts.map +1 -0
- package/lib/typescript/src/providers/customer/useSquareCustomer.d.ts +7 -0
- package/lib/typescript/src/providers/customer/useSquareCustomer.d.ts.map +1 -0
- package/lib/typescript/src/providers/index.d.ts +2 -0
- package/lib/typescript/src/providers/index.d.ts.map +1 -1
- package/lib/typescript/src/screens/SavedCards/SavedCards.d.ts.map +1 -1
- package/lib/typescript/src/utils/analytics.d.ts +2 -0
- package/lib/typescript/src/utils/analytics.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/constants/index.ts +1 -1
- package/src/hooks/index.ts +0 -1
- package/src/hooks/useAuth.ts +6 -0
- package/src/hooks/useCustomer.ts +0 -129
- package/src/providers/customer/CustomerProvider.tsx +272 -0
- package/src/providers/customer/README.md +122 -0
- package/src/providers/customer/classifyLoyaltyError.ts +25 -0
- package/src/providers/customer/index.ts +4 -0
- package/src/providers/customer/types.ts +34 -0
- package/src/providers/customer/useLoyalty.ts +27 -0
- package/src/providers/customer/useSquareCustomer.ts +19 -0
- package/src/providers/index.ts +6 -0
- package/src/screens/SavedCards/SavedCards.tsx +10 -3
- package/src/utils/analytics.ts +20 -0
- package/lib/commonjs/hooks/useCheckCustomer.js +0 -57
- package/lib/commonjs/hooks/useCheckCustomer.js.map +0 -1
- package/lib/module/hooks/useCheckCustomer.js +0 -49
- package/lib/module/hooks/useCheckCustomer.js.map +0 -1
- package/lib/typescript/src/hooks/useCheckCustomer.d.ts +0 -5
- package/lib/typescript/src/hooks/useCheckCustomer.d.ts.map +0 -1
- package/src/hooks/useCheckCustomer.ts +0 -49
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["Alert","useMutation","useQuery","useQueryClient","firestore","createCustomer","fetchLoyaltyRewards","getCustomer","saveCustomerAddress","saveCustomerCard","updateCustomerProfile","useMMKVString","MMKV_KEYS","queryKeys","firebase","useCustomerQueries","queryClient","user","currentUser","selectedBusinessId","BUSINESS_ID","isLoggedIn","isAnonymous","useFetchCustomer","CUSTOMER","uid","select","data","customer","useCreateCustomer","mutation","response","invalidateQueries","onError","err","show","title","code","description","message","createCustomerHook","mutateAsync","createCustomerLoading","isLoading","useUpdateCustomer","props","updateCustomer","mutate","updateCustomerLoading","useSaveCustomerAddress","address","useSaveAddress","saveAddressLoading","useFetchSavedCards","CARDS","payments","collection","orderBy","where","get","docs","length","map","payment","id","enabled","Boolean","useSaveCustomerCard","onSuccess","saveCard","saveCardLoading","useDisableCard","documentId","doc","update","isActive","disableCard","disableCardLoading","useFetchLoyaltyRewards","options","REWARDS"],"sourceRoot":"../../../src","sources":["hooks/useCustomer.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import React, { createContext, useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import auth from '@react-native-firebase/auth';
|
|
3
|
+
import firestore from '@react-native-firebase/firestore';
|
|
4
|
+
import { useMMKVString } from 'react-native-mmkv';
|
|
5
|
+
import { useQueryClient } from '@tanstack/react-query';
|
|
6
|
+
import uuid from 'react-native-uuid';
|
|
7
|
+
import { connectSquareCustomer, connectSquareLoyalty, createCustomer, fetchSquareLoyalty, getCustomer } from '../../api/customer';
|
|
8
|
+
import { MMKV_KEYS } from '../../constants';
|
|
9
|
+
import { queryKeys } from '../../hooks/queryKeys';
|
|
10
|
+
import { classifyLoyaltyError } from './classifyLoyaltyError';
|
|
11
|
+
const customerSetupAttempted = new Set();
|
|
12
|
+
export const CustomerContext = /*#__PURE__*/createContext(null);
|
|
13
|
+
export const CustomerProvider = ({
|
|
14
|
+
children,
|
|
15
|
+
autoEnroll,
|
|
16
|
+
loyaltyEnabled
|
|
17
|
+
}) => {
|
|
18
|
+
const queryClient = useQueryClient();
|
|
19
|
+
const [selectedBusinessId] = useMMKVString(MMKV_KEYS.BUSINESS_ID);
|
|
20
|
+
const [uid, setUid] = useState(null);
|
|
21
|
+
const uidRef = React.useRef(null);
|
|
22
|
+
const [customerStatus, setCustomerStatus] = useState('idle');
|
|
23
|
+
const [squareCustomerId, setSquareCustomerId] = useState(null);
|
|
24
|
+
const [customerError, setCustomerError] = useState(null);
|
|
25
|
+
const [loyaltyStatus, setLoyaltyStatus] = useState('idle');
|
|
26
|
+
const [loyalty, setLoyaltyData] = useState(null);
|
|
27
|
+
const [loyaltyError, setLoyaltyError] = useState(null);
|
|
28
|
+
const resetState = useCallback(userId => {
|
|
29
|
+
setCustomerStatus('idle');
|
|
30
|
+
setSquareCustomerId(null);
|
|
31
|
+
setCustomerError(null);
|
|
32
|
+
setLoyaltyStatus('idle');
|
|
33
|
+
setLoyaltyData(null);
|
|
34
|
+
setLoyaltyError(null);
|
|
35
|
+
if (userId) {
|
|
36
|
+
for (const key of [...customerSetupAttempted]) {
|
|
37
|
+
if (key.startsWith(`${userId}:`)) {
|
|
38
|
+
customerSetupAttempted.delete(key);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
queryClient.removeQueries([queryKeys.LOYALTY]);
|
|
43
|
+
queryClient.removeQueries([queryKeys.PROGRAM]);
|
|
44
|
+
}, [queryClient]);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
const unsubscribe = auth().onAuthStateChanged(user => {
|
|
47
|
+
const loggedIn = Boolean(user && !user.isAnonymous);
|
|
48
|
+
if (loggedIn && user) {
|
|
49
|
+
setUid(user.uid);
|
|
50
|
+
uidRef.current = user.uid;
|
|
51
|
+
} else {
|
|
52
|
+
resetState(uidRef.current);
|
|
53
|
+
setUid(null);
|
|
54
|
+
uidRef.current = null;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return unsubscribe;
|
|
58
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
59
|
+
}, []);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (!uid || !selectedBusinessId) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const key = `${uid}:${selectedBusinessId}`;
|
|
65
|
+
if (customerSetupAttempted.has(key)) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
customerSetupAttempted.add(key);
|
|
69
|
+
runCustomerSetup(uid, selectedBusinessId);
|
|
70
|
+
}, [uid, selectedBusinessId]);
|
|
71
|
+
const runCustomerSetup = async (userId, businessId) => {
|
|
72
|
+
const key = `${userId}:${businessId}`;
|
|
73
|
+
setCustomerStatus('loading');
|
|
74
|
+
try {
|
|
75
|
+
const customerRes = await getCustomer(userId);
|
|
76
|
+
if (customerRes?.data?.customer === null) {
|
|
77
|
+
await createCustomer({
|
|
78
|
+
uid: userId
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const programs = await firestore().collection(`customers/${userId}/programs`).where('type', '==', 'customer').where('businessId', '==', businessId).get();
|
|
82
|
+
let custId = null;
|
|
83
|
+
if (programs.empty) {
|
|
84
|
+
await connectSquareCustomer(userId, {
|
|
85
|
+
businessId,
|
|
86
|
+
uid: userId,
|
|
87
|
+
idempotentKey: uuid.v4()
|
|
88
|
+
});
|
|
89
|
+
const updated = await firestore().collection(`customers/${userId}/programs`).where('type', '==', 'customer').where('businessId', '==', businessId).get();
|
|
90
|
+
if (!updated.empty) {
|
|
91
|
+
custId = updated.docs[0].data().linkedObjectId ?? null;
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
custId = programs.docs[0].data().linkedObjectId ?? null;
|
|
95
|
+
}
|
|
96
|
+
setSquareCustomerId(custId);
|
|
97
|
+
setCustomerStatus('ready');
|
|
98
|
+
console.log(`[CustomerProvider] Customer ready for ${key}`);
|
|
99
|
+
} catch (err) {
|
|
100
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
101
|
+
console.warn(`[CustomerProvider] Customer setup failed for ${key}: ${msg}`);
|
|
102
|
+
customerSetupAttempted.delete(key);
|
|
103
|
+
setCustomerError(msg);
|
|
104
|
+
setCustomerStatus('error');
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
const fetchLoyaltyData = useCallback(async (userId, businessId) => {
|
|
108
|
+
try {
|
|
109
|
+
const response = await fetchSquareLoyalty(userId, businessId);
|
|
110
|
+
if (response?.data?.error) {
|
|
111
|
+
throw new Error(response.data.error.message || 'Unknown loyalty error');
|
|
112
|
+
}
|
|
113
|
+
setLoyaltyData(response?.data ?? null);
|
|
114
|
+
setLoyaltyStatus('ready');
|
|
115
|
+
setLoyaltyError(null);
|
|
116
|
+
} catch (err) {
|
|
117
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
118
|
+
console.log(`[CustomerProvider] Loyalty fetch failed: ${msg}`);
|
|
119
|
+
if (msg.includes('does not have loyalty')) {
|
|
120
|
+
if (autoEnroll) {
|
|
121
|
+
await attemptEnroll(userId, businessId);
|
|
122
|
+
} else {
|
|
123
|
+
setLoyaltyStatus('not_enrolled');
|
|
124
|
+
}
|
|
125
|
+
} else {
|
|
126
|
+
setLoyaltyError(msg);
|
|
127
|
+
setLoyaltyStatus('error');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
132
|
+
[autoEnroll]);
|
|
133
|
+
const attemptEnroll = useCallback(async (userId, businessId) => {
|
|
134
|
+
setLoyaltyStatus('enrolling');
|
|
135
|
+
try {
|
|
136
|
+
const response = await connectSquareLoyalty(userId, {
|
|
137
|
+
businessId,
|
|
138
|
+
uid: userId,
|
|
139
|
+
idempotentKey: uuid.v4()
|
|
140
|
+
});
|
|
141
|
+
if (response?.data?.error) {
|
|
142
|
+
throw new Error(response.data.error.message || 'Unknown connect error');
|
|
143
|
+
}
|
|
144
|
+
await fetchLoyaltyData(userId, businessId);
|
|
145
|
+
} catch (err) {
|
|
146
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
147
|
+
console.log(`[CustomerProvider] Loyalty connect failed: ${msg}`);
|
|
148
|
+
const outcome = classifyLoyaltyError(msg);
|
|
149
|
+
if (outcome === 'refetch') {
|
|
150
|
+
await fetchLoyaltyData(userId, businessId);
|
|
151
|
+
} else if (outcome === 'duplicate') {
|
|
152
|
+
setLoyaltyError('Multiple account records found. Contact support.');
|
|
153
|
+
setLoyaltyStatus('error');
|
|
154
|
+
} else if (outcome === 'no_loyalty') {
|
|
155
|
+
setLoyaltyStatus('no_loyalty');
|
|
156
|
+
} else {
|
|
157
|
+
setLoyaltyError(msg);
|
|
158
|
+
setLoyaltyStatus('error');
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}, [fetchLoyaltyData]);
|
|
162
|
+
const runLoyaltySetup = useCallback(async (userId, businessId) => {
|
|
163
|
+
setLoyaltyStatus('loading');
|
|
164
|
+
await fetchLoyaltyData(userId, businessId);
|
|
165
|
+
}, [fetchLoyaltyData]);
|
|
166
|
+
useEffect(() => {
|
|
167
|
+
if (customerStatus !== 'ready' || !uid || !selectedBusinessId) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (!loyaltyEnabled) {
|
|
171
|
+
setLoyaltyStatus('no_loyalty');
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
runLoyaltySetup(uid, selectedBusinessId);
|
|
175
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
176
|
+
}, [customerStatus, loyaltyEnabled, uid, selectedBusinessId]);
|
|
177
|
+
const enroll = useCallback(() => {
|
|
178
|
+
if (!uid || !selectedBusinessId || loyaltyStatus === 'enrolling') {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
attemptEnroll(uid, selectedBusinessId);
|
|
182
|
+
}, [uid, selectedBusinessId, loyaltyStatus, attemptEnroll]);
|
|
183
|
+
const refetchLoyalty = useCallback(() => {
|
|
184
|
+
if (!uid || !selectedBusinessId) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
fetchLoyaltyData(uid, selectedBusinessId);
|
|
188
|
+
}, [uid, selectedBusinessId, fetchLoyaltyData]);
|
|
189
|
+
const value = {
|
|
190
|
+
customerStatus,
|
|
191
|
+
squareCustomerId,
|
|
192
|
+
customerError,
|
|
193
|
+
loyaltyStatus,
|
|
194
|
+
loyalty,
|
|
195
|
+
points: loyalty?.program?.loyaltyDetails?.points ?? 0,
|
|
196
|
+
loyaltyError,
|
|
197
|
+
enroll,
|
|
198
|
+
refetchLoyalty
|
|
199
|
+
};
|
|
200
|
+
return /*#__PURE__*/React.createElement(CustomerContext.Provider, {
|
|
201
|
+
value: value
|
|
202
|
+
}, children);
|
|
203
|
+
};
|
|
204
|
+
//# sourceMappingURL=CustomerProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","createContext","useCallback","useEffect","useState","auth","firestore","useMMKVString","useQueryClient","uuid","connectSquareCustomer","connectSquareLoyalty","createCustomer","fetchSquareLoyalty","getCustomer","MMKV_KEYS","queryKeys","classifyLoyaltyError","customerSetupAttempted","Set","CustomerContext","CustomerProvider","children","autoEnroll","loyaltyEnabled","queryClient","selectedBusinessId","BUSINESS_ID","uid","setUid","uidRef","useRef","customerStatus","setCustomerStatus","squareCustomerId","setSquareCustomerId","customerError","setCustomerError","loyaltyStatus","setLoyaltyStatus","loyalty","setLoyaltyData","loyaltyError","setLoyaltyError","resetState","userId","key","startsWith","delete","removeQueries","LOYALTY","PROGRAM","unsubscribe","onAuthStateChanged","user","loggedIn","Boolean","isAnonymous","current","has","add","runCustomerSetup","businessId","customerRes","data","customer","programs","collection","where","get","custId","empty","idempotentKey","v4","updated","docs","linkedObjectId","console","log","err","msg","Error","message","String","warn","fetchLoyaltyData","response","error","includes","attemptEnroll","outcome","runLoyaltySetup","enroll","refetchLoyalty","value","points","program","loyaltyDetails","createElement","Provider"],"sourceRoot":"../../../../src","sources":["providers/customer/CustomerProvider.tsx"],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# CustomerProvider
|
|
2
|
+
|
|
3
|
+
Owns the full customer + loyalty lifecycle. Replaces the old scattered hooks (`useCheckCustomer`, `useFetchSquareLoyalty`, `useConnectSquareLoyalty`, `useFetchSquareProgram`, `useConnectSquareCustomer`).
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
1. Subscribes to Firebase auth — starts setup on login, clears state on logout
|
|
8
|
+
2. Ensures the customer record exists (`getCustomer` / `createCustomer`)
|
|
9
|
+
3. Ensures the Square customer program doc exists (`connectSquareCustomer`) — guarded by a module-level `Set` so it never fires twice for the same `uid:businessId`, even across remounts
|
|
10
|
+
4. Fetches loyalty data — on "does not have loyalty":
|
|
11
|
+
- `autoEnroll=true` (kiosk): calls `connectSquareLoyalty` automatically
|
|
12
|
+
- `autoEnroll=false` (Gusteau): sets `not_enrolled`, waits for `enroll()` call
|
|
13
|
+
5. Classifies all `connectSquareLoyalty` errors so checkout is never blocked
|
|
14
|
+
|
|
15
|
+
## Setup
|
|
16
|
+
|
|
17
|
+
Wrap your authenticated navigator with the provider:
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { CustomerProvider } from '@kiosinc/commons-rn';
|
|
21
|
+
|
|
22
|
+
// autoEnroll=true for kiosk (auto-enroll on login)
|
|
23
|
+
// autoEnroll=false for Gusteau (manual enroll via button)
|
|
24
|
+
<CustomerProvider
|
|
25
|
+
autoEnroll
|
|
26
|
+
loyaltyEnabled={isSquareLoyaltyEnabled}>
|
|
27
|
+
<YourNavigator />
|
|
28
|
+
</CustomerProvider>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`businessId` is read internally from MMKV (`MMKV_KEYS.BUSINESS_ID`) — no prop needed.
|
|
32
|
+
|
|
33
|
+
## Consumer hooks
|
|
34
|
+
|
|
35
|
+
### `useSquareCustomer()` — for checkout
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import { useSquareCustomer } from '@kiosinc/commons-rn';
|
|
39
|
+
|
|
40
|
+
const { squareCustomerId, customerStatus, customerError } = useSquareCustomer();
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
| Field | Type | Description |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| `squareCustomerId` | `string \| null` | Pass to `useOptimizedCheckout`. Available even if loyalty is broken. |
|
|
46
|
+
| `customerStatus` | `CustomerStatus` | `idle \| loading \| ready \| error` |
|
|
47
|
+
| `customerError` | `string \| null` | Error message if setup failed |
|
|
48
|
+
|
|
49
|
+
### `useLoyalty()` — for rewards screens
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import { useLoyalty } from '@kiosinc/commons-rn';
|
|
53
|
+
|
|
54
|
+
const {
|
|
55
|
+
loyaltyStatus,
|
|
56
|
+
isReady,
|
|
57
|
+
loyalty,
|
|
58
|
+
points,
|
|
59
|
+
loyaltyError,
|
|
60
|
+
enroll,
|
|
61
|
+
refetchLoyalty,
|
|
62
|
+
} = useLoyalty();
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
| Field | Type | Description |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| `loyaltyStatus` | `LoyaltyStatus` | See status machine below |
|
|
68
|
+
| `isReady` | `boolean` | `loyaltyStatus === 'ready'` |
|
|
69
|
+
| `loyalty` | `CustomerLoyalty \| null` | Full loyalty object |
|
|
70
|
+
| `points` | `number` | Available points (0 if not ready) |
|
|
71
|
+
| `loyaltyError` | `string \| null` | Show on error/no_loyalty screens |
|
|
72
|
+
| `enroll()` | `() => void` | Gusteau: call from "Join" button. Noop if already enrolling or autoEnroll=true. |
|
|
73
|
+
| `refetchLoyalty()` | `() => void` | Call after payment to refresh points |
|
|
74
|
+
|
|
75
|
+
## Status machines
|
|
76
|
+
|
|
77
|
+
### `customerStatus`
|
|
78
|
+
```
|
|
79
|
+
idle → loading → ready
|
|
80
|
+
→ error
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `loyaltyStatus`
|
|
84
|
+
```
|
|
85
|
+
idle → loading → ready
|
|
86
|
+
→ not_enrolled (autoEnroll=false, no loyalty account)
|
|
87
|
+
→ enrolling → ready
|
|
88
|
+
→ error
|
|
89
|
+
→ no_loyalty (merchant has no loyalty program)
|
|
90
|
+
→ error (duplicate customer docs, etc.)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Error handling
|
|
94
|
+
|
|
95
|
+
`connectSquareLoyalty` errors are classified automatically:
|
|
96
|
+
|
|
97
|
+
| Error message | Outcome |
|
|
98
|
+
|---|---|
|
|
99
|
+
| contains `already has` / `ALREADY_EXISTS` / `already exists` | Refetch → `ready` |
|
|
100
|
+
| contains `More than one` / `more than one` | `loyaltyStatus = 'error'`, message: "Multiple account records found. Contact support." |
|
|
101
|
+
| contains `Square Loyalty not enabled` / `not enabled` | `loyaltyStatus = 'no_loyalty'` |
|
|
102
|
+
| anything else | `loyaltyStatus = 'error'`, raw message shown |
|
|
103
|
+
|
|
104
|
+
## Session reset
|
|
105
|
+
|
|
106
|
+
Provider resets automatically on Firebase auth state change (logout). For kiosk sleep/wake cycles that don't sign out Firebase, sign the user out via `firebase().auth().signOut()` to trigger a full reset.
|
|
107
|
+
|
|
108
|
+
## Gusteau usage
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
// In your business selector screen:
|
|
112
|
+
<CustomerProvider autoEnroll={false} loyaltyEnabled={true}>
|
|
113
|
+
<AppNavigator />
|
|
114
|
+
</CustomerProvider>
|
|
115
|
+
|
|
116
|
+
// In your loyalty join screen:
|
|
117
|
+
const { loyaltyStatus, enroll } = useLoyalty();
|
|
118
|
+
|
|
119
|
+
if (loyaltyStatus === 'not_enrolled') {
|
|
120
|
+
return <Button onPress={enroll} title="Join Loyalty Program" />;
|
|
121
|
+
}
|
|
122
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function classifyLoyaltyError(message) {
|
|
2
|
+
if (message.includes('already has') || message.includes('ALREADY_EXISTS') || message.toLowerCase().includes('already exists')) {
|
|
3
|
+
return 'refetch';
|
|
4
|
+
}
|
|
5
|
+
if (message.includes('More than one') || message.includes('more than one')) {
|
|
6
|
+
return 'duplicate';
|
|
7
|
+
}
|
|
8
|
+
if (message.includes('Square Loyalty not enabled') || message.toLowerCase().includes('not enabled')) {
|
|
9
|
+
return 'no_loyalty';
|
|
10
|
+
}
|
|
11
|
+
return 'error';
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=classifyLoyaltyError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["classifyLoyaltyError","message","includes","toLowerCase"],"sourceRoot":"../../../../src","sources":["providers/customer/classifyLoyaltyError.ts"],"mappings":"AAMA,OAAO,SAASA,oBAAoBA,CAACC,OAAe,EAAyB;EAC3E,IACEA,OAAO,CAACC,QAAQ,CAAC,aAAa,CAAC,IAC/BD,OAAO,CAACC,QAAQ,CAAC,gBAAgB,CAAC,IAClCD,OAAO,CAACE,WAAW,CAAC,CAAC,CAACD,QAAQ,CAAC,gBAAgB,CAAC,EAChD;IACA,OAAO,SAAS;EAClB;EACA,IAAID,OAAO,CAACC,QAAQ,CAAC,eAAe,CAAC,IAAID,OAAO,CAACC,QAAQ,CAAC,eAAe,CAAC,EAAE;IAC1E,OAAO,WAAW;EACpB;EACA,IACED,OAAO,CAACC,QAAQ,CAAC,4BAA4B,CAAC,IAC9CD,OAAO,CAACE,WAAW,CAAC,CAAC,CAACD,QAAQ,CAAC,aAAa,CAAC,EAC7C;IACA,OAAO,YAAY;EACrB;EACA,OAAO,OAAO;AAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CustomerProvider","useSquareCustomer","useLoyalty"],"sourceRoot":"../../../../src","sources":["providers/customer/index.ts"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,oBAAoB;AACrD,SAASC,iBAAiB,QAAQ,qBAAqB;AACvD,SAASC,UAAU,QAAQ,cAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../../src","sources":["providers/customer/types.ts"],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { CustomerContext } from './CustomerProvider';
|
|
3
|
+
export const useLoyalty = () => {
|
|
4
|
+
const ctx = useContext(CustomerContext);
|
|
5
|
+
if (!ctx) {
|
|
6
|
+
throw new Error('useLoyalty must be used within CustomerProvider');
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
loyaltyStatus: ctx.loyaltyStatus,
|
|
10
|
+
isReady: ctx.loyaltyStatus === 'ready',
|
|
11
|
+
loyalty: ctx.loyalty,
|
|
12
|
+
points: ctx.points,
|
|
13
|
+
loyaltyError: ctx.loyaltyError,
|
|
14
|
+
enroll: ctx.enroll,
|
|
15
|
+
refetchLoyalty: ctx.refetchLoyalty
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=useLoyalty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useContext","CustomerContext","useLoyalty","ctx","Error","loyaltyStatus","isReady","loyalty","points","loyaltyError","enroll","refetchLoyalty"],"sourceRoot":"../../../../src","sources":["providers/customer/useLoyalty.ts"],"mappings":"AAAA,SAASA,UAAU,QAAQ,OAAO;AAClC,SAASC,eAAe,QAAQ,oBAAoB;AAGpD,OAAO,MAAMC,UAAU,GAAGA,CAAA,KAQrB;EACH,MAAMC,GAAG,GAAGH,UAAU,CAACC,eAAe,CAAC;EACvC,IAAI,CAACE,GAAG,EAAE;IACR,MAAM,IAAIC,KAAK,CAAC,iDAAiD,CAAC;EACpE;EACA,OAAO;IACLC,aAAa,EAAEF,GAAG,CAACE,aAAa;IAChCC,OAAO,EAAEH,GAAG,CAACE,aAAa,KAAK,OAAO;IACtCE,OAAO,EAAEJ,GAAG,CAACI,OAAO;IACpBC,MAAM,EAAEL,GAAG,CAACK,MAAM;IAClBC,YAAY,EAAEN,GAAG,CAACM,YAAY;IAC9BC,MAAM,EAAEP,GAAG,CAACO,MAAM;IAClBC,cAAc,EAAER,GAAG,CAACQ;EACtB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { CustomerContext } from './CustomerProvider';
|
|
3
|
+
export const useSquareCustomer = () => {
|
|
4
|
+
const ctx = useContext(CustomerContext);
|
|
5
|
+
if (!ctx) {
|
|
6
|
+
throw new Error('useSquareCustomer must be used within CustomerProvider');
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
customerStatus: ctx.customerStatus,
|
|
10
|
+
squareCustomerId: ctx.squareCustomerId,
|
|
11
|
+
customerError: ctx.customerError
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=useSquareCustomer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useContext","CustomerContext","useSquareCustomer","ctx","Error","customerStatus","squareCustomerId","customerError"],"sourceRoot":"../../../../src","sources":["providers/customer/useSquareCustomer.ts"],"mappings":"AAAA,SAASA,UAAU,QAAQ,OAAO;AAClC,SAASC,eAAe,QAAQ,oBAAoB;AAGpD,OAAO,MAAMC,iBAAiB,GAAGA,CAAA,KAI5B;EACH,MAAMC,GAAG,GAAGH,UAAU,CAACC,eAAe,CAAC;EACvC,IAAI,CAACE,GAAG,EAAE;IACR,MAAM,IAAIC,KAAK,CAAC,wDAAwD,CAAC;EAC3E;EACA,OAAO;IACLC,cAAc,EAAEF,GAAG,CAACE,cAAc;IAClCC,gBAAgB,EAAEH,GAAG,CAACG,gBAAgB;IACtCC,aAAa,EAAEJ,GAAG,CAACI;EACrB,CAAC;AACH,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { changeUser } from './authentication/actions/authentication.actions';
|
|
2
2
|
export { useAuthentication, useAuthenticationDispatch, AuthenticationProvider } from './authentication/AuthenticationProvider';
|
|
3
|
+
export { CustomerProvider, useSquareCustomer, useLoyalty } from './customer';
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["changeUser","useAuthentication","useAuthenticationDispatch","AuthenticationProvider"],"sourceRoot":"../../../src","sources":["providers/index.ts"],"mappings":"AAAA,SAASA,UAAU,QAAQ,iDAAiD;AAC5E,SACEC,iBAAiB,EACjBC,yBAAyB,EACzBC,sBAAsB,QACjB,yCAAyC"}
|
|
1
|
+
{"version":3,"names":["changeUser","useAuthentication","useAuthenticationDispatch","AuthenticationProvider","CustomerProvider","useSquareCustomer","useLoyalty"],"sourceRoot":"../../../src","sources":["providers/index.ts"],"mappings":"AAAA,SAASA,UAAU,QAAQ,iDAAiD;AAC5E,SACEC,iBAAiB,EACjBC,yBAAyB,EACzBC,sBAAsB,QACjB,yCAAyC;AAChD,SAASC,gBAAgB,EAAEC,iBAAiB,EAAEC,UAAU,QAAQ,YAAY"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useEffect, useState } from 'react';
|
|
1
|
+
import React, { useContext, useEffect, useState } from 'react';
|
|
2
2
|
import { Alert, Button, LineLoader, RefreshControl, Text, View } from '../../components';
|
|
3
3
|
import { ActivityIndicator, useTheme } from 'react-native-paper';
|
|
4
4
|
import uuid from 'react-native-uuid';
|
|
@@ -6,7 +6,7 @@ import { useTranslation } from 'react-i18next';
|
|
|
6
6
|
import { FlatList, Platform } from 'react-native';
|
|
7
7
|
import { onStartCardEntry } from '../../utils/square';
|
|
8
8
|
import { useCustomerQueries } from '../../hooks/useCustomer';
|
|
9
|
-
import {
|
|
9
|
+
import { CustomerContext } from '../../providers/customer/CustomerProvider';
|
|
10
10
|
import { CardRow } from './CardRow';
|
|
11
11
|
import { useApplePay } from './useApplePay';
|
|
12
12
|
export const SavedCards = ({
|
|
@@ -18,15 +18,20 @@ export const SavedCards = ({
|
|
|
18
18
|
t
|
|
19
19
|
} = useTranslation();
|
|
20
20
|
const theme = useTheme();
|
|
21
|
+
const customerCtx = useContext(CustomerContext);
|
|
22
|
+
if (__DEV__ && !customerCtx) {
|
|
23
|
+
console.warn('SavedCards: CustomerProvider not found in tree — customer setup will not run');
|
|
24
|
+
}
|
|
21
25
|
const {
|
|
22
|
-
|
|
23
|
-
} = useCheckCustomer();
|
|
24
|
-
const {
|
|
26
|
+
useFetchCustomer,
|
|
25
27
|
useSaveCustomerCard,
|
|
26
28
|
useFetchSavedCards,
|
|
27
29
|
useDisableCard,
|
|
28
30
|
useUpdateCustomer
|
|
29
31
|
} = useCustomerQueries();
|
|
32
|
+
const {
|
|
33
|
+
data: customer
|
|
34
|
+
} = useFetchCustomer();
|
|
30
35
|
const {
|
|
31
36
|
saveCard,
|
|
32
37
|
saveCardLoading
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useState","Alert","Button","LineLoader","RefreshControl","Text","View","ActivityIndicator","useTheme","uuid","useTranslation","FlatList","Platform","onStartCardEntry","useCustomerQueries","
|
|
1
|
+
{"version":3,"names":["React","useContext","useEffect","useState","Alert","Button","LineLoader","RefreshControl","Text","View","ActivityIndicator","useTheme","uuid","useTranslation","FlatList","Platform","onStartCardEntry","useCustomerQueries","CustomerContext","CardRow","useApplePay","SavedCards","onCheckout","showApplePay","total","t","theme","customerCtx","__DEV__","console","warn","useFetchCustomer","useSaveCustomerCard","useFetchSavedCards","useDisableCard","useUpdateCustomer","data","customer","saveCard","saveCardLoading","disableCard","disableCardLoading","selectedPaymentId","setSelectedPaymentId","updateCustomer","updateCustomerLoading","hasApplePay","paymentId","cards","isFetching","isLoading","refetch","handleAddCard","cardDetails","sourceId","nonce","idempotentKey","v4","show","title","description","handleUseCard","length","OS","selectedCard","find","card","linkedObjectId","paymentMethods","isApplePay","createElement","flex","px","bg","extraData","refreshControl","refreshing","onRefresh","showsVerticalScrollIndicator","renderItem","item","isDisabled","isSelected","isSelectable","onDelete","id","onSelect","addressId","squareCustomerId","ListHeaderComponent","mb","variant","color","ListFooterComponent","alignItems","pt","loading","onPress","icon","mode","height","padding","justifyContent","flexDirection","width","alignSelf","labelStyle","colors","background"],"sourceRoot":"../../../../src","sources":["screens/SavedCards/SavedCards.tsx"],"mappings":"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"}
|
|
@@ -2,6 +2,13 @@ import { Mixpanel } from 'mixpanel-react-native';
|
|
|
2
2
|
import { Platform } from 'react-native';
|
|
3
3
|
import Config from 'react-native-config';
|
|
4
4
|
import auth from '@react-native-firebase/auth';
|
|
5
|
+
import { MMKV } from 'react-native-mmkv';
|
|
6
|
+
|
|
7
|
+
// Persisted guard so alias fires at most once per install, even across restarts.
|
|
8
|
+
const aliasStorage = new MMKV({
|
|
9
|
+
id: 'mixpanel-alias'
|
|
10
|
+
});
|
|
11
|
+
const ALIAS_DONE_KEY = 'mixpanel_alias_done';
|
|
5
12
|
const createTrackFunction = () => {
|
|
6
13
|
return params => {
|
|
7
14
|
if ('properties' in params && params.properties) {
|
|
@@ -34,6 +41,20 @@ export const Analytics = {
|
|
|
34
41
|
// Registering super properties again on identification.
|
|
35
42
|
registerCustomSuperProperties();
|
|
36
43
|
};
|
|
44
|
+
|
|
45
|
+
// Links the current anonymous distinct_id to the signed-up user id exactly
|
|
46
|
+
// once per install, merging pre-sign-up activity into the authenticated
|
|
47
|
+
// profile. Must be awaited before identify so Mixpanel honors the merge.
|
|
48
|
+
const aliasOnce = async userId => {
|
|
49
|
+
if (!mixpanel || aliasStorage.getBoolean(ALIAS_DONE_KEY)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const distinctId = await mixpanel.getDistinctId();
|
|
53
|
+
if (distinctId && distinctId !== userId) {
|
|
54
|
+
mixpanel.alias(userId, distinctId);
|
|
55
|
+
aliasStorage.set(ALIAS_DONE_KEY, true);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
37
58
|
const currentUser = auth().currentUser;
|
|
38
59
|
if (currentUser?.isAnonymous) {
|
|
39
60
|
// Register custom super properties on app lunch before login/signup.
|
|
@@ -48,6 +69,7 @@ export const Analytics = {
|
|
|
48
69
|
unregisterSuperProperty: propertyName => mixpanel.unregisterSuperProperty(propertyName),
|
|
49
70
|
track: createTrackFunction(),
|
|
50
71
|
identify,
|
|
72
|
+
aliasOnce,
|
|
51
73
|
profile: {
|
|
52
74
|
set: (key, value) => {
|
|
53
75
|
mixpanel?.getPeople()?.set(key, value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Mixpanel","Platform","Config","auth","createTrackFunction","params","properties","mixpanel","track","eventName","Analytics","init","trackAutomaticEvents","MIXPANEL_TOKEN","registerCustomSuperProperties","registerSuperProperties","version","Version","now","Date","toISOString","registerSuperPropertiesOnce","app","URL_SCHEME","platform","OS","first_time_install","identify","userId","currentUser","isAnonymous","uid","unregisterSuperProperty","propertyName","profile","
|
|
1
|
+
{"version":3,"names":["Mixpanel","Platform","Config","auth","MMKV","aliasStorage","id","ALIAS_DONE_KEY","createTrackFunction","params","properties","mixpanel","track","eventName","Analytics","init","trackAutomaticEvents","MIXPANEL_TOKEN","registerCustomSuperProperties","registerSuperProperties","version","Version","now","Date","toISOString","registerSuperPropertiesOnce","app","URL_SCHEME","platform","OS","first_time_install","identify","userId","aliasOnce","getBoolean","distinctId","getDistinctId","alias","set","currentUser","isAnonymous","uid","unregisterSuperProperty","propertyName","profile","key","value","getPeople","reset","analytics"],"sourceRoot":"../../../src","sources":["utils/analytics.ts"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/constants/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/constants/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,QACoK,CAAC;AAE7L,eAAO,MAAM,SAAS;;CAErB,CAAC;AAEF,eAAO,MAAM,cAAc,2CAA2C,CAAC;AACvE,eAAO,MAAM,gBAAgB,uCAAuC,CAAC"}
|