UNPKG

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
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