import { Controller } from "@hotwired/stimulus"
import { subscription } from "~/javascripts/store/mixins/subscription"
/**
* @class Dashboard.SuccessfulBuildsController
* @classdesc Stimulus controller that populates the number of successful builds per build context.
* @extends Controller
**/
export default class extends Controller {
static targets = [ "production", "deployPreview", "cms" ]
static values = {
loading: String,
storeId: String
}
/**
* Subscribe to the store.
*
* @instance
* @memberof Dashboard.SuccessfulBuildsController
**/
connect() {
subscription(this)
this.subscribe()
this.reconnect()
}
/**
* Handles a repeated Turbo visit to the dashboard page.
*
* @instance
* @memberof Dashboard.SuccessfulBuildsController
**/
reconnect() {
if (this.store("selectedDataVizData")) {
this.storeUpdated("selectedDataVizData", this.storeIdValue)
}
}
/**
* Sets the text for the number of builds
*
* @instance
* @memberof Dashboard.SuccessfulBuildsController
**/
updateSuccessfulBuildsValue(target, text, context) {
target.innerHTML = `${text} ${this.calculateNumberOfBuilds(context)}`
}
/**
* Sets the text whilst waiting for the number of builds
*
* @instance
* @memberof Dashboard.SuccessfulBuildsController
**/
loadingSuccessfulBuildsValue(target, text) {
target.innerHTML = `${text} ${this.loadingValue}`
}
/**
* @instance
* @memberof Dashboard.SuccessfulBuildsController
**/
calculateNumberOfBuilds(context) {
return this.store("selectedDataVizData").reduce((acc , data) => {
return data.context === context ? acc + 1 : acc
}, 0)
}
/**
* Triggered by the store whenever any store data changes. Controls whether the number of builds should
* be populated or display the loading indicator
*
* @instance
* @memberof Dashboard.SuccessfulBuildsController
**/
storeUpdated(prop, storeId) {
if (this.store("fetchingDataVizData")) {
this.loadingSuccessfulBuildsValue(this.productionTarget, "Production")
this.loadingSuccessfulBuildsValue(this.deployPreviewTarget, "Deploy preview")
this.loadingSuccessfulBuildsValue(this.cmsTarget, "CMS")
}
if (prop === "selectedDataVizData" && storeId === this.storeIdValue) {
this.updateSuccessfulBuildsValue(this.productionTarget, "Production ...", "production")
this.updateSuccessfulBuildsValue(this.deployPreviewTarget, "Deploy preview ...", "deploy-preview")
this.updateSuccessfulBuildsValue(this.cmsTarget, "CMS ...", "cms")
}
}
/**
* Unsubscribe from the store
*
* @instance
* @memberof Dashboard.SuccessfulBuildsController
**/
disconnect() {
this.unsubscribe()
}
}