apphouse
Version:
Component library for React that uses observable state management and theme-able components.
99 lines (86 loc) • 2.23 kB
text/typescript
import { makeAutoObservable } from 'mobx';
import {
TOKEN_KEY_SEPARATOR,
TOKEN_PATH_PREFIX,
TokenType,
TokenTypeOption
} from './token.interface';
export class Token {
key: string;
value: string | number;
type: TokenTypeOption;
/**
* The theme id for which this token is for
*/
themeId?: string;
/**
* When a token is copied or imported from another theme it will have a
* reference to the original theme id
*/
referenceThemeId?: string;
constructor(token: TokenType) {
this.key = token.key;
this.value = token.value;
this.type = token.type;
this.referenceThemeId = token?.referenceThemeId || '';
this.themeId = token?.themeId || '';
makeAutoObservable(this);
}
get objectify(): TokenType {
return {
key: this.key,
value: this.value,
type: this.type,
themeId: this.themeId || '',
referenceThemeId: this.referenceThemeId || ''
};
}
get keyValuePair() {
const id = `${this.key}${TOKEN_KEY_SEPARATOR}${this.type}`;
return {
[id]: this.value
};
}
get tokenPath(): string {
let prefix = this.type;
if (this.type === 'token') {
prefix = TOKEN_PATH_PREFIX;
}
return `${prefix}.${this.key}`;
}
get tokenReferencePath(): string {
return `${this.key} (${this.value})`;
}
get readonlyValue(): string | number {
if (typeof this.value === 'function') {
return TOKEN_PATH_PREFIX;
} else {
if (typeof this.value === 'string' || typeof this.value === 'number') {
return `${this.key} (${this.value})` as string;
}
return `${this.key} (${JSON.stringify(this.value)})` as string;
}
}
get readonly(): string | number {
if (typeof this.value === 'function') {
return TOKEN_PATH_PREFIX;
} else {
return this.value as string;
}
}
get stringValue(): string | number {
if (typeof this.value === 'string' || typeof this.value === 'number') {
return this.value;
}
return JSON.stringify(this.value);
}
setKey(key: string) {
this.key = key;
}
setValue(value: string | number) {
this.value = value;
}
setType(value: TokenTypeOption) {
this.type = value;
}
}