nitro/apps/frontend/src/api/catalog/Product.ts

144 lines
4.9 KiB
TypeScript

import { IFurnitureData, IObjectData, IProductData } from '@nitrots/nitro-renderer';
import { GetConfiguration, GetRoomEngine, GetSessionDataManager } from '../nitro';
import { GetPixelEffectIcon, GetSubscriptionProductIcon } from './CatalogUtilities';
import { IProduct } from './IProduct';
import { IPurchasableOffer } from './IPurchasableOffer';
import { ProductTypeEnum } from './ProductTypeEnum';
export class Product implements IProduct
{
public static EFFECT_CLASSID_NINJA_DISAPPEAR: number = 108;
private _productType: string;
private _productClassId: number;
private _extraParam: string;
private _productCount: number;
private _productData: IProductData;
private _furnitureData: IFurnitureData;
private _isUniqueLimitedItem: boolean;
private _uniqueLimitedItemSeriesSize: number;
private _uniqueLimitedItemsLeft: number;
constructor(productType: string, productClassId: number, extraParam: string, productCount: number, productData: IProductData, furnitureData: IFurnitureData, isUniqueLimitedItem: boolean = false, uniqueLimitedItemSeriesSize: number = 0, uniqueLimitedItemsLeft: number = 0)
{
this._productType = productType.toLowerCase();
this._productClassId = productClassId;
this._extraParam = extraParam;
this._productCount = productCount;
this._productData = productData;
this._furnitureData = furnitureData;
this._isUniqueLimitedItem = isUniqueLimitedItem;
this._uniqueLimitedItemSeriesSize = uniqueLimitedItemSeriesSize;
this._uniqueLimitedItemsLeft = uniqueLimitedItemsLeft;
}
public static stripAddonProducts(products: IProduct[]): IProduct[]
{
if(products.length === 1) return products;
return products.filter(product => ((product.productType !== ProductTypeEnum.BADGE) && (product.productType !== ProductTypeEnum.EFFECT) && (product.productClassId !== Product.EFFECT_CLASSID_NINJA_DISAPPEAR)));
}
public getIconUrl(offer: IPurchasableOffer = null, stuffData: IObjectData = null): string
{
switch(this._productType)
{
case ProductTypeEnum.FLOOR:
return GetRoomEngine().getFurnitureFloorIconUrl(this.productClassId);
case ProductTypeEnum.WALL: {
if(offer && this._furnitureData)
{
let iconName = '';
switch(this._furnitureData.className)
{
case 'floor':
iconName = [ 'th', this._furnitureData.className, offer.product.extraParam ].join('_');
break;
case 'wallpaper':
iconName = [ 'th', 'wall', offer.product.extraParam ].join('_');
break;
case 'landscape':
iconName = [ 'th', this._furnitureData.className, (offer.product.extraParam || '').replace('.', '_'), '001' ].join('_');
break;
}
if(iconName !== '')
{
const assetUrl = GetConfiguration<string>('catalog.asset.url');
return `${ assetUrl }/${ iconName }.png`;
}
}
return GetRoomEngine().getFurnitureWallIconUrl(this.productClassId, this._extraParam);
}
case ProductTypeEnum.EFFECT:
return GetPixelEffectIcon(this.productClassId);
case ProductTypeEnum.HABBO_CLUB:
return GetSubscriptionProductIcon(this.productClassId);
case ProductTypeEnum.BADGE:
return GetSessionDataManager().getBadgeUrl(this._extraParam);
case ProductTypeEnum.ROBOT:
return null;
}
return null;
}
public get productType(): string
{
return this._productType;
}
public get productClassId(): number
{
return this._productClassId;
}
public get extraParam(): string
{
return this._extraParam;
}
public set extraParam(extraParam: string)
{
this._extraParam = extraParam;
}
public get productCount(): number
{
return this._productCount;
}
public get productData(): IProductData
{
return this._productData;
}
public get furnitureData(): IFurnitureData
{
return this._furnitureData;
}
public get isUniqueLimitedItem(): boolean
{
return this._isUniqueLimitedItem;
}
public get uniqueLimitedItemSeriesSize(): number
{
return this._uniqueLimitedItemSeriesSize;
}
public get uniqueLimitedItemsLeft(): number
{
return this._uniqueLimitedItemsLeft;
}
public set uniqueLimitedItemsLeft(uniqueLimitedItemsLeft: number)
{
this._uniqueLimitedItemsLeft = uniqueLimitedItemsLeft;
}
}