1"use strict"; 2var __importDefault = (this && this.__importDefault) || function (mod) { 3 return (mod && mod.__esModule) ? mod : { "default": mod }; 4}; 5Object.defineProperty(exports, "__esModule", { value: true }); 6exports.Sitemap = exports.getNavOptions = void 0; 7const react_1 = __importDefault(require("react")); 8const react_native_1 = require("react-native"); 9const react_native_safe_area_context_1 = require("react-native-safe-area-context"); 10const Pressable_1 = require("./Pressable"); 11const router_store_1 = require("../global-state/router-store"); 12const imperative_api_1 = require("../imperative-api"); 13const Link_1 = require("../link/Link"); 14const matchers_1 = require("../matchers"); 15const INDENT = 24; 16function getNavOptions() { 17 return { 18 title: 'sitemap', 19 headerShown: false, 20 presentation: 'modal', 21 animation: 'default', 22 headerLargeTitle: false, 23 headerTitleStyle: { 24 color: 'white', 25 }, 26 headerTintColor: 'white', 27 headerLargeTitleStyle: { 28 color: 'white', 29 }, 30 headerStyle: { 31 backgroundColor: 'black', 32 // @ts-expect-error: mistyped 33 borderBottomColor: '#323232', 34 }, 35 }; 36} 37exports.getNavOptions = getNavOptions; 38function Sitemap() { 39 const { top, bottom } = (0, react_native_safe_area_context_1.useSafeAreaInsets)(); 40 const { width } = (0, react_native_1.useWindowDimensions)(); 41 return (react_1.default.createElement(react_native_1.View, { style: styles.container }, 42 react_1.default.createElement(react_native_1.StatusBar, { barStyle: "light-content" }), 43 react_1.default.createElement(react_native_1.View, { style: [ 44 styles.main, 45 { 46 minWidth: Math.min(960, width * 0.9), 47 }, 48 ] }, 49 react_1.default.createElement(react_native_1.ScrollView, { contentContainerStyle: [ 50 styles.scroll, 51 { 52 paddingTop: top + 12, 53 paddingBottom: bottom + 12, 54 }, 55 ], style: { flex: 1 } }, 56 react_1.default.createElement(FileSystemView, null))))); 57} 58exports.Sitemap = Sitemap; 59function FileSystemView() { 60 const routes = (0, router_store_1.useExpoRouter)().getSortedRoutes(); 61 return (react_1.default.createElement(react_1.default.Fragment, null, routes.map((child) => (react_1.default.createElement(react_native_1.View, { key: child.contextKey, style: styles.itemContainer }, 62 react_1.default.createElement(FileItem, { route: child })))))); 63} 64function FileItem({ route, level = 0, parents = [], isInitial = false, }) { 65 const disabled = route.children.length > 0; 66 const segments = react_1.default.useMemo(() => [...parents, ...route.route.split('/')], [parents, route.route]); 67 const href = react_1.default.useMemo(() => { 68 return ('/' + 69 segments 70 .map((v) => { 71 // add an extra layer of entropy to the url for deep dynamic routes 72 if ((0, matchers_1.matchDeepDynamicRouteName)(v)) { 73 return v + '/' + Date.now(); 74 } 75 // index must be erased but groups can be preserved. 76 return v === 'index' ? '' : v; 77 }) 78 .filter(Boolean) 79 .join('/')); 80 }, [segments, route.route]); 81 const filename = react_1.default.useMemo(() => { 82 const segments = route.contextKey.split('/'); 83 // join last two segments for layout routes 84 if (route.contextKey.match(/_layout\.[jt]sx?$/)) { 85 return segments[segments.length - 2] + '/' + segments[segments.length - 1]; 86 } 87 const segmentCount = route.route.split('/').length; 88 // Join the segment count in reverse order 89 // This presents files without layout routes as children with all relevant segments. 90 return segments.slice(-segmentCount).join('/'); 91 }, [route]); 92 const info = isInitial ? 'Initial' : route.generated ? 'Virtual' : ''; 93 return (react_1.default.createElement(react_1.default.Fragment, null, 94 !route.internal && (react_1.default.createElement(Link_1.Link, { accessibilityLabel: route.contextKey, href: href, onPress: () => { 95 if (react_native_1.Platform.OS !== 'web' && imperative_api_1.router.canGoBack()) { 96 // Ensure the modal pops 97 imperative_api_1.router.back(); 98 } 99 }, style: { flex: 1, display: 'flex' }, disabled: disabled, asChild: true, 100 // Ensure we replace the history so you can't go back to this page. 101 replace: true }, 102 react_1.default.createElement(Pressable_1.Pressable, { style: { flex: 1 } }, ({ pressed, hovered }) => (react_1.default.createElement(react_native_1.View, { style: [ 103 styles.itemPressable, 104 { 105 paddingLeft: INDENT + level * INDENT, 106 backgroundColor: hovered ? 'rgba(255,255,255,0.1)' : 'transparent', 107 }, 108 pressed && { backgroundColor: '#323232' }, 109 disabled && { opacity: 0.4 }, 110 ] }, 111 react_1.default.createElement(react_native_1.View, { style: { flexDirection: 'row', alignItems: 'center' } }, 112 route.children.length ? react_1.default.createElement(PkgIcon, null) : react_1.default.createElement(FileIcon, null), 113 react_1.default.createElement(react_native_1.Text, { style: styles.filename }, filename)), 114 react_1.default.createElement(react_native_1.View, { style: { flexDirection: 'row', alignItems: 'center' } }, 115 !!info && (react_1.default.createElement(react_native_1.Text, { style: [styles.virtual, !disabled && { marginRight: 8 }] }, info)), 116 !disabled && react_1.default.createElement(ForwardIcon, null))))))), 117 route.children.map((child) => (react_1.default.createElement(FileItem, { key: child.contextKey, route: child, isInitial: route.initialRouteName === child.route, parents: segments, level: level + (route.generated ? 0 : 1) }))))); 118} 119function FileIcon() { 120 return react_1.default.createElement(react_native_1.Image, { style: styles.image, source: require('expo-router/assets/file.png') }); 121} 122function PkgIcon() { 123 return react_1.default.createElement(react_native_1.Image, { style: styles.image, source: require('expo-router/assets/pkg.png') }); 124} 125function ForwardIcon() { 126 return react_1.default.createElement(react_native_1.Image, { style: styles.image, source: require('expo-router/assets/forward.png') }); 127} 128const styles = react_native_1.StyleSheet.create({ 129 container: { 130 backgroundColor: 'black', 131 flex: 1, 132 alignItems: 'stretch', 133 }, 134 main: { 135 marginHorizontal: 'auto', 136 flex: 1, 137 alignItems: 'stretch', 138 }, 139 scroll: { 140 paddingHorizontal: 12, 141 // flex: 1, 142 // paddingTop: top + 12, 143 alignItems: 'stretch', 144 }, 145 itemContainer: { 146 borderWidth: 1, 147 borderColor: '#323232', 148 borderRadius: 19, 149 marginBottom: 12, 150 overflow: 'hidden', 151 }, 152 itemPressable: { 153 paddingHorizontal: INDENT, 154 paddingVertical: 16, 155 flexDirection: 'row', 156 justifyContent: 'space-between', 157 alignItems: 'center', 158 transitionDuration: '100ms', 159 }, 160 filename: { color: 'white', fontSize: 20, marginLeft: 12 }, 161 virtual: { textAlign: 'right', color: 'white' }, 162 image: { width: 24, height: 24, resizeMode: 'contain' }, 163}); 164//# sourceMappingURL=Sitemap.js.map