@geoapify/geocoder-autocomplete
Version:
A JavaScript address autocomplete input, compatible with Leaflet, MapLibre, OpenLayers, and other map libraries for efficient location search and geocoding.
117 lines (116 loc) • 3.76 kB
JavaScript
export class Callbacks {
changeCallbacks = [];
suggestionsChangeCallbacks = [];
inputCallbacks = [];
openCallbacks = [];
closeCallbacks = [];
requestStartCallbacks = [];
requestEndCallbacks = [];
addCallback(operation, callback) {
let currentCallbacks = this.getCallbacksByOperation(operation);
if (currentCallbacks) {
if (currentCallbacks.indexOf(callback) < 0) {
currentCallbacks.push(callback);
}
}
}
removeCallback(operation, callback) {
let currentCallbacks = this.getCallbacksByOperation(operation);
if (currentCallbacks) {
if (currentCallbacks.indexOf(callback) >= 0) {
currentCallbacks.splice(currentCallbacks.indexOf(callback), 1);
this.setCallbacksByOperation(operation, currentCallbacks);
}
else if (!callback) {
this.setCallbacksByOperation(operation, []);
}
}
}
notifyInputChange(currentValue) {
this.inputCallbacks.forEach(callback => callback(currentValue));
}
notifyChange(feature) {
this.changeCallbacks.forEach(callback => callback(feature));
}
notifySuggestions(features) {
this.suggestionsChangeCallbacks.forEach(callback => callback(features));
}
notifyOpened() {
this.openCallbacks.forEach(callback => callback(true));
}
notifyClosed() {
this.closeCallbacks.forEach(callback => callback(false));
}
notifyRequestStart(query) {
this.requestStartCallbacks.forEach(callback => callback(query));
}
notifyRequestEnd(success, data, error) {
this.requestEndCallbacks.forEach(callback => callback(success, data, error));
}
getCallbacksByOperation(operation) {
let currentCallbacks = null;
switch (operation) {
case 'select': {
currentCallbacks = this.changeCallbacks;
break;
}
case 'suggestions': {
currentCallbacks = this.suggestionsChangeCallbacks;
break;
}
case 'input': {
currentCallbacks = this.inputCallbacks;
break;
}
case 'close': {
currentCallbacks = this.closeCallbacks;
break;
}
case 'open': {
currentCallbacks = this.openCallbacks;
break;
}
case 'request_start': {
currentCallbacks = this.requestStartCallbacks;
break;
}
case 'request_end': {
currentCallbacks = this.requestEndCallbacks;
break;
}
}
return currentCallbacks;
}
setCallbacksByOperation(operation, callbacks) {
switch (operation) {
case 'select': {
this.changeCallbacks = callbacks;
break;
}
case 'suggestions': {
this.suggestionsChangeCallbacks = callbacks;
break;
}
case 'input': {
this.inputCallbacks = callbacks;
break;
}
case 'close': {
this.closeCallbacks = callbacks;
break;
}
case 'open': {
this.openCallbacks = callbacks;
break;
}
case 'request_start': {
this.requestStartCallbacks = callbacks;
break;
}
case 'request_end': {
this.requestEndCallbacks = callbacks;
break;
}
}
}
}