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