it-tools/src/tools/url-encoder/url-encoder.vue

100 lines
2.6 KiB
Vue
Raw Normal View History

<script setup lang="ts">
import { useCopy } from '@/composable/copy';
import { useValidation } from '@/composable/validation';
import { isNotThrowing } from '@/utils/boolean';
import { withDefaultOnError } from '@/utils/defaults';
const encodeInput = ref('Hello world :)');
const encodeOutput = computed(() => withDefaultOnError(() => encodeURIComponent(encodeInput.value), ''));
const encodedValidation = useValidation({
source: encodeInput,
rules: [
{
validator: value => isNotThrowing(() => encodeURIComponent(value)),
message: 'Impossible to parse this string',
},
],
});
const { copy: copyEncoded } = useCopy({ source: encodeOutput, text: 'Encoded string copied to the clipboard' });
const decodeInput = ref('Hello%20world%20%3A)');
const decodeOutput = computed(() => withDefaultOnError(() => decodeURIComponent(decodeInput.value), ''));
const decodeValidation = useValidation({
source: encodeInput,
rules: [
{
validator: value => isNotThrowing(() => decodeURIComponent(value)),
message: 'Impossible to parse this string',
},
],
});
const { copy: copyDecoded } = useCopy({ source: decodeOutput, text: 'Decoded string copied to the clipboard' });
</script>
2022-04-13 13:29:44 +02:00
<template>
<c-card title="Encode">
<n-form-item
label="Your string :"
:feedback="encodedValidation.message"
:validation-status="encodedValidation.status"
>
<n-input
v-model:value="encodeInput"
type="textarea"
placeholder="The string to encode"
:autosize="{ minRows: 2 }"
/>
</n-form-item>
2022-04-13 13:29:44 +02:00
<n-form-item label="Your string encoded :">
<n-input
:value="encodeOutput"
type="textarea"
readonly
placeholder="Your string encoded"
:autosize="{ minRows: 2 }"
/>
</n-form-item>
2022-04-13 13:29:44 +02:00
2023-05-27 17:36:15 +02:00
<div flex justify-center>
<c-button @click="copyEncoded">
Copy
</c-button>
2023-05-27 17:36:15 +02:00
</div>
</c-card>
<c-card title="Decode">
<n-form-item
label="Your encoded string :"
:feedback="decodeValidation.message"
:validation-status="decodeValidation.status"
>
<n-input
v-model:value="decodeInput"
type="textarea"
placeholder="The string to decode"
:autosize="{ minRows: 2 }"
/>
</n-form-item>
2022-04-13 13:29:44 +02:00
<n-form-item label="Your string decoded :">
<n-input
:value="decodeOutput"
type="textarea"
readonly
placeholder="Your string decoded"
:autosize="{ minRows: 2 }"
/>
</n-form-item>
2022-04-13 13:29:44 +02:00
2023-05-27 17:36:15 +02:00
<div flex justify-center>
<c-button @click="copyDecoded">
Copy
</c-button>
2023-05-27 17:36:15 +02:00
</div>
</c-card>
2022-04-13 13:29:44 +02:00
</template>