openreplay/frontend/app/services/FFlagsService.ts
Delirium e9e3e21a10
feat(ui/tracker): feature flags (#1097)
* 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
2023-06-21 12:35:40 +02:00

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 || {});
}
}