ng-spinner-wheel
Version:
A customizable standalone Angular spinner wheel component that supports weighted items. Useful for raffles, lucky draws, and gamified selections where some items have higher chances of winning.
54 lines • 7.1 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class NgSpinnerWheelService {
constructor() { }
getRandomColor() {
const letters = '0123456789ABCDEF';
let color = '#';
for (let i = 0; i < 6; i++) {
color += letters[Math.floor(Math.random() * 16)];
}
return color;
}
items = [];
addItemFoePool(item, weight) {
if (weight > 0) {
this.items.push({ item, weight });
}
else {
throw new Error("Weight must be greater than 0");
}
}
selectRandomItem() {
const totalWeight = this.items.reduce((sum, item) => sum + item.weight, 0);
if (totalWeight === 0) {
return null; // No items in the pool
}
let randomValue = Math.random() * totalWeight;
let accumulatedWeight = 0;
for (const { item, weight } of this.items) {
accumulatedWeight += weight;
if (randomValue <= accumulatedWeight) {
return item;
}
}
return null; // Shouldn't reach here, but just in case
}
getTextColor(backgroundHexColor) {
const hex = backgroundHexColor.replace(/^#/, '');
const r = parseInt(hex.substring(0, 2), 16) / 255;
const g = parseInt(hex.substring(2, 4), 16) / 255;
const b = parseInt(hex.substring(4, 6), 16) / 255;
const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;
return luminance > 0.5 ? '#000000' : '#FFFFFF';
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgSpinnerWheelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgSpinnerWheelService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgSpinnerWheelService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc3Bpbm5lci13aGVlbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctc3Bpbm5lci13aGVlbC9zcmMvbGliL25nLXNwaW5uZXItd2hlZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8scUJBQXFCO0lBRWhDLGdCQUFnQixDQUFDO0lBRWpCLGNBQWM7UUFDWixNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQztRQUNuQyxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNCLEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBR0QsS0FBSyxHQUFRLEVBQUUsQ0FBQztJQUVoQixjQUFjLENBQUMsSUFBUyxFQUFFLE1BQWM7UUFDdEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFXLEVBQUUsSUFBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV4RixJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxDQUFDLHVCQUF1QjtRQUN0QyxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUM5QyxJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUUxQixLQUFLLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFDLGlCQUFpQixJQUFJLE1BQU0sQ0FBQztZQUM1QixJQUFJLFdBQVcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsQ0FBQyx5Q0FBeUM7SUFDeEQsQ0FBQztJQUlELFlBQVksQ0FBQyxrQkFBMEI7UUFDckMsTUFBTSxHQUFHLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEQsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRCxNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN2RCxPQUFPLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2pELENBQUM7d0dBckRVLHFCQUFxQjs0R0FBckIscUJBQXFCLGNBRnBCLE1BQU07OzRGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ1NwaW5uZXJXaGVlbFNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBnZXRSYW5kb21Db2xvcigpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbGV0dGVycyA9ICcwMTIzNDU2Nzg5QUJDREVGJztcclxuICAgIGxldCBjb2xvciA9ICcjJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XHJcbiAgICAgIGNvbG9yICs9IGxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTYpXTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb2xvcjtcclxuICB9XHJcblxyXG5cclxuICBpdGVtczogYW55ID0gW107XHJcblxyXG4gIGFkZEl0ZW1Gb2VQb29sKGl0ZW06IGFueSwgd2VpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh3ZWlnaHQgPiAwKSB7XHJcbiAgICAgIHRoaXMuaXRlbXMucHVzaCh7IGl0ZW0sIHdlaWdodCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIldlaWdodCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0UmFuZG9tSXRlbSgpIHtcclxuICAgIGNvbnN0IHRvdGFsV2VpZ2h0ID0gdGhpcy5pdGVtcy5yZWR1Y2UoKHN1bTogbnVtYmVyLCBpdGVtOiBhbnkpID0+IHN1bSArIGl0ZW0ud2VpZ2h0LCAwKTtcclxuXHJcbiAgICBpZiAodG90YWxXZWlnaHQgPT09IDApIHtcclxuICAgICAgcmV0dXJuIG51bGw7IC8vIE5vIGl0ZW1zIGluIHRoZSBwb29sXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJhbmRvbVZhbHVlID0gTWF0aC5yYW5kb20oKSAqIHRvdGFsV2VpZ2h0O1xyXG4gICAgbGV0IGFjY3VtdWxhdGVkV2VpZ2h0ID0gMDtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHsgaXRlbSwgd2VpZ2h0IH0gb2YgdGhpcy5pdGVtcykge1xyXG4gICAgICBhY2N1bXVsYXRlZFdlaWdodCArPSB3ZWlnaHQ7XHJcbiAgICAgIGlmIChyYW5kb21WYWx1ZSA8PSBhY2N1bXVsYXRlZFdlaWdodCkge1xyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7IC8vIFNob3VsZG4ndCByZWFjaCBoZXJlLCBidXQganVzdCBpbiBjYXNlXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGdldFRleHRDb2xvcihiYWNrZ3JvdW5kSGV4Q29sb3I6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBoZXggPSBiYWNrZ3JvdW5kSGV4Q29sb3IucmVwbGFjZSgvXiMvLCAnJyk7XHJcbiAgICBjb25zdCByID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygwLCAyKSwgMTYpIC8gMjU1O1xyXG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMiwgNCksIDE2KSAvIDI1NTtcclxuICAgIGNvbnN0IGIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDQsIDYpLCAxNikgLyAyNTU7XHJcbiAgICBjb25zdCBsdW1pbmFuY2UgPSAwLjIxMjYgKiByICsgMC43MTUyICogZyArIDAuMDcyMiAqIGI7XHJcbiAgICByZXR1cm4gbHVtaW5hbmNlID4gMC41ID8gJyMwMDAwMDAnIDogJyNGRkZGRkYnO1xyXG4gIH1cclxuXHJcbn1cclxuIl19