Skip to content

Commit 76e6627

Browse files
committed
UX: Fix current channel value on user leave
1 parent b74614b commit 76e6627

2 files changed

Lines changed: 48 additions & 22 deletions

File tree

hooks/useRealtimeStore.ts

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
useUpateServerUserProfile,
2828
useUpdateServerUserProfileByServerUserId,
2929
useStripServerUserAndRoles,
30+
useRemoveProfilesForServerByServerUserId,
3031
} from '@/lib/store';
3132
import { useEffect } from 'react';
3233
import { Database } from '@/types/database.supabase';
@@ -68,6 +69,7 @@ export function useRealtimeStore(supabase: SupabaseClient<Database>) {
6869
const updateServerUserProfile = useUpateServerUserProfile();
6970
const updateServerUserProfileByServerUserId = useUpdateServerUserProfileByServerUserId();
7071
const stripServerUserAndRoles = useStripServerUserAndRoles();
72+
const removeProfilesforServerByServerUserId = useRemoveProfilesForServerByServerUserId();
7173
const allServerProfiles = useAllServerProfiles();
7274
const user = useUser();
7375

@@ -88,36 +90,22 @@ export function useRealtimeStore(supabase: SupabaseClient<Database>) {
8890
filter: `profile_id=eq.${user?.id}`,
8991
},
9092
async (payload) => {
91-
console.log('insert');
93+
console.log('current user joined a server');
9294

9395
addServer(supabase, (payload.new as ServerUser).id);
9496
getRolesForServer(supabase, payload.new.server_id);
95-
updateServerUserProfileByServerUserId(supabase, payload.new.id);
96-
}
97-
)
98-
.on<ServerUser>(
99-
'postgres_changes',
100-
{
101-
event: 'UPDATE',
102-
schema: 'public',
103-
table: 'server_users',
104-
filter: `profile_id=neq.${user?.id}`,
105-
},
106-
async (payload) => {
107-
console.log('Another user joined server');
108-
getAllServerProfilesForServer(supabase, payload.new.server_id);
97+
getAllServerProfilesForServer(supabase, payload.new.id);
10998
}
11099
)
111100
.on<ServerUser>(
112101
'postgres_changes',
113102
{
114103
event: 'UPDATE',
115104
schema: 'public',
116-
table: 'server_users',
117-
filter: `profile_id=eq.${user?.id}`,
105+
table: 'server_users'
118106
},
119107
async (payload) => {
120-
console.log('This user joined server');
108+
console.log('A user updated their server profile');
121109
updateServerUserProfileByServerUserId(supabase, payload.new.id);
122110
}
123111
)
@@ -130,13 +118,15 @@ export function useRealtimeStore(supabase: SupabaseClient<Database>) {
130118
filter: `profile_id=eq.${user?.id}`,
131119
},
132120
async (payload) => {
133-
console.log('remove user from server');
121+
console.log('This user left a server');
134122

135-
//we should try to use the removeServer function from the store but the only resource on the payload is payload.old.id which is the server_user id
136-
//and not the server id
123+
// we should try to use the removeServer function from the store but the only resource
124+
// on the payload is payload.old.id which is the server_user id and not the server id
137125
if (user) {
138126
getServers(supabase, user.id);
139127
}
128+
129+
removeProfilesforServerByServerUserId(payload.old.id!);
140130
}
141131
)
142132
.on<ServerUser>(
@@ -147,7 +137,7 @@ export function useRealtimeStore(supabase: SupabaseClient<Database>) {
147137
table: 'server_users',
148138
},
149139
async (payload) => {
150-
console.log('delete server user (user leaves)');
140+
console.log('Any user left a server');
151141
stripServerUserAndRoles(payload.old.id!);
152142
}
153143
)

lib/store.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,7 @@ export interface ServerProfilesState {
596596
updateServerProfileByServerUser: (supabase: SupabaseClient<Database>, server_user_id: number) => void;
597597
stripServerUserAndRoles: (server_user_id: number) => void;
598598
removeServerProfile: (profile_id: string, server_id: number) => void;
599+
removeProfilesForServerByServerUserId: (server_user_id: number) => void;
599600
}
600601

601602
const useServerProfilesStore = create<ServerProfilesState>()((set) => ({
@@ -696,6 +697,7 @@ const useServerProfilesStore = create<ServerProfilesState>()((set) => ({
696697
if (profile.server_user.id === server_user_id) {
697698
rv.get(server_id)!.get(profile_id)!.server_user = null;
698699
rv.get(server_id)!.get(profile_id)!.roles = null;
700+
break;
699701
}
700702
}
701703
}
@@ -721,6 +723,39 @@ const useServerProfilesStore = create<ServerProfilesState>()((set) => ({
721723
};
722724
});
723725
},
726+
727+
removeProfilesForServerByServerUserId: async (server_user_id) => {
728+
set((state) => {
729+
const rv = new Map(state.serverProfiles);
730+
let _server_id;
731+
732+
// Find the server user
733+
for (const [server_id, profiles] of rv) {
734+
for (const [profile_id, profile] of profiles) {
735+
if (!profile.server_user) {
736+
continue;
737+
}
738+
739+
if (profile.server_user.id === server_user_id) {
740+
_server_id = server_id;
741+
const currChannel = useChannelStore.getState().channel;
742+
743+
if (currChannel && currChannel.server_id === server_id) {
744+
useChannelStore.getState().setChannel(null);
745+
}
746+
747+
break;
748+
}
749+
}
750+
}
751+
752+
if (_server_id) {
753+
rv.delete(_server_id);
754+
}
755+
756+
return { serverProfiles: rv };
757+
});
758+
},
724759
}));
725760

726761
export const useServers = () => useServerStore((state) => state.servers);
@@ -826,6 +861,7 @@ export const useServerUserProfile = (server_id: number, profile_id: string) => u
826861
);
827862
export const useRemoveServerUserProfile = () => useServerProfilesStore((state) => state.removeServerProfile);
828863
export const useStripServerUserAndRoles = () => useServerProfilesStore((state) => state.stripServerUserAndRoles);
864+
export const useRemoveProfilesForServerByServerUserId = () => useServerProfilesStore((state) => state.removeProfilesForServerByServerUserId);
829865
export const useServerUserProfileHighestRolePosition = (server_id: number | null, profile_id: string) => useServerProfilesStore(
830866
(state) => {
831867
if (!server_id) {

0 commit comments

Comments
 (0)