feat: restore last active channel on login

- Channel store saves {serverId, channelId} to localStorage on select
- ServerBar restores last server+channel after fetching servers
- Fetches channels for the saved server, then sets the channel if valid
- Gracefully handles missing/deleted servers or channels
This commit is contained in:
2026-07-02 15:44:55 -04:00
parent b4e2f97dba
commit ed50815902
2 changed files with 35 additions and 3 deletions
+22 -2
View File
@@ -34,8 +34,28 @@ export function ServerBar() {
const { showMenu, MenuPortal } = useContextMenu();
useEffect(() => {
fetchServers();
}, [fetchServers]);
fetchServers().then(() => {
// ponytail: restore last active server + channel from localStorage
try {
const raw = localStorage.getItem('dumpster:lastChannel');
if (raw) {
const { serverId, channelId } = JSON.parse(raw);
const srv = useServerStore.getState().servers.find((s) => s.id === serverId);
if (srv) {
setActiveServer(serverId);
setDM(false);
// Fetch channels then restore the channel
useChannelStore.getState().fetchChannels(serverId).then(() => {
const ch = useChannelStore.getState().channelsByServer[serverId]?.find((c) => c.id === channelId);
if (ch) {
setActiveChannel(channelId);
}
});
}
}
} catch { /* ignore bad localStorage */ }
});
}, [fetchServers, setActiveServer, setActiveChannel, setDM]);
const handleSelect = (id: string) => {
setActiveServer(id);
+13 -1
View File
@@ -48,7 +48,19 @@ export const useChannelStore = create<ChannelState>((set) => ({
}
},
setActiveChannel: (id) => set({ activeChannelId: id }),
setActiveChannel: (id) => {
set({ activeChannelId: id });
if (id) {
// ponytail: persist last active channel for session restore
const state = useChannelStore.getState();
for (const [serverId, channels] of Object.entries(state.channelsByServer)) {
if (channels.some((c) => c.id === id)) {
localStorage.setItem('dumpster:lastChannel', JSON.stringify({ serverId, channelId: id }));
break;
}
}
}
},
addChannel: (channel) =>
set((state) => {