Skip to content

Commit cc6f39c

Browse files
Merge pull request #356 from DevLoversTeam/sl/feat/quiz
(SP: 1) [Frontend] Disable quiz editor Save button when no changes made
2 parents c5d3875 + 9a22eed commit cc6f39c

18 files changed

Lines changed: 67 additions & 48 deletions

frontend/app/[locale]/admin/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Metadata } from 'next';
21
import { FileQuestion, MessageSquare, ShoppingBag } from 'lucide-react';
2+
import { Metadata } from 'next';
33

44
import { Link } from '@/i18n/routing';
55

frontend/app/[locale]/admin/quiz/[id]/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import { Metadata } from 'next';
22
import { notFound } from 'next/navigation';
33

44
import { QuizEditorList } from '@/components/admin/quiz/QuizEditorList';
5-
import { UploadMoreQuestions } from '@/components/admin/quiz/UploadMoreQuestions';
6-
import { QuizStatusControls } from '@/components/admin/quiz/QuizStatusControls';
75
import { QuizMetadataEditor } from '@/components/admin/quiz/QuizMetadataEditor';
6+
import { QuizStatusControls } from '@/components/admin/quiz/QuizStatusControls';
7+
import { UploadMoreQuestions } from '@/components/admin/quiz/UploadMoreQuestions';
88
import { getAdminQuizFull } from '@/db/queries/quizzes/admin-quiz';
99
import { Link } from '@/i18n/routing';
1010
import { issueCsrfToken } from '@/lib/security/csrf';

frontend/components/admin/quiz/CreateQuizForm.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
'use client';
22

3-
import { useState } from 'react';
4-
53
import { useRouter } from 'next/navigation';
4+
import { useState } from 'react';
65

76
import type { AdminCategoryItem } from '@/db/queries/categories/admin-categories';
8-
import type { JsonQuestion } from '@/lib/validation/admin-quiz';
97
import { slugify } from '@/lib/shop/slug';
8+
import type { JsonQuestion } from '@/lib/validation/admin-quiz';
109

1110
import { InlineCategoryForm } from './InlineCategoryForm';
1211
import { JsonUploadArea } from './JsonUploadArea';

frontend/components/admin/quiz/DeleteQuizButton.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
'use client';
22

3-
import { useState } from 'react';
4-
53
import { useRouter } from 'next/navigation';
4+
import { useState } from 'react';
65

76
interface DeleteQuizButtonProps {
87
quizId: string;

frontend/components/admin/quiz/QuestionEditor.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ export function QuestionEditor({
169169
setValidationError(null);
170170
setActiveLocale('en');
171171
}
172+
// eslint-disable-next-line react-hooks/exhaustive-deps
172173
}, [isEditing]);
173174

174175
useEffect(() => {
@@ -501,7 +502,7 @@ export function QuestionEditor({
501502
<button
502503
type="button"
503504
onClick={handleSave}
504-
disabled={saveStatus === 'saving' || saveStatus === 'saved'}
505+
disabled={!isDirty || saveStatus === 'saving' || saveStatus === 'saved'}
505506
className={cn(
506507
'rounded-md px-4 py-2 text-sm font-medium transition-colors disabled:opacity-50',
507508
saveStatus === 'saved'

frontend/components/admin/quiz/QuizListTable.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1+
import type { AdminQuizListItem } from '@/db/queries/quizzes/admin-quiz';
12
import { Link } from '@/i18n/routing';
23
import { cn } from '@/lib/utils';
34

4-
import type { AdminQuizListItem } from '@/db/queries/quizzes/admin-quiz';
5-
65
import { DeleteQuizButton } from './DeleteQuizButton';
76

87
const TH =

frontend/components/admin/quiz/QuizStatusControls.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
'use client';
22

3-
import { useState } from 'react';
4-
53
import { useRouter } from 'next/navigation';
4+
import { useState } from 'react';
65

76
interface ConfirmModal {
87
title: string;

frontend/components/admin/quiz/UploadMoreQuestions.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
'use client';
22

3-
import { useState } from 'react';
4-
53
import { useRouter } from 'next/navigation';
4+
import { useState } from 'react';
65

76
import type { JsonQuestion } from '@/lib/validation/admin-quiz';
87

frontend/components/dashboard/AchievementBadge.tsx

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
11
'use client';
22

33
import {
4-
motion,
5-
useMotionValue,
6-
useReducedMotion,
7-
useSpring,
8-
useTransform,
9-
} from 'framer-motion';
10-
import {
11-
Fire,
12-
Target,
13-
Lightning,
144
Brain,
5+
Code,
6+
Crown,
157
Diamond,
16-
Star,
8+
Fire,
9+
GithubLogo,
1710
Heart,
18-
Trophy,
19-
Rocket,
20-
Crown,
21-
Code,
2211
Infinity as InfinityIcon,
23-
GithubLogo,
12+
Lightning,
2413
Medal,
25-
Seal,
2614
Moon,
15+
Rocket,
16+
Seal,
2717
Shield,
18+
Star,
19+
Target,
20+
Trophy,
2821
Waves,
2922
} from '@phosphor-icons/react';
23+
import {
24+
motion,
25+
useMotionValue,
26+
useReducedMotion,
27+
useSpring,
28+
useTransform,
29+
} from 'framer-motion';
3030
import { useTranslations } from 'next-intl';
31-
import { useState, useEffect } from 'react';
31+
import { useEffect,useState } from 'react';
3232

3333
import type {
34-
EarnedAchievement,
3534
AchievementIconName,
35+
EarnedAchievement,
3636
} from '@/lib/achievements';
3737

3838
const ICON_MAP: Record<AchievementIconName, React.ElementType> = {

frontend/components/home/FlipCardQA.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import {
99
} from 'framer-motion';
1010
import { RotateCw } from 'lucide-react';
1111
import Image from 'next/image';
12-
import { useEffect, useRef, useState } from 'react';
1312
import { useTranslations } from 'next-intl';
13+
import { useEffect, useRef, useState } from 'react';
1414

1515
interface Question {
1616
id: number;

0 commit comments

Comments
 (0)