fix: cleanup releasedFeature slice

pull/3281/head
Audric Ackermann 10 months ago
parent ccd41f6bdc
commit 28e1d9fe44
No known key found for this signature in database

@ -40,7 +40,7 @@ window.saveLog = additionalText => ipc.send('save-debug-log', additionalText);
window.sessionFeatureFlags = { window.sessionFeatureFlags = {
useOnionRequests: true, useOnionRequests: true,
useTestNet: isTestNet() || isTestIntegration(), useTestNet: isTestNet() || isTestIntegration(),
useClosedGroupV2: true, // TODO DO NOT MERGE Remove after QA useClosedGroupV2: false, // TODO DO NOT MERGE Remove after QA
forceLegacyGroupsDeprecated: false, // TODO DO NOT MERGE Remove after QA forceLegacyGroupsDeprecated: false, // TODO DO NOT MERGE Remove after QA
useClosedGroupV2QAButtons: true, // TODO DO NOT MERGE Remove after QA useClosedGroupV2QAButtons: true, // TODO DO NOT MERGE Remove after QA
replaceLocalizedStringsWithKeys: false, replaceLocalizedStringsWithKeys: false,

@ -4,7 +4,7 @@ import { DURATION } from '../session/constants';
import { updateLegacyGroupDeprecationTimestampUpdatedAt } from '../state/ducks/releasedFeatures'; import { updateLegacyGroupDeprecationTimestampUpdatedAt } from '../state/ducks/releasedFeatures';
import { NetworkTime } from '../util/NetworkTime'; import { NetworkTime } from '../util/NetworkTime';
import { PubKey } from '../session/types'; import { PubKey } from '../session/types';
import { areLegacyGroupsDeprecatedYet } from '../state/selectors/releasedFeatures'; import { areLegacyGroupsReadOnly } from '../state/selectors/releasedFeatures';
import { useSelectedConversationKey } from '../state/selectors/selectedConversation'; import { useSelectedConversationKey } from '../state/selectors/selectedConversation';
import type { StateType } from '../state/reducer'; import type { StateType } from '../state/reducer';
import { ConversationTypeEnum } from '../models/types'; import { ConversationTypeEnum } from '../models/types';
@ -27,7 +27,7 @@ export function getDisableLegacyGroupDeprecatedActions(state: StateType, convoId
if (!selectedConvoIsGroup) { if (!selectedConvoIsGroup) {
return false; return false;
} }
const legacyGroupDeprecated = areLegacyGroupsDeprecatedYet(); const legacyGroupDeprecated = areLegacyGroupsReadOnly();
// here we have // here we have
// - a valid convoId // - a valid convoId
// - that starts with 05 // - that starts with 05

@ -58,7 +58,7 @@ import {
} from './types'; } from './types';
import { ConversationTypeEnum } from '../../../models/types'; import { ConversationTypeEnum } from '../../../models/types';
import { Snode } from '../../../data/types'; import { Snode } from '../../../data/types';
import { areLegacyGroupsDeprecatedYetOutsideRedux } from '../../../state/selectors/releasedFeatures'; import { areLegacyGroupsReadOnlyOutsideRedux } from '../../../state/selectors/releasedFeatures';
const minMsgCountShouldRetry = 95; const minMsgCountShouldRetry = 95;
/** /**
@ -297,7 +297,7 @@ export class SwarmPolling {
.filter(m => !allGroupsInWrapper.some(w => w.pubkeyHex === m.pubkey.key)) .filter(m => !allGroupsInWrapper.some(w => w.pubkeyHex === m.pubkey.key))
.map(entryToKey); .map(entryToKey);
const legacyGroupDeprecatedDisabled = areLegacyGroupsDeprecatedYetOutsideRedux(); const legacyGroupDeprecatedDisabled = areLegacyGroupsReadOnlyOutsideRedux();
const allLegacyGroupsTracked = legacyGroupDeprecatedDisabled const allLegacyGroupsTracked = legacyGroupDeprecatedDisabled
? [] ? []

@ -59,8 +59,6 @@ export type GroupState = {
members: Record<GroupPubkeyType, Array<GroupMemberGet>>; members: Record<GroupPubkeyType, Array<GroupMemberGet>>;
memberChangesFromUIPending: boolean; memberChangesFromUIPending: boolean;
nameChangesFromUIPending: boolean; nameChangesFromUIPending: boolean;
membersInviteSending: Record<GroupPubkeyType, Array<PubkeyType>>;
membersPromoteSending: Record<GroupPubkeyType, Array<PubkeyType>>;
// those are group creation-related fields // those are group creation-related fields
creationFromUIPending: boolean; creationFromUIPending: boolean;
@ -74,8 +72,6 @@ export const initialGroupState: GroupState = {
creationFromUIPending: false, creationFromUIPending: false,
memberChangesFromUIPending: false, memberChangesFromUIPending: false,
nameChangesFromUIPending: false, nameChangesFromUIPending: false,
membersInviteSending: {},
membersPromoteSending: {},
creationMembersSelected: [], creationMembersSelected: [],
creationGroupName: '', creationGroupName: '',
}; };
@ -406,6 +402,10 @@ const loadMetaDumpsFromDB = createAsyncThunk(
metaDumped: data, metaDumped: data,
}); });
// If we were sending to that member an invite/promote, we won't auto retry.
// We need to reset the sending state (on load from disk) so that the user can resend manually if needed
await MetaGroupWrapperActions.memberResetAllSendingState(groupPk);
const infos = await MetaGroupWrapperActions.infoGet(groupPk); const infos = await MetaGroupWrapperActions.infoGet(groupPk);
const members = await MetaGroupWrapperActions.memberGetAll(groupPk); const members = await MetaGroupWrapperActions.memberGetAll(groupPk);
@ -680,6 +680,9 @@ async function handleMemberAddedFromUI({
updateMessagesToPush.push(groupChange); updateMessagesToPush.push(groupChange);
} }
} }
await LibSessionUtil.saveDumpsToDb(groupPk);
refreshConvosModelProps([groupPk]);
window.inboxStore?.dispatch(refreshGroupDetailsFromWrapper({ groupPk }) as any);
const extraStoreRequests = await StoreGroupRequestFactory.makeGroupMessageSubRequest( const extraStoreRequests = await StoreGroupRequestFactory.makeGroupMessageSubRequest(
updateMessagesToPush, updateMessagesToPush,
@ -1281,8 +1284,6 @@ const metaGroupSlice = createSlice({
) { ) {
delete state.infos[payload.groupPk]; delete state.infos[payload.groupPk];
delete state.members[payload.groupPk]; delete state.members[payload.groupPk];
delete state.membersInviteSending[payload.groupPk];
delete state.membersPromoteSending[payload.groupPk];
}, },
addSelectedGroupMember( addSelectedGroupMember(
state: GroupState, state: GroupState,

@ -1,26 +1,31 @@
import { createSlice, type PayloadAction } from '@reduxjs/toolkit'; import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
import { DURATION } from '../../session/constants'; import { DURATION } from '../../session/constants';
import { NetworkTime } from '../../util/NetworkTime';
// update this to be when we ship desktop groups REMOVE AFTER QA // update this to be when we ship desktop groups REMOVE AFTER QA
const GROUP_DESKTOP_RELEASE = 1767225600 * 1000; // currently Thursday, January 1, 2026 12:00:00 AM const GROUP_DESKTOP_RELEASE = 1767225600 * 1000; // currently 1st Jan 2026
/** /**
* 1 week after the release of groups (more or less), we force new groups to be created as new groups * 3+7 days after the release of groups (more or less), we force new groups to be created as new groups
*/ */
export const START_CREATE_NEW_GROUP_TIMESTAMP_MS = GROUP_DESKTOP_RELEASE + DURATION.WEEKS * 1; const START_CREATE_NEW_GROUP_TIMESTAMP_MS = GROUP_DESKTOP_RELEASE + DURATION.DAYS * 10;
/** /**
* 2 weeks after `START_CREATE_NEW_GROUP_TIMESTAMP_MS`, we mark legacy groups readonly * 2 weeks after `START_CREATE_NEW_GROUP_TIMESTAMP_MS`, we mark legacy groups readonly
*/ */
export const LEGACY_GROUP_DEPRECATED_TIMESTAMP_MS = const LEGACY_GROUP_DEPRECATED_TIMESTAMP_MS =
START_CREATE_NEW_GROUP_TIMESTAMP_MS + DURATION.WEEKS * 2; START_CREATE_NEW_GROUP_TIMESTAMP_MS + DURATION.WEEKS * 2;
export interface ReleasedFeaturesState { export interface ReleasedFeaturesState {
legacyGroupDeprecationTimestampRefreshAtMs: number; legacyGroupDeprecationTimestampRefreshAtMs: number;
canCreateGroupV2: boolean;
legacyGroupsReadOnly: boolean;
} }
export const initialReleasedFeaturesState = { export const initialReleasedFeaturesState = {
legacyGroupDeprecationTimestampRefreshAtMs: Date.now(), legacyGroupDeprecationTimestampRefreshAtMs: Date.now(),
canCreateGroupV2: Date.now() >= START_CREATE_NEW_GROUP_TIMESTAMP_MS,
legacyGroupsReadOnly: Date.now() >= LEGACY_GROUP_DEPRECATED_TIMESTAMP_MS,
}; };
const releasedFeaturesSlice = createSlice({ const releasedFeaturesSlice = createSlice({
@ -29,6 +34,9 @@ const releasedFeaturesSlice = createSlice({
reducers: { reducers: {
updateLegacyGroupDeprecationTimestampUpdatedAt: (state, action: PayloadAction<number>) => { updateLegacyGroupDeprecationTimestampUpdatedAt: (state, action: PayloadAction<number>) => {
state.legacyGroupDeprecationTimestampRefreshAtMs = action.payload; state.legacyGroupDeprecationTimestampRefreshAtMs = action.payload;
state.canCreateGroupV2 = NetworkTime.now() >= START_CREATE_NEW_GROUP_TIMESTAMP_MS;
state.legacyGroupsReadOnly = NetworkTime.now() >= LEGACY_GROUP_DEPRECATED_TIMESTAMP_MS;
return state;
}, },
}, },
}); });

@ -1,29 +1,29 @@
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import { NetworkTime } from '../../util/NetworkTime'; import type { StateType } from '../reducer';
import {
LEGACY_GROUP_DEPRECATED_TIMESTAMP_MS,
START_CREATE_NEW_GROUP_TIMESTAMP_MS,
} from '../ducks/releasedFeatures';
export const areLegacyGroupsDeprecatedYet = (): boolean => { const areGroupsCreatedAsNewGroupsYet = (): boolean => {
const theyAreDeprecated = NetworkTime.now() >= LEGACY_GROUP_DEPRECATED_TIMESTAMP_MS; const shouldCreateNewGroups = !!window.inboxStore?.getState()?.releasedFeatures.canCreateGroupV2;
return window.sessionFeatureFlags.forceLegacyGroupsDeprecated || theyAreDeprecated; return window.sessionFeatureFlags.useClosedGroupV2 || shouldCreateNewGroups;
}; };
const areGroupsCreatedAsNewGroupsYet = (): boolean => { export const areLegacyGroupsReadOnly = (): boolean => {
const shouldCreateNewGroups = NetworkTime.now() >= START_CREATE_NEW_GROUP_TIMESTAMP_MS; const theyAre = !!window.inboxStore?.getState()?.releasedFeatures.legacyGroupsReadOnly;
return window.sessionFeatureFlags.useClosedGroupV2 || shouldCreateNewGroups; return window.sessionFeatureFlags.forceLegacyGroupsDeprecated || theyAre;
}; };
export function useAreGroupsCreatedAsNewGroupsYet() { export function useAreGroupsCreatedAsNewGroupsYet() {
useSelector((state: StateType) => state.releasedFeatures.canCreateGroupV2);
return useSelector(areGroupsCreatedAsNewGroupsYet); return useSelector(areGroupsCreatedAsNewGroupsYet);
} }
export function areLegacyGroupsDeprecatedYetOutsideRedux() { /**
* @returns true if legacy groups should not be polled anymore
*/
export function areLegacyGroupsReadOnlyOutsideRedux() {
if (!window.inboxStore) { if (!window.inboxStore) {
return false; return false;
} }
return areLegacyGroupsDeprecatedYet(); return areLegacyGroupsReadOnly();
} }

@ -674,6 +674,10 @@ export const MetaGroupWrapperActions: MetaGroupWrapperActionsCalls = {
pubkeyHex, pubkeyHex,
profilePicture, profilePicture,
]) as Promise<ReturnType<MetaGroupWrapperActionsCalls['memberSetProfilePicture']>>, ]) as Promise<ReturnType<MetaGroupWrapperActionsCalls['memberSetProfilePicture']>>,
memberResetAllSendingState: async (groupPk: GroupPubkeyType) =>
callLibSessionWorker([`MetaGroupConfig-${groupPk}`, 'memberResetAllSendingState']) as Promise<
ReturnType<MetaGroupWrapperActionsCalls['memberResetAllSendingState']>
>,
/** GroupKeys wrapper specific actions */ /** GroupKeys wrapper specific actions */
keyRekey: async (groupPk: GroupPubkeyType) => keyRekey: async (groupPk: GroupPubkeyType) =>

Loading…
Cancel
Save