Spaces:
Running
Running
| """ | |
| Exit Intent Rescue Scenario Handler | |
| Quick flow to retain users about to leave | |
| """ | |
| from typing import Dict, Any | |
| from .base_handler import BaseScenarioHandler | |
| class ExitIntentRescueHandler(BaseScenarioHandler): | |
| """ | |
| Handle exit intent rescue flow | |
| Very short 2-step flow to capture leaving users | |
| Steps: | |
| 1. Offer discount coupon | |
| 2. Collect email to send coupon | |
| """ | |
| def start(self, initial_data: Dict = None) -> Dict[str, Any]: | |
| """Start exit intent flow with urgency""" | |
| return { | |
| "message": "Khoan đã! 😭 Trước khi bạn rời đi…\n\nChúng mình sắp có mã giảm **5%** cho lần mua đầu tiên. Bạn muốn nhận không?", | |
| "new_state": { | |
| "active_scenario": "exit_intent_rescue", | |
| "scenario_step": 1, | |
| "scenario_data": initial_data or {} | |
| } | |
| } | |
| def next_step(self, current_step: int, user_input: str, scenario_data: Dict) -> Dict[str, Any]: | |
| """Process and try to capture email quickly""" | |
| # STEP 1: Want coupon? | |
| if current_step == 1: | |
| choice = self._detect_yes_no(user_input) | |
| if choice == 'yes': | |
| return { | |
| "message": "Tuyệt vời! 🎉 Cho mình xin email để gửi mã giảm giá nhé?", | |
| "new_state": { | |
| "active_scenario": "exit_intent_rescue", | |
| "scenario_step": 2, | |
| "scenario_data": scenario_data | |
| }, | |
| "scenario_active": True | |
| } | |
| else: | |
| return { | |
| "message": "Okie! Hẹn gặp lại bạn nhé 👋", | |
| "new_state": None, | |
| "scenario_active": False, | |
| "end_scenario": True | |
| } | |
| # STEP 2: Collect email and send coupon | |
| elif current_step == 2: | |
| email = user_input.strip() | |
| if not self._validate_email(email): | |
| return { | |
| "message": "Email này có vẻ không đúng. Bạn nhập lại nhanh giúp mình nhé?", | |
| "new_state": None, | |
| "scenario_active": True | |
| } | |
| scenario_data['email'] = email | |
| # Save lead with high priority (exit intent) | |
| try: | |
| self.lead_storage.save_lead( | |
| event_name="Exit Intent Coupon", | |
| email=email, | |
| interests={"exit_intent": True, "discount_5_percent": True}, | |
| session_id=scenario_data.get('session_id') | |
| ) | |
| print(f"🎯 Exit intent lead saved: {email}") | |
| except Exception as e: | |
| print(f"⚠️ Error saving lead: {e}") | |
| return { | |
| "message": "Đã gửi mã **FIRST5** vào email rồi nha! ✨\n\nDùng ngay hôm nay nhé, mã chỉ có hiệu lực 24h thôi!", | |
| "new_state": None, | |
| "scenario_active": False, | |
| "end_scenario": True, | |
| "action": "send_coupon_email" | |
| } | |
| # Fallback | |
| return { | |
| "message": "Hẹn gặp lại bạn! 👋", | |
| "new_state": None, | |
| "scenario_active": False, | |
| "end_scenario": True | |
| } | |
| def _detect_yes_no(self, user_input: str) -> str: | |
| """Detect yes/no quickly""" | |
| input_lower = user_input.lower() | |
| return 'yes' if any(k in input_lower for k in ['có', 'yes', 'ok', 'được', 'ừ', 'muốn']) else 'no' | |