fix: cleanup releasedFeature slice

pull/3281/head
Audric Ackermann 2 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 = {
useOnionRequests: true,
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
useClosedGroupV2QAButtons: true, // TODO DO NOT MERGE Remove after QA
replaceLocalizedStringsWithKeys: false,

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

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

@ -59,8 +59,6 @@ export type GroupState = {
members: Record<GroupPubkeyType, Array<GroupMemberGet>>;
memberChangesFromUIPending: boolean;
nameChangesFromUIPending: boolean;
membersInviteSending: Record<GroupPubkeyType, Array<PubkeyType>>;
membersPromoteSending: Record<GroupPubkeyType, Array<PubkeyType>>;
// those are group creation-related fields
creationFromUIPending: boolean;
@ -74,8 +72,6 @@ export const initialGroupState: GroupState = {
creationFromUIPending: false,
memberChangesFromUIPending: false,
nameChangesFromUIPending: false,
membersInviteSending: {},
membersPromoteSending: {},
creationMembersSelected: [],
creationGroupName: '',
};
@ -406,6 +402,10 @@ const loadMetaDumpsFromDB = createAsyncThunk(
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 members = await MetaGroupWrapperActions.memberGetAll(groupPk);
@ -680,6 +680,9 @@ async function handleMemberAddedFromUI({
updateMessagesToPush.push(groupChange);
}
}
await LibSessionUtil.saveDumpsToDb(groupPk);
refreshConvosModelProps([groupPk]);
window.inboxStore?.dispatch(refreshGroupDetailsFromWrapper({ groupPk }) as any);
const extraStoreRequests = await StoreGroupRequestFactory.makeGroupMessageSubRequest(
updateMessagesToPush,
@ -1281,8 +1284,6 @@ const metaGroupSlice = createSlice({
) {
delete state.infos[payload.groupPk];
delete state.members[payload.groupPk];
delete state.membersInviteSending[payload.groupPk];
delete state.membersPromoteSending[payload.groupPk];
},
addSelectedGroupMember(
state: GroupState,

@ -1,26 +1,31 @@
import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
import { DURATION } from '../../session/constants';
import { NetworkTime } from '../../util/NetworkTime';
// 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
*/
export const LEGACY_GROUP_DEPRECATED_TIMESTAMP_MS =
const LEGACY_GROUP_DEPRECATED_TIMESTAMP_MS =
START_CREATE_NEW_GROUP_TIMESTAMP_MS + DURATION.WEEKS * 2;
export interface ReleasedFeaturesState {
legacyGroupDeprecationTimestampRefreshAtMs: number;
canCreateGroupV2: boolean;
legacyGroupsReadOnly: boolean;
}
export const initialReleasedFeaturesState = {
legacyGroupDeprecationTimestampRefreshAtMs: Date.now(),
canCreateGroupV2: Date.now() >= START_CREATE_NEW_GROUP_TIMESTAMP_MS,
legacyGroupsReadOnly: Date.now() >= LEGACY_GROUP_DEPRECATED_TIMESTAMP_MS,
};
const releasedFeaturesSlice = createSlice({
@ -29,6 +34,9 @@ const releasedFeaturesSlice = createSlice({
reducers: {
updateLegacyGroupDeprecationTimestampUpdatedAt: (state, action: PayloadAction<number>) => {
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 { NetworkTime } from '../../util/NetworkTime';
import {
LEGACY_GROUP_DEPRECATED_TIMESTAMP_MS,
START_CREATE_NEW_GROUP_TIMESTAMP_MS,
} from '../ducks/releasedFeatures';
import type { StateType } from '../reducer';
export const areLegacyGroupsDeprecatedYet = (): boolean => {
const theyAreDeprecated = NetworkTime.now() >= LEGACY_GROUP_DEPRECATED_TIMESTAMP_MS;
const areGroupsCreatedAsNewGroupsYet = (): boolean => {
const shouldCreateNewGroups = !!window.inboxStore?.getState()?.releasedFeatures.canCreateGroupV2;
return window.sessionFeatureFlags.forceLegacyGroupsDeprecated || theyAreDeprecated;
return window.sessionFeatureFlags.useClosedGroupV2 || shouldCreateNewGroups;
};
const areGroupsCreatedAsNewGroupsYet = (): boolean => {
const shouldCreateNewGroups = NetworkTime.now() >= START_CREATE_NEW_GROUP_TIMESTAMP_MS;
export const areLegacyGroupsReadOnly = (): boolean => {
const theyAre = !!window.inboxStore?.getState()?.releasedFeatures.legacyGroupsReadOnly;
return window.sessionFeatureFlags.useClosedGroupV2 || shouldCreateNewGroups;
return window.sessionFeatureFlags.forceLegacyGroupsDeprecated || theyAre;
};
export function useAreGroupsCreatedAsNewGroupsYet() {
useSelector((state: StateType) => state.releasedFeatures.canCreateGroupV2);
return useSelector(areGroupsCreatedAsNewGroupsYet);
}
export function areLegacyGroupsDeprecatedYetOutsideRedux() {
/**
* @returns true if legacy groups should not be polled anymore
*/
export function areLegacyGroupsReadOnlyOutsideRedux() {
if (!window.inboxStore) {
return false;
}
return areLegacyGroupsDeprecatedYet();
return areLegacyGroupsReadOnly();
}

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

Loading…
Cancel
Save