* fix(player): fix initial visual offset jump check * change(ui): add empty feature flags page * change(ui): add empty feature flags page * fix(ui): some more fixes * change(ui): add subrouting for sessions tab * change(ui): more fixes for routing * change(ui): add flag creation page, flags list table, flag store/type * change(tracker): flags in tracker * change(tracker): return all flags * feat(ui): add API and types connector * feat(ui): split components to prevent rerendering * feat(ui): add icon, fix redirect.path crashlooping * feat(ui): add conditions and stuff, add flags class to tracker to handle stuff * feat(ui): add condition state and filters * feat(ui): fix flag creation with api change * feat(ui): fix flag editing (api changes); simplify new/edit flag component * feat(ui): add filters, make table pretty :insert_magic_emoji: * feat(ui): remove rollout percentage from list, remove console logs * feat(ui): multivar toggler * feat(tracker): add more methods to tracker * feat(tracker): more type coverage * feat(tracker): add tests * fix(ui): some fixes for multivar * feat(ui): multivar api support * fix(ui):start adding tests for fflags * fix(ui): rm not working file.. * fix(ui): rm unused packages * fix(ui): remove name field, fix some api and type names * fix(ui): fix crash * fix(tracker/ui): keep flags in sessionStorage, support API errors in feature flags storage * fix(tracker/ui): clear unused things, fix url handling, fix icons rendering etc
84 lines
1.9 KiB
TypeScript
84 lines
1.9 KiB
TypeScript
import BaseService from 'App/services/BaseService';
|
|
|
|
type FFlagType = 'single' | 'multi';
|
|
type FFlagCondition = {
|
|
name: string;
|
|
rolloutPercentage: number;
|
|
filters: [];
|
|
};
|
|
|
|
export interface SimpleFlag {
|
|
name: string;
|
|
flagKey: string;
|
|
description: string;
|
|
flagType: FFlagType;
|
|
isPersist: boolean;
|
|
conditions: FFlagCondition[];
|
|
payload?: string;
|
|
}
|
|
|
|
type Variant = {
|
|
variantId?: number;
|
|
value: string;
|
|
description?: string;
|
|
payload: string;
|
|
rolloutPercentage: number;
|
|
}
|
|
|
|
export interface FFlag extends SimpleFlag {
|
|
featureFlagId: number;
|
|
isActive: boolean;
|
|
createdAt: number;
|
|
updatedAt: number;
|
|
createdBy: number;
|
|
updatedBy: number;
|
|
conditions: never;
|
|
variants: Variant[]
|
|
}
|
|
|
|
export interface SingleFFlag extends SimpleFlag {
|
|
createdAt: number;
|
|
updatedAt: number;
|
|
createdBy: number;
|
|
updatedBy: number;
|
|
featureFlagId: number;
|
|
isActive: boolean;
|
|
variants: Variant[]
|
|
}
|
|
|
|
export default class FFlagsService extends BaseService {
|
|
fetchFlags(filters: Record<string, any>): Promise<{ list: FFlag[]; total: number }> {
|
|
return this.client
|
|
.post('/feature-flags/search', filters)
|
|
.then((r) => r.json())
|
|
.then((j) => j.data || []);
|
|
}
|
|
|
|
createFlag(flag: SimpleFlag): Promise<FFlag> {
|
|
return this.client
|
|
.post('/feature-flags', flag)
|
|
.then((r) => r.json())
|
|
.then((j) => j.data || {});
|
|
}
|
|
|
|
updateFlag(flag: FFlag): Promise<FFlag> {
|
|
return this.client
|
|
.put(`/feature-flags/${flag.featureFlagId}`, flag)
|
|
.then((r) => r.json())
|
|
.then((j) => j.data || {});
|
|
}
|
|
|
|
deleteFlag(id: number): Promise<void> {
|
|
return this.client
|
|
.delete(`/feature-flags/${id}`)
|
|
.then((r) => r.json())
|
|
.then((j) => j.data || {});
|
|
}
|
|
|
|
getFlag(id: number): Promise<SingleFFlag> {
|
|
return this.client
|
|
.get(`/feature-flags/${id}`)
|
|
.then((r) => r.json())
|
|
.then((j) => j.data || {});
|
|
}
|
|
}
|