Fix profile language picker
Browse files
app/(app)/profile/LearningLanguagesEditor.tsx
CHANGED
|
@@ -47,51 +47,64 @@ export function LearningLanguagesEditor({
|
|
| 47 |
return (
|
| 48 |
<div className="space-y-4">
|
| 49 |
<div className="flex flex-wrap gap-3">
|
| 50 |
-
{targetLangs.map((lang) =>
|
| 51 |
-
|
| 52 |
-
key={lang}
|
| 53 |
-
className="group relative flex items-center gap-2 rounded-xl border-2 border-black bg-[#FFD21E] px-4 py-2 text-sm font-black text-black shadow-[3px_3px_0px_rgba(0,0,0,1)]"
|
| 54 |
-
>
|
| 55 |
-
{languageName(lang)}
|
| 56 |
-
<button
|
| 57 |
-
onClick={() => updateLangs(targetLangs.filter(l => l !== lang))}
|
| 58 |
-
disabled={isPending || targetLangs.length <= 1}
|
| 59 |
-
className="ml-1 p-0.5 rounded-md hover:bg-black/10 transition-colors disabled:opacity-0 disabled:pointer-events-none"
|
| 60 |
-
>
|
| 61 |
-
<X size={14} strokeWidth={3} />
|
| 62 |
-
</button>
|
| 63 |
-
</div>
|
| 64 |
-
))}
|
| 65 |
-
|
| 66 |
-
<div className="relative">
|
| 67 |
-
<button
|
| 68 |
-
onClick={() => setIsAdding(!isAdding)}
|
| 69 |
-
disabled={isPending}
|
| 70 |
-
className="flex items-center justify-center h-10 w-10 rounded-xl border-2 border-black bg-white text-black shadow-[3px_3px_0px_rgba(0,0,0,1)] hover:translate-x-[-2px] hover:translate-y-[-2px] hover:shadow-[5px_5px_0px_rgba(0,0,0,1)] active:translate-x-[1px] active:translate-y-[1px] active:shadow-[1px_1px_0px_rgba(0,0,0,1)] transition-all disabled:opacity-50"
|
| 71 |
-
>
|
| 72 |
-
<Plus size={20} strokeWidth={3} className={`transition-transform duration-200 ${isAdding ? "rotate-45" : ""}`} />
|
| 73 |
-
</button>
|
| 74 |
|
| 75 |
-
|
| 76 |
-
<div
|
| 77 |
-
{
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
)}
|
| 91 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
)}
|
| 93 |
</div>
|
| 94 |
-
|
| 95 |
|
| 96 |
{isPending && (
|
| 97 |
<div className="text-[10px] font-black uppercase tracking-widest text-[#0EA5A4] animate-pulse">
|
|
|
|
| 47 |
return (
|
| 48 |
<div className="space-y-4">
|
| 49 |
<div className="flex flex-wrap gap-3">
|
| 50 |
+
{targetLangs.map((lang) => {
|
| 51 |
+
const label = languageName(lang);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
|
| 53 |
+
return (
|
| 54 |
+
<div
|
| 55 |
+
key={lang}
|
| 56 |
+
className="group relative flex items-center gap-2 rounded-xl border-2 border-black bg-[#FFD21E] px-4 py-2 text-sm font-black text-black shadow-[3px_3px_0px_rgba(0,0,0,1)]"
|
| 57 |
+
>
|
| 58 |
+
{label}
|
| 59 |
+
<button
|
| 60 |
+
type="button"
|
| 61 |
+
aria-label={`Remove ${label} from learning languages`}
|
| 62 |
+
onClick={() => updateLangs(targetLangs.filter((l) => l !== lang))}
|
| 63 |
+
disabled={isPending || targetLangs.length <= 1}
|
| 64 |
+
className="ml-1 p-0.5 rounded-md hover:bg-black/10 transition-colors disabled:opacity-0 disabled:pointer-events-none"
|
| 65 |
+
>
|
| 66 |
+
<X size={14} strokeWidth={3} />
|
| 67 |
+
</button>
|
|
|
|
| 68 |
</div>
|
| 69 |
+
);
|
| 70 |
+
})}
|
| 71 |
+
|
| 72 |
+
<button
|
| 73 |
+
type="button"
|
| 74 |
+
aria-controls="learning-language-options"
|
| 75 |
+
aria-expanded={isAdding}
|
| 76 |
+
aria-label={isAdding ? "Close language picker" : "Add a learning language"}
|
| 77 |
+
onClick={() => setIsAdding(!isAdding)}
|
| 78 |
+
disabled={isPending}
|
| 79 |
+
className="flex h-10 w-10 items-center justify-center rounded-xl border-2 border-black bg-white text-black shadow-[3px_3px_0px_rgba(0,0,0,1)] transition-all hover:translate-x-[-2px] hover:translate-y-[-2px] hover:shadow-[5px_5px_0px_rgba(0,0,0,1)] active:translate-x-[1px] active:translate-y-[1px] active:shadow-[1px_1px_0px_rgba(0,0,0,1)] disabled:opacity-50"
|
| 80 |
+
>
|
| 81 |
+
<Plus size={20} strokeWidth={3} className={`transition-transform duration-200 ${isAdding ? "rotate-45" : ""}`} />
|
| 82 |
+
</button>
|
| 83 |
+
</div>
|
| 84 |
+
|
| 85 |
+
{isAdding && (
|
| 86 |
+
<div
|
| 87 |
+
id="learning-language-options"
|
| 88 |
+
className="max-h-64 w-full overflow-y-auto rounded-xl border-2 border-black bg-white p-1 shadow-[6px_6px_0px_rgba(0,0,0,1)]"
|
| 89 |
+
>
|
| 90 |
+
{availableLangs.length > 0 ? (
|
| 91 |
+
availableLangs.map((lang) => (
|
| 92 |
+
<button
|
| 93 |
+
key={lang.code}
|
| 94 |
+
type="button"
|
| 95 |
+
aria-label={`Add ${lang.name} to learning languages`}
|
| 96 |
+
onClick={() => updateLangs([...targetLangs, lang.code])}
|
| 97 |
+
className="flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-sm font-bold text-black transition-colors hover:bg-[#F3F4F6]"
|
| 98 |
+
>
|
| 99 |
+
<ReactCountryFlag countryCode={lang.flag} svg style={{ width: "1.1rem", height: "1.1rem" }} />
|
| 100 |
+
<span>{lang.name}</span>
|
| 101 |
+
</button>
|
| 102 |
+
))
|
| 103 |
+
) : (
|
| 104 |
+
<div className="px-3 py-2 text-xs font-bold italic text-gray-500">No more languages</div>
|
| 105 |
)}
|
| 106 |
</div>
|
| 107 |
+
)}
|
| 108 |
|
| 109 |
{isPending && (
|
| 110 |
<div className="text-[10px] font-black uppercase tracking-widest text-[#0EA5A4] animate-pulse">
|