diff --git a/lib/actions/user-actions.js b/lib/actions/user-actions.js --- a/lib/actions/user-actions.js +++ b/lib/actions/user-actions.js @@ -78,10 +78,7 @@ SubscriptionUpdateRequest, SubscriptionUpdateResult, } from '../types/subscription-types.js'; -import { - thickThreadTypes, - threadTypeIsThick, -} from '../types/thread-types-enum.js'; +import { thickThreadTypes } from '../types/thread-types-enum.js'; import type { RawThreadInfos } from '../types/thread-types.js'; import { userActionsP2PMessageTypes, @@ -1209,9 +1206,20 @@ }; }; -function useUpdateSubscription( - threadInfo: ThreadInfo, -): (input: SubscriptionUpdateRequest) => Promise { +type UseUpdateSubscriptionInput = $ReadOnly< + | { + +thick: false, + ...SubscriptionUpdateRequest, + } + | { + +thick: true, + +threadInfo: ThreadInfo, + ...SubscriptionUpdateRequest, + }, +>; +function useUpdateSubscription(): ( + input: UseUpdateSubscriptionInput, +) => Promise { const processAndSendDMOperation = useProcessAndSendDMOperation(); const viewerID = useSelector( state => state.currentUserInfo && state.currentUserInfo.id, @@ -1219,16 +1227,20 @@ const keyserverCall = useKeyserverCall(updateSubscription); return React.useCallback( - async (input: SubscriptionUpdateRequest) => { - if (!threadTypeIsThick(threadInfo.type)) { - return await keyserverCall(input); + async (input: UseUpdateSubscriptionInput) => { + if (!input.thick) { + const { thick, ...rest } = input; + return await keyserverCall({ ...rest }); } invariant(viewerID, 'viewerID must be set'); + + const { threadInfo, updatedFields } = input; const subscription = { ...threadInfo.currentUser.subscription, - ...input.updatedFields, + ...updatedFields, }; + const op: DMChangeThreadSubscriptionOperation = { type: 'change_thread_subscription', time: Date.now(), @@ -1253,7 +1265,7 @@ await processAndSendDMOperation(opSpecification); return { threadID: threadInfo.id, subscription }; }, - [keyserverCall, processAndSendDMOperation, viewerID, threadInfo], + [keyserverCall, processAndSendDMOperation, viewerID], ); } diff --git a/lib/shared/thread-settings-notifications-utils.js b/lib/shared/thread-settings-notifications-utils.js --- a/lib/shared/thread-settings-notifications-utils.js +++ b/lib/shared/thread-settings-notifications-utils.js @@ -11,6 +11,7 @@ import { createLoadingStatusSelector } from '../selectors/loading-selectors.js'; import { threadInfoSelector } from '../selectors/thread-selectors.js'; import type { ThreadInfo } from '../types/minimally-encoded-thread-permissions-types.js'; +import { threadTypeIsThick } from '../types/thread-types-enum.js'; import { useDispatchActionPromise } from '../utils/redux-promise-utils.js'; import { useSelector } from '../utils/redux-utils.js'; @@ -102,16 +103,28 @@ const dispatchActionPromise = useDispatchActionPromise(); - const callUpdateSubscription = useUpdateSubscription(threadInfo); + const callUpdateSubscription = useUpdateSubscription(); const updateSubscriptionPromise = React.useCallback(async () => { - const res = await callUpdateSubscription({ + const updateSubscriptionRequest = { threadID: threadInfo.id, updatedFields: { home: notificationSettings !== 'muted', pushNotifs: notificationSettings === 'home', }, - }); + }; + const updateSubscriptionInput = threadTypeIsThick(threadInfo.type) + ? { + thick: true, + threadInfo, + ...updateSubscriptionRequest, + } + : { + thick: false, + ...updateSubscriptionRequest, + }; + + const res = await callUpdateSubscription(updateSubscriptionInput); onSuccessCallback(); @@ -120,7 +133,7 @@ callUpdateSubscription, notificationSettings, onSuccessCallback, - threadInfo.id, + threadInfo, ]); const updateSubscriptionLoadingStatus = useSelector(