Files
developer-roadmap/src/components/Questions/QuestionsProgress.tsx

102 lines
3.5 KiB
TypeScript
Raw Normal View History

2023-09-03 12:02:34 +01:00
import { CheckCircle, RotateCcw, SkipForward, Sparkles } from 'lucide-react';
2023-09-02 23:09:02 +01:00
import { showLoginPopup } from '../../lib/popup';
type QuestionsProgressProps = {
isLoading?: boolean;
2023-09-02 23:09:02 +01:00
showLoginAlert?: boolean;
2023-09-03 12:02:34 +01:00
knowCount?: number;
didNotKnowCount?: number;
totalCount?: number;
skippedCount?: number;
2023-09-03 12:14:20 +01:00
onResetClick?: () => void;
2023-09-02 23:09:02 +01:00
};
export function QuestionsProgress(props: QuestionsProgressProps) {
2023-09-03 12:02:34 +01:00
const {
showLoginAlert,
isLoading = false,
knowCount = 0,
didNotKnowCount = 0,
totalCount = 0,
skippedCount = 0,
2023-09-03 12:14:20 +01:00
onResetClick = () => null,
2023-09-03 12:02:34 +01:00
} = props;
const totalSolved = knowCount + didNotKnowCount + skippedCount;
const donePercentage = (totalSolved / totalCount) * 100;
2023-09-01 20:07:17 +01:00
return (
<div className="mb-3 overflow-hidden rounded-lg border border-gray-300 bg-white p-4 sm:mb-5 sm:p-6">
2023-09-01 20:07:17 +01:00
<div className="mb-3 flex items-center text-gray-600">
<div className="relative w-full flex-1 rounded-xl bg-gray-200 p-1">
2023-09-03 12:02:34 +01:00
<div
2023-09-03 23:12:27 +01:00
className="duration-400 absolute bottom-0 left-0 top-0 rounded-xl bg-slate-800 transition-[width]"
2023-09-03 12:02:34 +01:00
style={{
width: `${donePercentage}%`,
}}
/>
2023-09-01 20:07:17 +01:00
</div>
2023-09-03 12:02:34 +01:00
<span className="ml-3 text-sm">
{totalSolved} / {totalCount}
</span>
2023-09-01 20:07:17 +01:00
</div>
<div className="relative -left-1 flex flex-col gap-2 text-sm text-black sm:flex-row sm:gap-3">
<span className="flex items-center">
<CheckCircle className="mr-1 h-4" />
2023-09-03 12:02:34 +01:00
<span>Knew</span>
2023-09-01 20:07:17 +01:00
<span className="ml-2 rounded-md bg-gray-200/80 px-1.5 font-medium text-black">
2023-09-03 23:12:27 +01:00
<span className="tabular-nums">{knowCount}</span>{' '}
<span className="hidden lg:inline">Questions</span>
<span className="inline sm:hidden">Questions</span>
2023-09-01 20:07:17 +01:00
</span>
</span>
<span className="flex items-center">
<Sparkles className="mr-1 h-4" />
2023-09-03 12:02:34 +01:00
<span>Learnt</span>
2023-09-01 20:07:17 +01:00
<span className="ml-2 rounded-md bg-gray-200/80 px-1.5 font-medium text-black">
2023-09-03 23:12:27 +01:00
<span className="tabular-nums">{didNotKnowCount}</span>{' '}
<span className="hidden lg:inline">Questions</span>
<span className="inline sm:hidden">Questions</span>
2023-09-03 12:02:34 +01:00
</span>
</span>
<span className="flex items-center">
<SkipForward className="mr-1 h-4" />
<span>Skipped</span>
<span className="ml-2 rounded-md bg-gray-200/80 px-1.5 font-medium text-black">
2023-09-03 23:12:27 +01:00
<span className="tabular-nums">{skippedCount}</span>{' '}
<span className="hidden lg:inline">Questions</span>
<span className="inline sm:hidden">Questions</span>
2023-09-01 20:07:17 +01:00
</span>
</span>
2023-09-03 12:14:20 +01:00
<button
disabled={isLoading}
onClick={onResetClick}
className="flex items-center text-red-600 transition-opacity duration-300 hover:text-red-900 disabled:opacity-50"
>
2023-09-01 20:07:17 +01:00
<RotateCcw className="mr-1 h-4" />
2023-09-03 12:02:34 +01:00
Reset
<span className="inline lg:hidden">Progress</span>
2023-09-01 20:07:17 +01:00
</button>
</div>
2023-09-02 17:49:07 +01:00
2023-09-02 23:09:02 +01:00
{showLoginAlert && (
<p className="-mx-6 -mb-6 mt-6 border-t bg-yellow-100 py-3 text-sm text-yellow-900">
2023-09-02 23:09:02 +01:00
You progress is not saved. Please{' '}
<button
onClick={() => {
showLoginPopup();
}}
className="underline-offset-3 font-medium underline hover:text-black"
>
login to save your progress.
</button>
</p>
)}
2023-09-01 20:07:17 +01:00
</div>
);
}