Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion frontend/app/[locale]/admin/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Metadata } from 'next';
import { FileQuestion, MessageSquare, ShoppingBag } from 'lucide-react';
import { Metadata } from 'next';

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

Expand Down
4 changes: 2 additions & 2 deletions frontend/app/[locale]/admin/quiz/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import { Metadata } from 'next';
import { notFound } from 'next/navigation';

import { QuizEditorList } from '@/components/admin/quiz/QuizEditorList';
import { UploadMoreQuestions } from '@/components/admin/quiz/UploadMoreQuestions';
import { QuizStatusControls } from '@/components/admin/quiz/QuizStatusControls';
import { QuizMetadataEditor } from '@/components/admin/quiz/QuizMetadataEditor';
import { QuizStatusControls } from '@/components/admin/quiz/QuizStatusControls';
import { UploadMoreQuestions } from '@/components/admin/quiz/UploadMoreQuestions';
import { getAdminQuizFull } from '@/db/queries/quizzes/admin-quiz';
import { Link } from '@/i18n/routing';
import { issueCsrfToken } from '@/lib/security/csrf';
Expand Down
5 changes: 2 additions & 3 deletions frontend/components/admin/quiz/CreateQuizForm.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
'use client';

import { useState } from 'react';

import { useRouter } from 'next/navigation';
import { useState } from 'react';

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

import { InlineCategoryForm } from './InlineCategoryForm';
import { JsonUploadArea } from './JsonUploadArea';
Expand Down
3 changes: 1 addition & 2 deletions frontend/components/admin/quiz/DeleteQuizButton.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
'use client';

import { useState } from 'react';

import { useRouter } from 'next/navigation';
import { useState } from 'react';

interface DeleteQuizButtonProps {
quizId: string;
Expand Down
3 changes: 2 additions & 1 deletion frontend/components/admin/quiz/QuestionEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ export function QuestionEditor({
setValidationError(null);
setActiveLocale('en');
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isEditing]);

useEffect(() => {
Expand Down Expand Up @@ -501,7 +502,7 @@ export function QuestionEditor({
<button
type="button"
onClick={handleSave}
disabled={saveStatus === 'saving' || saveStatus === 'saved'}
disabled={!isDirty || saveStatus === 'saving' || saveStatus === 'saved'}
className={cn(
'rounded-md px-4 py-2 text-sm font-medium transition-colors disabled:opacity-50',
saveStatus === 'saved'
Expand Down
3 changes: 1 addition & 2 deletions frontend/components/admin/quiz/QuizListTable.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import type { AdminQuizListItem } from '@/db/queries/quizzes/admin-quiz';
import { Link } from '@/i18n/routing';
import { cn } from '@/lib/utils';

import type { AdminQuizListItem } from '@/db/queries/quizzes/admin-quiz';

import { DeleteQuizButton } from './DeleteQuizButton';

const TH =
Expand Down
3 changes: 1 addition & 2 deletions frontend/components/admin/quiz/QuizStatusControls.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
'use client';

import { useState } from 'react';

import { useRouter } from 'next/navigation';
import { useState } from 'react';

interface ConfirmModal {
title: string;
Expand Down
3 changes: 1 addition & 2 deletions frontend/components/admin/quiz/UploadMoreQuestions.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
'use client';

import { useState } from 'react';

import { useRouter } from 'next/navigation';
import { useState } from 'react';

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

Expand Down
38 changes: 19 additions & 19 deletions frontend/components/dashboard/AchievementBadge.tsx
Original file line number Diff line number Diff line change
@@ -1,38 +1,38 @@
'use client';

import {
motion,
useMotionValue,
useReducedMotion,
useSpring,
useTransform,
} from 'framer-motion';
import {
Fire,
Target,
Lightning,
Brain,
Code,
Crown,
Diamond,
Star,
Fire,
GithubLogo,
Heart,
Trophy,
Rocket,
Crown,
Code,
Infinity as InfinityIcon,
GithubLogo,
Lightning,
Medal,
Seal,
Moon,
Rocket,
Seal,
Shield,
Star,
Target,
Trophy,
Waves,
} from '@phosphor-icons/react';
import {
motion,
useMotionValue,
useReducedMotion,
useSpring,
useTransform,
} from 'framer-motion';
import { useTranslations } from 'next-intl';
import { useState, useEffect } from 'react';
import { useEffect,useState } from 'react';

import type {
EarnedAchievement,
AchievementIconName,
EarnedAchievement,
} from '@/lib/achievements';

const ICON_MAP: Record<AchievementIconName, React.ElementType> = {
Expand Down
2 changes: 1 addition & 1 deletion frontend/components/home/FlipCardQA.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import {
} from 'framer-motion';
import { RotateCw } from 'lucide-react';
import Image from 'next/image';
import { useEffect, useRef, useState } from 'react';
import { useTranslations } from 'next-intl';
import { useEffect, useRef, useState } from 'react';

interface Question {
id: number;
Expand Down
3 changes: 2 additions & 1 deletion frontend/components/home/InteractiveCTAButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import {
useSpring,
} from 'framer-motion';
import { useTranslations } from 'next-intl';
import React, { useRef, useState, useEffect } from 'react';
import React, { useEffect,useRef, useState } from 'react';

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

const MotionLink = motion(Link);
Expand Down
30 changes: 26 additions & 4 deletions frontend/components/quiz/QuizzesSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,32 @@ export default function QuizzesSection({
</div>
</div>
) : (
<div className="py-12 text-center">
<p className="text-gray-600 dark:text-gray-400">
{t('noQuizzes')}
</p>
<div className="py-20 text-center">
{(() => {
const lines = t('noQuizzes')
.split('\n')
.map(l => l.trim())
.filter(Boolean);
return (
<>
{lines[0] && (
<p className="motion-safe:animate-fade-up text-lg font-semibold text-gray-900 motion-reduce:opacity-100 dark:text-white">
{lines[0]}
</p>
)}
{lines[1] && (
<p className="motion-safe:animate-fade-up mt-2 text-gray-400 motion-safe:[animation-delay:150ms] motion-reduce:opacity-100 dark:text-gray-300">
{lines[1]}
</p>
)}
{lines[2] && (
<p className="motion-safe:animate-fade-up mt-1 text-gray-500 motion-safe:[animation-delay:300ms] motion-reduce:opacity-100 dark:text-gray-400">
{lines[2]}
</p>
)}
</>
);
})()}
</div>
)}
</TabsContent>
Expand Down
6 changes: 3 additions & 3 deletions frontend/db/queries/quizzes/admin-quiz.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ import { eq, inArray, sql } from 'drizzle-orm';
import { db } from '../../index';
import { categories, categoryTranslations } from '../../schema/categories';
import {
quizQuestions,
quizTranslations,
quizzes,
quizAnswers,
quizAnswerTranslations,
quizQuestionContent,
quizQuestions,
quizTranslations,
quizzes,
} from '../../schema/quiz';

const ADMIN_LOCALE = 'en';
Expand Down
2 changes: 1 addition & 1 deletion frontend/db/seed-questions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import 'dotenv/config';

import { and, eq } from 'drizzle-orm';

import rawData from '../parse/questions.json';
import { invalidateAllQaCache } from '../lib/cache/qa';
import rawData from '../parse/questions.json';
import { db } from './index';
import { categories, questions, questionTranslations } from './schema';

Expand Down
2 changes: 1 addition & 1 deletion frontend/lib/quiz/quiz-answers-redis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
quizQuestions,
} from '@/db/schema/quiz';
import { getRedisClient } from '@/lib/redis';
import type { QuizQuestionWithAnswers, AttemptReview } from '@/types/quiz';
import type { AttemptReview,QuizQuestionWithAnswers } from '@/types/quiz';

interface QuizAnswersCache {
quizId: string;
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@
"start": "Start Quiz"
},
"section": {
"noQuizzes": "No quizzes in this category yet."
"noQuizzes": "No quizzes yet...\nBut they're already in development.\nStay tuned - new quizzes coming soon!"
},
"exitModal": {
"title": "Exit Quiz?",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/pl.json
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@
"start": "Rozpocznij Quiz"
},
"section": {
"noQuizzes": "Brak quizów w tej kategorii."
"noQuizzes": "Brak quizów na ten moment…\nAle już są w przygotowaniu.\nBądź na bieżąco - wkrótce pojawią się nowe quizy!"
},
"exitModal": {
"title": "Wyjść z Quizu?",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/uk.json
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@
"start": "Розпочати квіз"
},
"section": {
"noQuizzes": "У цій категорії ще немає квізів."
"noQuizzes": "Квізів поки що немає…\nАле вони вже в розробці.\nСлідкуйте за оновленнями - скоро зʼявляться нові квізи!"
},
"exitModal": {
"title": "Вийти з квізу?",
Expand Down