Files
fluxer/fluxer_app/src/actions/DeveloperOptionsActionCreators.tsx
2026-02-17 12:22:36 +00:00

93 lines
3.2 KiB
TypeScript

/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
import {ComponentDispatch} from '@app/lib/ComponentDispatch';
import {Logger} from '@app/lib/Logger';
import {ChannelRecord} from '@app/records/ChannelRecord';
import {UserRecord} from '@app/records/UserRecord';
import DeveloperOptionsStore, {type DeveloperOptionsState} from '@app/stores/DeveloperOptionsStore';
import MockIncomingCallStore from '@app/stores/MockIncomingCallStore';
import UserStore from '@app/stores/UserStore';
import {ChannelTypes} from '@fluxer/constants/src/ChannelConstants';
import type {Channel} from '@fluxer/schema/src/domains/channel/ChannelSchemas';
import type {UserPartial} from '@fluxer/schema/src/domains/user/UserResponseSchemas';
import {generateSnowflake} from '@fluxer/snowflake/src/Snowflake';
const logger = new Logger('DeveloperOptions');
export function updateOption<K extends keyof DeveloperOptionsState>(key: K, value: DeveloperOptionsState[K]): void {
logger.debug(`Updating developer option: ${String(key)} = ${value}`);
DeveloperOptionsStore.updateOption(key, value);
}
export function setAttachmentMock(
attachmentId: string,
mock: DeveloperOptionsState['mockAttachmentStates'][string] | null,
): void {
const next = {...DeveloperOptionsStore.mockAttachmentStates};
if (mock === null) {
delete next[attachmentId];
} else {
next[attachmentId] = mock;
}
updateOption('mockAttachmentStates', next);
ComponentDispatch.dispatch('LAYOUT_RESIZED');
}
export function clearAllAttachmentMocks(): void {
updateOption('mockAttachmentStates', {});
ComponentDispatch.dispatch('LAYOUT_RESIZED');
}
export function triggerMockIncomingCall(): void {
const currentUser = UserStore.getCurrentUser();
if (!currentUser) {
logger.warn('Cannot trigger mock incoming call: No current user');
return;
}
const mockChannelId = generateSnowflake().toString();
const initiatorPartial: UserPartial = {
id: currentUser.id,
username: currentUser.username,
discriminator: currentUser.discriminator,
global_name: currentUser.globalName,
avatar: currentUser.avatar ?? null,
avatar_color: currentUser.avatarColor ?? null,
flags: currentUser.flags ?? 0,
};
const channelData: Channel = {
id: mockChannelId,
type: ChannelTypes.DM,
recipients: [initiatorPartial],
};
const channelRecord = new ChannelRecord(channelData);
const initiatorRecord = new UserRecord(initiatorPartial);
MockIncomingCallStore.setMockCall({
channel: channelRecord,
initiator: initiatorRecord,
});
logger.info(`Triggered mock incoming call from user ${currentUser.username}`);
}