@react-navigation/core 7.0.0-rc.7 → 7.0.0-rc.8

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.
@@ -4,8 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useIsFocused = useIsFocused;
7
- var _react = _interopRequireWildcard(require("react"));
8
- var React = _react;
7
+ var React = _interopRequireWildcard(require("react"));
9
8
  var _useNavigation = require("./useNavigation.cjs");
10
9
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
11
10
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -15,25 +14,15 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
15
14
  */
16
15
  function useIsFocused() {
17
16
  const navigation = (0, _useNavigation.useNavigation)();
18
- const [isFocused, setIsFocused] = (0, _react.useState)(navigation.isFocused);
19
- const valueToReturn = navigation.isFocused();
20
- if (isFocused !== valueToReturn) {
21
- // If the value has changed since the last render, we need to update it.
22
- // This could happen if we missed an update from the event listeners during re-render.
23
- // React will process this update immediately, so the old subscription value won't be committed.
24
- // It is still nice to avoid returning a mismatched value though, so let's override the return value.
25
- // This is the same logic as in https://github.com/facebook/react/tree/master/packages/use-subscription
26
- setIsFocused(valueToReturn);
27
- }
28
- React.useEffect(() => {
29
- const unsubscribeFocus = navigation.addListener('focus', () => setIsFocused(true));
30
- const unsubscribeBlur = navigation.addListener('blur', () => setIsFocused(false));
17
+ const subscribe = React.useCallback(callback => {
18
+ const unsubscribeFocus = navigation.addListener('focus', callback);
19
+ const unsubscribeBlur = navigation.addListener('blur', callback);
31
20
  return () => {
32
21
  unsubscribeFocus();
33
22
  unsubscribeBlur();
34
23
  };
35
24
  }, [navigation]);
36
- React.useDebugValue(valueToReturn);
37
- return valueToReturn;
25
+ const value = React.useSyncExternalStore(subscribe, navigation.isFocused, navigation.isFocused);
26
+ return value;
38
27
  }
39
28
  //# sourceMappingURL=useIsFocused.cjs.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","React","_useNavigation","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","useIsFocused","navigation","useNavigation","isFocused","setIsFocused","useState","valueToReturn","useEffect","unsubscribeFocus","addListener","unsubscribeBlur","useDebugValue"],"sourceRoot":"../../src","sources":["useIsFocused.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAA+B,IAAAC,KAAA,GAAAH,MAAA;AAG/B,IAAAI,cAAA,GAAAF,OAAA;AAAgD,SAAAG,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAL,wBAAAK,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAEhD;AACA;AACA;AACA;AACO,SAASW,YAAYA,CAAA,EAAY;EACtC,MAAMC,UAAU,GAAG,IAAAC,4BAAa,EAAC,CAAC;EAClC,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAG,IAAAC,eAAQ,EAACJ,UAAU,CAACE,SAAS,CAAC;EAEhE,MAAMG,aAAa,GAAGL,UAAU,CAACE,SAAS,CAAC,CAAC;EAE5C,IAAIA,SAAS,KAAKG,aAAa,EAAE;IAC/B;IACA;IACA;IACA;IACA;IACAF,YAAY,CAACE,aAAa,CAAC;EAC7B;EAEA5B,KAAK,CAAC6B,SAAS,CAAC,MAAM;IACpB,MAAMC,gBAAgB,GAAGP,UAAU,CAACQ,WAAW,CAAC,OAAO,EAAE,MACvDL,YAAY,CAAC,IAAI,CACnB,CAAC;IAED,MAAMM,eAAe,GAAGT,UAAU,CAACQ,WAAW,CAAC,MAAM,EAAE,MACrDL,YAAY,CAAC,KAAK,CACpB,CAAC;IAED,OAAO,MAAM;MACXI,gBAAgB,CAAC,CAAC;MAClBE,eAAe,CAAC,CAAC;IACnB,CAAC;EACH,CAAC,EAAE,CAACT,UAAU,CAAC,CAAC;EAEhBvB,KAAK,CAACiC,aAAa,CAACL,aAAa,CAAC;EAElC,OAAOA,aAAa;AACtB","ignoreList":[]}
1
+ {"version":3,"names":["React","_interopRequireWildcard","require","_useNavigation","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","useIsFocused","navigation","useNavigation","subscribe","useCallback","callback","unsubscribeFocus","addListener","unsubscribeBlur","value","useSyncExternalStore","isFocused"],"sourceRoot":"../../src","sources":["useIsFocused.tsx"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,cAAA,GAAAD,OAAA;AAAgD,SAAAE,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAJ,wBAAAI,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAEhD;AACA;AACA;AACA;AACO,SAASW,YAAYA,CAAA,EAAY;EACtC,MAAMC,UAAU,GAAG,IAAAC,4BAAa,EAAC,CAAC;EAElC,MAAMC,SAAS,GAAG3B,KAAK,CAAC4B,WAAW,CAChCC,QAAoB,IAAK;IACxB,MAAMC,gBAAgB,GAAGL,UAAU,CAACM,WAAW,CAAC,OAAO,EAAEF,QAAQ,CAAC;IAClE,MAAMG,eAAe,GAAGP,UAAU,CAACM,WAAW,CAAC,MAAM,EAAEF,QAAQ,CAAC;IAEhE,OAAO,MAAM;MACXC,gBAAgB,CAAC,CAAC;MAClBE,eAAe,CAAC,CAAC;IACnB,CAAC;EACH,CAAC,EACD,CAACP,UAAU,CACb,CAAC;EAED,MAAMQ,KAAK,GAAGjC,KAAK,CAACkC,oBAAoB,CACtCP,SAAS,EACTF,UAAU,CAACU,SAAS,EACpBV,UAAU,CAACU,SACb,CAAC;EAED,OAAOF,KAAK;AACd","ignoreList":[]}
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useNavigationState = useNavigationState;
7
7
  var React = _interopRequireWildcard(require("react"));
8
+ var _withSelector = require("use-sync-external-store/with-selector");
8
9
  var _useNavigation = require("./useNavigation.cjs");
9
10
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
10
11
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -15,22 +16,11 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
15
16
  */
16
17
  function useNavigationState(selector) {
17
18
  const navigation = (0, _useNavigation.useNavigation)();
18
-
19
- // We don't care about the state value, we run the selector again at the end
20
- // The state is only to make sure that there's a re-render when we have a new value
21
- const [, setResult] = React.useState(() => selector(navigation.getState()));
22
-
23
- // We store the selector in a ref to avoid re-subscribing listeners every render
24
- const selectorRef = React.useRef(selector);
25
- React.useEffect(() => {
26
- selectorRef.current = selector;
27
- });
28
- React.useEffect(() => {
29
- const unsubscribe = navigation.addListener('state', e => {
30
- setResult(selectorRef.current(e.data.state));
31
- });
19
+ const subscribe = React.useCallback(callback => {
20
+ const unsubscribe = navigation.addListener('state', callback);
32
21
  return unsubscribe;
33
22
  }, [navigation]);
34
- return selector(navigation.getState());
23
+ const value = (0, _withSelector.useSyncExternalStoreWithSelector)(subscribe, navigation.getState, navigation.getState, selector);
24
+ return value;
35
25
  }
36
26
  //# sourceMappingURL=useNavigationState.cjs.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","_interopRequireWildcard","require","_useNavigation","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","useNavigationState","selector","navigation","useNavigation","setResult","useState","getState","selectorRef","useRef","useEffect","current","unsubscribe","addListener","data","state"],"sourceRoot":"../../src","sources":["useNavigationState.tsx"],"mappings":";;;;;;AACA,IAAAA,KAAA,GAAAC,uBAAA,CAAAC,OAAA;AAGA,IAAAC,cAAA,GAAAD,OAAA;AAAgD,SAAAE,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAJ,wBAAAI,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAMhD;AACA;AACA;AACA;AACA;AACO,SAASW,kBAAkBA,CAChCC,QAAgC,EAC7B;EACH,MAAMC,UAAU,GAAG,IAAAC,4BAAa,EAA4B,CAAC;;EAE7D;EACA;EACA,MAAM,GAAGC,SAAS,CAAC,GAAG5B,KAAK,CAAC6B,QAAQ,CAAC,MAAMJ,QAAQ,CAACC,UAAU,CAACI,QAAQ,CAAC,CAAC,CAAC,CAAC;;EAE3E;EACA,MAAMC,WAAW,GAAG/B,KAAK,CAACgC,MAAM,CAACP,QAAQ,CAAC;EAE1CzB,KAAK,CAACiC,SAAS,CAAC,MAAM;IACpBF,WAAW,CAACG,OAAO,GAAGT,QAAQ;EAChC,CAAC,CAAC;EAEFzB,KAAK,CAACiC,SAAS,CAAC,MAAM;IACpB,MAAME,WAAW,GAAGT,UAAU,CAACU,WAAW,CAAC,OAAO,EAAG/B,CAAC,IAAK;MACzDuB,SAAS,CAACG,WAAW,CAACG,OAAO,CAAC7B,CAAC,CAACgC,IAAI,CAACC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,OAAOH,WAAW;EACpB,CAAC,EAAE,CAACT,UAAU,CAAC,CAAC;EAEhB,OAAOD,QAAQ,CAACC,UAAU,CAACI,QAAQ,CAAC,CAAC,CAAC;AACxC","ignoreList":[]}
1
+ {"version":3,"names":["React","_interopRequireWildcard","require","_withSelector","_useNavigation","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","useNavigationState","selector","navigation","useNavigation","subscribe","useCallback","callback","unsubscribe","addListener","value","useSyncExternalStoreWithSelector","getState"],"sourceRoot":"../../src","sources":["useNavigationState.tsx"],"mappings":";;;;;;AACA,IAAAA,KAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AAGA,IAAAE,cAAA,GAAAF,OAAA;AAAgD,SAAAG,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAL,wBAAAK,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAMhD;AACA;AACA;AACA;AACA;AACO,SAASW,kBAAkBA,CAChCC,QAAgC,EAC7B;EACH,MAAMC,UAAU,GAAG,IAAAC,4BAAa,EAA4B,CAAC;EAE7D,MAAMC,SAAS,GAAG7B,KAAK,CAAC8B,WAAW,CAChCC,QAAoB,IAAK;IACxB,MAAMC,WAAW,GAAGL,UAAU,CAACM,WAAW,CAAC,OAAO,EAAEF,QAAQ,CAAC;IAE7D,OAAOC,WAAW;EACpB,CAAC,EACD,CAACL,UAAU,CACb,CAAC;EAED,MAAMO,KAAK,GAAG,IAAAC,8CAAgC,EAC5CN,SAAS,EACTF,UAAU,CAACS,QAAQ,EACnBT,UAAU,CAACS,QAAQ,EACnBV,QACF,CAAC;EAED,OAAOQ,KAAK;AACd","ignoreList":[]}
@@ -1,5 +1,4 @@
1
1
  import * as React from 'react';
2
- import { useState } from 'react';
3
2
  import { useNavigation } from "./useNavigation.mjs";
4
3
 
5
4
  /**
@@ -8,25 +7,15 @@ import { useNavigation } from "./useNavigation.mjs";
8
7
  */
9
8
  export function useIsFocused() {
10
9
  const navigation = useNavigation();
11
- const [isFocused, setIsFocused] = useState(navigation.isFocused);
12
- const valueToReturn = navigation.isFocused();
13
- if (isFocused !== valueToReturn) {
14
- // If the value has changed since the last render, we need to update it.
15
- // This could happen if we missed an update from the event listeners during re-render.
16
- // React will process this update immediately, so the old subscription value won't be committed.
17
- // It is still nice to avoid returning a mismatched value though, so let's override the return value.
18
- // This is the same logic as in https://github.com/facebook/react/tree/master/packages/use-subscription
19
- setIsFocused(valueToReturn);
20
- }
21
- React.useEffect(() => {
22
- const unsubscribeFocus = navigation.addListener('focus', () => setIsFocused(true));
23
- const unsubscribeBlur = navigation.addListener('blur', () => setIsFocused(false));
10
+ const subscribe = React.useCallback(callback => {
11
+ const unsubscribeFocus = navigation.addListener('focus', callback);
12
+ const unsubscribeBlur = navigation.addListener('blur', callback);
24
13
  return () => {
25
14
  unsubscribeFocus();
26
15
  unsubscribeBlur();
27
16
  };
28
17
  }, [navigation]);
29
- React.useDebugValue(valueToReturn);
30
- return valueToReturn;
18
+ const value = React.useSyncExternalStore(subscribe, navigation.isFocused, navigation.isFocused);
19
+ return value;
31
20
  }
32
21
  //# sourceMappingURL=useIsFocused.mjs.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useState","useNavigation","useIsFocused","navigation","isFocused","setIsFocused","valueToReturn","useEffect","unsubscribeFocus","addListener","unsubscribeBlur","useDebugValue"],"sourceRoot":"../../src","sources":["useIsFocused.tsx"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,QAAQ,QAAQ,OAAO;AAEhC,SAASC,aAAa,QAAQ,qBAAiB;;AAE/C;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAA,EAAY;EACtC,MAAMC,UAAU,GAAGF,aAAa,CAAC,CAAC;EAClC,MAAM,CAACG,SAAS,EAAEC,YAAY,CAAC,GAAGL,QAAQ,CAACG,UAAU,CAACC,SAAS,CAAC;EAEhE,MAAME,aAAa,GAAGH,UAAU,CAACC,SAAS,CAAC,CAAC;EAE5C,IAAIA,SAAS,KAAKE,aAAa,EAAE;IAC/B;IACA;IACA;IACA;IACA;IACAD,YAAY,CAACC,aAAa,CAAC;EAC7B;EAEAP,KAAK,CAACQ,SAAS,CAAC,MAAM;IACpB,MAAMC,gBAAgB,GAAGL,UAAU,CAACM,WAAW,CAAC,OAAO,EAAE,MACvDJ,YAAY,CAAC,IAAI,CACnB,CAAC;IAED,MAAMK,eAAe,GAAGP,UAAU,CAACM,WAAW,CAAC,MAAM,EAAE,MACrDJ,YAAY,CAAC,KAAK,CACpB,CAAC;IAED,OAAO,MAAM;MACXG,gBAAgB,CAAC,CAAC;MAClBE,eAAe,CAAC,CAAC;IACnB,CAAC;EACH,CAAC,EAAE,CAACP,UAAU,CAAC,CAAC;EAEhBJ,KAAK,CAACY,aAAa,CAACL,aAAa,CAAC;EAElC,OAAOA,aAAa;AACtB","ignoreList":[]}
1
+ {"version":3,"names":["React","useNavigation","useIsFocused","navigation","subscribe","useCallback","callback","unsubscribeFocus","addListener","unsubscribeBlur","value","useSyncExternalStore","isFocused"],"sourceRoot":"../../src","sources":["useIsFocused.tsx"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,aAAa,QAAQ,qBAAiB;;AAE/C;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAA,EAAY;EACtC,MAAMC,UAAU,GAAGF,aAAa,CAAC,CAAC;EAElC,MAAMG,SAAS,GAAGJ,KAAK,CAACK,WAAW,CAChCC,QAAoB,IAAK;IACxB,MAAMC,gBAAgB,GAAGJ,UAAU,CAACK,WAAW,CAAC,OAAO,EAAEF,QAAQ,CAAC;IAClE,MAAMG,eAAe,GAAGN,UAAU,CAACK,WAAW,CAAC,MAAM,EAAEF,QAAQ,CAAC;IAEhE,OAAO,MAAM;MACXC,gBAAgB,CAAC,CAAC;MAClBE,eAAe,CAAC,CAAC;IACnB,CAAC;EACH,CAAC,EACD,CAACN,UAAU,CACb,CAAC;EAED,MAAMO,KAAK,GAAGV,KAAK,CAACW,oBAAoB,CACtCP,SAAS,EACTD,UAAU,CAACS,SAAS,EACpBT,UAAU,CAACS,SACb,CAAC;EAED,OAAOF,KAAK;AACd","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
+ import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector';
2
3
  import { useNavigation } from "./useNavigation.mjs";
3
4
  /**
4
5
  * Hook to get a value from the current navigation state using a selector.
@@ -7,22 +8,11 @@ import { useNavigation } from "./useNavigation.mjs";
7
8
  */
8
9
  export function useNavigationState(selector) {
9
10
  const navigation = useNavigation();
10
-
11
- // We don't care about the state value, we run the selector again at the end
12
- // The state is only to make sure that there's a re-render when we have a new value
13
- const [, setResult] = React.useState(() => selector(navigation.getState()));
14
-
15
- // We store the selector in a ref to avoid re-subscribing listeners every render
16
- const selectorRef = React.useRef(selector);
17
- React.useEffect(() => {
18
- selectorRef.current = selector;
19
- });
20
- React.useEffect(() => {
21
- const unsubscribe = navigation.addListener('state', e => {
22
- setResult(selectorRef.current(e.data.state));
23
- });
11
+ const subscribe = React.useCallback(callback => {
12
+ const unsubscribe = navigation.addListener('state', callback);
24
13
  return unsubscribe;
25
14
  }, [navigation]);
26
- return selector(navigation.getState());
15
+ const value = useSyncExternalStoreWithSelector(subscribe, navigation.getState, navigation.getState, selector);
16
+ return value;
27
17
  }
28
18
  //# sourceMappingURL=useNavigationState.mjs.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useNavigation","useNavigationState","selector","navigation","setResult","useState","getState","selectorRef","useRef","useEffect","current","unsubscribe","addListener","e","data","state"],"sourceRoot":"../../src","sources":["useNavigationState.tsx"],"mappings":"AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAG9B,SAASC,aAAa,QAAQ,qBAAiB;AAM/C;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,QAAgC,EAC7B;EACH,MAAMC,UAAU,GAAGH,aAAa,CAA4B,CAAC;;EAE7D;EACA;EACA,MAAM,GAAGI,SAAS,CAAC,GAAGL,KAAK,CAACM,QAAQ,CAAC,MAAMH,QAAQ,CAACC,UAAU,CAACG,QAAQ,CAAC,CAAC,CAAC,CAAC;;EAE3E;EACA,MAAMC,WAAW,GAAGR,KAAK,CAACS,MAAM,CAACN,QAAQ,CAAC;EAE1CH,KAAK,CAACU,SAAS,CAAC,MAAM;IACpBF,WAAW,CAACG,OAAO,GAAGR,QAAQ;EAChC,CAAC,CAAC;EAEFH,KAAK,CAACU,SAAS,CAAC,MAAM;IACpB,MAAME,WAAW,GAAGR,UAAU,CAACS,WAAW,CAAC,OAAO,EAAGC,CAAC,IAAK;MACzDT,SAAS,CAACG,WAAW,CAACG,OAAO,CAACG,CAAC,CAACC,IAAI,CAACC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,OAAOJ,WAAW;EACpB,CAAC,EAAE,CAACR,UAAU,CAAC,CAAC;EAEhB,OAAOD,QAAQ,CAACC,UAAU,CAACG,QAAQ,CAAC,CAAC,CAAC;AACxC","ignoreList":[]}
1
+ {"version":3,"names":["React","useSyncExternalStoreWithSelector","useNavigation","useNavigationState","selector","navigation","subscribe","useCallback","callback","unsubscribe","addListener","value","getState"],"sourceRoot":"../../src","sources":["useNavigationState.tsx"],"mappings":"AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,gCAAgC,QAAQ,uCAAuC;AAGxF,SAASC,aAAa,QAAQ,qBAAiB;AAM/C;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,QAAgC,EAC7B;EACH,MAAMC,UAAU,GAAGH,aAAa,CAA4B,CAAC;EAE7D,MAAMI,SAAS,GAAGN,KAAK,CAACO,WAAW,CAChCC,QAAoB,IAAK;IACxB,MAAMC,WAAW,GAAGJ,UAAU,CAACK,WAAW,CAAC,OAAO,EAAEF,QAAQ,CAAC;IAE7D,OAAOC,WAAW;EACpB,CAAC,EACD,CAACJ,UAAU,CACb,CAAC;EAED,MAAMM,KAAK,GAAGV,gCAAgC,CAC5CK,SAAS,EACTD,UAAU,CAACO,QAAQ,EACnBP,UAAU,CAACO,QAAQ,EACnBR,QACF,CAAC;EAED,OAAOO,KAAK;AACd","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useIsFocused.d.ts","sourceRoot":"","sources":["../../../src/useIsFocused.tsx"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAiCtC"}
1
+ {"version":3,"file":"useIsFocused.d.ts","sourceRoot":"","sources":["../../../src/useIsFocused.tsx"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAuBtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useNavigationState.d.ts","sourceRoot":"","sources":["../../../src/useNavigationState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAMhF,KAAK,QAAQ,CAAC,SAAS,SAAS,aAAa,EAAE,CAAC,IAAI,CAClD,KAAK,EAAE,eAAe,CAAC,SAAS,CAAC,KAC9B,CAAC,CAAC;AAEP;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,SAAS,aAAa,EAAE,CAAC,EACnE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,GAC/B,CAAC,CAuBH"}
1
+ {"version":3,"file":"useNavigationState.d.ts","sourceRoot":"","sources":["../../../src/useNavigationState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAOhF,KAAK,QAAQ,CAAC,SAAS,SAAS,aAAa,EAAE,CAAC,IAAI,CAClD,KAAK,EAAE,eAAe,CAAC,SAAS,CAAC,KAC9B,CAAC,CAAC;AAEP;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,SAAS,aAAa,EAAE,CAAC,EACnE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,GAC/B,CAAC,CAoBH"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@react-navigation/core",
3
3
  "description": "Core utilities for building navigators",
4
- "version": "7.0.0-rc.7",
4
+ "version": "7.0.0-rc.8",
5
5
  "keywords": [
6
6
  "react",
7
7
  "react-native",
@@ -46,12 +46,14 @@
46
46
  "nanoid": "3.3.7",
47
47
  "query-string": "^7.1.3",
48
48
  "react-is": "^18.2.0",
49
- "use-latest-callback": "^0.1.11"
49
+ "use-latest-callback": "^0.2.1",
50
+ "use-sync-external-store": "^1.2.2"
50
51
  },
51
52
  "devDependencies": {
52
53
  "@testing-library/react-native": "^12.4.3",
53
54
  "@types/react": "~18.2.79",
54
55
  "@types/react-is": "^18.2.3",
56
+ "@types/use-sync-external-store": "^0.0.6",
55
57
  "del-cli": "^5.1.0",
56
58
  "immer": "^10.0.3",
57
59
  "react": "18.2.0",
@@ -86,5 +88,5 @@
86
88
  ]
87
89
  ]
88
90
  },
89
- "gitHead": "a5dcadcdd72520c47ef4946b507017abd519ce9c"
91
+ "gitHead": "1f63ce5b62055a439f43bfcbd6dd5ca5c64af603"
90
92
  }
@@ -1,5 +1,4 @@
1
1
  import * as React from 'react';
2
- import { useState } from 'react';
3
2
 
4
3
  import { useNavigation } from './useNavigation';
5
4
 
@@ -9,35 +8,25 @@ import { useNavigation } from './useNavigation';
9
8
  */
10
9
  export function useIsFocused(): boolean {
11
10
  const navigation = useNavigation();
12
- const [isFocused, setIsFocused] = useState(navigation.isFocused);
13
11
 
14
- const valueToReturn = navigation.isFocused();
15
-
16
- if (isFocused !== valueToReturn) {
17
- // If the value has changed since the last render, we need to update it.
18
- // This could happen if we missed an update from the event listeners during re-render.
19
- // React will process this update immediately, so the old subscription value won't be committed.
20
- // It is still nice to avoid returning a mismatched value though, so let's override the return value.
21
- // This is the same logic as in https://github.com/facebook/react/tree/master/packages/use-subscription
22
- setIsFocused(valueToReturn);
23
- }
24
-
25
- React.useEffect(() => {
26
- const unsubscribeFocus = navigation.addListener('focus', () =>
27
- setIsFocused(true)
28
- );
29
-
30
- const unsubscribeBlur = navigation.addListener('blur', () =>
31
- setIsFocused(false)
32
- );
33
-
34
- return () => {
35
- unsubscribeFocus();
36
- unsubscribeBlur();
37
- };
38
- }, [navigation]);
39
-
40
- React.useDebugValue(valueToReturn);
41
-
42
- return valueToReturn;
12
+ const subscribe = React.useCallback(
13
+ (callback: () => void) => {
14
+ const unsubscribeFocus = navigation.addListener('focus', callback);
15
+ const unsubscribeBlur = navigation.addListener('blur', callback);
16
+
17
+ return () => {
18
+ unsubscribeFocus();
19
+ unsubscribeBlur();
20
+ };
21
+ },
22
+ [navigation]
23
+ );
24
+
25
+ const value = React.useSyncExternalStore(
26
+ subscribe,
27
+ navigation.isFocused,
28
+ navigation.isFocused
29
+ );
30
+
31
+ return value;
43
32
  }
@@ -1,5 +1,6 @@
1
1
  import type { NavigationState, ParamListBase } from '@react-navigation/routers';
2
2
  import * as React from 'react';
3
+ import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector';
3
4
 
4
5
  import type { NavigationProp } from './types';
5
6
  import { useNavigation } from './useNavigation';
@@ -18,24 +19,21 @@ export function useNavigationState<ParamList extends ParamListBase, T>(
18
19
  ): T {
19
20
  const navigation = useNavigation<NavigationProp<ParamList>>();
20
21
 
21
- // We don't care about the state value, we run the selector again at the end
22
- // The state is only to make sure that there's a re-render when we have a new value
23
- const [, setResult] = React.useState(() => selector(navigation.getState()));
22
+ const subscribe = React.useCallback(
23
+ (callback: () => void) => {
24
+ const unsubscribe = navigation.addListener('state', callback);
24
25
 
25
- // We store the selector in a ref to avoid re-subscribing listeners every render
26
- const selectorRef = React.useRef(selector);
26
+ return unsubscribe;
27
+ },
28
+ [navigation]
29
+ );
27
30
 
28
- React.useEffect(() => {
29
- selectorRef.current = selector;
30
- });
31
+ const value = useSyncExternalStoreWithSelector(
32
+ subscribe,
33
+ navigation.getState,
34
+ navigation.getState,
35
+ selector
36
+ );
31
37
 
32
- React.useEffect(() => {
33
- const unsubscribe = navigation.addListener('state', (e) => {
34
- setResult(selectorRef.current(e.data.state));
35
- });
36
-
37
- return unsubscribe;
38
- }, [navigation]);
39
-
40
- return selector(navigation.getState());
38
+ return value;
41
39
  }