fix: show admin in contacts list when contact verification is enabled
- Add addUsers action to users slice for non-destructive store merge - Populate missing contact users from target_info in getContacts handler - Always show admin users in useFilteredUsers regardless of contact status
This commit is contained in:
+25
-11
@@ -16,7 +16,7 @@ import {
|
|||||||
} from "@/types/user";
|
} from "@/types/user";
|
||||||
import BASE_URL, { ContentTypes } from "../config";
|
import BASE_URL, { ContentTypes } from "../config";
|
||||||
import { updateAutoDeleteSetting, updateMute } from "../slices/footprint";
|
import { updateAutoDeleteSetting, updateMute } from "../slices/footprint";
|
||||||
import { fillUsers, updateContactStatus as updateStatus } from "../slices/users";
|
import { addUsers, fillUsers, updateContactStatus as updateStatus } from "../slices/users";
|
||||||
import { RootState } from "../store";
|
import { RootState } from "../store";
|
||||||
// import toast from "react-hot-toast";
|
// import toast from "react-hot-toast";
|
||||||
import baseQuery from "./base.query";
|
import baseQuery from "./base.query";
|
||||||
@@ -65,17 +65,31 @@ export const userApi = createApi({
|
|||||||
}),
|
}),
|
||||||
getContacts: builder.query<ContactResponse[], void>({
|
getContacts: builder.query<ContactResponse[], void>({
|
||||||
query: () => ({ url: `/user/contacts` }),
|
query: () => ({ url: `/user/contacts` }),
|
||||||
async onQueryStarted(data, { dispatch, queryFulfilled }) {
|
async onQueryStarted(data, { dispatch, queryFulfilled, getState }) {
|
||||||
try {
|
try {
|
||||||
const { data: users } = await queryFulfilled;
|
const { data: contacts } = await queryFulfilled;
|
||||||
const payloads = users.map((c) => {
|
|
||||||
const uid = c.target_uid;
|
// Fill user data for any contact whose user entry is missing from the store
|
||||||
const status = c.contact_info.status;
|
// (e.g. /user endpoint may not return all users to non-admin users)
|
||||||
return {
|
const missingUsers = contacts
|
||||||
uid,
|
.filter((c) => !(getState() as RootState).users.byId[c.target_uid])
|
||||||
status,
|
.map((c) => ({
|
||||||
};
|
...c.target_info,
|
||||||
});
|
avatar:
|
||||||
|
c.target_info.avatar_updated_at === 0
|
||||||
|
? ""
|
||||||
|
: `${BASE_URL}/resource/avatar?uid=${c.target_uid}&t=${c.target_info.avatar_updated_at}`,
|
||||||
|
status: c.contact_info.status,
|
||||||
|
}));
|
||||||
|
|
||||||
|
if (missingUsers.length > 0) {
|
||||||
|
dispatch(addUsers(missingUsers));
|
||||||
|
}
|
||||||
|
|
||||||
|
const payloads = contacts.map((c) => ({
|
||||||
|
uid: c.target_uid,
|
||||||
|
status: c.contact_info.status,
|
||||||
|
}));
|
||||||
dispatch(updateStatus(payloads));
|
dispatch(updateStatus(payloads));
|
||||||
} catch {
|
} catch {
|
||||||
console.log("get contact list error");
|
console.log("get contact list error");
|
||||||
|
|||||||
+12
-1
@@ -100,6 +100,17 @@ const usersSlice = createSlice({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
// Merge users into store without overwriting existing entries
|
||||||
|
addUsers(state, action: PayloadAction<StoredUser[]>) {
|
||||||
|
const users = action.payload || [];
|
||||||
|
users.forEach((user) => {
|
||||||
|
const { uid } = user;
|
||||||
|
if (!state.byId[uid]) {
|
||||||
|
state.byId[uid] = user;
|
||||||
|
state.ids.push(uid);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
updateContactStatus(
|
updateContactStatus(
|
||||||
state,
|
state,
|
||||||
action: PayloadAction<
|
action: PayloadAction<
|
||||||
@@ -116,6 +127,6 @@ const usersSlice = createSlice({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
export const { updateContactStatus, resetUsers, fillUsers, updateUsersByLogs, updateUsersStatus } =
|
export const { updateContactStatus, resetUsers, fillUsers, updateUsersByLogs, updateUsersStatus, addUsers } =
|
||||||
usersSlice.actions;
|
usersSlice.actions;
|
||||||
export default usersSlice.reducer;
|
export default usersSlice.reducer;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export default function useFilteredUsers() {
|
|||||||
);
|
);
|
||||||
const [filteredUsers, setFilteredUsers] = useState<StoredUser[]>([]);
|
const [filteredUsers, setFilteredUsers] = useState<StoredUser[]>([]);
|
||||||
const useContactList = enableContact && !isAdmin;
|
const useContactList = enableContact && !isAdmin;
|
||||||
const users = useContactList ? originUsers.filter((u) => u.status == "added") : originUsers;
|
const users = useContactList ? originUsers.filter((u) => u.status == "added" || u.is_admin) : originUsers;
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!input) {
|
if (!input) {
|
||||||
setFilteredUsers(sortUsersByRole(users));
|
setFilteredUsers(sortUsersByRole(users));
|
||||||
|
|||||||
Reference in New Issue
Block a user