@@ -144,6 +144,7 @@ export const Profile = () => {
144144 const [ updating , setUpdating ] = useState ( false ) ;
145145
146146 const [ isEditModalOpen , setIsEditModalOpen ] = useState ( false ) ;
147+ const [ badgeSort , setBadgeSort ] = useState ( "Default" ) ;
147148 const [ isEmbedModalOpen , setIsEmbedModalOpen ] = useState ( false ) ;
148149 const [ editName , setEditName ] = useState ( "" ) ;
149150 const [ editAvatar , setEditAvatar ] = useState ( "" ) ;
@@ -2223,8 +2224,33 @@ export const Profile = () => {
22232224 < Award className = "w-5 h-5 text-violet-500" />
22242225 </ div >
22252226
2226- < div className = "grid grid-cols-1 sm:grid-cols-2 gap-4 my-6" >
2227- { systemBadges . map ( ( badge ) => {
2227+ { /* Issue #617: Badge sort controls */ }
2228+ { isOwnProfile && (
2229+ < div className = "flex items-center gap-2 mt-4 mb-2 flex-wrap" >
2230+ < span className = "text-[10px] font-bold text-slate-400 uppercase tracking-wider" > Sort:</ span >
2231+ { [ "Default" , "Unlocked First" , "Locked First" ] . map ( ( opt ) => (
2232+ < button
2233+ key = { opt }
2234+ onClick = { ( ) => setBadgeSort ( opt ) }
2235+ className = { `px-2.5 py-1 text-[10px] font-bold rounded-lg border transition-all cursor-pointer ${
2236+ badgeSort === opt
2237+ ? "bg-violet-600 border-violet-600 text-white"
2238+ : "border-slate-200 dark:border-slate-800 text-slate-500 hover:bg-slate-100 dark:hover:bg-slate-800"
2239+ } `}
2240+ >
2241+ { opt }
2242+ </ button >
2243+ ) ) }
2244+ </ div >
2245+ ) }
2246+ < div className = "grid grid-cols-1 sm:grid-cols-2 gap-4 my-4" >
2247+ { [ ...systemBadges ] . sort ( ( a , b ) => {
2248+ const aUnlocked = a . id === "b1" || ( a . id === "b2" && gitRankPoints >= 100 ) || ( a . id === "b3" && streak >= 10 ) || ( a . id === "b4" && codingVersePoints >= 100 ) || ( a . id === "b5" && referralPoints >= 1000 ) ;
2249+ const bUnlocked = b . id === "b1" || ( b . id === "b2" && gitRankPoints >= 100 ) || ( b . id === "b3" && streak >= 10 ) || ( b . id === "b4" && codingVersePoints >= 100 ) || ( b . id === "b5" && referralPoints >= 1000 ) ;
2250+ if ( badgeSort === "Unlocked First" ) return aUnlocked === bUnlocked ? 0 : aUnlocked ? - 1 : 1 ;
2251+ if ( badgeSort === "Locked First" ) return aUnlocked === bUnlocked ? 0 : aUnlocked ? 1 : - 1 ;
2252+ return 0 ;
2253+ } ) . map ( ( badge ) => {
22282254 let unlocked = false ;
22292255 if ( badge . id === "b1" ) unlocked = true ;
22302256 if ( badge . id === "b2" && gitRankPoints >= 100 ) unlocked = true ;
0 commit comments