@usebridge/sdk-react 0.4.1 → 0.5.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/dist/index.d.cts CHANGED
@@ -29,7 +29,7 @@ declare function useBridgeSdk(): BridgeSdk;
29
29
  * @param query the query to search for, may be an empty string
30
30
  * @param limit the maximum number of results to return, defaults to 10
31
31
  */
32
- declare function usePayerAutocomplete(query: string, { limit, }: {
32
+ declare function usePayerAutocomplete(query: string, { limit, }?: {
33
33
  /**
34
34
  * The maximum number of results to return, defaults to 10
35
35
  */
package/dist/index.d.ts CHANGED
@@ -29,7 +29,7 @@ declare function useBridgeSdk(): BridgeSdk;
29
29
  * @param query the query to search for, may be an empty string
30
30
  * @param limit the maximum number of results to return, defaults to 10
31
31
  */
32
- declare function usePayerAutocomplete(query: string, { limit, }: {
32
+ declare function usePayerAutocomplete(query: string, { limit, }?: {
33
33
  /**
34
34
  * The maximum number of results to return, defaults to 10
35
35
  */
package/dist/index.js CHANGED
@@ -159,22 +159,44 @@ var require_lodash = __commonJS({
159
159
  });
160
160
 
161
161
  // src/sdk/index.tsx
162
- import { createContext, useContext, useRef } from "react";
162
+ import { createContext, useContext, useRef as useRef2 } from "react";
163
163
  import { BridgeSdk as BridgeSdk2 } from "@usebridge/sdk-core";
164
164
 
165
165
  // src/sdk/use-prefetch-payers.ts
166
166
  import "@usebridge/sdk-core";
167
- import { useEffect } from "react";
167
+ import { useEffect, useRef } from "react";
168
168
  function usePrefetchPayers(bridgeSdk, enabled) {
169
+ const fetched = useRef(false);
169
170
  useEffect(() => {
171
+ if (fetched.current) return;
170
172
  if (enabled) {
171
173
  void Promise.all(
172
174
  ["", "b", "u", "a"].map((query) => bridgeSdk.payerSearch({ query, limit: 10 }))
173
175
  );
176
+ fetched.current = true;
174
177
  }
175
178
  }, [bridgeSdk, enabled]);
176
179
  }
177
180
 
181
+ // src/sdk/use-analytics-lifecycle.ts
182
+ import { useEffect as useEffect2 } from "react";
183
+ function useAnalyticsLifecycle(bridgeSdk) {
184
+ useEffect2(() => {
185
+ return () => {
186
+ bridgeSdk._analytics.flush();
187
+ };
188
+ }, [bridgeSdk]);
189
+ useEffect2(() => {
190
+ const flush = () => {
191
+ if (document.visibilityState === "hidden") bridgeSdk._analytics.flush();
192
+ };
193
+ if (typeof window !== "undefined") window.addEventListener("visibilitychange", flush);
194
+ return () => {
195
+ if (typeof window !== "undefined") window.removeEventListener("visibilitychange", flush);
196
+ };
197
+ }, [bridgeSdk]);
198
+ }
199
+
178
200
  // src/sdk/index.tsx
179
201
  import { jsxs } from "react/jsx-runtime";
180
202
  var BridgeSdkContext = createContext(null);
@@ -183,8 +205,11 @@ var BridgeSdkProvider = ({
183
205
  prefetchPayers = true,
184
206
  children
185
207
  }) => {
186
- const { current } = useRef(new BridgeSdk2(config));
208
+ const sdkRef = useRef2(null);
209
+ if (!sdkRef.current) sdkRef.current = new BridgeSdk2(config);
210
+ const current = sdkRef.current;
187
211
  usePrefetchPayers(current, prefetchPayers);
212
+ useAnalyticsLifecycle(current);
188
213
  return /* @__PURE__ */ jsxs(BridgeSdkContext.Provider, { value: current, children: [
189
214
  " ",
190
215
  children,
@@ -198,14 +223,14 @@ function useBridgeSdk() {
198
223
  }
199
224
 
200
225
  // src/payer-search/use-payer-autocomplete.ts
201
- import { useEffect as useEffect3, useMemo as useMemo2, useRef as useRef3, useState as useState2 } from "react";
226
+ import { useEffect as useEffect4, useMemo as useMemo2, useRef as useRef4, useState as useState2 } from "react";
202
227
 
203
228
  // ../../node_modules/usehooks-ts/dist/index.js
204
229
  var import_lodash = __toESM(require_lodash(), 1);
205
- import { useState, useCallback, useLayoutEffect, useEffect as useEffect2, useRef as useRef2, useMemo } from "react";
230
+ import { useState, useCallback, useLayoutEffect, useEffect as useEffect3, useRef as useRef3, useMemo } from "react";
206
231
  function useIsMounted() {
207
- const isMounted = useRef2(false);
208
- useEffect2(() => {
232
+ const isMounted = useRef3(false);
233
+ useEffect3(() => {
209
234
  isMounted.current = true;
210
235
  return () => {
211
236
  isMounted.current = false;
@@ -226,7 +251,7 @@ async function retryLoop(fn, shouldRetry, delayMs = 500) {
226
251
  while (!cancelled) {
227
252
  try {
228
253
  return await fn();
229
- } catch (err) {
254
+ } catch (_) {
230
255
  if (!shouldRetry()) {
231
256
  cancelled = true;
232
257
  } else {
@@ -1780,14 +1805,14 @@ var omit_default = omit;
1780
1805
  var resultCache = /* @__PURE__ */ new Map();
1781
1806
  function usePayerAutocomplete(query, {
1782
1807
  limit = 10
1783
- }) {
1808
+ } = {}) {
1784
1809
  const payerSearch = usePayerSearch();
1785
1810
  const [isLoading, setIsLoading] = useState2(false);
1786
1811
  const [results, setResults] = useState2([]);
1787
1812
  const normalizedQuery = query.trim().toLowerCase();
1788
- const reqId = useRef3(0);
1813
+ const reqId = useRef4(0);
1789
1814
  const isMounted = useIsMounted();
1790
- useEffect3(() => {
1815
+ useEffect4(() => {
1791
1816
  const thisId = ++reqId.current;
1792
1817
  const cachedResults = resultCache.get(normalizedQuery);
1793
1818
  if (cachedResults) {
@@ -1830,7 +1855,7 @@ import { createContext as createContext2 } from "react";
1830
1855
  var SoftEligibilityContext = createContext2(null);
1831
1856
 
1832
1857
  // src/eligibility-input/eligibility-input-provider.tsx
1833
- import { useContext as useContext5, useRef as useRef5 } from "react";
1858
+ import { useContext as useContext5, useRef as useRef6 } from "react";
1834
1859
  import "zustand";
1835
1860
 
1836
1861
  // src/eligibility-input/eligibility-input-store.ts
@@ -1894,7 +1919,7 @@ var HardEligibilityProvider = ({
1894
1919
  }) => /* @__PURE__ */ jsx(HardEligibilityContext.Provider, { value: session, children: /* @__PURE__ */ jsx(EligibilityInputProvider, { children }) });
1895
1920
 
1896
1921
  // src/hard-eligibility/use-hard-eligibility-state.ts
1897
- import { useEffect as useEffect4, useState as useState3 } from "react";
1922
+ import { useEffect as useEffect5, useState as useState3 } from "react";
1898
1923
  import "@usebridge/sdk-core";
1899
1924
 
1900
1925
  // src/hard-eligibility/use-hard-eligibility.ts
@@ -1910,7 +1935,7 @@ function useHardEligibilitySession() {
1910
1935
  function useHardEligibilityState() {
1911
1936
  const session = useHardEligibilitySession();
1912
1937
  const [state, setState] = useState3(session.state);
1913
- useEffect4(() => {
1938
+ useEffect5(() => {
1914
1939
  session.on("update", setState);
1915
1940
  return () => {
1916
1941
  session.removeListener("update", setState);
@@ -1938,7 +1963,7 @@ import {
1938
1963
  } from "@usebridge/sdk-core";
1939
1964
 
1940
1965
  // src/eligibility-input/use-eligibility-input-field.ts
1941
- import { useContext as useContext4, useEffect as useEffect5, useMemo as useMemo3, useRef as useRef4, useState as useState4, useLayoutEffect as useLayoutEffect2 } from "react";
1966
+ import { useContext as useContext4, useEffect as useEffect6, useMemo as useMemo3, useRef as useRef5, useState as useState4, useLayoutEffect as useLayoutEffect2 } from "react";
1942
1967
  import { HardEligibility, SoftEligibility } from "@usebridge/sdk-core";
1943
1968
  function useEligibilityInputField(field, defaultValue) {
1944
1969
  const input = useEligibilityInput();
@@ -1949,19 +1974,19 @@ function useEligibilityInputField(field, defaultValue) {
1949
1974
  let isDisabled = false;
1950
1975
  const [forceMemberId, setForceMemberId] = useState4(false);
1951
1976
  const errorForceMemberId = hardEligibilityContext?.state.error?.forceMemberId;
1952
- useEffect5(() => {
1977
+ useEffect6(() => {
1953
1978
  if (errorForceMemberId) setForceMemberId(true);
1954
1979
  }, [errorForceMemberId]);
1955
1980
  try {
1956
1981
  const { status } = useHardEligibilityState();
1957
1982
  isDisabled = !HardEligibility.canSubmit(status);
1958
1983
  if (status === "WAITING_FOR_SERVICE_ELIGIBILITY") isDisabled = true;
1959
- } catch (err) {
1984
+ } catch (_) {
1960
1985
  }
1961
1986
  try {
1962
1987
  const { status } = useSoftEligibilityState();
1963
1988
  isDisabled = !SoftEligibility.canSubmit(status);
1964
- } catch (err) {
1989
+ } catch (_) {
1965
1990
  }
1966
1991
  if (requirePatient && !hardEligibilityContext)
1967
1992
  throw new Error(`useEligibilityInputField("${field}") requires a HardEligibilityContext`);
@@ -2004,7 +2029,7 @@ function useEligibilityInputField(field, defaultValue) {
2004
2029
  throw new Error(`Unknown field: ${field}`);
2005
2030
  }
2006
2031
  const setValue = set;
2007
- const hasSetDefaultValue = useRef4(false);
2032
+ const hasSetDefaultValue = useRef5(false);
2008
2033
  useLayoutEffect2(() => {
2009
2034
  if (hasSetDefaultValue.current) return;
2010
2035
  if (defaultValue) setValue(defaultValue);
@@ -2070,10 +2095,44 @@ function useHardEligibilitySubmit() {
2070
2095
  return useMemo4(() => ({ isDisabled, submit }), [isDisabled, submit]);
2071
2096
  }
2072
2097
 
2098
+ // src/eligibility-input/eligibility-input-analytics.tsx
2099
+ import { useEffect as useEffect7, useMemo as useMemo5 } from "react";
2100
+ function useEligibilityInputFieldState(field) {
2101
+ const fieldState = useEligibilityInputField(field);
2102
+ return useMemo5(
2103
+ () => omit_default(fieldState, "setValue"),
2104
+ [
2105
+ fieldState.value,
2106
+ fieldState.isVisible,
2107
+ fieldState.isValid,
2108
+ fieldState.isRequired,
2109
+ fieldState.isDisabled
2110
+ ]
2111
+ );
2112
+ }
2113
+ var EligibilityInputAnalytics = () => {
2114
+ const { _analytics: analytics } = useBridgeSdk();
2115
+ const firstName = useEligibilityInputFieldState("firstName");
2116
+ const lastName = useEligibilityInputFieldState("lastName");
2117
+ const dateOfBirth = useEligibilityInputFieldState("dateOfBirth");
2118
+ const memberId = useEligibilityInputFieldState("memberId");
2119
+ const payer = useEligibilityInputFieldState("payer");
2120
+ const state = useEligibilityInputFieldState("state");
2121
+ const isValid = useEligibilityInputIsValid();
2122
+ const payload = useMemo5(
2123
+ () => ({ firstName, lastName, dateOfBirth, memberId, payer, state, isValid }),
2124
+ [firstName, lastName, dateOfBirth, memberId, payer, state, isValid]
2125
+ );
2126
+ useEffect7(() => {
2127
+ analytics.event("input.state.updated", payload);
2128
+ }, [analytics, payload]);
2129
+ return null;
2130
+ };
2131
+
2073
2132
  // src/eligibility-input/eligibility-input-provider.tsx
2074
- import { jsx as jsx2 } from "react/jsx-runtime";
2133
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
2075
2134
  var EligibilityInputProvider = ({ children }) => {
2076
- const storeRef = useRef5(null);
2135
+ const storeRef = useRef6(null);
2077
2136
  const softEligibilityContext = useContext5(SoftEligibilityContext);
2078
2137
  const hardEligibilityContext = useContext5(HardEligibilityContext);
2079
2138
  if (!storeRef.current) {
@@ -2083,7 +2142,10 @@ var EligibilityInputProvider = ({ children }) => {
2083
2142
  else throw new Error("Missing SoftEligibilityContext or HardEligibilityContext");
2084
2143
  storeRef.current = createEligibilityInputStore(requirePatient);
2085
2144
  }
2086
- return /* @__PURE__ */ jsx2(EligibilityInputContext.Provider, { value: storeRef.current, children });
2145
+ return /* @__PURE__ */ jsxs2(EligibilityInputContext.Provider, { value: storeRef.current, children: [
2146
+ children,
2147
+ /* @__PURE__ */ jsx2(EligibilityInputAnalytics, {})
2148
+ ] });
2087
2149
  };
2088
2150
 
2089
2151
  // src/soft-eligibility/soft-eligibility-provider.tsx
@@ -2104,7 +2166,7 @@ function useCreateSoftEligibilitySession() {
2104
2166
  }
2105
2167
 
2106
2168
  // src/soft-eligibility/use-soft-eligibility-state.ts
2107
- import { useEffect as useEffect6, useState as useState5 } from "react";
2169
+ import { useEffect as useEffect8, useState as useState5 } from "react";
2108
2170
  import "@usebridge/sdk-core";
2109
2171
 
2110
2172
  // src/soft-eligibility/use-soft-eligibility.ts
@@ -2120,7 +2182,7 @@ function useSoftEligibilitySession() {
2120
2182
  function useSoftEligibilityState() {
2121
2183
  const session = useSoftEligibilitySession();
2122
2184
  const [state, setState] = useState5(session.state);
2123
- useEffect6(() => {
2185
+ useEffect8(() => {
2124
2186
  session.on("update", setState);
2125
2187
  return () => {
2126
2188
  session.removeListener("update", setState);
@@ -2130,7 +2192,7 @@ function useSoftEligibilityState() {
2130
2192
  }
2131
2193
 
2132
2194
  // src/soft-eligibility/use-soft-eligibility-submit.ts
2133
- import { useCallback as useCallback6, useMemo as useMemo5 } from "react";
2195
+ import { useCallback as useCallback6, useMemo as useMemo6 } from "react";
2134
2196
  import { SoftEligibility as SoftEligibility2 } from "@usebridge/sdk-core";
2135
2197
  function useSoftEligibilitySubmit() {
2136
2198
  const session = useSoftEligibilitySession();
@@ -2143,7 +2205,7 @@ function useSoftEligibilitySubmit() {
2143
2205
  if (!state.value) throw new Error("State is required");
2144
2206
  return session.submit({ payerId: payer.value.id, state: state.value });
2145
2207
  }, [session, payer, state]);
2146
- return useMemo5(
2208
+ return useMemo6(
2147
2209
  () => ({
2148
2210
  isDisabled,
2149
2211
  submit