openreplay/frontend/app/mstore/featureFlagsStore.ts
Delirium a71381da40
getting rid of redux for good (#2556)
* start moving ui to redux tlk

* remove unused reducer

* changes for gdpr and site types

* ui: migrating duck/roles to mobx

* ui: drop unreferenced types

* ui: drop unreferenced types

* ui: move player slice reducer to mobx family

* ui: move assignments to issueReportingStore.ts

* remove issues store

* some fixes after issues store

* remove errors reducer, drop old components

* finish removing errors reducer

* start moving integrations state to mobx

* change(ui): funnel duck cleanup

* change(ui): custom fields

* change(ui): customMetrics cleanup

* change(ui): customMetrics cleanup

* change(ui): duck/filters minor cleanup

* change(ui): duck/filters cleanup

* change(ui): duck/customMetrics cleanup and upgrades

* fix integrations service, fix babel config to >.25 + not ie

* refactoring integrations reducers etc WIP

* finish removing integrations state

* some fixes for integrated check

* start of projects refactoring

* move api and "few" files to new project store

* new batch for site -> projects

* fix setid context

* move all critical components, drop site duck

* remove all duck/site refs, remove old components

* fixup for SessionTags.tsx, remove duck/sources (?)

* move session store

* init sessionstore outside of context

* fix userfilter

* replace simple actions for session store

* sessions sotre

* Rtm temp (#2597)

* change(ui): duck/search wip

* change(ui): duck/search wip

* change(ui): duck/search wip

* change(ui): duck/searchLive wip

* change(ui): duck/searchLive wip

* change(ui): duck/searchLive wip

* change(ui): duck/searchLive wip

* change(ui): search states

* change(ui): search states

* change(ui): search states

* change(ui): fix savedSearch store

* change(ui): fix savedSearch store

* some fixes for session connector

* change(ui): fix savedSearch store

* change(ui): fix searchLive

* change(ui): fix searchLive

* fixes for session replay

* change(ui): bookmark fetch

* last components for sessions

* add fetchautoplaylist

* finish session reducer, remove deleted reducers

* change(ui): fix the search fetch

* change(ui): fix the search fetch

* fix integrations call ctx

* ensure ctx for sessionstore

* fix(ui): checking for latest sessions path

* start removing user reducer

* removing user reducer pt2...

* finish user store

* remove rand log

* fix crashes

* tinkering workflow file for tracker test

* making sure prefetched sessions work properly

* fix conflict

* fix router redirects during loading

---------

Co-authored-by: Shekar Siri <sshekarsiri@gmail.com>
2024-10-03 11:38:36 +02:00

189 lines
4.7 KiB
TypeScript

import { makeAutoObservable } from 'mobx';
import FeatureFlag from './types/FeatureFlag';
import { fflagsService } from 'App/services';
type All = '0'
type Active = '1'
type Inactive = '2'
export type Activity = All | Active | Inactive
export default class FeatureFlagsStore {
currentFflag: FeatureFlag | null = null;
isDescrEditing: boolean = false;
isTitleEditing: boolean = false;
flags: FeatureFlag[] = [];
isLoading: boolean = false;
flagsSearch: string = '';
activity: Activity = '0';
sort = { order: 'DESC', query: '' };
page: number = 1;
total = 0
readonly pageSize: number = 10;
client: typeof fflagsService
constructor() {
makeAutoObservable(this);
this.client = fflagsService
}
setFlagsSearch = (search: string) => {
this.flagsSearch = search;
};
setPage = (page: number) => {
this.page = page;
void this.fetchFlags()
};
setEditing = ({ isDescrEditing = false, isTitleEditing = false }) => {
this.isDescrEditing = isDescrEditing;
this.isTitleEditing = isTitleEditing;
};
setList = (flags: FeatureFlag[]) => {
this.flags = flags;
};
removeFromList = (id: FeatureFlag['featureFlagId']) => {
this.flags = this.flags.filter((f) => f.featureFlagId !== id);
};
addFlag = (flag: FeatureFlag) => {
this.flags.push(flag);
};
getFlagById = (id: string) => {
return this.flags.find((f) => f.featureFlagId === parseInt(id, 10));
};
setCurrentFlag = (flag: FeatureFlag | null) => {
this.currentFflag = flag;
};
initNewFlag = () => {
this.currentFflag = new FeatureFlag();
};
setLoading = (isLoading: boolean) => {
this.isLoading = isLoading;
};
setActivity = (activity: Activity) => {
this.activity = activity;
}
setSort = (sort: { order: string, query: string }) => {
this.sort = sort;
}
fetchFlags = async () => {
this.setLoading(true);
try {
const filters = {
limit: this.pageSize,
page: this.page,
order: this.sort.order,
query: this.sort.query,
isActive: this.activity === '0' ? undefined : this.activity === '1',
// userId: 3,
}
const { list, total } = await this.client.fetchFlags(filters);
const flags = list.map((record) => new FeatureFlag(record));
this.setList(flags);
this.setTotal(total)
} catch (e) {
console.error(e);
} finally {
this.setLoading(false);
}
};
setTotal(total: number) {
this.total = total
}
checkFlagForm = () => {
if (!this.currentFflag) return 'Feature flag not initialized'
if (this.currentFflag.flagKey === '') {
return 'Feature flag must have a key'
}
if (!this.currentFflag.isSingleOption && this.currentFflag?.variants.findIndex((v) => v.value === '') !== -1) {
return 'All variants must include unique key'
}
if (!this.currentFflag?.isSingleOption && this.currentFflag?.isRedDistribution) {
return 'Variants rollout percentage must add up to 100%'
}
return null;
}
createFlag = async () => {
if (this.currentFflag) {
this.setLoading(true);
try {
this.currentFflag.setHasChanged(false)
const result = await this.client.createFlag(this.currentFflag.toJS());
this.addFlag(new FeatureFlag(result));
} catch (e) {
console.error(e);
throw e.response;
} finally {
this.setLoading(false);
}
}
};
updateFlagStatus = async (flagId: number, isActive: boolean) => {
try {
await this.client.updateStatus(flagId, isActive);
} catch (e) {
console.error(e);
throw e
}
}
updateFlag = async (flag?: FeatureFlag, skipLoader?: boolean) => {
const usedFlag = flag || this.currentFflag;
if (usedFlag) {
if (!skipLoader) {
this.setLoading(true);
}
try {
// @ts-ignore
const result = await this.client.updateFlag(usedFlag.toJS());
if (!flag) this.setCurrentFlag(new FeatureFlag(result));
if (!flag) this.currentFflag?.setHasChanged(false)
} catch (e) {
console.error('getting api error', e);
throw e.response;
} finally {
this.setLoading(false);
}
}
};
deleteFlag = async (id: FeatureFlag['featureFlagId']) => {
this.setLoading(true);
try {
await this.client.deleteFlag(id);
this.removeFromList(id);
} catch (e) {
console.error(e);
} finally {
this.setLoading(false);
}
};
fetchFlag = async (id: FeatureFlag['featureFlagId']) => {
this.setLoading(true);
try {
const result = await this.client.getFlag(id);
this.setCurrentFlag(new FeatureFlag(result));
} catch (e) {
console.error(e);
} finally {
this.setLoading(false);
}
};
}