Skip to content

Commit 377bc70

Browse files
AmirMohammad CheraghaliAmirMohammad Cheraghali
authored andcommitted
feat: Implement Teaching Mode toggle to conditionally show Quiz builder
1 parent 805eaf0 commit 377bc70

3 files changed

Lines changed: 20 additions & 3 deletions

File tree

src/ViewerApp.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,6 +1338,7 @@ function App() {
13381338
// handleResetView and handleUpload extracted to hook
13391339

13401340
const [isPublicationMode, setIsPublicationMode] = useState(false);
1341+
const [isTeachingMode, setIsTeachingMode] = useState(false);
13411342

13421343
// Store previous theme to restore after exiting Publication Mode
13431344
const previousThemeRef = useRef(isLightMode);
@@ -2828,6 +2829,7 @@ function App() {
28282829
onToggleNotes={() => setIsNotesOpen(!isNotesOpen)}
28292830
onOpenSettings={() => setIsSettingsOpen(true)}
28302831
onOpenAssignmentBuilder={() => setIsAssignmentBuilderOpen(true)}
2832+
isTeachingMode={isTeachingMode}
28312833
/>
28322834

28332835
<AIChatSidebar isOpen={isAiChatOpen} onClose={() => setIsAiChatOpen(false)} pdbId={pdbId} pdbMetadata={pdbMetadata} />
@@ -2908,6 +2910,8 @@ function App() {
29082910
setVisualizerEngine={setVisualizerEngine}
29092911
isOpen={isSettingsOpen}
29102912
onClose={() => setIsSettingsOpen(false)}
2913+
isTeachingMode={isTeachingMode}
2914+
setIsTeachingMode={setIsTeachingMode}
29112915
/>
29122916
</>
29132917
)}

src/components/HUD.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@ interface HUDProps {
2929
onToggleNotes?: () => void;
3030
onOpenSettings?: () => void;
3131
onOpenAssignmentBuilder?: () => void;
32+
isTeachingMode?: boolean;
3233
}
3334

34-
export function HUD({ hoveredResidue, pdbMetadata, pdbId, isLightMode, isEmbedMode = false, peerSession, remoteHoveredResidue, isHost, remoteUserName, peerNames = {}, controllerId, isCameraSynced, onToggleCameraSync, userName, unreadCount = 0, isChatOpen = false, onToggleChat, isAiChatOpen = false, onToggleAiChat, isNotesOpen = false, onToggleNotes, onOpenSettings, onOpenAssignmentBuilder }: HUDProps) {
35+
export function HUD({ hoveredResidue, pdbMetadata, pdbId, isLightMode, isEmbedMode = false, peerSession, remoteHoveredResidue, isHost, remoteUserName, peerNames = {}, controllerId, isCameraSynced, onToggleCameraSync, userName, unreadCount = 0, isChatOpen = false, onToggleChat, isAiChatOpen = false, onToggleAiChat, isNotesOpen = false, onToggleNotes, onOpenSettings, onOpenAssignmentBuilder, isTeachingMode = false }: HUDProps) {
3536
const { t } = useTranslation();
3637
const textColor = isLightMode ? 'text-gray-800' : 'text-gray-200';
3738
const bgColor = isLightMode ? 'bg-white/80' : 'bg-black/80';
@@ -176,7 +177,7 @@ export function HUD({ hoveredResidue, pdbMetadata, pdbId, isLightMode, isEmbedMo
176177
)}
177178

178179
{/* Main Control Pill — hidden in embed mode */}
179-
{!isEmbedMode && (peerSession?.isConnected || onToggleAiChat || onToggleNotes || onOpenAssignmentBuilder) && (
180+
{!isEmbedMode && (peerSession?.isConnected || onToggleAiChat || onToggleNotes || (isTeachingMode && onOpenAssignmentBuilder)) && (
180181
<div className={`pointer-events-auto backdrop-blur-md rounded-full border ${borderColor} ${bgColor} shadow-lg px-4 py-2 flex items-center justify-center gap-2 animate-in slide-in-from-bottom-2 mx-auto`}>
181182

182183
{/* Desktop: Reactions Inline */}
@@ -240,7 +241,7 @@ export function HUD({ hoveredResidue, pdbMetadata, pdbId, isLightMode, isEmbedMo
240241
{t.aiBtn as string}
241242
</button>
242243
)}
243-
{onOpenAssignmentBuilder && (
244+
{isTeachingMode && onOpenAssignmentBuilder && (
244245
<button
245246
onClick={onOpenAssignmentBuilder}
246247
className={`relative text-[10px] font-bold px-4 py-1.5 md:px-2 md:py-1 rounded-full flex items-center gap-2 transition-colors shadow-sm ${isLightMode ? 'bg-green-100 text-green-700 hover:bg-green-200' : 'bg-green-500/20 text-green-300 hover:bg-green-500/30'}`}

src/components/Settings.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ interface SettingsProps {
1111
setSsao: (v: boolean) => void;
1212
visualizerEngine: 'ngl' | 'molstar';
1313
setVisualizerEngine: (v: 'ngl' | 'molstar') => void;
14+
isTeachingMode: boolean;
15+
setIsTeachingMode: (v: boolean) => void;
1416
isOpen: boolean;
1517
onClose: () => void;
1618
}
@@ -20,6 +22,7 @@ export function Settings({
2022
quality, setQuality,
2123
ssao, setSsao,
2224
visualizerEngine, setVisualizerEngine,
25+
isTeachingMode, setIsTeachingMode,
2326
isOpen, onClose
2427
}: SettingsProps) {
2528
const { t } = useTranslation();
@@ -86,6 +89,15 @@ export function Settings({
8689
<div className={`absolute top-1 w-5 h-5 rounded-full bg-white shadow-md transition-transform duration-300 ${!isLightMode ? 'translate-x-8' : 'translate-x-1'}`} />
8790
</button>
8891
</div>
92+
<div className="flex items-center justify-between p-1">
93+
<span className="text-sm font-medium">Teaching Mode</span>
94+
<button
95+
onClick={() => setIsTeachingMode(!isTeachingMode)}
96+
className={`w-14 h-7 rounded-full transition-all duration-300 relative shadow-inner ${isTeachingMode ? 'bg-indigo-600' : 'bg-neutral-200'}`}
97+
>
98+
<div className={`absolute top-1 w-5 h-5 rounded-full bg-white shadow-md transition-transform duration-300 ${isTeachingMode ? 'translate-x-8' : 'translate-x-1'}`} />
99+
</button>
100+
</div>
89101
</div>
90102

91103
<hr className={`border-t ${borderColor}`} />

0 commit comments

Comments
 (0)