mirror of
https://github.com/CorentinTh/it-tools.git
synced 2025-04-20 14:56:17 -04:00
fix(encryption): alert on decryption error (#711)
* update(c-alert): Add variant 'error' * fix(encryption): Alert decryption error (#652) * feat(c-alert): added title * refactor(composable): mutualized computedCatch --------- Co-authored-by: code2933 <code2933@outlook.com>
This commit is contained in:
parent
4d5a67d96d
commit
02b0d0d1a1
5 changed files with 58 additions and 6 deletions
22
src/composable/computed/catchedComputed.ts
Normal file
22
src/composable/computed/catchedComputed.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { type Ref, ref, watchEffect } from 'vue';
|
||||||
|
|
||||||
|
export { computedCatch };
|
||||||
|
|
||||||
|
function computedCatch<T, D>(getter: () => T, { defaultValue }: { defaultValue: D; defaultErrorMessage?: string }): [Ref<T | D>, Ref<string | undefined>];
|
||||||
|
function computedCatch<T, D>(getter: () => T, { defaultValue, defaultErrorMessage = 'Unknown error' }: { defaultValue?: D; defaultErrorMessage?: string } = {}) {
|
||||||
|
const error = ref<string | undefined>();
|
||||||
|
const value = ref<T | D | undefined>();
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
try {
|
||||||
|
error.value = undefined;
|
||||||
|
value.value = getter();
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
error.value = err instanceof Error ? err.message : err?.toString() ?? defaultErrorMessage;
|
||||||
|
value.value = defaultValue;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return [value, error] as const;
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { AES, RC4, Rabbit, TripleDES, enc } from 'crypto-js';
|
import { AES, RC4, Rabbit, TripleDES, enc } from 'crypto-js';
|
||||||
|
import { computedCatch } from '@/composable/computed/catchedComputed';
|
||||||
|
|
||||||
const algos = { AES, TripleDES, Rabbit, RC4 };
|
const algos = { AES, TripleDES, Rabbit, RC4 };
|
||||||
|
|
||||||
|
@ -11,9 +12,10 @@ const cypherOutput = computed(() => algos[cypherAlgo.value].encrypt(cypherInput.
|
||||||
const decryptInput = ref('U2FsdGVkX1/EC3+6P5dbbkZ3e1kQ5o2yzuU0NHTjmrKnLBEwreV489Kr0DIB+uBs');
|
const decryptInput = ref('U2FsdGVkX1/EC3+6P5dbbkZ3e1kQ5o2yzuU0NHTjmrKnLBEwreV489Kr0DIB+uBs');
|
||||||
const decryptAlgo = ref<keyof typeof algos>('AES');
|
const decryptAlgo = ref<keyof typeof algos>('AES');
|
||||||
const decryptSecret = ref('my secret key');
|
const decryptSecret = ref('my secret key');
|
||||||
const decryptOutput = computed(() =>
|
const [decryptOutput, decryptError] = computedCatch(() => algos[decryptAlgo.value].decrypt(decryptInput.value, decryptSecret.value).toString(enc.Utf8), {
|
||||||
algos[decryptAlgo.value].decrypt(decryptInput.value, decryptSecret.value).toString(enc.Utf8),
|
defaultValue: '',
|
||||||
);
|
defaultErrorMessage: 'Unable to decrypt your text',
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -63,7 +65,11 @@ const decryptOutput = computed(() =>
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<c-alert v-if="decryptError" type="error" mt-12 title="Error while decrypting">
|
||||||
|
{{ decryptError }}
|
||||||
|
</c-alert>
|
||||||
<c-input-text
|
<c-input-text
|
||||||
|
v-else
|
||||||
label="Your decrypted text:"
|
label="Your decrypted text:"
|
||||||
:value="decryptOutput"
|
:value="decryptOutput"
|
||||||
placeholder="Your string hash"
|
placeholder="Your string hash"
|
||||||
|
|
|
@ -1,11 +1,19 @@
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
const variants = ['warning'] as const;
|
const variants = ['warning', 'error'] as const;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<h2>Basic</h2>
|
||||||
<c-alert v-for="variant in variants" :key="variant" :type="variant" mb-4>
|
<c-alert v-for="variant in variants" :key="variant" :type="variant" mb-4>
|
||||||
Lorem ipsum dolor sit amet consectetur adipisicing elit. Magni reprehenderit itaque enim? Suscipit magni optio velit
|
Lorem ipsum dolor sit amet consectetur adipisicing elit. Magni reprehenderit itaque enim? Suscipit magni optio velit
|
||||||
quia, eveniet repellat pariatur quaerat laudantium dignissimos natus, beatae deleniti adipisci, atque necessitatibus
|
quia, eveniet repellat pariatur quaerat laudantium dignissimos natus, beatae deleniti adipisci, atque necessitatibus
|
||||||
odio!
|
odio!
|
||||||
</c-alert>
|
</c-alert>
|
||||||
|
|
||||||
|
<h2>With title</h2>
|
||||||
|
<c-alert v-for="variant in variants" :key="variant" :type="variant" title="This is the title" mb-4>
|
||||||
|
Lorem ipsum dolor sit amet consectetur adipisicing elit. Magni reprehenderit itaque enim? Suscipit magni optio velit
|
||||||
|
quia, eveniet repellat pariatur quaerat laudantium dignissimos natus, beatae deleniti adipisci, atque necessitatibus
|
||||||
|
odio!
|
||||||
|
</c-alert>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { defineThemes } from '../theme/theme.models';
|
||||||
import { appThemes } from '../theme/themes';
|
import { appThemes } from '../theme/themes';
|
||||||
|
|
||||||
import WarningIcon from '~icons/mdi/alert-circle-outline';
|
import WarningIcon from '~icons/mdi/alert-circle-outline';
|
||||||
|
import ErrorIcon from '~icons/mdi/close-circle-outline';
|
||||||
|
|
||||||
export const { useTheme } = defineThemes({
|
export const { useTheme } = defineThemes({
|
||||||
dark: {
|
dark: {
|
||||||
|
@ -12,6 +13,12 @@ export const { useTheme } = defineThemes({
|
||||||
textColor: appThemes.dark.warning.color,
|
textColor: appThemes.dark.warning.color,
|
||||||
icon: WarningIcon,
|
icon: WarningIcon,
|
||||||
},
|
},
|
||||||
|
error: {
|
||||||
|
backgroundColor: appThemes.dark.error.colorFaded,
|
||||||
|
borderColor: appThemes.dark.error.color,
|
||||||
|
textColor: appThemes.dark.error.color,
|
||||||
|
icon: ErrorIcon,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
light: {
|
light: {
|
||||||
warning: {
|
warning: {
|
||||||
|
@ -20,5 +27,11 @@ export const { useTheme } = defineThemes({
|
||||||
textColor: darken(appThemes.light.warning.color, 40),
|
textColor: darken(appThemes.light.warning.color, 40),
|
||||||
icon: WarningIcon,
|
icon: WarningIcon,
|
||||||
},
|
},
|
||||||
|
error: {
|
||||||
|
backgroundColor: appThemes.light.error.colorFaded,
|
||||||
|
borderColor: appThemes.light.error.color,
|
||||||
|
textColor: darken(appThemes.light.error.color, 40),
|
||||||
|
icon: ErrorIcon,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { useTheme } from './c-alert.theme';
|
import { useTheme } from './c-alert.theme';
|
||||||
|
|
||||||
const props = withDefaults(defineProps<{ type?: 'warning' }>(), { type: 'warning' });
|
const props = withDefaults(defineProps<{ type?: 'warning'; title?: string }>(), { type: 'warning', title: undefined });
|
||||||
const { type } = toRefs(props);
|
const { type, title } = toRefs(props);
|
||||||
|
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const variantTheme = computed(() => theme.value[type.value]);
|
const variantTheme = computed(() => theme.value[type.value]);
|
||||||
|
@ -17,6 +17,9 @@ const variantTheme = computed(() => theme.value[type.value]);
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="c-alert--content">
|
<div class="c-alert--content">
|
||||||
|
<div v-if="title" class="c-alert--title" text-15px fw-600>
|
||||||
|
{{ title }}
|
||||||
|
</div>
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue