import type { MaybeRef } from '@vueuse/core' import { computed, inject, provide, ref, unref, watch } from 'vue' const STORAGE_KEY = 'axolotl:symlink-warning-dismissed' const PROVIDE_KEY = Symbol('symlinkWarningDismiss') function loadDismissed(): Set { try { const raw = localStorage.getItem(STORAGE_KEY) if (raw) { return new Set(JSON.parse(raw)) } } catch { // ignore } return new Set() } function saveDismissed(set: Set) { try { localStorage.setItem(STORAGE_KEY, JSON.stringify([...set])) } catch { // ignore } } const dismissedInstances = ref>(loadDismissed()) export interface SymlinkWarningDismissState { isHidden: import('vue').ComputedRef dismissTemp: () => void dismissPermanently: () => void } export function useSymlinkWarningDismiss(instanceId: MaybeRef) { const locallyHidden = ref(false) const isDismissed = computed(() => { const id = unref(instanceId) if (!id) return false return dismissedInstances.value.has(id) }) const isHidden = computed(() => locallyHidden.value || isDismissed.value) watch( () => unref(instanceId), () => { locallyHidden.value = false }, ) function dismissTemp() { locallyHidden.value = true } function dismissPermanently() { const id = unref(instanceId) if (!id) return const next = new Set(dismissedInstances.value) next.add(id) dismissedInstances.value = next saveDismissed(next) } const state: SymlinkWarningDismissState = { isHidden, dismissTemp, dismissPermanently, } provide(PROVIDE_KEY, state) return state } export function injectSymlinkWarningDismiss(): SymlinkWarningDismissState | null { return inject(PROVIDE_KEY, null) }