RSS Git Download  Clone
Raw Blame History 3kB 106 lines
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { useSettingsStore } from './settings.store'

function computeApiHost(): string {
    const apiUrl = new URL(location.toString())
    if ((globalThis as any).p3xrDevMode === true) {
        const apiPort = (globalThis as any).p3xrApiPort || '7843'
        return `http://${apiUrl.hostname}:${apiPort}`
    }
    return `${apiUrl.protocol}//${apiUrl.host}`
}

export const useRedisStateStore = defineStore('redisState', () => {
    const apiHost = ref(computeApiHost())
    const connection = ref<any>(undefined)
    const connections = ref<{ list: any[] }>({ list: [] })
    const cfg = ref<any>(undefined)
    const version = ref<string | undefined>(undefined)
    const currentDatabase = ref<number | undefined>(undefined)
    const databaseIndexes = ref<number[]>([])
    const keysRaw = ref<string[]>([])
    const keysInfo = ref<any>(undefined)
    const search = ref('')
    const page = ref(1)
    const info = ref<any>(undefined)
    const dbsize = ref<number | undefined>(undefined)
    const monitor = ref(false)
    const commands = ref<string[]>([])
    const commandsMeta = ref<Record<string, { syntax: string; group: string }>>({})
    const modules = ref<any[]>([])
    const hasRediSearch = ref(false)
    const hasReJSON = ref(false)
    const hasTimeSeries = ref(false)
    const hasBloom = ref(false)
    const theme = ref<string | undefined>(undefined)
    const redisConnections = ref<Record<string, any>>({})
    const keysInfoFetchedAt = ref(Date.now())
    const redisChanged = ref(false)
    const failed = ref(false)
    const reducedFunctions = ref(false)

    function resetConnections() {
        connections.value = { list: [] }
    }

    // --- Computed helpers (matching Angular computed signals) ---
    const filteredKeys = computed(() => {
        const settings = useSettingsStore()
        let keys = keysRaw.value.slice()
        if (settings.searchClientSide && typeof search.value === 'string' && search.value.length > 0) {
            keys = settings.searchStartsWith
                ? keys.filter((k: string) => k.startsWith(search.value))
                : keys.filter((k: string) => k.includes(search.value))
        }
        return keys
    })

    const paginatedKeys = computed(() => {
        const settings = useSettingsStore()
        const keys = filteredKeys.value
        if (keys.length <= settings.pageCount) return keys
        const start = (page.value - 1) * settings.pageCount
        return keys.slice(start, start + settings.pageCount)
    })

    const pages = computed(() => {
        const settings = useSettingsStore()
        return Math.ceil(filteredKeys.value.length / settings.pageCount)
    })

    return {
        apiHost,
        connection,
        connections,
        cfg,
        version,
        currentDatabase,
        databaseIndexes,
        keysRaw,
        keysInfo,
        search,
        page,
        info,
        dbsize,
        monitor,
        commands,
        commandsMeta,
        modules,
        hasRediSearch,
        hasReJSON,
        hasTimeSeries,
        hasBloom,
        theme,
        redisConnections,
        keysInfoFetchedAt,
        redisChanged,
        failed,
        reducedFunctions,
        resetConnections,
        filteredKeys,
        paginatedKeys,
        pages,
    }
})