expo-router 5.2.0-canary-20250729-d8899ae → 6.0.0-beta.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.
Files changed (215) hide show
  1. package/_ctx.android.js +1 -1
  2. package/_ctx.ios.js +1 -1
  3. package/_ctx.web.js +1 -1
  4. package/assets/modal.module.css +12 -3
  5. package/build/ExpoRoot.d.ts.map +1 -1
  6. package/build/ExpoRoot.js +12 -2
  7. package/build/ExpoRoot.js.map +1 -1
  8. package/build/Route.d.ts +9 -0
  9. package/build/Route.d.ts.map +1 -1
  10. package/build/Route.js.map +1 -1
  11. package/build/constants.d.ts +2 -0
  12. package/build/constants.d.ts.map +1 -1
  13. package/build/constants.js +3 -1
  14. package/build/constants.js.map +1 -1
  15. package/build/doctor/index.d.ts +1 -1
  16. package/build/doctor/index.d.ts.map +1 -1
  17. package/build/doctor/index.js +4 -1
  18. package/build/doctor/index.js.map +1 -1
  19. package/build/exports.d.ts +2 -2
  20. package/build/exports.d.ts.map +1 -1
  21. package/build/exports.js +6 -6
  22. package/build/exports.js.map +1 -1
  23. package/build/fork/native-stack/createNativeStackNavigator.d.ts +2 -2
  24. package/build/fork/native-stack/createNativeStackNavigator.d.ts.map +1 -1
  25. package/build/fork/native-stack/createNativeStackNavigator.js +82 -2
  26. package/build/fork/native-stack/createNativeStackNavigator.js.map +1 -1
  27. package/build/fork/useLinking.js +2 -2
  28. package/build/fork/useLinking.js.map +1 -1
  29. package/build/getLinkingConfig.d.ts +29 -2
  30. package/build/getLinkingConfig.d.ts.map +1 -1
  31. package/build/getLinkingConfig.js +35 -4
  32. package/build/getLinkingConfig.js.map +1 -1
  33. package/build/getRoutesCore.d.ts +1 -0
  34. package/build/getRoutesCore.d.ts.map +1 -1
  35. package/build/getRoutesCore.js +60 -0
  36. package/build/getRoutesCore.js.map +1 -1
  37. package/build/getServerManifest.d.ts +20 -1
  38. package/build/getServerManifest.d.ts.map +1 -1
  39. package/build/getServerManifest.js +8 -1
  40. package/build/getServerManifest.js.map +1 -1
  41. package/build/global-state/routeInfo.d.ts.map +1 -1
  42. package/build/global-state/routeInfo.js +12 -1
  43. package/build/global-state/routeInfo.js.map +1 -1
  44. package/build/global-state/router-store.d.ts.map +1 -1
  45. package/build/global-state/router-store.js +4 -0
  46. package/build/global-state/router-store.js.map +1 -1
  47. package/build/global-state/routing.d.ts +29 -1
  48. package/build/global-state/routing.d.ts.map +1 -1
  49. package/build/global-state/routing.js +78 -42
  50. package/build/global-state/routing.js.map +1 -1
  51. package/build/global-state/utils.d.ts +4 -0
  52. package/build/global-state/utils.d.ts.map +1 -0
  53. package/build/global-state/utils.js +29 -0
  54. package/build/global-state/utils.js.map +1 -0
  55. package/build/hooks.d.ts +1 -1
  56. package/build/hooks.d.ts.map +1 -1
  57. package/build/hooks.js +9 -4
  58. package/build/hooks.js.map +1 -1
  59. package/build/layouts/DrawerClient.d.ts +2 -2
  60. package/build/layouts/Stack.web.d.ts +1 -1
  61. package/build/layouts/Stack.web.d.ts.map +1 -1
  62. package/build/layouts/Stack.web.js +3 -3
  63. package/build/layouts/Stack.web.js.map +1 -1
  64. package/build/layouts/StackClient.d.ts +2 -2
  65. package/build/layouts/StackClient.d.ts.map +1 -1
  66. package/build/layouts/StackClient.js +18 -14
  67. package/build/layouts/StackClient.js.map +1 -1
  68. package/build/layouts/TabsClient.d.ts +3 -3
  69. package/build/layouts/withLayoutContext.d.ts.map +1 -1
  70. package/build/layouts/withLayoutContext.js +13 -0
  71. package/build/layouts/withLayoutContext.js.map +1 -1
  72. package/build/link/ExpoLink.d.ts.map +1 -1
  73. package/build/link/ExpoLink.js +3 -2
  74. package/build/link/ExpoLink.js.map +1 -1
  75. package/build/link/InternalLinkPreviewContext.d.ts +6 -0
  76. package/build/link/InternalLinkPreviewContext.d.ts.map +1 -0
  77. package/build/link/InternalLinkPreviewContext.js +6 -0
  78. package/build/link/InternalLinkPreviewContext.js.map +1 -0
  79. package/build/link/Link.d.ts +2 -67
  80. package/build/link/Link.d.ts.map +1 -1
  81. package/build/link/Link.js +5 -70
  82. package/build/link/Link.js.map +1 -1
  83. package/build/link/LinkWithPreview.d.ts +1 -46
  84. package/build/link/LinkWithPreview.d.ts.map +1 -1
  85. package/build/link/LinkWithPreview.js +30 -114
  86. package/build/link/LinkWithPreview.js.map +1 -1
  87. package/build/link/elements.d.ts +174 -0
  88. package/build/link/elements.d.ts.map +1 -0
  89. package/build/link/elements.js +172 -0
  90. package/build/link/elements.js.map +1 -0
  91. package/build/link/preview/HrefPreview.d.ts +1 -1
  92. package/build/link/preview/HrefPreview.d.ts.map +1 -1
  93. package/build/link/preview/HrefPreview.js +61 -7
  94. package/build/link/preview/HrefPreview.js.map +1 -1
  95. package/build/link/preview/LinkPreviewContext.d.ts +3 -2
  96. package/build/link/preview/LinkPreviewContext.d.ts.map +1 -1
  97. package/build/link/preview/LinkPreviewContext.js +3 -2
  98. package/build/link/preview/LinkPreviewContext.js.map +1 -1
  99. package/build/link/preview/native.d.ts +14 -6
  100. package/build/link/preview/native.d.ts.map +1 -1
  101. package/build/link/preview/native.js.map +1 -1
  102. package/build/link/preview/useNextScreenId.d.ts +8 -1
  103. package/build/link/preview/useNextScreenId.d.ts.map +1 -1
  104. package/build/link/preview/useNextScreenId.js +36 -32
  105. package/build/link/preview/useNextScreenId.js.map +1 -1
  106. package/build/link/preview/utils.d.ts +12 -0
  107. package/build/link/preview/utils.d.ts.map +1 -0
  108. package/build/link/preview/utils.js +66 -0
  109. package/build/link/preview/utils.js.map +1 -0
  110. package/build/modal/Modal.js +1 -1
  111. package/build/modal/Modal.js.map +1 -1
  112. package/build/modal/ModalsRenderer.js +1 -1
  113. package/build/modal/ModalsRenderer.js.map +1 -1
  114. package/build/modal/ModalsRenderer.web.js +4 -4
  115. package/build/modal/ModalsRenderer.web.js.map +1 -1
  116. package/build/modal/web/{ModalStack.web.d.ts → ModalStack.d.ts} +1 -1
  117. package/build/modal/web/ModalStack.d.ts.map +1 -0
  118. package/build/modal/web/{ModalStack.web.js → ModalStack.js} +5 -5
  119. package/build/modal/web/ModalStack.js.map +1 -0
  120. package/build/modal/web/{ModalStackRouteDrawer.web.d.ts → ModalStackRouteDrawer.d.ts} +1 -1
  121. package/build/modal/web/ModalStackRouteDrawer.d.ts.map +1 -0
  122. package/build/modal/web/{ModalStackRouteDrawer.web.js → ModalStackRouteDrawer.js} +1 -2
  123. package/build/modal/web/ModalStackRouteDrawer.js.map +1 -0
  124. package/build/modal/web/{TransparentModalStackRouteDrawer.web.d.ts → TransparentModalStackRouteDrawer.d.ts} +1 -1
  125. package/build/modal/web/TransparentModalStackRouteDrawer.d.ts.map +1 -0
  126. package/build/modal/web/{TransparentModalStackRouteDrawer.web.js → TransparentModalStackRouteDrawer.js} +1 -1
  127. package/build/modal/web/TransparentModalStackRouteDrawer.js.map +1 -0
  128. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsNavigator.d.ts +17 -0
  129. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsNavigator.d.ts.map +1 -0
  130. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsNavigator.js +27 -0
  131. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsNavigator.js.map +1 -0
  132. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsRouter.d.ts +3 -0
  133. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsRouter.d.ts.map +1 -0
  134. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsRouter.js +65 -0
  135. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsRouter.js.map +1 -0
  136. package/build/native-tabs/NativeBottomTabs/NativeTabTrigger.d.ts +47 -0
  137. package/build/native-tabs/NativeBottomTabs/NativeTabTrigger.d.ts.map +1 -0
  138. package/build/native-tabs/NativeBottomTabs/NativeTabTrigger.js +153 -0
  139. package/build/native-tabs/NativeBottomTabs/NativeTabTrigger.js.map +1 -0
  140. package/build/native-tabs/NativeBottomTabs/NativeTabs.d.ts +24 -0
  141. package/build/native-tabs/NativeBottomTabs/NativeTabs.d.ts.map +1 -0
  142. package/build/native-tabs/NativeBottomTabs/NativeTabs.js +27 -0
  143. package/build/native-tabs/NativeBottomTabs/NativeTabs.js.map +1 -0
  144. package/build/native-tabs/NativeBottomTabs/NativeTabsView.d.ts +4 -0
  145. package/build/native-tabs/NativeBottomTabs/NativeTabsView.d.ts.map +1 -0
  146. package/build/native-tabs/NativeBottomTabs/NativeTabsView.js +116 -0
  147. package/build/native-tabs/NativeBottomTabs/NativeTabsView.js.map +1 -0
  148. package/build/native-tabs/NativeBottomTabs/types.d.ts +166 -0
  149. package/build/native-tabs/NativeBottomTabs/types.d.ts.map +1 -0
  150. package/build/native-tabs/NativeBottomTabs/types.js +3 -0
  151. package/build/native-tabs/NativeBottomTabs/types.js.map +1 -0
  152. package/build/native-tabs/NativeBottomTabs/utils.d.ts +7 -0
  153. package/build/native-tabs/NativeBottomTabs/utils.d.ts.map +1 -0
  154. package/build/native-tabs/NativeBottomTabs/utils.js +21 -0
  155. package/build/native-tabs/NativeBottomTabs/utils.js.map +1 -0
  156. package/build/native-tabs/common/elements.d.ts +74 -0
  157. package/build/native-tabs/common/elements.d.ts.map +1 -0
  158. package/build/native-tabs/common/elements.js +21 -0
  159. package/build/native-tabs/common/elements.js.map +1 -0
  160. package/build/native-tabs/index.d.ts +5 -0
  161. package/build/native-tabs/index.d.ts.map +1 -0
  162. package/build/native-tabs/index.js +23 -0
  163. package/build/native-tabs/index.js.map +1 -0
  164. package/build/routes-manifest.d.ts +42 -0
  165. package/build/routes-manifest.d.ts.map +1 -1
  166. package/build/routes-manifest.js.map +1 -1
  167. package/build/rsc/middleware.d.ts +1 -1
  168. package/build/rsc/middleware.d.ts.map +1 -1
  169. package/build/rsc/middleware.js.map +1 -1
  170. package/build/testing-library/mock-config.d.ts +18 -0
  171. package/build/testing-library/mock-config.d.ts.map +1 -1
  172. package/build/testing-library/mock-config.js +4 -1
  173. package/build/testing-library/mock-config.js.map +1 -1
  174. package/build/ui/common.d.ts.map +1 -1
  175. package/build/ui/common.js +7 -6
  176. package/build/ui/common.js.map +1 -1
  177. package/build/useNavigation.d.ts.map +1 -1
  178. package/build/useNavigation.js +8 -5
  179. package/build/useNavigation.js.map +1 -1
  180. package/build/views/NoSSR.d.ts +5 -0
  181. package/build/views/NoSSR.d.ts.map +1 -0
  182. package/build/views/NoSSR.js +22 -0
  183. package/build/views/NoSSR.js.map +1 -0
  184. package/build/views/Screen.d.ts.map +1 -1
  185. package/build/views/Screen.js +4 -1
  186. package/build/views/Screen.js.map +1 -1
  187. package/build/views/Sitemap.d.ts.map +1 -1
  188. package/build/views/Sitemap.js +113 -10
  189. package/build/views/Sitemap.js.map +1 -1
  190. package/build/views/Unmatched.d.ts.map +1 -1
  191. package/build/views/Unmatched.js +14 -4
  192. package/build/views/Unmatched.js.map +1 -1
  193. package/ios/ExpoHead.podspec +10 -1
  194. package/ios/LinkPreview/LinkPreviewNativeActionView.swift +159 -21
  195. package/ios/LinkPreview/LinkPreviewNativeModule.swift +44 -6
  196. package/ios/LinkPreview/LinkPreviewNativeNavigation.h +37 -11
  197. package/ios/LinkPreview/LinkPreviewNativeNavigation.mm +110 -87
  198. package/ios/LinkPreview/LinkPreviewNativeNavigation.swift +136 -0
  199. package/ios/LinkPreview/LinkPreviewNativePreviewView.swift +0 -1
  200. package/ios/LinkPreview/LinkPreviewNativeTriggerView.swift +1 -1
  201. package/ios/LinkPreview/LinkPreviewNativeView.swift +72 -71
  202. package/package.json +42 -10
  203. package/plugin/build/index.d.ts +2 -0
  204. package/plugin/options.json +5 -0
  205. package/plugin/src/index.ts +2 -0
  206. package/plugin/tsconfig.tsbuildinfo +1 -0
  207. package/server.d.ts +2 -1
  208. package/unstable-native-tabs.d.ts +1 -0
  209. package/unstable-native-tabs.js +1 -0
  210. package/build/modal/web/ModalStack.web.d.ts.map +0 -1
  211. package/build/modal/web/ModalStack.web.js.map +0 -1
  212. package/build/modal/web/ModalStackRouteDrawer.web.d.ts.map +0 -1
  213. package/build/modal/web/ModalStackRouteDrawer.web.js.map +0 -1
  214. package/build/modal/web/TransparentModalStackRouteDrawer.web.d.ts.map +0 -1
  215. package/build/modal/web/TransparentModalStackRouteDrawer.web.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Screen.js","sourceRoot":"","sources":["../../src/views/Screen.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAsBb,wBAiBC;AAED,4BAgCC;AAxED,qDAAoD;AACpD,iCAAgE;AAEhE,oDAAiD;AACjD,+DAA4D;AAC5D,0CAAyD;AAezD,sEAAsE;AACtE,SAAgB,MAAM,CAAmC,EAAE,IAAI,EAAE,OAAO,EAAyB;IAC/F,MAAM,KAAK,GAAG,IAAA,iBAAQ,GAAE,CAAC;IACzB,MAAM,UAAU,GAAG,IAAA,6BAAa,EAAC,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,IAAA,+BAAuB,EAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IAE1E,IAAA,yCAAmB,EAAC,GAAG,EAAE;QACvB,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;YAC3C,kGAAkG;YAClG,4CAA4C;YAC5C,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC;gBAC/C,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAElD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,QAAQ,CACtB,KAAgB,EAChB,UAAmB;IAEnB,IAAI,IAAA,sBAAc,EAAC,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5D,IACE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC/B,KAAK,CAAC,KAAK;YACX,MAAM,IAAI,KAAK,CAAC,KAAK;YACrB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EACjB,CAAC;YACD,MAAM,IAAI,KAAK,CACb,sDAAsD,UAAU,8EAA8E,CAC/I,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC1C,IACE,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,IAAI,CAC5C,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,CAC9E,EACD,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,sDAAsD,UAAU,yHAAyH,CAC1L,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["'use client';\nimport { useRoute } from '@react-navigation/native';\nimport { isValidElement, ReactElement, ReactNode } from 'react';\n\nimport { useNavigation } from '../useNavigation';\nimport { useSafeLayoutEffect } from './useSafeLayoutEffect';\nimport { isRoutePreloadedInStack } from '../utils/stack';\n\nexport type ScreenProps<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * Name is required when used inside a Layout component.\n *\n * When used in a route, this can be an absolute path like `/(root)` to the parent route or a relative path like `../../` to the parent route.\n * This should not be used inside of a Layout component.\n * @example `/(root)` maps to a layout route `/app/(root).tsx`.\n */\n name?: string;\n initialParams?: Record<string, any>;\n options?: TOptions;\n};\n\n/** Component for setting the current screen's options dynamically. */\nexport function Screen<TOptions extends object = object>({ name, options }: ScreenProps<TOptions>) {\n const route = useRoute();\n const navigation = useNavigation(name);\n const isFocused = navigation.isFocused();\n const isPreloaded = isRoutePreloadedInStack(navigation.getState(), route);\n\n useSafeLayoutEffect(() => {\n if (options && Object.keys(options).length) {\n // React Navigation will infinitely loop in some cases if an empty object is passed to setOptions.\n // https://github.com/expo/router/issues/452\n if (!isPreloaded || (isPreloaded && isFocused)) {\n navigation.setOptions(options);\n }\n }\n }, [isFocused, isPreloaded, navigation, options]);\n\n return null;\n}\n\nexport function isScreen(\n child: ReactNode,\n contextKey?: string\n): child is ReactElement<ScreenProps & { name: string }> {\n if (isValidElement(child) && child && child.type === Screen) {\n if (\n typeof child.props === 'object' &&\n child.props &&\n 'name' in child.props &&\n !child.props.name\n ) {\n throw new Error(\n `<Screen /> component in \\`default export\\` at \\`app${contextKey}/_layout\\` must have a \\`name\\` prop when used as a child of a Layout Route.`\n );\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (\n ['children', 'component', 'getComponent'].some(\n (key) => child.props && typeof child.props === 'object' && key in child.props\n )\n ) {\n throw new Error(\n `<Screen /> component in \\`default export\\` at \\`app${contextKey}/_layout\\` must not have a \\`children\\`, \\`component\\`, or \\`getComponent\\` prop when used as a child of a Layout Route`\n );\n }\n }\n\n return true;\n }\n\n return false;\n}\n"]}
1
+ {"version":3,"file":"Screen.js","sourceRoot":"","sources":["../../src/views/Screen.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAsBb,wBAsBC;AAED,4BAgCC;AA7ED,qDAAoD;AACpD,iCAAgE;AAEhE,oDAAiD;AACjD,+DAA4D;AAC5D,0CAAyD;AAezD,sEAAsE;AACtE,SAAgB,MAAM,CAAmC,EAAE,IAAI,EAAE,OAAO,EAAyB;IAC/F,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAA,iBAAQ,GAAE,CAAC;IACzB,MAAM,UAAU,GAAG,IAAA,6BAAa,GAAE,CAAC;IACnC,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,IAAA,+BAAuB,EAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IAE1E,IAAA,yCAAmB,EAAC,GAAG,EAAE;QACvB,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;YAC3C,kGAAkG;YAClG,4CAA4C;YAC5C,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC;gBAC/C,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAElD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,QAAQ,CACtB,KAAgB,EAChB,UAAmB;IAEnB,IAAI,IAAA,sBAAc,EAAC,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5D,IACE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC/B,KAAK,CAAC,KAAK;YACX,MAAM,IAAI,KAAK,CAAC,KAAK;YACrB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EACjB,CAAC;YACD,MAAM,IAAI,KAAK,CACb,sDAAsD,UAAU,8EAA8E,CAC/I,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC1C,IACE,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,IAAI,CAC5C,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,CAC9E,EACD,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,sDAAsD,UAAU,yHAAyH,CAC1L,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["'use client';\nimport { useRoute } from '@react-navigation/native';\nimport { isValidElement, ReactElement, ReactNode } from 'react';\n\nimport { useNavigation } from '../useNavigation';\nimport { useSafeLayoutEffect } from './useSafeLayoutEffect';\nimport { isRoutePreloadedInStack } from '../utils/stack';\n\nexport type ScreenProps<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * Name is required when used inside a Layout component.\n *\n * When used in a route, this can be an absolute path like `/(root)` to the parent route or a relative path like `../../` to the parent route.\n * This should not be used inside of a Layout component.\n * @example `/(root)` maps to a layout route `/app/(root).tsx`.\n */\n name?: string;\n initialParams?: Record<string, any>;\n options?: TOptions;\n};\n\n/** Component for setting the current screen's options dynamically. */\nexport function Screen<TOptions extends object = object>({ name, options }: ScreenProps<TOptions>) {\n if (name) {\n throw new Error(\n `The name prop on the Screen component may only be used when it is inside a Layout route`\n );\n }\n const route = useRoute();\n const navigation = useNavigation();\n const isFocused = navigation.isFocused();\n const isPreloaded = isRoutePreloadedInStack(navigation.getState(), route);\n\n useSafeLayoutEffect(() => {\n if (options && Object.keys(options).length) {\n // React Navigation will infinitely loop in some cases if an empty object is passed to setOptions.\n // https://github.com/expo/router/issues/452\n if (!isPreloaded || (isPreloaded && isFocused)) {\n navigation.setOptions(options);\n }\n }\n }, [isFocused, isPreloaded, navigation, options]);\n\n return null;\n}\n\nexport function isScreen(\n child: ReactNode,\n contextKey?: string\n): child is ReactElement<ScreenProps & { name: string }> {\n if (isValidElement(child) && child && child.type === Screen) {\n if (\n typeof child.props === 'object' &&\n child.props &&\n 'name' in child.props &&\n !child.props.name\n ) {\n throw new Error(\n `<Screen /> component in \\`default export\\` at \\`app${contextKey}/_layout\\` must have a \\`name\\` prop when used as a child of a Layout Route.`\n );\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (\n ['children', 'component', 'getComponent'].some(\n (key) => child.props && typeof child.props === 'object' && key in child.props\n )\n ) {\n throw new Error(\n `<Screen /> component in \\`default export\\` at \\`app${contextKey}/_layout\\` must not have a \\`children\\`, \\`component\\`, or \\`getComponent\\` prop when used as a child of a Layout Route`\n );\n }\n }\n\n return true;\n }\n\n return false;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Sitemap.d.ts","sourceRoot":"","sources":["../../src/views/Sitemap.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,KAAK,MAAM,OAAO,CAAC;AAoB1B,wBAAgB,aAAa,IAAI,4BAA4B,CAiC5D;AAED,wBAAgB,OAAO,sBAkBtB"}
1
+ {"version":3,"file":"Sitemap.d.ts","sourceRoot":"","sources":["../../src/views/Sitemap.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,KAAK,MAAM,OAAO,CAAC;AAqB1B,wBAAgB,aAAa,IAAI,4BAA4B,CAkC5D;AAED,wBAAgB,OAAO,sBAQtB"}
@@ -7,9 +7,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.getNavOptions = getNavOptions;
9
9
  exports.Sitemap = Sitemap;
10
+ const expo_constants_1 = __importDefault(require("expo-constants"));
10
11
  const react_1 = __importDefault(require("react"));
11
12
  const react_native_1 = require("react-native");
12
13
  const react_native_safe_area_context_1 = require("react-native-safe-area-context");
14
+ const NoSSR_1 = require("./NoSSR");
13
15
  const Pressable_1 = require("./Pressable");
14
16
  const useSitemap_1 = require("./useSitemap");
15
17
  const Link_1 = require("../link/Link");
@@ -23,6 +25,7 @@ function getNavOptions() {
23
25
  headerTitleStyle: {
24
26
  color: 'white',
25
27
  },
28
+ headerShown: true,
26
29
  headerTintColor: 'white',
27
30
  headerLargeTitleStyle: {
28
31
  color: 'white',
@@ -48,14 +51,22 @@ function getNavOptions() {
48
51
  };
49
52
  }
50
53
  function Sitemap() {
54
+ // Following the https://github.com/expo/expo/blob/ubax/router/move-404-and-sitemap-to-root/packages/expo-router/src/getRoutesSSR.ts#L38
55
+ // we need to ensure that the Sitemap component is not rendered on the server.
56
+ return (<NoSSR_1.NoSSR>
57
+ <SitemapInner />
58
+ </NoSSR_1.NoSSR>);
59
+ }
60
+ function SitemapInner() {
51
61
  const sitemap = (0, useSitemap_1.useSitemap)();
52
62
  const children = react_1.default.useMemo(() => sitemap?.children.filter(({ isInternal }) => !isInternal) ?? [], [sitemap]);
53
- return (<react_native_1.View style={styles.container}>
63
+ return (<react_native_1.View style={styles.container} testID="expo-router-sitemap">
54
64
  {statusbar_1.canOverrideStatusBarBehavior && <react_native_1.StatusBar barStyle="light-content"/>}
55
- <react_native_1.ScrollView contentContainerStyle={styles.scroll}>
65
+ <react_native_1.ScrollView contentContainerStyle={styles.scroll} automaticallyAdjustContentInsets contentInsetAdjustmentBehavior="automatic">
56
66
  {children.map((child) => (<react_native_1.View testID="sitemap-item-container" key={child.contextKey} style={styles.itemContainer}>
57
67
  <SitemapItem node={child}/>
58
68
  </react_native_1.View>))}
69
+ <SystemInfo />
59
70
  </react_native_1.ScrollView>
60
71
  </react_native_1.View>);
61
72
  }
@@ -69,26 +80,25 @@ function SitemapItem({ node, level = 0 }) {
69
80
  }
70
81
  function LayoutSitemapItem({ node, level, info }) {
71
82
  const [isCollapsed, setIsCollapsed] = react_1.default.useState(true);
72
- return (<>
83
+ return (<react_native_1.View style={styles.itemInnerContainer}>
73
84
  <SitemapItemPressable style={{ opacity: 0.4 }} leftIcon={<PkgIcon />} rightIcon={<ArrowIcon rotation={isCollapsed ? 0 : 180}/>} filename={node.filename} level={level} info={info} onPress={() => setIsCollapsed((prev) => !prev)}/>
74
85
  {!isCollapsed &&
75
86
  node.children.map((child) => (<SitemapItem key={child.contextKey} node={child} level={level + (node.isGenerated ? 0 : 1)}/>))}
76
- </>);
87
+ </react_native_1.View>);
77
88
  }
78
89
  function StandardSitemapItem({ node, info, level }) {
79
- return (<Link_1.Link accessibilityLabel={node.contextKey} href={node.href} asChild
80
- // Ensure we replace the history so you can't go back to this page.
81
- replace>
90
+ return (<Link_1.Link accessibilityLabel={node.contextKey} href={node.href} asChild replace>
82
91
  <SitemapItemPressable leftIcon={<FileIcon />} rightIcon={<ForwardIcon />} filename={node.filename} level={level} info={info}/>
83
92
  </Link_1.Link>);
84
93
  }
85
94
  function SitemapItemPressable({ style, leftIcon, rightIcon, filename, level, info, ...pressableProps }) {
86
95
  return (<Pressable_1.Pressable {...pressableProps}>
87
96
  {({ pressed, hovered }) => (<react_native_1.View testID="sitemap-item" style={[
97
+ styles.itemInnerContainer,
88
98
  styles.itemPressable,
89
99
  {
90
100
  paddingLeft: INDENT + level * INDENT,
91
- backgroundColor: hovered ? '#202425' : 'transparent',
101
+ backgroundColor: hovered ? '#202425' : '#151718',
92
102
  },
93
103
  pressed && { backgroundColor: '#26292b' },
94
104
  style,
@@ -125,6 +135,50 @@ function ArrowIcon({ rotation = 0 }) {
125
135
  },
126
136
  ]} source={require('expo-router/assets/arrow_down.png')}/>);
127
137
  }
138
+ function SystemInfo() {
139
+ const getHermesVersion = () => {
140
+ if (!global.HermesInternal) {
141
+ return null;
142
+ }
143
+ const HERMES_RUNTIME = global.HermesInternal?.getRuntimeProperties?.() ?? {};
144
+ const HERMES_VERSION = HERMES_RUNTIME['OSS Release Version'];
145
+ const isStaticHermes = HERMES_RUNTIME['Static Hermes'];
146
+ if (!HERMES_RUNTIME) {
147
+ return null;
148
+ }
149
+ if (isStaticHermes) {
150
+ return `${HERMES_VERSION} (shermes)`;
151
+ }
152
+ return HERMES_VERSION;
153
+ };
154
+ const locationOrigin = window.location.origin;
155
+ const expoSdkVersion = expo_constants_1.default.expoConfig?.sdkVersion || 'Unknown';
156
+ const hermesVersion = getHermesVersion();
157
+ return (<react_native_1.View testID="sitemap-system-info" style={{
158
+ gap: 8,
159
+ marginTop: 16,
160
+ }}>
161
+ <react_native_1.Text style={styles.systemInfoTitle}>System Information</react_native_1.Text>
162
+ <react_native_1.View style={styles.systemInfoContainer}>
163
+ <FormText right={process.env.NODE_ENV}>Mode</FormText>
164
+ <FormText right={expoSdkVersion}>Expo SDK</FormText>
165
+ {hermesVersion && <FormText right={hermesVersion}>Hermes version</FormText>}
166
+ {locationOrigin && <FormText right={locationOrigin}>Location origin</FormText>}
167
+ </react_native_1.View>
168
+ </react_native_1.View>);
169
+ }
170
+ function FormText({ children, right }) {
171
+ return (<react_native_1.View style={styles.systemInfoItem}>
172
+ <react_native_1.Text style={styles.systemInfoLabel} numberOfLines={1} ellipsizeMode="tail">
173
+ {children}
174
+ </react_native_1.Text>
175
+ <react_native_1.View style={{ flex: 1 }}/>
176
+
177
+ <react_native_1.Text selectable style={[styles.systemInfoValue, styles.code]} numberOfLines={1} ellipsizeMode="tail">
178
+ {right}
179
+ </react_native_1.Text>
180
+ </react_native_1.View>);
181
+ }
128
182
  const styles = react_native_1.StyleSheet.create({
129
183
  container: {
130
184
  backgroundColor: 'black',
@@ -157,6 +211,7 @@ const styles = react_native_1.StyleSheet.create({
157
211
  fontWeight: 'bold',
158
212
  },
159
213
  scroll: {
214
+ gap: 12,
160
215
  paddingHorizontal: '5%',
161
216
  paddingVertical: 16,
162
217
  ...react_native_1.Platform.select({
@@ -179,8 +234,13 @@ const styles = react_native_1.StyleSheet.create({
179
234
  borderColor: '#313538',
180
235
  backgroundColor: '#151718',
181
236
  borderRadius: 12,
182
- marginBottom: 12,
183
- overflow: 'hidden',
237
+ borderCurve: 'continuous',
238
+ },
239
+ itemInnerContainer: {
240
+ backgroundColor: '#151718',
241
+ borderRadius: 12,
242
+ borderCurve: 'continuous',
243
+ gap: 12,
184
244
  },
185
245
  itemPressable: {
186
246
  paddingHorizontal: INDENT,
@@ -206,5 +266,48 @@ const styles = react_native_1.StyleSheet.create({
206
266
  alignItems: 'center',
207
267
  justifyContent: 'center',
208
268
  },
269
+ systemInfoContainer: {
270
+ borderWidth: 1,
271
+ borderColor: '#313538',
272
+ backgroundColor: '#151718',
273
+ borderRadius: 12,
274
+ gap: 8,
275
+ borderCurve: 'continuous',
276
+ padding: INDENT,
277
+ },
278
+ systemInfoTitle: {
279
+ color: 'white',
280
+ fontSize: 18,
281
+ fontWeight: '600',
282
+ marginBottom: 12,
283
+ paddingHorizontal: INDENT,
284
+ },
285
+ systemInfoItem: {
286
+ flexDirection: 'row',
287
+ gap: 8,
288
+ alignItems: 'center',
289
+ flexWrap: 'wrap',
290
+ },
291
+ systemInfoLabel: {
292
+ color: 'white',
293
+ fontSize: 16,
294
+ lineHeight: 24,
295
+ },
296
+ systemInfoValue: {
297
+ color: 'white',
298
+ fontSize: 16,
299
+ opacity: 0.7,
300
+ flexShrink: 1,
301
+ letterSpacing: 0.5,
302
+ },
303
+ code: {
304
+ fontVariant: ['tabular-nums'],
305
+ fontFamily: react_native_1.Platform.select({
306
+ default: `SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace`,
307
+ ios: 'ui-monospace',
308
+ android: 'monospace',
309
+ }),
310
+ fontWeight: '500',
311
+ },
209
312
  });
210
313
  //# sourceMappingURL=Sitemap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Sitemap.js","sourceRoot":"","sources":["../../src/views/Sitemap.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright © 2024 650 Industries.\n'use client';\n\nimport { NativeStackNavigationOptions } from '@react-navigation/native-stack';\nimport React from 'react';\nimport {\n Image,\n StyleSheet,\n Text,\n View,\n ScrollView,\n Platform,\n StatusBar,\n ViewStyle,\n} from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\n\nimport { Pressable, PressableProps } from './Pressable';\nimport { useSitemap, SitemapType } from './useSitemap';\nimport { Link } from '../link/Link';\nimport { canOverrideStatusBarBehavior } from '../utils/statusbar';\n\nconst INDENT = 20;\n\nexport function getNavOptions(): NativeStackNavigationOptions {\n return {\n title: 'sitemap',\n presentation: 'modal',\n headerLargeTitle: false,\n headerTitleStyle: {\n color: 'white',\n },\n headerTintColor: 'white',\n headerLargeTitleStyle: {\n color: 'white',\n },\n headerStyle: {\n backgroundColor: 'black',\n // @ts-expect-error: mistyped\n borderBottomColor: '#323232',\n },\n header: () => {\n const WrapperElement = Platform.OS === 'android' ? SafeAreaView : View;\n return (\n <WrapperElement style={styles.header}>\n <View style={styles.headerContent}>\n <View style={styles.headerIcon}>\n <SitemapIcon />\n </View>\n <Text role=\"heading\" aria-level={1} style={styles.title}>\n Sitemap\n </Text>\n </View>\n </WrapperElement>\n );\n },\n };\n}\n\nexport function Sitemap() {\n const sitemap = useSitemap();\n const children = React.useMemo(\n () => sitemap?.children.filter(({ isInternal }) => !isInternal) ?? [],\n [sitemap]\n );\n return (\n <View style={styles.container}>\n {canOverrideStatusBarBehavior && <StatusBar barStyle=\"light-content\" />}\n <ScrollView contentContainerStyle={styles.scroll}>\n {children.map((child) => (\n <View testID=\"sitemap-item-container\" key={child.contextKey} style={styles.itemContainer}>\n <SitemapItem node={child} />\n </View>\n ))}\n </ScrollView>\n </View>\n );\n}\n\ninterface SitemapItemProps {\n node: SitemapType;\n level?: number;\n info?: string;\n}\n\nfunction SitemapItem({ node, level = 0 }: SitemapItemProps) {\n const isLayout = React.useMemo(\n () => node.children.length > 0 || node.contextKey.match(/_layout\\.[jt]sx?$/),\n [node]\n );\n const info = node.isInitial ? 'Initial' : node.isGenerated ? 'Generated' : '';\n\n if (isLayout) {\n return <LayoutSitemapItem node={node} level={level} info={info} />;\n }\n return <StandardSitemapItem node={node} level={level} info={info} />;\n}\nfunction LayoutSitemapItem({ node, level, info }: Required<SitemapItemProps>) {\n const [isCollapsed, setIsCollapsed] = React.useState(true);\n\n return (\n <>\n <SitemapItemPressable\n style={{ opacity: 0.4 }}\n leftIcon={<PkgIcon />}\n rightIcon={<ArrowIcon rotation={isCollapsed ? 0 : 180} />}\n filename={node.filename}\n level={level}\n info={info}\n onPress={() => setIsCollapsed((prev) => !prev)}\n />\n {!isCollapsed &&\n node.children.map((child) => (\n <SitemapItem\n key={child.contextKey}\n node={child}\n level={level + (node.isGenerated ? 0 : 1)}\n />\n ))}\n </>\n );\n}\n\nfunction StandardSitemapItem({ node, info, level }: Required<SitemapItemProps>) {\n return (\n <Link\n accessibilityLabel={node.contextKey}\n href={node.href}\n asChild\n // Ensure we replace the history so you can't go back to this page.\n replace>\n <SitemapItemPressable\n leftIcon={<FileIcon />}\n rightIcon={<ForwardIcon />}\n filename={node.filename}\n level={level}\n info={info}\n />\n </Link>\n );\n}\n\nfunction SitemapItemPressable({\n style,\n leftIcon,\n rightIcon,\n filename,\n level,\n info,\n ...pressableProps\n}: {\n style?: ViewStyle;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n filename: string;\n level: number;\n info?: string;\n} & Omit<PressableProps, 'style' | 'children'>) {\n return (\n <Pressable {...pressableProps}>\n {({ pressed, hovered }) => (\n <View\n testID=\"sitemap-item\"\n style={[\n styles.itemPressable,\n {\n paddingLeft: INDENT + level * INDENT,\n backgroundColor: hovered ? '#202425' : 'transparent',\n },\n pressed && { backgroundColor: '#26292b' },\n style,\n ]}>\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {leftIcon}\n <Text style={styles.filename}>{filename}</Text>\n </View>\n\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {!!info && <Text style={[styles.virtual, { marginRight: 8 }]}>{info}</Text>}\n {rightIcon}\n </View>\n </View>\n )}\n </Pressable>\n );\n}\n\nfunction FileIcon() {\n return <Image style={styles.image} source={require('expo-router/assets/file.png')} />;\n}\n\nfunction PkgIcon() {\n return <Image style={styles.image} source={require('expo-router/assets/pkg.png')} />;\n}\n\nfunction ForwardIcon() {\n return <Image style={styles.image} source={require('expo-router/assets/forward.png')} />;\n}\n\nfunction SitemapIcon() {\n return <Image style={styles.image} source={require('expo-router/assets/sitemap.png')} />;\n}\n\nfunction ArrowIcon({ rotation = 0 }: { rotation?: number }) {\n return (\n <Image\n style={[\n styles.image,\n {\n transform: [{ rotate: `${rotation}deg` }],\n },\n ]}\n source={require('expo-router/assets/arrow_down.png')}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n backgroundColor: 'black',\n flex: 1,\n alignItems: 'stretch',\n },\n header: {\n backgroundColor: '#151718',\n paddingVertical: 16,\n borderBottomWidth: 1,\n borderColor: '#313538',\n boxShadow: '0px 3px 3px rgba(0, 0, 0, 0.33)',\n },\n headerContent: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 14,\n paddingHorizontal: '5%',\n ...Platform.select({\n web: {\n width: '100%',\n maxWidth: 960,\n marginHorizontal: 'auto',\n },\n }),\n },\n title: {\n color: 'white',\n fontSize: 28,\n fontWeight: 'bold',\n },\n scroll: {\n paddingHorizontal: '5%',\n paddingVertical: 16,\n ...Platform.select({\n ios: {\n paddingBottom: 24,\n },\n web: {\n width: '100%',\n maxWidth: 960,\n marginHorizontal: 'auto',\n paddingBottom: 24,\n },\n default: {\n paddingBottom: 12,\n },\n }),\n },\n itemContainer: {\n borderWidth: 1,\n borderColor: '#313538',\n backgroundColor: '#151718',\n borderRadius: 12,\n marginBottom: 12,\n overflow: 'hidden',\n },\n itemPressable: {\n paddingHorizontal: INDENT,\n paddingVertical: 16,\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n ...Platform.select({\n web: {\n transitionDuration: '100ms',\n },\n }),\n },\n filename: { color: 'white', fontSize: 20, marginLeft: 12 },\n virtual: { textAlign: 'right', color: 'white' },\n image: { width: 24, height: 24, resizeMode: 'contain', opacity: 0.6 },\n headerIcon: {\n width: 40,\n height: 40,\n backgroundColor: '#202425',\n borderRadius: 8,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n"]}
1
+ {"version":3,"file":"Sitemap.js","sourceRoot":"","sources":["../../src/views/Sitemap.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright © 2024 650 Industries.\n'use client';\n\nimport { NativeStackNavigationOptions } from '@react-navigation/native-stack';\nimport Constants from 'expo-constants';\nimport React from 'react';\nimport {\n Image,\n StyleSheet,\n Text,\n View,\n ScrollView,\n Platform,\n StatusBar,\n ViewStyle,\n} from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\n\nimport { NoSSR } from './NoSSR';\nimport { Pressable, PressableProps } from './Pressable';\nimport { useSitemap, SitemapType } from './useSitemap';\nimport { Link } from '../link/Link';\nimport { canOverrideStatusBarBehavior } from '../utils/statusbar';\n\nconst INDENT = 20;\n\nexport function getNavOptions(): NativeStackNavigationOptions {\n return {\n title: 'sitemap',\n presentation: 'modal',\n headerLargeTitle: false,\n headerTitleStyle: {\n color: 'white',\n },\n headerShown: true,\n headerTintColor: 'white',\n headerLargeTitleStyle: {\n color: 'white',\n },\n headerStyle: {\n backgroundColor: 'black',\n // @ts-expect-error: mistyped\n borderBottomColor: '#323232',\n },\n header: () => {\n const WrapperElement = Platform.OS === 'android' ? SafeAreaView : View;\n return (\n <WrapperElement style={styles.header}>\n <View style={styles.headerContent}>\n <View style={styles.headerIcon}>\n <SitemapIcon />\n </View>\n <Text role=\"heading\" aria-level={1} style={styles.title}>\n Sitemap\n </Text>\n </View>\n </WrapperElement>\n );\n },\n };\n}\n\nexport function Sitemap() {\n // Following the https://github.com/expo/expo/blob/ubax/router/move-404-and-sitemap-to-root/packages/expo-router/src/getRoutesSSR.ts#L38\n // we need to ensure that the Sitemap component is not rendered on the server.\n return (\n <NoSSR>\n <SitemapInner />\n </NoSSR>\n );\n}\n\nfunction SitemapInner() {\n const sitemap = useSitemap();\n const children = React.useMemo(\n () => sitemap?.children.filter(({ isInternal }) => !isInternal) ?? [],\n [sitemap]\n );\n return (\n <View style={styles.container} testID=\"expo-router-sitemap\">\n {canOverrideStatusBarBehavior && <StatusBar barStyle=\"light-content\" />}\n <ScrollView\n contentContainerStyle={styles.scroll}\n automaticallyAdjustContentInsets\n contentInsetAdjustmentBehavior=\"automatic\">\n {children.map((child) => (\n <View testID=\"sitemap-item-container\" key={child.contextKey} style={styles.itemContainer}>\n <SitemapItem node={child} />\n </View>\n ))}\n <SystemInfo />\n </ScrollView>\n </View>\n );\n}\n\ninterface SitemapItemProps {\n node: SitemapType;\n level?: number;\n info?: string;\n}\n\nfunction SitemapItem({ node, level = 0 }: SitemapItemProps) {\n const isLayout = React.useMemo(\n () => node.children.length > 0 || node.contextKey.match(/_layout\\.[jt]sx?$/),\n [node]\n );\n const info = node.isInitial ? 'Initial' : node.isGenerated ? 'Generated' : '';\n\n if (isLayout) {\n return <LayoutSitemapItem node={node} level={level} info={info} />;\n }\n return <StandardSitemapItem node={node} level={level} info={info} />;\n}\n\nfunction LayoutSitemapItem({ node, level, info }: Required<SitemapItemProps>) {\n const [isCollapsed, setIsCollapsed] = React.useState(true);\n\n return (\n <View style={styles.itemInnerContainer}>\n <SitemapItemPressable\n style={{ opacity: 0.4 }}\n leftIcon={<PkgIcon />}\n rightIcon={<ArrowIcon rotation={isCollapsed ? 0 : 180} />}\n filename={node.filename}\n level={level}\n info={info}\n onPress={() => setIsCollapsed((prev) => !prev)}\n />\n {!isCollapsed &&\n node.children.map((child) => (\n <SitemapItem\n key={child.contextKey}\n node={child}\n level={level + (node.isGenerated ? 0 : 1)}\n />\n ))}\n </View>\n );\n}\n\nfunction StandardSitemapItem({ node, info, level }: Required<SitemapItemProps>) {\n return (\n <Link accessibilityLabel={node.contextKey} href={node.href} asChild replace>\n <SitemapItemPressable\n leftIcon={<FileIcon />}\n rightIcon={<ForwardIcon />}\n filename={node.filename}\n level={level}\n info={info}\n />\n </Link>\n );\n}\n\nfunction SitemapItemPressable({\n style,\n leftIcon,\n rightIcon,\n filename,\n level,\n info,\n ...pressableProps\n}: {\n style?: ViewStyle;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n filename: string;\n level: number;\n info?: string;\n} & Omit<PressableProps, 'style' | 'children'>) {\n return (\n <Pressable {...pressableProps}>\n {({ pressed, hovered }) => (\n <View\n testID=\"sitemap-item\"\n style={[\n styles.itemInnerContainer,\n styles.itemPressable,\n {\n paddingLeft: INDENT + level * INDENT,\n backgroundColor: hovered ? '#202425' : '#151718',\n },\n pressed && { backgroundColor: '#26292b' },\n style,\n ]}>\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {leftIcon}\n <Text style={styles.filename}>{filename}</Text>\n </View>\n\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {!!info && <Text style={[styles.virtual, { marginRight: 8 }]}>{info}</Text>}\n {rightIcon}\n </View>\n </View>\n )}\n </Pressable>\n );\n}\n\nfunction FileIcon() {\n return <Image style={styles.image} source={require('expo-router/assets/file.png')} />;\n}\n\nfunction PkgIcon() {\n return <Image style={styles.image} source={require('expo-router/assets/pkg.png')} />;\n}\n\nfunction ForwardIcon() {\n return <Image style={styles.image} source={require('expo-router/assets/forward.png')} />;\n}\n\nfunction SitemapIcon() {\n return <Image style={styles.image} source={require('expo-router/assets/sitemap.png')} />;\n}\n\nfunction ArrowIcon({ rotation = 0 }: { rotation?: number }) {\n return (\n <Image\n style={[\n styles.image,\n {\n transform: [{ rotate: `${rotation}deg` }],\n },\n ]}\n source={require('expo-router/assets/arrow_down.png')}\n />\n );\n}\n\nfunction SystemInfo() {\n const getHermesVersion = () => {\n if (!global.HermesInternal) {\n return null;\n }\n\n const HERMES_RUNTIME = global.HermesInternal?.getRuntimeProperties?.() ?? {};\n const HERMES_VERSION = HERMES_RUNTIME['OSS Release Version'];\n const isStaticHermes = HERMES_RUNTIME['Static Hermes'];\n\n if (!HERMES_RUNTIME) {\n return null;\n }\n\n if (isStaticHermes) {\n return `${HERMES_VERSION} (shermes)`;\n }\n return HERMES_VERSION;\n };\n\n const locationOrigin = window.location.origin;\n const expoSdkVersion = Constants.expoConfig?.sdkVersion || 'Unknown';\n const hermesVersion = getHermesVersion();\n\n return (\n <View\n testID=\"sitemap-system-info\"\n style={{\n gap: 8,\n marginTop: 16,\n }}>\n <Text style={styles.systemInfoTitle}>System Information</Text>\n <View style={styles.systemInfoContainer}>\n <FormText right={process.env.NODE_ENV}>Mode</FormText>\n <FormText right={expoSdkVersion}>Expo SDK</FormText>\n {hermesVersion && <FormText right={hermesVersion}>Hermes version</FormText>}\n {locationOrigin && <FormText right={locationOrigin}>Location origin</FormText>}\n </View>\n </View>\n );\n}\n\nfunction FormText({ children, right }: { children?: React.ReactNode; right?: React.ReactNode }) {\n return (\n <View style={styles.systemInfoItem}>\n <Text style={styles.systemInfoLabel} numberOfLines={1} ellipsizeMode=\"tail\">\n {children}\n </Text>\n <View style={{ flex: 1 }} />\n\n <Text\n selectable\n style={[styles.systemInfoValue, styles.code]}\n numberOfLines={1}\n ellipsizeMode=\"tail\">\n {right}\n </Text>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n backgroundColor: 'black',\n flex: 1,\n alignItems: 'stretch',\n },\n header: {\n backgroundColor: '#151718',\n paddingVertical: 16,\n borderBottomWidth: 1,\n borderColor: '#313538',\n boxShadow: '0px 3px 3px rgba(0, 0, 0, 0.33)',\n },\n headerContent: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 14,\n paddingHorizontal: '5%',\n ...Platform.select({\n web: {\n width: '100%',\n maxWidth: 960,\n marginHorizontal: 'auto',\n },\n }),\n },\n title: {\n color: 'white',\n fontSize: 28,\n fontWeight: 'bold',\n },\n scroll: {\n gap: 12,\n paddingHorizontal: '5%',\n paddingVertical: 16,\n ...Platform.select({\n ios: {\n paddingBottom: 24,\n },\n web: {\n width: '100%',\n maxWidth: 960,\n marginHorizontal: 'auto',\n paddingBottom: 24,\n },\n default: {\n paddingBottom: 12,\n },\n }),\n },\n itemContainer: {\n borderWidth: 1,\n borderColor: '#313538',\n backgroundColor: '#151718',\n borderRadius: 12,\n borderCurve: 'continuous',\n },\n itemInnerContainer: {\n backgroundColor: '#151718',\n borderRadius: 12,\n borderCurve: 'continuous',\n gap: 12,\n },\n itemPressable: {\n paddingHorizontal: INDENT,\n paddingVertical: 16,\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n ...Platform.select({\n web: {\n transitionDuration: '100ms',\n },\n }),\n },\n filename: { color: 'white', fontSize: 20, marginLeft: 12 },\n virtual: { textAlign: 'right', color: 'white' },\n image: { width: 24, height: 24, resizeMode: 'contain', opacity: 0.6 },\n headerIcon: {\n width: 40,\n height: 40,\n backgroundColor: '#202425',\n borderRadius: 8,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n },\n systemInfoContainer: {\n borderWidth: 1,\n borderColor: '#313538',\n backgroundColor: '#151718',\n borderRadius: 12,\n gap: 8,\n borderCurve: 'continuous',\n padding: INDENT,\n },\n systemInfoTitle: {\n color: 'white',\n fontSize: 18,\n fontWeight: '600',\n marginBottom: 12,\n paddingHorizontal: INDENT,\n },\n systemInfoItem: {\n flexDirection: 'row',\n gap: 8,\n alignItems: 'center',\n flexWrap: 'wrap',\n },\n systemInfoLabel: {\n color: 'white',\n fontSize: 16,\n lineHeight: 24,\n },\n systemInfoValue: {\n color: 'white',\n fontSize: 16,\n opacity: 0.7,\n\n flexShrink: 1,\n letterSpacing: 0.5,\n },\n code: {\n fontVariant: ['tabular-nums'],\n fontFamily: Platform.select({\n default: `SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace`,\n ios: 'ui-monospace',\n android: 'monospace',\n }),\n fontWeight: '500',\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Unmatched.d.ts","sourceRoot":"","sources":["../../src/views/Unmatched.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B;;;;GAIG;AACH,wBAAgB,SAAS,sBA2HxB"}
1
+ {"version":3,"file":"Unmatched.d.ts","sourceRoot":"","sources":["../../src/views/Unmatched.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B;;;;GAIG;AACH,wBAAgB,SAAS,sBAQxB"}
@@ -11,6 +11,7 @@ const expo_linking_1 = require("expo-linking");
11
11
  const react_1 = __importDefault(require("react"));
12
12
  const react_native_1 = require("react-native");
13
13
  const hooks_1 = require("../hooks");
14
+ const NoSSR_1 = require("./NoSSR");
14
15
  const Link_1 = require("../link/Link");
15
16
  const useNavigation_1 = require("../useNavigation");
16
17
  const useSafeLayoutEffect_1 = require("./useSafeLayoutEffect");
@@ -22,6 +23,13 @@ const Pressable_1 = require("../views/Pressable");
22
23
  * @hidden
23
24
  */
24
25
  function Unmatched() {
26
+ // Following the https://github.com/expo/expo/blob/ubax/router/move-404-and-sitemap-to-root/packages/expo-router/src/getRoutesSSR.ts#L51
27
+ // we need to ensure that the Unmatched component is not rendered on the server.
28
+ return (<NoSSR_1.NoSSR>
29
+ <UnmatchedInner />
30
+ </NoSSR_1.NoSSR>);
31
+ }
32
+ function UnmatchedInner() {
25
33
  const [render, setRender] = react_1.default.useState(false);
26
34
  const router = (0, hooks_1.useRouter)();
27
35
  const route = (0, native_1.useRoute)();
@@ -35,11 +43,13 @@ function Unmatched() {
35
43
  const isPreloaded = (0, stack_1.isRoutePreloadedInStack)(navigation.getState(), route);
36
44
  /** This route may be prefetched if a <Link prefetch href="/<unmatched>" /> is used */
37
45
  (0, useSafeLayoutEffect_1.useSafeLayoutEffect)(() => {
38
- navigation.setOptions({
39
- title: 'Not Found',
40
- });
46
+ if (!isPreloaded || (isPreloaded && isFocused)) {
47
+ navigation.setOptions({
48
+ title: 'Not Found',
49
+ });
50
+ }
41
51
  }, [isFocused, isPreloaded, navigation]);
42
- return (<react_native_1.View style={styles.container}>
52
+ return (<react_native_1.View testID="expo-router-unmatched" style={styles.container}>
43
53
  <NotFoundAsset />
44
54
  <react_native_1.Text role="heading" aria-level={1} style={styles.title}>
45
55
  Unmatched Route
@@ -1 +1 @@
1
- {"version":3,"file":"Unmatched.js","sourceRoot":"","sources":["../../src/views/Unmatched.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright © 2024 650 Industries.\n'use client';\n\nimport { useRoute } from '@react-navigation/native';\nimport { createURL } from 'expo-linking';\nimport React from 'react';\nimport { StyleSheet, Text, View, Platform, Image } from 'react-native';\n\nimport { usePathname, useRouter } from '../hooks';\nimport { Link } from '../link/Link';\nimport { useNavigation } from '../useNavigation';\nimport { useSafeLayoutEffect } from './useSafeLayoutEffect';\nimport { isRoutePreloadedInStack } from '../utils/stack';\nimport { Pressable } from '../views/Pressable';\n\n/**\n * Default screen for unmatched routes.\n *\n * @hidden\n */\nexport function Unmatched() {\n const [render, setRender] = React.useState(false);\n\n const router = useRouter();\n const route = useRoute();\n\n const navigation = useNavigation();\n const pathname = usePathname();\n const url = createURL(pathname);\n\n React.useEffect(() => {\n setRender(true);\n }, []);\n\n const isFocused = navigation.isFocused();\n const isPreloaded = isRoutePreloadedInStack(navigation.getState(), route);\n\n /** This route may be prefetched if a <Link prefetch href=\"/<unmatched>\" /> is used */\n useSafeLayoutEffect(() => {\n navigation.setOptions({\n title: 'Not Found',\n });\n }, [isFocused, isPreloaded, navigation]);\n\n return (\n <View style={styles.container}>\n <NotFoundAsset />\n <Text role=\"heading\" aria-level={1} style={styles.title}>\n Unmatched Route\n </Text>\n <Text role=\"heading\" aria-level={2} style={[styles.subtitle, styles.secondaryText]}>\n Page could not be found.\n </Text>\n {render ? (\n <Link href={pathname} replace {...Platform.select({ native: { asChild: true } })}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n style={[\n styles.pageLink,\n styles.secondaryText,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n {url}\n </Text>\n )}\n </Pressable>\n </Link>\n ) : (\n <View style={[styles.pageLink, styles.placeholder]} />\n )}\n <View style={styles.linkContainer}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n onPress={() => {\n if (router.canGoBack()) {\n router.back();\n } else {\n router.replace('/');\n }\n }}\n style={[\n styles.link,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n Go back\n </Text>\n )}\n </Pressable>\n <Text style={[styles.linkSeparator, styles.secondaryText]}>•</Text>\n <Link href=\"/_sitemap\" replace {...Platform.select({ native: { asChild: true } })}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n style={[\n styles.link,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n Sitemap\n </Text>\n )}\n </Pressable>\n </Link>\n </View>\n </View>\n );\n}\n\nfunction NotFoundAsset() {\n return <Image source={require('expo-router/assets/unmatched.png')} style={styles.image} />;\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: 'black',\n padding: 24,\n paddingBottom: 64,\n alignItems: 'center',\n justifyContent: 'center',\n },\n image: {\n width: 270,\n height: 168,\n resizeMode: 'contain',\n marginBottom: 28,\n },\n title: {\n ...Platform.select({\n web: {\n fontSize: 64,\n lineHeight: 64,\n },\n default: {\n fontSize: 56,\n lineHeight: 56,\n },\n }),\n color: '#fff',\n fontWeight: '800',\n textAlign: 'center',\n },\n subtitle: {\n fontSize: 34,\n marginTop: 4,\n marginBottom: 12,\n fontWeight: '200',\n textAlign: 'center',\n },\n pageLink: {\n minHeight: 20,\n },\n secondaryText: {\n color: '#9ba1a6',\n },\n placeholder: {\n backgroundColor: '#9ba1a644',\n minWidth: 180,\n borderRadius: 5,\n },\n linkContainer: {\n marginTop: 28,\n flexDirection: 'row',\n gap: 12,\n },\n link: {\n fontSize: 20,\n textAlign: 'center',\n color: '#52a9ff',\n },\n linkSeparator: {\n fontSize: 20,\n },\n});\n"]}
1
+ {"version":3,"file":"Unmatched.js","sourceRoot":"","sources":["../../src/views/Unmatched.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright © 2024 650 Industries.\n'use client';\n\nimport { useRoute } from '@react-navigation/native';\nimport { createURL } from 'expo-linking';\nimport React from 'react';\nimport { StyleSheet, Text, View, Platform, Image } from 'react-native';\n\nimport { usePathname, useRouter } from '../hooks';\nimport { NoSSR } from './NoSSR';\nimport { Link } from '../link/Link';\nimport { useNavigation } from '../useNavigation';\nimport { useSafeLayoutEffect } from './useSafeLayoutEffect';\nimport { isRoutePreloadedInStack } from '../utils/stack';\nimport { Pressable } from '../views/Pressable';\n\n/**\n * Default screen for unmatched routes.\n *\n * @hidden\n */\nexport function Unmatched() {\n // Following the https://github.com/expo/expo/blob/ubax/router/move-404-and-sitemap-to-root/packages/expo-router/src/getRoutesSSR.ts#L51\n // we need to ensure that the Unmatched component is not rendered on the server.\n return (\n <NoSSR>\n <UnmatchedInner />\n </NoSSR>\n );\n}\n\nfunction UnmatchedInner() {\n const [render, setRender] = React.useState(false);\n\n const router = useRouter();\n const route = useRoute();\n\n const navigation = useNavigation();\n const pathname = usePathname();\n const url = createURL(pathname);\n\n React.useEffect(() => {\n setRender(true);\n }, []);\n\n const isFocused = navigation.isFocused();\n const isPreloaded = isRoutePreloadedInStack(navigation.getState(), route);\n\n /** This route may be prefetched if a <Link prefetch href=\"/<unmatched>\" /> is used */\n useSafeLayoutEffect(() => {\n if (!isPreloaded || (isPreloaded && isFocused)) {\n navigation.setOptions({\n title: 'Not Found',\n });\n }\n }, [isFocused, isPreloaded, navigation]);\n\n return (\n <View testID=\"expo-router-unmatched\" style={styles.container}>\n <NotFoundAsset />\n <Text role=\"heading\" aria-level={1} style={styles.title}>\n Unmatched Route\n </Text>\n <Text role=\"heading\" aria-level={2} style={[styles.subtitle, styles.secondaryText]}>\n Page could not be found.\n </Text>\n {render ? (\n <Link href={pathname} replace {...Platform.select({ native: { asChild: true } })}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n style={[\n styles.pageLink,\n styles.secondaryText,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n {url}\n </Text>\n )}\n </Pressable>\n </Link>\n ) : (\n <View style={[styles.pageLink, styles.placeholder]} />\n )}\n <View style={styles.linkContainer}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n onPress={() => {\n if (router.canGoBack()) {\n router.back();\n } else {\n router.replace('/');\n }\n }}\n style={[\n styles.link,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n Go back\n </Text>\n )}\n </Pressable>\n <Text style={[styles.linkSeparator, styles.secondaryText]}>•</Text>\n <Link href=\"/_sitemap\" replace {...Platform.select({ native: { asChild: true } })}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n style={[\n styles.link,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n Sitemap\n </Text>\n )}\n </Pressable>\n </Link>\n </View>\n </View>\n );\n}\n\nfunction NotFoundAsset() {\n return <Image source={require('expo-router/assets/unmatched.png')} style={styles.image} />;\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: 'black',\n padding: 24,\n paddingBottom: 64,\n alignItems: 'center',\n justifyContent: 'center',\n },\n image: {\n width: 270,\n height: 168,\n resizeMode: 'contain',\n marginBottom: 28,\n },\n title: {\n ...Platform.select({\n web: {\n fontSize: 64,\n lineHeight: 64,\n },\n default: {\n fontSize: 56,\n lineHeight: 56,\n },\n }),\n color: '#fff',\n fontWeight: '800',\n textAlign: 'center',\n },\n subtitle: {\n fontSize: 34,\n marginTop: 4,\n marginBottom: 12,\n fontWeight: '200',\n textAlign: 'center',\n },\n pageLink: {\n minHeight: 20,\n },\n secondaryText: {\n color: '#9ba1a6',\n },\n placeholder: {\n backgroundColor: '#9ba1a644',\n minWidth: 180,\n borderRadius: 5,\n },\n linkContainer: {\n marginTop: 28,\n flexDirection: 'row',\n gap: 12,\n },\n link: {\n fontSize: 20,\n textAlign: 'center',\n color: '#52a9ff',\n },\n linkSeparator: {\n fontSize: 20,\n },\n});\n"]}
@@ -2,6 +2,14 @@ require 'json'
2
2
 
3
3
  package = JSON.parse(File.read(File.join(__dir__, '..', 'package.json')))
4
4
 
5
+ new_arch_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
6
+ new_arch_compiler_flags = '-DRCT_NEW_ARCH_ENABLED'
7
+ compiler_flags = ''
8
+
9
+ if new_arch_enabled
10
+ compiler_flags << ' ' << new_arch_compiler_flags
11
+ end
12
+
5
13
  Pod::Spec.new do |s|
6
14
  s.name = 'ExpoHead'
7
15
  s.version = package['version']
@@ -22,7 +30,8 @@ Pod::Spec.new do |s|
22
30
  # Swift/Objective-C compatibility
23
31
  s.pod_target_xcconfig = {
24
32
  'DEFINES_MODULE' => 'YES',
25
- 'SWIFT_COMPILATION_MODE' => 'wholemodule'
33
+ 'SWIFT_COMPILATION_MODE' => 'wholemodule',
34
+ 'OTHER_SWIFT_FLAGS' => "$(inherited) #{compiler_flags}",
26
35
  }
27
36
 
28
37
  if !$ExpoUseSources&.include?(package['name']) && ENV['EXPO_USE_SOURCE'].to_i == 0 && File.exist?("#{s.name}.xcframework") && Gem::Version.new(Pod::VERSION) >= Gem::Version.new('1.10.0')
@@ -1,36 +1,174 @@
1
1
  import ExpoModulesCore
2
2
  import WebKit
3
3
 
4
- class LinkPreviewNativeActionView: ExpoView {
5
- var id: String = ""
6
- var title: String = ""
7
- var icon: String?
8
- var subActions: [LinkPreviewNativeActionView] = []
4
+ class LinkPreviewNativeActionView: ExpoView, LinkPreviewMenuUpdatable {
5
+ // MARK: - Shared props
6
+ var title: String = "" {
7
+ didSet {
8
+ updateUiAction()
9
+ if isMenuAction {
10
+ updateMenu()
11
+ }
12
+ }
13
+ }
14
+ var icon: String? {
15
+ didSet {
16
+ updateUiAction()
17
+ if isMenuAction {
18
+ updateMenu()
19
+ }
20
+ }
21
+ }
22
+ var destructive: Bool = false {
23
+ didSet {
24
+ updateUiAction()
25
+ if isMenuAction {
26
+ updateMenu()
27
+ }
28
+ }
29
+ }
30
+
31
+ // MARK: - Action only props
32
+ var disabled: Bool = false {
33
+ didSet {
34
+ updateUiAction()
35
+ }
36
+ }
37
+ var isOn: Bool = false {
38
+ didSet {
39
+ updateUiAction()
40
+ }
41
+ }
42
+ var keepPresented: Bool = false {
43
+ didSet {
44
+ updateUiAction()
45
+ }
46
+ }
47
+
48
+ // MARK: - Menu only props
49
+ var singleSelection: Bool = false {
50
+ didSet {
51
+ if isMenuAction {
52
+ updateMenu()
53
+ }
54
+ }
55
+ }
56
+ var displayAsPalette: Bool = false {
57
+ didSet {
58
+ if isMenuAction {
59
+ updateMenu()
60
+ }
61
+ }
62
+ }
63
+ var displayInline: Bool = false {
64
+ didSet {
65
+ if isMenuAction {
66
+ updateMenu()
67
+ }
68
+ }
69
+ }
70
+ var subActions: [LinkPreviewNativeActionView] = [] {
71
+ didSet {
72
+ updateMenu()
73
+ }
74
+ }
75
+
76
+ // MARK: - Events
77
+ let onSelected = EventDispatcher()
78
+
79
+ // MARK: - Native API
80
+ weak var parentMenuUpdatable: LinkPreviewMenuUpdatable?
81
+
82
+ private var baseUiAction: UIAction
83
+ private var menuAction: UIMenu
84
+
85
+ var isMenuAction: Bool {
86
+ return !subActions.isEmpty
87
+ }
88
+
89
+ var uiAction: UIMenuElement {
90
+ isMenuAction ? menuAction : baseUiAction
91
+ }
9
92
 
10
93
  required init(appContext: AppContext? = nil) {
94
+ baseUiAction = UIAction(title: "", handler: { _ in })
95
+ menuAction = UIMenu(title: "", image: nil, options: [], children: [])
11
96
  super.init(appContext: appContext)
12
97
  clipsToBounds = true
98
+ baseUiAction = UIAction(title: "", handler: { _ in self.onSelected() })
13
99
  }
14
100
 
15
- #if RCT_NEW_ARCH_ENABLED
16
- override func mountChildComponentView(_ childComponentView: UIView, index: Int) {
17
- if let childActionView = childComponentView as? LinkPreviewNativeActionView {
18
- subActions.append(childActionView)
19
- } else {
20
- print(
21
- "ExpoRouter: Unknown child component view (\(childComponentView)) mounted to NativeLinkPreviewActionView"
22
- )
101
+ func updateMenu() {
102
+ let subActions = subActions.map { subAction in
103
+ subAction.uiAction
104
+ }
105
+ var options: UIMenu.Options = []
106
+ if #available(iOS 17.0, *) {
107
+ if displayAsPalette {
108
+ options.insert(.displayAsPalette)
109
+ }
110
+ }
111
+ if singleSelection {
112
+ options.insert(.singleSelection)
113
+ }
114
+ if displayInline {
115
+ options.insert(.displayInline)
116
+ }
117
+ if destructive {
118
+ options.insert(.destructive)
23
119
  }
120
+
121
+ menuAction = UIMenu(
122
+ title: title,
123
+ image: icon.flatMap { UIImage(systemName: $0) },
124
+ options: options,
125
+ children: subActions
126
+ )
127
+
128
+ parentMenuUpdatable?.updateMenu()
24
129
  }
25
130
 
26
- override func unmountChildComponentView(_ child: UIView, index: Int) {
27
- if let childActionView = child as? LinkPreviewNativeActionView {
28
- subActions.removeAll(where: { $0 == childActionView })
29
- } else {
30
- print(
31
- "ExpoRouter: Unknown child component view (\(child)) unmounted from NativeLinkPreviewActionView"
32
- )
131
+ private func updateUiAction() {
132
+ var attributes: UIMenuElement.Attributes = []
133
+ if destructive { attributes.insert(.destructive) }
134
+ if disabled { attributes.insert(.disabled) }
135
+
136
+ if #available(iOS 16.0, *) {
137
+ if keepPresented { attributes.insert(.keepsMenuPresented) }
33
138
  }
139
+
140
+ baseUiAction.title = title
141
+ baseUiAction.image = icon.flatMap { UIImage(systemName: $0) }
142
+ baseUiAction.attributes = attributes
143
+ baseUiAction.state = isOn ? .on : .off
144
+
145
+ parentMenuUpdatable?.updateMenu()
34
146
  }
35
- #endif
147
+
148
+ #if RCT_NEW_ARCH_ENABLED
149
+ override func mountChildComponentView(_ childComponentView: UIView, index: Int) {
150
+ if let childActionView = childComponentView as? LinkPreviewNativeActionView {
151
+ subActions.append(childActionView)
152
+ childActionView.parentMenuUpdatable = self
153
+ } else {
154
+ print(
155
+ "ExpoRouter: Unknown child component view (\(childComponentView)) mounted to NativeLinkPreviewActionView"
156
+ )
157
+ }
158
+ }
159
+
160
+ override func unmountChildComponentView(_ child: UIView, index: Int) {
161
+ if let childActionView = child as? LinkPreviewNativeActionView {
162
+ subActions.removeAll(where: { $0 == childActionView })
163
+ } else {
164
+ print(
165
+ "ExpoRouter: Unknown child component view (\(child)) unmounted from NativeLinkPreviewActionView"
166
+ )
167
+ }
168
+ }
169
+ #endif
170
+ }
171
+
172
+ protocol LinkPreviewMenuUpdatable: AnyObject {
173
+ func updateMenu()
36
174
  }