import { Platform, StyleSheet, View } from "react-native";
import { useRouter } from "expo-router";
import { GradientBackground } from "../../components/ui";
import { QuestionFeedbackModal } from "../../components/feedback";
import { MatchConfetti } from "../../components/MatchConfetti";
import { AvatarPromptCard } from "../../components/AvatarPromptCard";
import { Paywall } from "../../components/paywall";
import { useSwipeScreen } from "./hooks/useSwipeScreen";
import { SwipeCardStack } from "./components/SwipeCardStack";
import { SwipeHeader } from "./components/SwipeHeader";
import { SwipeUploadOverlay } from "./components/SwipeUploadOverlay";
import { SwipeLoadingState } from "./components/SwipeLoadingState";
import { SwipeSealedAnswersBanner } from "./components/SwipeSealedAnswersBanner";
import { SwipeDailyLimitState } from "./components/SwipeDailyLimitState";
import { SwipeBlockedState } from "./components/SwipeBlockedState";
import { SwipeNoPacksState } from "./components/SwipeNoPacksState";
import { SwipeCaughtUpState } from "./components/SwipeCaughtUpState";
const SwipeScreen = () => {
const router = useRouter();
const {
packId,
mode,
filteredQuestions,
currentIndex,
feedbackQuestion,
isLoading,
isUploading,
isBlocked,
gapInfo,
dailyLimitInfo,
showPaywall,
packContext,
showConfetti,
showAvatarPrompt,
countdown,
user,
partner,
couple,
sealedCount,
enabledPackIds,
effectiveTotal,
fetchQuestions,
handleAnswer,
handleConfettiComplete,
handleAvatarPromptAddPhoto,
handleAvatarPromptDismiss,
getQuestionPackInfo,
checkAnswerGap,
setFeedbackQuestion,
setShowPaywall,
} = useSwipeScreen();
if (isLoading) {
return ;
}
if (dailyLimitInfo?.is_blocked) {
return (
setShowPaywall(true)}
onClosePaywall={() => setShowPaywall(false)}
onPaywallSuccess={() => {
setShowPaywall(false);
fetchQuestions();
}}
/>
);
}
if (isBlocked && gapInfo) {
return (
);
}
// Pack selection is stored per couple, so it only exists once paired. A solo
// user cannot have configured packs yet; recommended() already falls back to
// every public pack for them, so this gate would otherwise be a dead end.
if (couple && !packId && enabledPackIds.length === 0) {
return (
router.push("/")} />
);
}
if (currentIndex >= filteredQuestions.length) {
return (
router.push("/(app)/matches")}
onBackToHome={() => router.push("/")}
onRefresh={fetchQuestions}
/>
);
}
return (
router.back()}
dailyLimitInfo={dailyLimitInfo}
/>
{!partner && (
router.push("/pairing")}
/>
)}
setFeedbackQuestion({ id: questionId, text: questionText })}
/>
setFeedbackQuestion(null)}
questionId={feedbackQuestion?.id || ''}
questionText={feedbackQuestion?.text || ''}
/>
{
handleAvatarPromptAddPhoto();
router.push('/(app)/settings/profile');
}}
onDismiss={handleAvatarPromptDismiss}
/>
setShowPaywall(false)}
onSuccess={() => {
setShowPaywall(false);
fetchQuestions();
}}
/>
{isUploading && }
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
bottomSpacer: {
height: Platform.OS === 'ios' ? 100 : 80,
},
});
export default SwipeScreen;