(function() {
/** hotspot status scan */
Help4.widget.help.view2.HotspotScan = class {
/**
* @param {Help4.widget.help.Widget} widget
* @param {Help4.widget.help.ProjectTile[]} projectTiles
* @returns {Promise<Object>}
*/
static async scan(widget, projectTiles) {
// ATTENTION - PRECONDITIONS:
// a tile that are monitored here
// 1. has a hotspot
// 2. is not centered
// 3. is on this screen (as this is on-screen help)
if (!projectTiles.length) return {};
const {
service: {
/** @type {Help4.service.recording.PlaybackService} */ playbackService,
/** @type {Help4.service.recording.PlaybackCacheService} */ playbackCacheService
},
engine: {
/** @type {Help4.engine.DomRefreshEngine} */ domRefreshEngine
}
} = widget.getContext();
const {Core} = Help4.widget.companionCore;
const hotspotData = projectTiles.map(projectTile => Core.projectTileToHotspotData(projectTile));
// make sure to receive non-cached results
// this will update all status entries within hotspotDataList
domRefreshEngine.sleep(true); // prevent additional rescans due to our DOM manipulations during scan
playbackCacheService?.clean();
await playbackService?.update(hotspotData);
domRefreshEngine.sleep(false);
// map the information into an object
const result = {};
hotspotData.forEach(hotspot => {
const {tileId, status} = hotspot;
result[tileId] = status?.toObject?.() || {visible: false};
});
Help4.WM.listeners.onHotspotStatus.onEvent({type: 'hotspot-status', data: result});
return result;
}
}
})();