import { Stack, useLocalSearchParams, usePathname, useRouter, } from "expo-router"; import { Fragment } from "react"; import { Platform } from "react-native"; import { useFeedbackBody } from "../../shared/context/FeedbackBodyProvider"; import { useFeedbackUi } from "../../shared/context/FeedbackProvider"; import { allowAuthenticatedAction, createEntryLabel, entryStatusChoices, } from "../../shared/helpers"; import { EditEntryStackScreen } from "./EditEntryScreen"; import type { FeedbackStackProps, FeedbackStackScreenOptions } from "./types"; function firstParam(value: string | string[] | undefined): string | undefined { return Array.isArray(value) ? value[0] : value; } export function FeedbackStack({ searchRef, stackOptions, colors, androidToolbarIcons = {}, BottomToolbarWrapper, children, }: FeedbackStackProps) { const { query, enabledKinds, hooks, selectedEntryId, setQuery, setShowForm, setIsSearching, setSelectedEntryId, statusFilter, setStatusFilter, isAuthenticated, onUnauthenticated, } = useFeedbackBody(); const { messages, theme } = useFeedbackUi(); const router = useRouter(); const ToolbarWrapper = BottomToolbarWrapper ?? Fragment; const pathname = usePathname(); const params = useLocalSearchParams<{ __convexFeedbackEditEntryId?: string | string[]; }>(); const editEntryId = firstParam(params.__convexFeedbackEditEntryId); const editEntry = hooks.useEntry(editEntryId); const selectedEntry = hooks.useEntry(selectedEntryId); const editStackOptions: FeedbackStackScreenOptions = typeof stackOptions === "function" ? { presentation: Platform.OS === "ios" ? "formSheet" : "modal", sheetAllowedDetents: [0.6], } : { presentation: Platform.OS === "ios" ? "formSheet" : "modal", sheetAllowedDetents: [0.6], ...stackOptions, }; if (editEntryId !== undefined) { return ( router.back()} colors={colors} androidToolbarIcons={androidToolbarIcons} stackOptions={editStackOptions} /> ); } const canGoBack = !!selectedEntryId || router.canGoBack(); const handleBackPress = () => { if (selectedEntryId === null) { router.back(); return; } if (searchRef.current && query) searchRef.current.focus(); setSelectedEntryId(null); return true; }; const pageTitle = enabledKinds.length === 1 ? messages.kindsPlural[enabledKinds.at(0)!] : messages.board.title; return ( <> {selectedEntry?.viewerIsAuthor === true && ( { router.push({ pathname, params: { __convexFeedbackEditEntryId: selectedEntry.id }, }); }} tintColor={theme.colors.primary} > {messages.entry.edit} )} { if (allowAuthenticatedAction(isAuthenticated, onUnauthenticated)) { setShowForm(true); } }} tintColor={theme.colors.primary} > {createEntryLabel(enabledKinds, messages)} {children} { if (selectedEntryId) { setSelectedEntryId(null); } setQuery( (q as unknown as { nativeEvent: { text: string } }).nativeEvent .text, ); }} onFocus={() => { if (selectedEntryId) { setSelectedEntryId(null); } setIsSearching(true); }} onBlur={() => setIsSearching(false)} obscureBackground={false} allowToolbarIntegration hideNavigationBar={false} ref={searchRef} textColor={theme.colors.text} /> {entryStatusChoices(messages).map(({ value, label }) => ( setStatusFilter(value)} > {label} ))} ); }