{/* Header */}
{/* Main Content Area */}
{/* 預約系統 (Calendar) */}
{activeTab === ‘calendar’ && (
))}
)}
{/* 教材與新聞 (Materials) */}
{activeTab === ‘materials’ && (
{aiContent === title && (
)}
))}
)}
{/* 單字卡 (Flashcards) */}
{activeTab === ‘flashcards’ && (
)}
{/* 口說挑戰 (Speaking) */}
{activeTab === ‘speaking’ && (
)}
{/* 個人設定與 72H 取消政策 (Profile) */}
{activeTab === ‘profile’ && (
{role === ‘student’ && (
)}
)}
{/* Booking Confirmation Modal */}
{isBookingModalOpen && (
)}
{/* Cancel Confirmation Modal */}
{cancelTarget && (
)}
{/* Bottom Nav Bar */}
{[
{ id: ‘calendar’, icon: ‘Calendar’, label: role === ‘teacher’ ? ‘課表’ : ‘預約’ },
{ id: ‘materials’, icon: ‘BookOpen’, label: ‘教材’ },
{ id: ‘flashcards’, icon: ‘BookMarked’, label: ‘單字’ },
{ id: ‘speaking’, icon: ‘Mic2’, label: ‘口說’ },
{ id: ‘profile’, icon: ‘User’, label: ‘個人’ }
].map(tab => (
))}
);
};
const root = ReactDOM.createRoot(document.getElementById(‘sabrina-app-root’));
root.render();
Sabrina English {role === ‘teacher’ && • 教師模式}
{activeTab}
{[1, 2, 3, 4].map((w, idx) => (
))}
{monthDays[activeWeek].map((day, i) => (
{day.getDate()}
{day.toLocaleDateString(‘zh-TW’, { weekday: ‘long’ })}
{timeSlots.slice(0, 4).map(slot => {
const booked = isSlotBooked(day, slot);
return (
);
})}
每週新聞時事導讀
{[“AI 如何重塑職場生態", “全球永續時尚趨勢"].map(title => ({title}
✨ Sabrina’s AI Guide
這篇文章探討了 AI 科技如何改變未來五年的職場互動與技能需求… (解析生成中) setIsFlipped(!isFlipped)}>
Vocabulary
Aesthetic
Tap to flip
“Concerned with beauty or the appreciation of beauty."
“The app has a very Morandi aesthetic."
每週挑戰:職涯規劃
Describe your career goals for the next 5 years. Why is English important for your journey?
{isRecording ? ‘Recording…’ : ‘Tap to Start’}
S
Sabrina 學生
我的預約紀錄 72H Policy
{myBookings.length === 0 ? ( 尚無預約紀錄 ) : ( myBookings.map(b => { const canModify = checkCanModify(b.fullDate); return ({b.displayDate}
{b.slot}
已確認
{canModify ? (
) : (
);
})
)}
72 小時內不可取消、更改
)}
確認預約嗎?
{selectedSlot?.day.toLocaleDateString(‘zh-TW’, { month: ‘short’, day: ‘numeric’ })} 的 {selectedSlot?.slot}
確定取消預約?
您即將取消 {cancelTarget.displayDate} {cancelTarget.slot} 的課程。