- {getGroupedTools().map(([group, tools]) => {
- const isGrpCollapsed = !!mobileCollapsedGroups[group];
- return (
-
-
- {!isGrpCollapsed && tools.map(t => (
- { setActive(t.id); setAppsOpen(false); }} />
- ))}
-
- );
- })}
+
+ {getGroupedTools().map(([group, tools]) => (
+
+
{group.toUpperCase()}
+ {tools.map(t => (
+
0 ? `${t.label} ●` : t.label}
+ onClick={() => { setActive(t.id); setAppsOpen(false); }} />
+ ))}
+
+ ))}
@@ -389,6 +373,10 @@ function BottomNav({ active, setActive, user, onLogout, unreadMsgs=0 }) {
style={{ flex:1, display:'flex', flexDirection:'column', alignItems:'center',
justifyContent:'center', gap:3, background:'transparent', border:'none',
cursor:'pointer', position:'relative', minWidth:0, padding:'0 4px' }}>
+ {isApps && hexWarsTurns>0 && (
+
+ )}
{isApps && unreadMsgs>0 && (
clearInterval(t);
},[user]);
+ useEffect(()=>{
+ if(!user)return;
+ const poll=()=>api('/tools/gebietseroberung/my-turns').then(d=>setHexWarsTurns(d.count||0)).catch(()=>{});
+ poll();
+ const t=setInterval(poll,30*1000);
+ return()=>clearInterval(t);
+ },[user]);
+
const toast=useCallback((msg,type='success')=>{
setToastMsg({msg,type});
setTimeout(()=>setToastMsg({msg:'',type:'success'}),3500);
@@ -3789,7 +3786,7 @@ export default function App() {
{localStorage.removeItem('sk_token');setUser(null);}}
- unreadMsgs={unreadMsgs}/>
+ unreadMsgs={unreadMsgs} hexWarsTurns={hexWarsTurns}/>
)}
{active==='dashboard' && { setUnreadBoard(0); setUnreadPromoted(0); }} unreadChangelog={unreadChangelog} onChangelogRead={()=>setUnreadChangelog(0)} unackedFavs={unackedFavs} onClearUnackedFavs={()=>setUnackedFavs({count:0,isAdmin:false})} user={user}/>}
@@ -3801,7 +3798,7 @@ export default function App() {
{localStorage.removeItem('sk_token');setUser(null);}}
- unreadMsgs={unreadMsgs}/>
+ unreadMsgs={unreadMsgs} hexWarsTurns={hexWarsTurns}/>
)}