Freika/dawarich · warning
[Settings] No API key available for recalculation status che
Error message
[Settings] No API key available for recalculation status check
What it means
The transportation-mode recalculation status poll needs the user's API key as a Bearer token. The Stimulus controller exposes it via apiKeyValue; when that value is blank the manager logs this warning and skips the fetch entirely, leaving the recalculation progress UI unupdated.
Source
Thrown at app/javascript/controllers/maps/maplibre/settings_manager.js:468
this.setTransportationSettingsLocked(true)
// Start polling for status updates
this.startRecalculationPolling()
} else {
Toast.success(translate("messages.transportation_settings_saved"))
this.resetTransportationDirtyState()
}
}
// ===== Transportation Mode Recalculation Status =====
/**
* Check the transportation mode recalculation status
*/
async checkRecalculationStatus() {
try {
const apiKey = this.controller.apiKeyValue
if (!apiKey) {
console.warn(
"[Settings] No API key available for recalculation status check",
)
return
}
const response = await fetch(
"/api/v1/settings/transportation_recalculation_status",
{
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
},
)
if (!response.ok) {
console.warn(
"[Settings] Failed to check recalculation status:",View on GitHub (pinned to 97fad417c5)
Solutions
- Generate an API key in the app's API keys settings if the user has none
- Ensure the map element renders data-maps--maplibre-api-key-value with the key (check the DOM)
- If the status UI must work without a key, expose recalculation status through a session-authenticated route instead of the API-key endpoint
- Treat as expected when keyless — downgrade to debug and render a neutral state
Example fix
// before
const apiKey = this.controller.apiKeyValue
if (!apiKey) {
console.warn("[Settings] No API key available for recalculation status check")
return
}
// after
const apiKey = this.controller.apiKeyValue
if (!apiKey) {
console.debug("[Settings] No API key; skipping recalculation status poll")
this.updateRecalculationUI({ status: "unknown" }) // neutral UI instead of stale UI
return
} Defensive patterns
Strategy: validation
Validate before calling
const key = this.controller.apiKeyValue
if (typeof key !== "string" || key.trim().length === 0) {
this.updateRecalculationUI({ status: "unknown" })
return
} Type guard
/** @param {unknown} v @returns {v is string} */
function isNonEmptyKey(v) {
return typeof v === "string" && v.trim().length > 0
} Prevention
- Render the API key data attribute server-side from the current user's active key
- Hide recalculation-progress UI when no key is present instead of polling and warning
- Keep Stimulus value names in sync between markup and controller definitions across upgrades
When it happens
Trigger: The maps controller element lacks its api-key data attribute (anonymous view, template regression, value renamed in an upgrade); the attribute present but empty because the user never generated an API key; a shared or embedded map rendered without a key.
Common situations: Fresh installs where the user has not created an API key in settings; view refactors dropping the data attribute; controller value names changed between versions so old markup no longer populates apiKeyValue.
Related errors
- [Settings] Failed to check recalculation status:
- blank token
- client_id not configured
- blank token
- Google client IDs not configured
AI-assisted analysis of Freika/dawarich@97fad417c5 (2026-08-21).
Data as JSON: /api/errors/a8e8e3120e57ac4d.
Report an issue: GitHub.