feat(app): gate a collapsing guild header behind an experiment (#2779)

This commit is contained in:
Hampus authored and GitHub committed 2026-09-14 21:15:31 +02:00
1 parent 550e6b05a1
commit d0c6146429
29 files changed
+1449 -115

No files matched your search

@@ -16,6 +16,10 @@ import {
GuildActivityLogPresentationAssignmentResponse,
INERT_GUILD_ACTIVITY_LOG_PRESENTATION_ASSIGNMENT,
} from '@fluxer/schema/src/domains/experiment/GuildActivityLogPresentationSchemas';
import {
GuildHeaderCollapseAssignmentResponse,
INERT_GUILD_HEADER_COLLAPSE_ASSIGNMENT,
} from '@fluxer/schema/src/domains/experiment/GuildHeaderCollapseSchemas';
import {
INERT_MESSAGE_HOVER_TRACKING_ASSIGNMENT,
MessageHoverTrackingAssignmentResponse,
@@ -67,6 +71,7 @@ const ExperimentAssignmentsSchema = z.object({
blocked_message_groups: BlockedMessageGroupsAssignmentResponse.optional(),
guild_activity_log_presentation: GuildActivityLogPresentationAssignmentResponse.optional(),
expression_info_card: ExpressionInfoCardAssignmentResponse.optional(),
guild_header_collapse: GuildHeaderCollapseAssignmentResponse.optional(),
});
export const ExperimentAssignmentsResponse = z.object({
@@ -118,3 +123,9 @@ export function readExpressionInfoCardAssignment(
): ExpressionInfoCardAssignmentResponse {
return response.assignments.expression_info_card ?? INERT_EXPRESSION_INFO_CARD_ASSIGNMENT;
}
export function readGuildHeaderCollapseAssignment(
response: ExperimentAssignmentsResponse,
): GuildHeaderCollapseAssignmentResponse {
return response.assignments.guild_header_collapse ?? INERT_GUILD_HEADER_COLLAPSE_ASSIGNMENT;
}
@@ -0,0 +1,38 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createClientBehaviorExperiment} from '@fluxer/schema/src/domains/experiment/ClientBehaviorExperiment';
import type {z} from 'zod';
const guildHeaderCollapse = createClientBehaviorExperiment({defaultRolloutSalt: 'guild-header-collapse-v1'});
export const GuildHeaderCollapseConfigSchema = guildHeaderCollapse.ConfigSchema;
export type GuildHeaderCollapseConfig = z.infer<typeof GuildHeaderCollapseConfigSchema>;
export const DEFAULT_GUILD_HEADER_COLLAPSE_CONFIG: GuildHeaderCollapseConfig = guildHeaderCollapse.DEFAULT_CONFIG;
export const GuildHeaderCollapseConfigUpdateRequest = guildHeaderCollapse.ConfigUpdateRequest;
export type GuildHeaderCollapseConfigUpdateRequest = z.infer<typeof GuildHeaderCollapseConfigUpdateRequest>;
export const GuildHeaderCollapseConfigResponse = guildHeaderCollapse.ConfigSchema;
export type GuildHeaderCollapseConfigResponse = GuildHeaderCollapseConfig;
export const GuildHeaderCollapseAssignmentResponse = guildHeaderCollapse.AssignmentResponse;
export type GuildHeaderCollapseAssignmentResponse = z.infer<typeof GuildHeaderCollapseAssignmentResponse>;
export const INERT_GUILD_HEADER_COLLAPSE_ASSIGNMENT: GuildHeaderCollapseAssignmentResponse =
guildHeaderCollapse.INERT_ASSIGNMENT;
export function resolveGuildHeaderCollapseAssignment(
config: GuildHeaderCollapseConfig,
userId: string,
): GuildHeaderCollapseAssignmentResponse {
return guildHeaderCollapse.resolveAssignment(config, userId);
}
export function isGuildHeaderCollapseTargeted(assignment: GuildHeaderCollapseAssignmentResponse): boolean {
return assignment.enabled && assignment.user_targeted;
}