Files
kestrelos/app/pages/settings.vue
Madison Grubb 1668ec4230
All checks were successful
ci/woodpecker/pr/pr Pipeline was successful
heavily simplify server and app content. unify styling
2026-02-13 23:36:17 -05:00

113 lines
2.8 KiB
Vue

<template>
<div class="p-6">
<h2 class="kestrel-page-heading mb-4">
Settings
</h2>
<section class="mb-8">
<h3 class="kestrel-section-label">
Map & offline
</h3>
<div class="kestrel-card p-4">
<p class="mb-3 text-sm text-kestrel-text">
Clear saved map tiles to free storage. The map will load tiles from the network again when you use it.
</p>
<p
v-if="tilesStored !== null"
class="mb-2 text-xs text-kestrel-muted"
>
{{ tilesStored > 0 ? `${tilesStored} tiles stored.` : 'No tiles stored.' }}
</p>
<p
v-if="tilesMessage"
class="mb-2 text-sm"
:class="tilesMessageSuccess ? 'text-green-400' : 'text-red-400'"
>
{{ tilesMessage }}
</p>
<button
type="button"
class="kestrel-btn-secondary disabled:opacity-50"
:disabled="tilesLoading"
@click="onClearTiles"
>
{{ tilesLoading ? 'Clearing…' : 'Clear saved map tiles' }}
</button>
</div>
</section>
<section>
<h3 class="kestrel-section-label">
About
</h3>
<div class="kestrel-card p-4">
<p class="font-medium text-kestrel-text">
KestrelOS
</p>
<p
v-if="version"
class="mt-1 text-sm text-kestrel-muted"
>
Version {{ version }}
</p>
<p class="mt-2 text-xs text-kestrel-muted">
Tactical Operations Center for OSINT feeds.
</p>
</div>
</section>
</div>
</template>
<script setup>
const config = useRuntimeConfig()
const version = config.public?.version ?? null
const tilesStored = ref(null)
const tilesMessage = ref('')
const tilesMessageSuccess = ref(false)
const tilesLoading = ref(false)
async function loadTilesStored() {
if (typeof window === 'undefined') return
try {
const offline = await import('leaflet.offline')
if (offline.getStorageLength) {
const n = await offline.getStorageLength()
tilesStored.value = n
}
}
catch {
tilesStored.value = null
}
}
async function onClearTiles() {
tilesMessage.value = ''
tilesLoading.value = true
try {
const offline = await import('leaflet.offline')
if (offline.truncate) {
await offline.truncate()
tilesStored.value = 0
tilesMessage.value = 'Saved map tiles cleared.'
tilesMessageSuccess.value = true
}
else {
tilesMessage.value = 'Could not clear tiles.'
tilesMessageSuccess.value = false
}
}
catch (e) {
tilesMessage.value = e?.message ?? 'Failed to clear tiles.'
tilesMessageSuccess.value = false
}
finally {
tilesLoading.value = false
}
}
onMounted(() => {
loadTilesStored()
})
</script>