parent
2a7fd53c8b
commit
e4c29b03ab
3 changed files with 121 additions and 14 deletions
@ -0,0 +1,89 @@ |
||||
import { useEffect, useRef, useState } from 'react'; |
||||
|
||||
export function QuestionCard() { |
||||
const [isAnswerVisible, setIsAnswerVisible] = useState<boolean>(false); |
||||
const answerRef = useRef<HTMLDivElement>(null); |
||||
const questionRef = useRef<HTMLDivElement>(null); |
||||
|
||||
useEffect(() => { |
||||
// set the height of the question width to the height of the answer
|
||||
// width if the answer is visible and the question height is less than
|
||||
// the answer height
|
||||
if (isAnswerVisible) { |
||||
const answerHeight = answerRef.current?.clientHeight || 0; |
||||
const questionHeight = questionRef.current?.clientHeight || 0; |
||||
|
||||
if (answerHeight > questionHeight) { |
||||
questionRef.current!.style.height = `${answerHeight}px`; |
||||
} |
||||
|
||||
// if the user has scrolled down and the top of the answer is not
|
||||
// visible, scroll to the top of the answer
|
||||
const questionTop = questionRef.current?.getBoundingClientRect().top || 0; |
||||
if (questionTop < 0) { |
||||
window.scrollTo({ |
||||
top: window.scrollY + questionTop - 100, |
||||
}); |
||||
} |
||||
} else { |
||||
questionRef.current!.style.height = `auto`; |
||||
} |
||||
}, [isAnswerVisible]); |
||||
|
||||
return ( |
||||
<> |
||||
<div |
||||
ref={questionRef} |
||||
className={`flex flex-grow flex-col items-center justify-center py-8`} |
||||
> |
||||
<div className="text-gray-400"> |
||||
<span>Frontend</span> |
||||
<span className="mx-3">·</span> |
||||
<span className="capitalize">Easy Question</span> |
||||
</div> |
||||
|
||||
<div className="mx-auto flex max-w-[550px] flex-1 items-center justify-center py-8"> |
||||
<p className="text-3xl leading-normal text-black"> |
||||
What do you think is the output of the following code? |
||||
</p> |
||||
</div> |
||||
|
||||
<div className="text-center"> |
||||
<button |
||||
onClick={() => { |
||||
setIsAnswerVisible(true); |
||||
}} |
||||
className="cursor-pointer text-gray-500 underline underline-offset-4 transition-colors hover:text-black" |
||||
> |
||||
Click to Reveal the Answer |
||||
</button> |
||||
</div> |
||||
</div> |
||||
|
||||
<div |
||||
ref={answerRef} |
||||
className={`absolute left-0 right-0 flex flex-col items-center justify-center rounded-[7px] bg-neutral-100 py-8 text-xl leading-normal text-black transition-all duration-300 ${ |
||||
isAnswerVisible ? 'top-0 min-h-[398px]' : 'top-full' |
||||
}`}
|
||||
> |
||||
<div className="mx-auto flex max-w-[600px] flex-grow items-center py-0 px-5 text-2xl leading-normal"> |
||||
<p> |
||||
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam |
||||
voluptatum, quod, quas, quia, voluptates voluptate quibusdam |
||||
voluptatibus quos quae quidem. Quisqu |
||||
</p> |
||||
</div> |
||||
<div className="text-center mt-7"> |
||||
<button |
||||
onClick={() => { |
||||
setIsAnswerVisible(false); |
||||
}} |
||||
className="cursor-pointer text-base text-gray-500 underline underline-offset-4 transition-colors hover:text-black" |
||||
> |
||||
Hide the Answer |
||||
</button> |
||||
</div> |
||||
</div> |
||||
</> |
||||
); |
||||
} |
@ -0,0 +1,9 @@ |
||||
export function QuestionLoader() { |
||||
return ( |
||||
<div className="flex h-full w-full items-center justify-center"> |
||||
<p className="animate-pulse text-2xl text-black duration-100"> |
||||
Please wait .. |
||||
</p> |
||||
</div> |
||||
); |
||||
} |
Loading…
Reference in new issue