diff --git a/src/composable/computedRefreshable.ts b/src/composable/computedRefreshable.ts new file mode 100644 index 00000000..e89b79b3 --- /dev/null +++ b/src/composable/computedRefreshable.ts @@ -0,0 +1,42 @@ +import { computedAsync } from '@vueuse/core'; +import { computed, ref, watch } from 'vue'; + +export { computedRefreshable, computedRefreshableAsync }; + +function computedRefreshable(getter: () => T) { + const dirty = ref(true); + let value: T; + + const update = () => (dirty.value = true); + + watch(getter, update); + + const computedValue = computed(() => { + if (dirty.value) { + value = getter(); + dirty.value = false; + } + return value; + }); + + return [computedValue, update] as const; +} + +function computedRefreshableAsync(getter: () => Promise, defaultValue?: T) { + const dirty = ref(true); + let value: T; + + const update = () => (dirty.value = true); + + watch(getter, update); + + const computedValue = computedAsync(async () => { + if (dirty.value) { + value = await getter(); + dirty.value = false; + } + return value; + }, defaultValue); + + return [computedValue, update] as const; +} diff --git a/src/tools/rsa-key-pair-generator/rsa-key-pair-generator.vue b/src/tools/rsa-key-pair-generator/rsa-key-pair-generator.vue index fbad58d3..852205d2 100644 --- a/src/tools/rsa-key-pair-generator/rsa-key-pair-generator.vue +++ b/src/tools/rsa-key-pair-generator/rsa-key-pair-generator.vue @@ -2,8 +2,10 @@
- + + + Refresh key-pair
@@ -21,9 +23,9 @@