diff --git a/website/public/locales/en/tasks.json b/website/public/locales/en/tasks.json index 53cfa088..7fa7c452 100644 --- a/website/public/locales/en/tasks.json +++ b/website/public/locales/en/tasks.json @@ -77,5 +77,6 @@ "label": "Classify Assistant Reply", "desc": "Provide labels for a prompt.", "overview": "Read the following conversation and then answer the question about the last reply in the discussion." - } + }, + "available_task_count": "{{count}} tasks available" } diff --git a/website/src/components/Dashboard/TaskOption.tsx b/website/src/components/Dashboard/TaskOption.tsx index 0401fd97..55236b93 100644 --- a/website/src/components/Dashboard/TaskOption.tsx +++ b/website/src/components/Dashboard/TaskOption.tsx @@ -1,5 +1,7 @@ import { + Badge, Box, + Card, Flex, GridItem, Heading, @@ -8,7 +10,6 @@ import { SimpleGrid, Spacer, Text, - useColorModeValue, } from "@chakra-ui/react"; import { HelpCircle } from "lucide-react"; import Link from "next/link"; @@ -19,19 +20,20 @@ import { TaskCategory, TaskInfo, TaskType } from "src/types/Task"; import { TaskCategoryLabels, TaskInfos } from "../Tasks/TaskTypes"; +export type TaskCategoryItem = { taskType: TaskType; count: number }; + export interface TasksOptionProps { - content: Partial>; + content: Partial>; } export const TaskOption = ({ content }: TasksOptionProps) => { const { t } = useTranslation(["dashboard", "tasks"]); - const backgroundColor = useColorModeValue("white", "gray.700"); const taskInfoMap = useMemo( () => Object.values(content) .flat() - .reduce((obj, taskType) => { + .reduce((obj, { taskType }) => { obj[taskType] = TaskInfos.filter((t) => t.type === taskType).pop(); return obj; }, {} as Record), @@ -40,7 +42,7 @@ export const TaskOption = ({ content }: TasksOptionProps) => { return ( - {Object.entries(content).map(([category, taskTypes]) => ( + {Object.entries(content).map(([category, items]) => (
@@ -52,24 +54,25 @@ export const TaskOption = ({ content }: TasksOptionProps) => { - {taskTypes - .map((taskType) => taskInfoMap[taskType]) + {items + .map(({ taskType, count }) => ({ ...taskInfoMap[taskType], count })) .map((item) => ( - - - {t(getTypeSafei18nKey(`tasks:${item.id}.label`))} - {t(getTypeSafei18nKey(`tasks:${item.id}.desc`))} + + + + {t(getTypeSafei18nKey(`tasks:${item.id}.label`))} + {t(getTypeSafei18nKey(`tasks:${item.id}.desc`))} + + + {t("tasks:available_task_count", { count: item.count })} + {t("go")} -> @@ -85,12 +88,20 @@ export const TaskOption = ({ content }: TasksOptionProps) => { }; export const allTaskOptions: TasksOptionProps["content"] = { - [TaskCategory.Random]: [TaskType.random], - [TaskCategory.Create]: [TaskType.initial_prompt, TaskType.prompter_reply, TaskType.assistant_reply], - [TaskCategory.Evaluate]: [ - TaskType.rank_initial_prompts, - TaskType.rank_prompter_replies, - TaskType.rank_assistant_replies, + [TaskCategory.Random]: [{ taskType: TaskType.random, count: 0 }], + [TaskCategory.Create]: [ + { taskType: TaskType.initial_prompt, count: 0 }, + { taskType: TaskType.prompter_reply, count: 0 }, + { taskType: TaskType.assistant_reply, count: 0 }, + ], + [TaskCategory.Evaluate]: [ + { taskType: TaskType.rank_initial_prompts, count: 0 }, + { taskType: TaskType.rank_prompter_replies, count: 0 }, + { taskType: TaskType.rank_assistant_replies, count: 0 }, + ], + [TaskCategory.Label]: [ + { taskType: TaskType.label_initial_prompt, count: 0 }, + { taskType: TaskType.label_prompter_reply, count: 0 }, + { taskType: TaskType.label_assistant_reply, count: 0 }, ], - [TaskCategory.Label]: [TaskType.label_initial_prompt, TaskType.label_prompter_reply, TaskType.label_assistant_reply], }; diff --git a/website/src/pages/dashboard.tsx b/website/src/pages/dashboard.tsx index 23fcec06..e9fe3a18 100644 --- a/website/src/pages/dashboard.tsx +++ b/website/src/pages/dashboard.tsx @@ -5,8 +5,9 @@ import { useEffect, useMemo, useState } from "react"; import { LeaderboardWidget, TaskOption, WelcomeCard } from "src/components/Dashboard"; import { getDashboardLayout } from "src/components/Layout"; import { get } from "src/lib/api"; -import { AvailableTasks, TaskCategory, TaskType } from "src/types/Task"; +import { AvailableTasks, TaskCategory } from "src/types/Task"; export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; +import { TaskCategoryItem } from "src/components/Dashboard/TaskOption"; import useSWR from "swr"; const Dashboard = () => { @@ -59,4 +60,4 @@ const filterAvailableTasks = (availableTasks: Partial) => Object.entries(availableTasks) .filter(([, count]) => count > 0) .sort((a, b) => b[1] - a[1]) - .map(([taskType]) => taskType) as TaskType[]; + .map(([taskType, count]) => ({ taskType, count })) as TaskCategoryItem[]; diff --git a/website/src/styles/Theme/components/Badge.ts b/website/src/styles/Theme/components/Badge.ts new file mode 100644 index 00000000..b67c1f3e --- /dev/null +++ b/website/src/styles/Theme/components/Badge.ts @@ -0,0 +1,14 @@ +import { defineStyleConfig } from "@chakra-ui/react"; + +export const badgeTheme = defineStyleConfig({ + baseStyle: { + borderRadius: "lg", + px: 2, + py: 0.5, + fontWeight: "600", + }, + defaultProps: { + variant: "solid", + colorScheme: "blue", + }, +}); diff --git a/website/src/styles/Theme/index.ts b/website/src/styles/Theme/index.ts index 37ca424d..91d54088 100644 --- a/website/src/styles/Theme/index.ts +++ b/website/src/styles/Theme/index.ts @@ -2,6 +2,7 @@ import { type ThemeConfig, extendTheme } from "@chakra-ui/react"; import { Styles } from "@chakra-ui/theme-tools"; import { colors } from "./colors"; +import { badgeTheme } from "./components/Badge"; import { cardTheme } from "./components/Card"; import { containerTheme } from "./components/Container"; @@ -12,6 +13,7 @@ const config: ThemeConfig = { }; const components = { + Badge: badgeTheme, Container: containerTheme, Card: cardTheme, };