Skip to content

Commit 1ecbd61

Browse files
Merge branch 'staging'
2 parents 4543182 + 10f0acb commit 1ecbd61

File tree

37 files changed

+544
-160
lines changed

37 files changed

+544
-160
lines changed

src/pages/Auth/store/saga.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ const resetGlobalData = (fullReset: boolean) => {
300300
}
301301
store.dispatch(inboxActions.resetInbox());
302302
store.dispatch(cacheActions.resetFeedStates());
303+
store.dispatch(cacheActions.resetDiscussionMessagesStates());
303304
store.dispatch(commonActions.resetCommon());
304305
};
305306

src/pages/OldCommon/hooks/useCommonMembers.ts

Lines changed: 151 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
import { useCallback } from "react";
1+
import { useCallback, useEffect, useRef, useState } from "react";
22
import { useDispatch, useSelector } from "react-redux";
3+
import { CommonService, Logger, UserService } from "@/services";
4+
import { store } from "@/shared/appConfig";
35
import { LoadingState } from "@/shared/interfaces";
4-
import { CommonMemberWithUserInfo } from "@/shared/models";
6+
import { CommonMember, CommonMemberWithUserInfo, User } from "@/shared/models";
57
import {
68
cacheActions,
79
selectCommonMembersStateByCommonId,
10+
selectUserStates,
811
} from "@/store/states";
9-
import { getCommonMembers } from "../store/actions";
1012

1113
interface Options {
1214
commonId?: string;
@@ -16,7 +18,7 @@ type State = LoadingState<CommonMemberWithUserInfo[]>;
1618

1719
interface Return extends State {
1820
fetchCommonMembers: (circleVisibility?: string[]) => void;
19-
setCommonMembers: (commonMembers: CommonMemberWithUserInfo[]) => void;
21+
setCommonMembers: (commonMembers: CommonMember[]) => void;
2022
}
2123

2224
const DEFAULT_STATE: State = {
@@ -27,47 +29,170 @@ const DEFAULT_STATE: State = {
2729

2830
export const useCommonMembers = ({ commonId }: Options): Return => {
2931
const dispatch = useDispatch();
30-
31-
const state =
32+
const commonMembersState =
3233
useSelector(selectCommonMembersStateByCommonId(commonId)) || DEFAULT_STATE;
34+
const [state, setState] = useState<State>({
35+
loading: false,
36+
fetched: false,
37+
data: [],
38+
});
39+
const stateRef = useRef(state);
40+
stateRef.current = state;
3341

3442
const fetchCommonMembers = useCallback(
35-
(circleVisibility: string[] = []) => {
43+
async (circleVisibility: string[] = []) => {
3644
if (!commonId) {
3745
return;
3846
}
3947

40-
dispatch(
41-
getCommonMembers.request({
42-
payload: { commonId, circleVisibility },
43-
callback: (error, commonMembers) => {
44-
if (!error) {
45-
dispatch(
46-
cacheActions.updateCommonMembersByCommonId({
47-
commonId,
48-
commonMembers: commonMembers ?? [],
49-
}),
50-
);
51-
}
52-
},
53-
}),
54-
);
48+
await new Promise((resolve) => setTimeout(resolve, 0));
49+
50+
if (stateRef.current.data.length === 0) {
51+
setState({
52+
loading: true,
53+
fetched: false,
54+
data: [],
55+
});
56+
}
57+
58+
try {
59+
const commonMembers = await CommonService.getCommonMembers(
60+
commonId,
61+
circleVisibility,
62+
);
63+
dispatch(
64+
cacheActions.updateCommonMembersByCommonId({
65+
commonId,
66+
commonMembers,
67+
}),
68+
);
69+
} catch (err) {
70+
Logger.error(err);
71+
72+
if (stateRef.current.data.length === 0) {
73+
setState({
74+
loading: false,
75+
fetched: true,
76+
data: [],
77+
});
78+
}
79+
}
5580
},
56-
[dispatch, commonId],
81+
[dispatch, commonId, stateRef],
5782
);
5883

5984
const setCommonMembers = useCallback(
60-
(commonMembers: CommonMemberWithUserInfo[]) => {
85+
(commonMembers: CommonMember[] = []) => {
6186
dispatch(
6287
cacheActions.updateCommonMembersByCommonId({
6388
commonId,
64-
commonMembers: commonMembers ?? [],
89+
commonMembers,
6590
}),
6691
);
6792
},
68-
[commonId],
93+
[dispatch, commonId],
6994
);
7095

96+
useEffect(() => {
97+
const commonMembers = commonMembersState.data;
98+
99+
if (!commonMembers) {
100+
return;
101+
}
102+
if (commonMembers.length === 0) {
103+
setState({
104+
loading: false,
105+
fetched: true,
106+
data: [],
107+
});
108+
return;
109+
}
110+
111+
(async () => {
112+
try {
113+
const cachedUserStates = selectUserStates()(store.getState());
114+
const hasUsersFromCache = commonMembers.some(
115+
({ userId }) => cachedUserStates[userId]?.data,
116+
);
117+
let userIdsToFetch = commonMembers.reduce<string[]>(
118+
(acc, { userId }) =>
119+
cachedUserStates[userId]?.data ? acc : [...acc, userId],
120+
[],
121+
);
122+
123+
if (hasUsersFromCache) {
124+
setState((prevState) => {
125+
const finalCommonMembers = commonMembers.reduce<
126+
CommonMemberWithUserInfo[]
127+
>((acc, commonMember) => {
128+
const existingCommonMember = prevState.data.find(
129+
({ id }) => id === commonMember.id,
130+
);
131+
132+
if (existingCommonMember) {
133+
return [...acc, existingCommonMember];
134+
}
135+
136+
const user = cachedUserStates[commonMember.userId]?.data;
137+
138+
return user ? [...acc, { ...commonMember, user }] : acc;
139+
}, []);
140+
141+
return {
142+
loading: false,
143+
fetched: true,
144+
data: finalCommonMembers,
145+
};
146+
});
147+
} else {
148+
userIdsToFetch = commonMembers.map(({ userId }) => userId);
149+
}
150+
151+
if (userIdsToFetch.length === 0) {
152+
return;
153+
}
154+
155+
const fetchedUsers = (
156+
await UserService.getUsersByIds(userIdsToFetch)
157+
).filter((user): user is User => Boolean(user));
158+
159+
setState((prevState) => {
160+
const finalCommonMembers = commonMembers.reduce<
161+
CommonMemberWithUserInfo[]
162+
>((acc, commonMember) => {
163+
const existingCommonMember = prevState.data.find(
164+
({ id }) => id === commonMember.id,
165+
);
166+
167+
if (existingCommonMember) {
168+
return [...acc, existingCommonMember];
169+
}
170+
171+
const user = fetchedUsers.find(
172+
({ uid }) => uid === commonMember.userId,
173+
);
174+
175+
return user ? [...acc, { ...commonMember, user }] : acc;
176+
}, []);
177+
178+
return {
179+
loading: false,
180+
fetched: true,
181+
data: finalCommonMembers,
182+
};
183+
});
184+
dispatch(cacheActions.updateUserStates(fetchedUsers));
185+
} catch (err) {
186+
Logger.error(err);
187+
setState((prevState) => ({
188+
loading: false,
189+
fetched: true,
190+
data: prevState.data,
191+
}));
192+
}
193+
})();
194+
}, [commonMembersState.data]);
195+
71196
return {
72197
...state,
73198
data: state.data || DEFAULT_STATE.data,

src/pages/common/components/ChatComponent/components/ChatContent/ChatContent.tsx

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
QueryParamKey,
2020
LOADER_APPEARANCE_DELAY,
2121
} from "@/shared/constants";
22-
import { useQueryParams } from "@/shared/hooks";
22+
import { useMemoizedFunction, useQueryParams } from "@/shared/hooks";
2323
import { useIsTabletView } from "@/shared/hooks/viewport";
2424
import { ModalTransition } from "@/shared/interfaces";
2525
import {
@@ -181,21 +181,25 @@ const ChatContent: ForwardRefRenderFunction<
181181
}
182182
}, [shouldScrollToElementId, discussionMessages]);
183183

184-
async function scrollToRepliedMessage(messageId: string, endDate: Date) {
185-
await fetchReplied(messageId, endDate);
186-
setShouldScrollToElementId(messageId);
187-
}
184+
const scrollToRepliedMessage = useMemoizedFunction(
185+
async (messageId: string, endDate: Date) => {
186+
await fetchReplied(messageId, endDate);
187+
setShouldScrollToElementId(messageId);
188+
},
189+
);
188190

189-
function scrollToRepliedMessageDMChat(messageId: string) {
190-
scroller.scrollTo(messageId, {
191-
containerId: chatWrapperId,
192-
delay: 0,
193-
duration: 300,
194-
offset: -100,
195-
smooth: true,
196-
});
197-
setHighlightedMessageId(messageId);
198-
}
191+
const scrollToRepliedMessageDMChat = useMemoizedFunction(
192+
(messageId: string) => {
193+
scroller.scrollTo(messageId, {
194+
containerId: chatWrapperId,
195+
delay: 0,
196+
duration: 300,
197+
offset: -100,
198+
smooth: true,
199+
});
200+
setHighlightedMessageId(messageId);
201+
},
202+
);
199203

200204
useEffect(() => {
201205
if (typeof messageIdParam === "string") {

src/pages/common/components/ChatComponent/components/ChatFilePreview/ChatFilePreview.module.scss

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,14 @@
88
}
99

1010
.wrapper {
11-
overflow-x: scroll;
11+
overflow-x: auto;
1212
display: flex;
1313
width: 100%;
1414
}
1515

1616
.filePreviewWrapper {
1717
position: relative;
1818
margin: 1rem 0.5rem 0;
19-
height: 6.25rem;
2019
}
2120

2221
.filePreview {

src/pages/common/components/CommonTabPanels/components/FeedTab/components/NewDiscussionCreation/NewDiscussionCreation.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { FC, useCallback, useMemo } from "react";
1+
import React, { FC, useCallback, useEffect, useMemo } from "react";
22
import { useDispatch, useSelector } from "react-redux";
33
import { selectUser } from "@/pages/Auth/store/selectors";
44
import {
@@ -33,6 +33,7 @@ interface NewDiscussionCreationProps {
3333
isModalVariant?: boolean;
3434
edit?: boolean;
3535
defaultVisibility?: string;
36+
onDiscussionIdChange?: () => void;
3637
}
3738

3839
interface InitialValues {
@@ -52,6 +53,7 @@ const NewDiscussionCreation: FC<NewDiscussionCreationProps> = (props) => {
5253
isModalVariant = false,
5354
edit,
5455
defaultVisibility,
56+
onDiscussionIdChange,
5557
} = props;
5658
const dispatch = useDispatch();
5759
const discussionCreationData = useSelector(selectDiscussionCreationData);
@@ -132,6 +134,12 @@ const NewDiscussionCreation: FC<NewDiscussionCreationProps> = (props) => {
132134
[governanceCircles, userCircleIds, userId, common.id, edit],
133135
);
134136

137+
useEffect(() => {
138+
if (discussionCreationData?.id) {
139+
onDiscussionIdChange?.();
140+
}
141+
}, [discussionCreationData?.id]);
142+
135143
if (
136144
isModalVariant &&
137145
typeof commonImage === "string" &&

src/pages/common/components/DiscussionFeedCard/DiscussionFeedCard.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ const DiscussionFeedCard = forwardRef<FeedItemRef, DiscussionFeedCardProps>(
222222
const commonNotion = outerCommonNotion ?? common?.notion;
223223

224224
const handleOpenChat = useCallback(() => {
225-
if (discussion) {
225+
if (discussion && !isPreviewMode) {
226226
setChatItem({
227227
feedItemId: item.id,
228228
discussion,
@@ -254,6 +254,7 @@ const DiscussionFeedCard = forwardRef<FeedItemRef, DiscussionFeedCardProps>(
254254
feedItemUserMetadata?.seen,
255255
feedItemUserMetadata?.hasUnseenMention,
256256
nestedItemData,
257+
isPreviewMode,
257258
]);
258259

259260
const onDiscussionDelete = useCallback(async () => {

src/pages/common/components/ProposalFeedCard/ProposalFeedCard.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ const ProposalFeedCard = forwardRef<FeedItemRef, ProposalFeedCardProps>(
312312
}, [isActive, cardTitle]);
313313

314314
const handleOpenChat = useCallback(() => {
315-
if (discussion && proposal) {
315+
if (discussion && proposal && !isPreviewMode) {
316316
setChatItem({
317317
feedItemId: item.id,
318318
discussion,
@@ -345,6 +345,7 @@ const ProposalFeedCard = forwardRef<FeedItemRef, ProposalFeedCardProps>(
345345
feedItemUserMetadata?.seen,
346346
feedItemUserMetadata?.hasUnseenMention,
347347
nestedItemData,
348+
isPreviewMode,
348349
]);
349350

350351
useEffect(() => {

0 commit comments

Comments
 (0)