- {solutions?.data.map((solution, counter) => {
- const avatar = solution.user.avatar || '';
- const languages = solution?.languages || [];
-
- return (
-
-
-
-
-
- {solution.user.name}
-
-
- {submittedAlternatives[
- counter % submittedAlternatives.length
- ] || 'submitted their solution'}
- {' '}
-
- {getRelativeTimeString(solution?.submittedAt!)}
-
-
-
-
-
- {
- handleSubmitVote(solution._id!, 'upvote');
- }}
- />
-
- {
- handleSubmitVote(solution._id!, 'downvote');
- }}
- />
-
-
-
{
- e.preventDefault();
- setShowLeavingRoadmapModal(solution);
- }}
- target="_blank"
- href={solution.repositoryUrl}
- >
-
- Visit Solution
-
+
{
+ const isAlreadySelected = selectedLanguages.includes(language);
+ const newLanguages = isAlreadySelected
+ ? selectedLanguages.filter((l) => l !== language)
+ : [...selectedLanguages, language];
+
+ setPageState({
+ ...pageState,
+ languages: newLanguages,
+ });
+ }}
+ />
+
+ {isLoading ? (
+
+ ) : (
+ <>
+
+ {solutions?.data.map((solution, counter) => {
+ const avatar = solution.user.avatar || '';
+ return (
+
+
+
+
+
+ {solution.user.name}
+
+
+ {submittedAlternatives[
+ counter % submittedAlternatives.length
+ ] || 'submitted their solution'}
+ {' '}
+
+ {getRelativeTimeString(solution?.submittedAt!)}
+
+
+
+
+
+ {
+ handleSubmitVote(solution._id!, 'upvote');
+ }}
+ />
+
+ {
+ handleSubmitVote(solution._id!, 'downvote');
+ }}
+ />
+
+
+
+
+
-
-
-
- {languages.map((language) => (
-
-
- {language}
-
- ))}
-
+ );
+ })}
+
+
+ {(solutions?.totalPages || 0) > 1 && (
+
+
{
+ setPageState({
+ ...pageState,
+ currentPage: page,
+ });
+ }}
+ />
- );
- })}
-
-
- {(solutions?.totalPages || 0) > 1 && (
-
-
{
- setPageState({
- ...pageState,
- currentPage: page,
- });
- }}
- />
-
+ )}
+ >
)}
);
diff --git a/src/components/Projects/SelectLanguages.tsx b/src/components/Projects/SelectLanguages.tsx
new file mode 100644
index 000000000..933775eca
--- /dev/null
+++ b/src/components/Projects/SelectLanguages.tsx
@@ -0,0 +1,105 @@
+import { useRef, useState } from 'react';
+import { cn } from '../../lib/classname';
+import { useOutsideClick } from '../../hooks/use-outside-click';
+
+const languageColors = new Map([
+ ['JavaScript', 'bg-[#f1e05a]'],
+ ['Python', 'bg-[#3572A5]'],
+ ['Java', 'bg-[#b07219]'],
+ ['HTML', 'bg-[#e34c26]'],
+ ['CSS', 'bg-[#563d7c]'],
+ ['C++', 'bg-[#f34b7d]'],
+ ['C', 'bg-[#555555]'],
+ ['Go', 'bg-[#00ADD8]'],
+ ['TypeScript', 'bg-[#2b7489]'],
+ ['Shell', 'bg-[#89e051]'],
+ ['Ruby', 'bg-[#701516]'],
+ ['PHP', 'bg-[#4F5D95]'],
+ ['Rust', 'bg-[#dea584]'],
+ ['Swift', 'bg-[#ffac45]'],
+ ['Kotlin', 'bg-[#A97BFF]'],
+ ['Dart', 'bg-[#00B4AB]'],
+ ['Scala', 'bg-[#c22d40]'],
+ ['Objective-C', 'bg-[#438eff]'],
+ ['Vue', 'bg-[#41b883]'],
+ ['R', 'bg-[#198CE7]'],
+ ['Perl', 'bg-[#0298c3]'],
+ ['Haskell', 'bg-[#5e5086]'],
+ ['Lua', 'bg-[#000080]'],
+ ['Matlab', 'bg-[#e16737]'],
+ ['Vim script', 'bg-[#199f4b]'],
+ ['Elixir', 'bg-[#6e4a7e]'],
+ ['Erlang', 'bg-[#B83998]'],
+ ['Clojure', 'bg-[#db5855]'],
+ ['Markdown', 'bg-[#083fa1]'],
+ ['TeX', 'bg-[#3D6117]'],
+ ['SQL', 'bg-[#e38c00]'],
+]);
+
+type SelectLanguagesProps = {
+ languages: string[];
+ selectedLanguages: string[];
+ onSelectLanguage: (language: string) => void;
+};
+
+export function SelectLanguages(props: SelectLanguagesProps) {
+ const { languages, onSelectLanguage, selectedLanguages } = props;
+
+ const dropdownRef = useRef
(null);
+ const [isOpen, setIsOpen] = useState(false);
+
+ useOutsideClick(dropdownRef, () => {
+ setIsOpen(false);
+ });
+
+ return (
+
+ {selectedLanguages.length > 0 && (
+ <>
+ {selectedLanguages.map((language) => (
+
+
+ {language}
+
+ ))}
+ >
+ )}
+
+
+
+
+ {isOpen && (
+
+ {languages.map((language) => {
+ return (
+
+ );
+ })}
+
+ )}
+
+
+ );
+}