Files
Wegwichtel/public/js/vibration.js
T
Florian Zumpe aff88eba1b
Sonarqube Scanner / Prepare environment (push) Successful in 20s
Sonarqube Scanner / Build and test (push) Failing after 36s
Sonarqube Scanner / SonarQube analysis (push) Skipped
Sonarqube Scanner / Deploy to Server (push) Successful in 9s
Internationalization
2026-10-01 09:41:01 +02:00

54 lines
1.4 KiB
JavaScript

(function (ns) {
'use strict';
const Patterns = Object.freeze({
MICRO: 50,
MINI: 100,
SHORT: 200,
LONG: 2000,
ALARM: Object.freeze([100, 50, 100]),
POI: Object.freeze([2000, 200, 2000]),
ACTIVE_POI: Object.freeze([500, 300, 500])
});
function supported() {
return typeof navigator !== 'undefined' && typeof navigator.vibrate === 'function';
}
function normalize(pattern) {
const selected = pattern ?? Patterns.LONG;
if (Array.isArray(selected)) {
const values = selected.map(Number);
if (!values.length || values.some(value => !Number.isFinite(value) || value < 0)) {
throw new TypeError(ns.I18n.t("vibration.das.vibrationsmuster.muss.aus.nichtnegativen.millisekunden.bestehen"));
}
return values;
}
const duration = Number(selected);
if (!Number.isFinite(duration) || duration < 0) {
throw new TypeError(ns.I18n.t("vibration.die.vibrationsdauer.muss.eine.nichtnegative.millisekundenangabe.sein"));
}
return [duration];
}
function start(pattern = Patterns.LONG) {
const normalized = normalize(pattern);
if (!supported()) return false;
return navigator.vibrate(normalized);
}
function stop() {
if (!supported()) return false;
return navigator.vibrate(0);
}
ns.Vibration = Object.freeze({
Patterns,
isSupported: supported,
start,
stop
});
}(globalThis.Wegwichtel));