@flagship.io/react-sdk
Version:
Flagship REACT SDK
60 lines (59 loc) • 2 kB
JavaScript
import { Flagship, FSFlagMetadata, FSFlagStatus } from './deps.js';
import { GET_FLAG_CAST_ERROR, noVisitorMessage } from './constants.js';
import { hasSameType, logInfo, logWarn, sprintf } from './utils.js';
export class FSFlag {
key;
flag;
constructor(key, state) {
const flagsData = state.flags;
if (!state.hasVisitorData) {
logWarn(Flagship.getConfig(), noVisitorMessage, 'GetFlag');
}
this.key = key;
this.flag = flagsData?.get(key);
}
getValue(defaultValue) {
if (!this.flag) {
return defaultValue;
}
if (this.flag.value === null || this.flag.value === undefined) {
return defaultValue;
}
if (defaultValue !== null && defaultValue !== undefined && !hasSameType(this.flag.value, defaultValue)) {
logInfo(Flagship.getConfig(), sprintf(GET_FLAG_CAST_ERROR, this.key), 'getValue');
return defaultValue;
}
return this.flag.value;
}
exists() {
if (!this.flag) {
return false;
}
return !!(this.flag.campaignId && this.flag.variationId && this.flag.variationGroupId);
}
async visitorExposed() {
// do nothing
}
get metadata() {
if (!this.flag) {
return FSFlagMetadata.Empty();
}
return new FSFlagMetadata({
campaignId: this.flag.campaignId,
campaignName: this.flag.campaignName,
variationGroupId: this.flag.variationGroupId,
variationGroupName: this.flag.variationGroupName,
variationId: this.flag.variationId,
variationName: this.flag.variationName,
isReference: !!this.flag.isReference,
campaignType: this.flag.campaignType,
slug: this.flag.slug
});
}
get status() {
if (!this.exists()) {
return FSFlagStatus.NOT_FOUND;
}
return FSFlagStatus.FETCHED;
}
}