@sendoracloud/sdk-react-native 0.18.5 → 0.18.7
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/dist/index.cjs +105 -0
- package/dist/index.d.cts +79 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.js +105 -0
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -2094,6 +2094,111 @@ var SendoraSDK = class {
|
|
|
2094
2094
|
}
|
|
2095
2095
|
};
|
|
2096
2096
|
}
|
|
2097
|
+
/**
|
|
2098
|
+
* In-app messaging namespace — fetch active messages (modals,
|
|
2099
|
+
* banners, slideouts, tooltips) targeted at this user + record
|
|
2100
|
+
* impressions (shown / clicked / dismissed) so the dashboard's
|
|
2101
|
+
* "shown N times" caps and CTR analytics work. Mirrors backend
|
|
2102
|
+
* `/in-app-messages/{active,impressions}` SDK routes and the web
|
|
2103
|
+
* SDK's `InAppMessaging` class.
|
|
2104
|
+
*
|
|
2105
|
+
* Typical use:
|
|
2106
|
+
* const msgs = await SendoraCloud.messages.fetchActive();
|
|
2107
|
+
* for (const m of msgs) renderMessage(m);
|
|
2108
|
+
* // when user sees it:
|
|
2109
|
+
* await SendoraCloud.messages.recordImpression({ messageId: m.id, action: "shown" });
|
|
2110
|
+
* // when user clicks CTA:
|
|
2111
|
+
* await SendoraCloud.messages.recordImpression({ messageId: m.id, action: "clicked" });
|
|
2112
|
+
*
|
|
2113
|
+
* `action` is a free-form string; "shown" / "clicked" / "dismissed"
|
|
2114
|
+
* are the canonical set the dashboard graphs from.
|
|
2115
|
+
*/
|
|
2116
|
+
get messages() {
|
|
2117
|
+
const self = this;
|
|
2118
|
+
return {
|
|
2119
|
+
fetchActive: async () => {
|
|
2120
|
+
if (!self.config) throw new Error("[sendoracloud] init() must complete before messages.fetchActive().");
|
|
2121
|
+
const url = `${self.config.apiUrl}/api/v1/in-app-messages/active`;
|
|
2122
|
+
const res = await fetch(url, {
|
|
2123
|
+
method: "GET",
|
|
2124
|
+
headers: { "x-api-key": self.config.publicKey }
|
|
2125
|
+
});
|
|
2126
|
+
if (!res.ok) throw new Error(`[sendoracloud] messages.fetchActive failed (${res.status})`);
|
|
2127
|
+
const parsed = await res.json();
|
|
2128
|
+
if (!parsed.success || !Array.isArray(parsed.data)) {
|
|
2129
|
+
throw new Error("[sendoracloud] messages.fetchActive: bad response");
|
|
2130
|
+
}
|
|
2131
|
+
return parsed.data;
|
|
2132
|
+
},
|
|
2133
|
+
recordImpression: async (input) => {
|
|
2134
|
+
if (!self.config) throw new Error("[sendoracloud] init() must complete before messages.recordImpression().");
|
|
2135
|
+
const res = await post(
|
|
2136
|
+
{ apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
|
|
2137
|
+
"/in-app-messages/impressions",
|
|
2138
|
+
input
|
|
2139
|
+
);
|
|
2140
|
+
if (!res || !res.ok) throw new Error(`[sendoracloud] messages.recordImpression failed (${res?.status ?? "network"})`);
|
|
2141
|
+
}
|
|
2142
|
+
};
|
|
2143
|
+
}
|
|
2144
|
+
/**
|
|
2145
|
+
* Feature-flags namespace — per-user evaluation against percentage
|
|
2146
|
+
* rollouts + audience targeting. Mirrors backend
|
|
2147
|
+
* `/feature-flags/{evaluate,evaluate-all}` SDK routes and the web
|
|
2148
|
+
* SDK's `FeatureFlags` class.
|
|
2149
|
+
*
|
|
2150
|
+
* `evaluate(key)` returns the resolved value (boolean / string /
|
|
2151
|
+
* number / variant payload) for a single flag — use when you only
|
|
2152
|
+
* need one specific flag in a code path.
|
|
2153
|
+
*
|
|
2154
|
+
* `evaluateAll()` returns the full flag map in one round-trip —
|
|
2155
|
+
* call once on app startup or screen mount, then read from the
|
|
2156
|
+
* map locally. Avoids N+1.
|
|
2157
|
+
*
|
|
2158
|
+
* Both methods auto-thread `userId` (from `identify()`) when not
|
|
2159
|
+
* passed. `entityId` is for entity-scoped flags (org / team /
|
|
2160
|
+
* device-cohort); typically omitted in mobile apps.
|
|
2161
|
+
*/
|
|
2162
|
+
get flags() {
|
|
2163
|
+
const self = this;
|
|
2164
|
+
return {
|
|
2165
|
+
evaluate: async (input) => {
|
|
2166
|
+
if (!self.config) throw new Error("[sendoracloud] init() must complete before flags.evaluate().");
|
|
2167
|
+
const body = {
|
|
2168
|
+
key: input.key,
|
|
2169
|
+
userId: input.userId ?? self.userId ?? void 0,
|
|
2170
|
+
entityId: input.entityId,
|
|
2171
|
+
environment: input.environment
|
|
2172
|
+
};
|
|
2173
|
+
const res = await post(
|
|
2174
|
+
{ apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
|
|
2175
|
+
"/feature-flags/evaluate",
|
|
2176
|
+
body
|
|
2177
|
+
);
|
|
2178
|
+
if (!res || !res.ok) throw new Error(`[sendoracloud] flags.evaluate failed (${res?.status ?? "network"})`);
|
|
2179
|
+
const parsed = await res.json();
|
|
2180
|
+
if (!parsed.success || !parsed.data) throw new Error("[sendoracloud] flags.evaluate: bad response");
|
|
2181
|
+
return parsed.data;
|
|
2182
|
+
},
|
|
2183
|
+
evaluateAll: async (input) => {
|
|
2184
|
+
if (!self.config) throw new Error("[sendoracloud] init() must complete before flags.evaluateAll().");
|
|
2185
|
+
const body = {
|
|
2186
|
+
userId: input?.userId ?? self.userId ?? void 0,
|
|
2187
|
+
entityId: input?.entityId,
|
|
2188
|
+
environment: input?.environment
|
|
2189
|
+
};
|
|
2190
|
+
const res = await post(
|
|
2191
|
+
{ apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
|
|
2192
|
+
"/feature-flags/evaluate-all",
|
|
2193
|
+
body
|
|
2194
|
+
);
|
|
2195
|
+
if (!res || !res.ok) throw new Error(`[sendoracloud] flags.evaluateAll failed (${res?.status ?? "network"})`);
|
|
2196
|
+
const parsed = await res.json();
|
|
2197
|
+
if (!parsed.success || !parsed.data) throw new Error("[sendoracloud] flags.evaluateAll: bad response");
|
|
2198
|
+
return parsed.data;
|
|
2199
|
+
}
|
|
2200
|
+
};
|
|
2201
|
+
}
|
|
2097
2202
|
/**
|
|
2098
2203
|
* Clear identity + rotate the anonymous id. Call on logout. Awaits
|
|
2099
2204
|
* the AsyncStorage writes so a caller who kills the app immediately
|
package/dist/index.d.cts
CHANGED
|
@@ -996,6 +996,85 @@ declare class SendoraSDK {
|
|
|
996
996
|
submittedAt: string;
|
|
997
997
|
}>;
|
|
998
998
|
};
|
|
999
|
+
/**
|
|
1000
|
+
* In-app messaging namespace — fetch active messages (modals,
|
|
1001
|
+
* banners, slideouts, tooltips) targeted at this user + record
|
|
1002
|
+
* impressions (shown / clicked / dismissed) so the dashboard's
|
|
1003
|
+
* "shown N times" caps and CTR analytics work. Mirrors backend
|
|
1004
|
+
* `/in-app-messages/{active,impressions}` SDK routes and the web
|
|
1005
|
+
* SDK's `InAppMessaging` class.
|
|
1006
|
+
*
|
|
1007
|
+
* Typical use:
|
|
1008
|
+
* const msgs = await SendoraCloud.messages.fetchActive();
|
|
1009
|
+
* for (const m of msgs) renderMessage(m);
|
|
1010
|
+
* // when user sees it:
|
|
1011
|
+
* await SendoraCloud.messages.recordImpression({ messageId: m.id, action: "shown" });
|
|
1012
|
+
* // when user clicks CTA:
|
|
1013
|
+
* await SendoraCloud.messages.recordImpression({ messageId: m.id, action: "clicked" });
|
|
1014
|
+
*
|
|
1015
|
+
* `action` is a free-form string; "shown" / "clicked" / "dismissed"
|
|
1016
|
+
* are the canonical set the dashboard graphs from.
|
|
1017
|
+
*/
|
|
1018
|
+
get messages(): {
|
|
1019
|
+
fetchActive: () => Promise<Array<{
|
|
1020
|
+
id: string;
|
|
1021
|
+
type: string;
|
|
1022
|
+
title: string | null;
|
|
1023
|
+
body: string;
|
|
1024
|
+
ctaText: string | null;
|
|
1025
|
+
ctaUrl: string | null;
|
|
1026
|
+
imageUrl: string | null;
|
|
1027
|
+
theme: string | null;
|
|
1028
|
+
priority: number;
|
|
1029
|
+
isActive: boolean;
|
|
1030
|
+
[key: string]: unknown;
|
|
1031
|
+
}>>;
|
|
1032
|
+
recordImpression: (input: {
|
|
1033
|
+
messageId: string;
|
|
1034
|
+
action: string;
|
|
1035
|
+
entityId?: string;
|
|
1036
|
+
}) => Promise<void>;
|
|
1037
|
+
};
|
|
1038
|
+
/**
|
|
1039
|
+
* Feature-flags namespace — per-user evaluation against percentage
|
|
1040
|
+
* rollouts + audience targeting. Mirrors backend
|
|
1041
|
+
* `/feature-flags/{evaluate,evaluate-all}` SDK routes and the web
|
|
1042
|
+
* SDK's `FeatureFlags` class.
|
|
1043
|
+
*
|
|
1044
|
+
* `evaluate(key)` returns the resolved value (boolean / string /
|
|
1045
|
+
* number / variant payload) for a single flag — use when you only
|
|
1046
|
+
* need one specific flag in a code path.
|
|
1047
|
+
*
|
|
1048
|
+
* `evaluateAll()` returns the full flag map in one round-trip —
|
|
1049
|
+
* call once on app startup or screen mount, then read from the
|
|
1050
|
+
* map locally. Avoids N+1.
|
|
1051
|
+
*
|
|
1052
|
+
* Both methods auto-thread `userId` (from `identify()`) when not
|
|
1053
|
+
* passed. `entityId` is for entity-scoped flags (org / team /
|
|
1054
|
+
* device-cohort); typically omitted in mobile apps.
|
|
1055
|
+
*/
|
|
1056
|
+
get flags(): {
|
|
1057
|
+
evaluate: (input: {
|
|
1058
|
+
key: string;
|
|
1059
|
+
entityId?: string;
|
|
1060
|
+
userId?: string;
|
|
1061
|
+
environment?: string;
|
|
1062
|
+
}) => Promise<{
|
|
1063
|
+
key: string;
|
|
1064
|
+
value: unknown;
|
|
1065
|
+
variant: string | null;
|
|
1066
|
+
reason: string;
|
|
1067
|
+
}>;
|
|
1068
|
+
evaluateAll: (input?: {
|
|
1069
|
+
entityId?: string;
|
|
1070
|
+
userId?: string;
|
|
1071
|
+
environment?: string;
|
|
1072
|
+
}) => Promise<Record<string, {
|
|
1073
|
+
value: unknown;
|
|
1074
|
+
variant: string | null;
|
|
1075
|
+
reason: string;
|
|
1076
|
+
}>>;
|
|
1077
|
+
};
|
|
999
1078
|
/**
|
|
1000
1079
|
* Clear identity + rotate the anonymous id. Call on logout. Awaits
|
|
1001
1080
|
* the AsyncStorage writes so a caller who kills the app immediately
|
package/dist/index.d.ts
CHANGED
|
@@ -996,6 +996,85 @@ declare class SendoraSDK {
|
|
|
996
996
|
submittedAt: string;
|
|
997
997
|
}>;
|
|
998
998
|
};
|
|
999
|
+
/**
|
|
1000
|
+
* In-app messaging namespace — fetch active messages (modals,
|
|
1001
|
+
* banners, slideouts, tooltips) targeted at this user + record
|
|
1002
|
+
* impressions (shown / clicked / dismissed) so the dashboard's
|
|
1003
|
+
* "shown N times" caps and CTR analytics work. Mirrors backend
|
|
1004
|
+
* `/in-app-messages/{active,impressions}` SDK routes and the web
|
|
1005
|
+
* SDK's `InAppMessaging` class.
|
|
1006
|
+
*
|
|
1007
|
+
* Typical use:
|
|
1008
|
+
* const msgs = await SendoraCloud.messages.fetchActive();
|
|
1009
|
+
* for (const m of msgs) renderMessage(m);
|
|
1010
|
+
* // when user sees it:
|
|
1011
|
+
* await SendoraCloud.messages.recordImpression({ messageId: m.id, action: "shown" });
|
|
1012
|
+
* // when user clicks CTA:
|
|
1013
|
+
* await SendoraCloud.messages.recordImpression({ messageId: m.id, action: "clicked" });
|
|
1014
|
+
*
|
|
1015
|
+
* `action` is a free-form string; "shown" / "clicked" / "dismissed"
|
|
1016
|
+
* are the canonical set the dashboard graphs from.
|
|
1017
|
+
*/
|
|
1018
|
+
get messages(): {
|
|
1019
|
+
fetchActive: () => Promise<Array<{
|
|
1020
|
+
id: string;
|
|
1021
|
+
type: string;
|
|
1022
|
+
title: string | null;
|
|
1023
|
+
body: string;
|
|
1024
|
+
ctaText: string | null;
|
|
1025
|
+
ctaUrl: string | null;
|
|
1026
|
+
imageUrl: string | null;
|
|
1027
|
+
theme: string | null;
|
|
1028
|
+
priority: number;
|
|
1029
|
+
isActive: boolean;
|
|
1030
|
+
[key: string]: unknown;
|
|
1031
|
+
}>>;
|
|
1032
|
+
recordImpression: (input: {
|
|
1033
|
+
messageId: string;
|
|
1034
|
+
action: string;
|
|
1035
|
+
entityId?: string;
|
|
1036
|
+
}) => Promise<void>;
|
|
1037
|
+
};
|
|
1038
|
+
/**
|
|
1039
|
+
* Feature-flags namespace — per-user evaluation against percentage
|
|
1040
|
+
* rollouts + audience targeting. Mirrors backend
|
|
1041
|
+
* `/feature-flags/{evaluate,evaluate-all}` SDK routes and the web
|
|
1042
|
+
* SDK's `FeatureFlags` class.
|
|
1043
|
+
*
|
|
1044
|
+
* `evaluate(key)` returns the resolved value (boolean / string /
|
|
1045
|
+
* number / variant payload) for a single flag — use when you only
|
|
1046
|
+
* need one specific flag in a code path.
|
|
1047
|
+
*
|
|
1048
|
+
* `evaluateAll()` returns the full flag map in one round-trip —
|
|
1049
|
+
* call once on app startup or screen mount, then read from the
|
|
1050
|
+
* map locally. Avoids N+1.
|
|
1051
|
+
*
|
|
1052
|
+
* Both methods auto-thread `userId` (from `identify()`) when not
|
|
1053
|
+
* passed. `entityId` is for entity-scoped flags (org / team /
|
|
1054
|
+
* device-cohort); typically omitted in mobile apps.
|
|
1055
|
+
*/
|
|
1056
|
+
get flags(): {
|
|
1057
|
+
evaluate: (input: {
|
|
1058
|
+
key: string;
|
|
1059
|
+
entityId?: string;
|
|
1060
|
+
userId?: string;
|
|
1061
|
+
environment?: string;
|
|
1062
|
+
}) => Promise<{
|
|
1063
|
+
key: string;
|
|
1064
|
+
value: unknown;
|
|
1065
|
+
variant: string | null;
|
|
1066
|
+
reason: string;
|
|
1067
|
+
}>;
|
|
1068
|
+
evaluateAll: (input?: {
|
|
1069
|
+
entityId?: string;
|
|
1070
|
+
userId?: string;
|
|
1071
|
+
environment?: string;
|
|
1072
|
+
}) => Promise<Record<string, {
|
|
1073
|
+
value: unknown;
|
|
1074
|
+
variant: string | null;
|
|
1075
|
+
reason: string;
|
|
1076
|
+
}>>;
|
|
1077
|
+
};
|
|
999
1078
|
/**
|
|
1000
1079
|
* Clear identity + rotate the anonymous id. Call on logout. Awaits
|
|
1001
1080
|
* the AsyncStorage writes so a caller who kills the app immediately
|
package/dist/index.js
CHANGED
|
@@ -2056,6 +2056,111 @@ var SendoraSDK = class {
|
|
|
2056
2056
|
}
|
|
2057
2057
|
};
|
|
2058
2058
|
}
|
|
2059
|
+
/**
|
|
2060
|
+
* In-app messaging namespace — fetch active messages (modals,
|
|
2061
|
+
* banners, slideouts, tooltips) targeted at this user + record
|
|
2062
|
+
* impressions (shown / clicked / dismissed) so the dashboard's
|
|
2063
|
+
* "shown N times" caps and CTR analytics work. Mirrors backend
|
|
2064
|
+
* `/in-app-messages/{active,impressions}` SDK routes and the web
|
|
2065
|
+
* SDK's `InAppMessaging` class.
|
|
2066
|
+
*
|
|
2067
|
+
* Typical use:
|
|
2068
|
+
* const msgs = await SendoraCloud.messages.fetchActive();
|
|
2069
|
+
* for (const m of msgs) renderMessage(m);
|
|
2070
|
+
* // when user sees it:
|
|
2071
|
+
* await SendoraCloud.messages.recordImpression({ messageId: m.id, action: "shown" });
|
|
2072
|
+
* // when user clicks CTA:
|
|
2073
|
+
* await SendoraCloud.messages.recordImpression({ messageId: m.id, action: "clicked" });
|
|
2074
|
+
*
|
|
2075
|
+
* `action` is a free-form string; "shown" / "clicked" / "dismissed"
|
|
2076
|
+
* are the canonical set the dashboard graphs from.
|
|
2077
|
+
*/
|
|
2078
|
+
get messages() {
|
|
2079
|
+
const self = this;
|
|
2080
|
+
return {
|
|
2081
|
+
fetchActive: async () => {
|
|
2082
|
+
if (!self.config) throw new Error("[sendoracloud] init() must complete before messages.fetchActive().");
|
|
2083
|
+
const url = `${self.config.apiUrl}/api/v1/in-app-messages/active`;
|
|
2084
|
+
const res = await fetch(url, {
|
|
2085
|
+
method: "GET",
|
|
2086
|
+
headers: { "x-api-key": self.config.publicKey }
|
|
2087
|
+
});
|
|
2088
|
+
if (!res.ok) throw new Error(`[sendoracloud] messages.fetchActive failed (${res.status})`);
|
|
2089
|
+
const parsed = await res.json();
|
|
2090
|
+
if (!parsed.success || !Array.isArray(parsed.data)) {
|
|
2091
|
+
throw new Error("[sendoracloud] messages.fetchActive: bad response");
|
|
2092
|
+
}
|
|
2093
|
+
return parsed.data;
|
|
2094
|
+
},
|
|
2095
|
+
recordImpression: async (input) => {
|
|
2096
|
+
if (!self.config) throw new Error("[sendoracloud] init() must complete before messages.recordImpression().");
|
|
2097
|
+
const res = await post(
|
|
2098
|
+
{ apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
|
|
2099
|
+
"/in-app-messages/impressions",
|
|
2100
|
+
input
|
|
2101
|
+
);
|
|
2102
|
+
if (!res || !res.ok) throw new Error(`[sendoracloud] messages.recordImpression failed (${res?.status ?? "network"})`);
|
|
2103
|
+
}
|
|
2104
|
+
};
|
|
2105
|
+
}
|
|
2106
|
+
/**
|
|
2107
|
+
* Feature-flags namespace — per-user evaluation against percentage
|
|
2108
|
+
* rollouts + audience targeting. Mirrors backend
|
|
2109
|
+
* `/feature-flags/{evaluate,evaluate-all}` SDK routes and the web
|
|
2110
|
+
* SDK's `FeatureFlags` class.
|
|
2111
|
+
*
|
|
2112
|
+
* `evaluate(key)` returns the resolved value (boolean / string /
|
|
2113
|
+
* number / variant payload) for a single flag — use when you only
|
|
2114
|
+
* need one specific flag in a code path.
|
|
2115
|
+
*
|
|
2116
|
+
* `evaluateAll()` returns the full flag map in one round-trip —
|
|
2117
|
+
* call once on app startup or screen mount, then read from the
|
|
2118
|
+
* map locally. Avoids N+1.
|
|
2119
|
+
*
|
|
2120
|
+
* Both methods auto-thread `userId` (from `identify()`) when not
|
|
2121
|
+
* passed. `entityId` is for entity-scoped flags (org / team /
|
|
2122
|
+
* device-cohort); typically omitted in mobile apps.
|
|
2123
|
+
*/
|
|
2124
|
+
get flags() {
|
|
2125
|
+
const self = this;
|
|
2126
|
+
return {
|
|
2127
|
+
evaluate: async (input) => {
|
|
2128
|
+
if (!self.config) throw new Error("[sendoracloud] init() must complete before flags.evaluate().");
|
|
2129
|
+
const body = {
|
|
2130
|
+
key: input.key,
|
|
2131
|
+
userId: input.userId ?? self.userId ?? void 0,
|
|
2132
|
+
entityId: input.entityId,
|
|
2133
|
+
environment: input.environment
|
|
2134
|
+
};
|
|
2135
|
+
const res = await post(
|
|
2136
|
+
{ apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
|
|
2137
|
+
"/feature-flags/evaluate",
|
|
2138
|
+
body
|
|
2139
|
+
);
|
|
2140
|
+
if (!res || !res.ok) throw new Error(`[sendoracloud] flags.evaluate failed (${res?.status ?? "network"})`);
|
|
2141
|
+
const parsed = await res.json();
|
|
2142
|
+
if (!parsed.success || !parsed.data) throw new Error("[sendoracloud] flags.evaluate: bad response");
|
|
2143
|
+
return parsed.data;
|
|
2144
|
+
},
|
|
2145
|
+
evaluateAll: async (input) => {
|
|
2146
|
+
if (!self.config) throw new Error("[sendoracloud] init() must complete before flags.evaluateAll().");
|
|
2147
|
+
const body = {
|
|
2148
|
+
userId: input?.userId ?? self.userId ?? void 0,
|
|
2149
|
+
entityId: input?.entityId,
|
|
2150
|
+
environment: input?.environment
|
|
2151
|
+
};
|
|
2152
|
+
const res = await post(
|
|
2153
|
+
{ apiUrl: self.config.apiUrl, publicKey: self.config.publicKey, debug: self.debug },
|
|
2154
|
+
"/feature-flags/evaluate-all",
|
|
2155
|
+
body
|
|
2156
|
+
);
|
|
2157
|
+
if (!res || !res.ok) throw new Error(`[sendoracloud] flags.evaluateAll failed (${res?.status ?? "network"})`);
|
|
2158
|
+
const parsed = await res.json();
|
|
2159
|
+
if (!parsed.success || !parsed.data) throw new Error("[sendoracloud] flags.evaluateAll: bad response");
|
|
2160
|
+
return parsed.data;
|
|
2161
|
+
}
|
|
2162
|
+
};
|
|
2163
|
+
}
|
|
2059
2164
|
/**
|
|
2060
2165
|
* Clear identity + rotate the anonymous id. Call on logout. Awaits
|
|
2061
2166
|
* the AsyncStorage writes so a caller who kills the app immediately
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sendoracloud/sdk-react-native",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.7",
|
|
4
4
|
"description": "Sendora Cloud React Native + Expo SDK — analytics, identity, push-token registration, auth, deep links (Branch / Firebase Dynamic Links parity). Auth + analytics + deep links work in Expo Go; push token registration requires a Dev Client (EAS Build or `npx expo prebuild`).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|