diff options
author | 2022-04-13 13:29:44 +0200 | |
---|---|---|
committer | 2022-04-13 13:29:44 +0200 | |
commit | afac5664c802c8480fe2c457bcfb7f5e26829cdf (patch) | |
tree | 034221a9ae212dae928d9a127c6dd0ac12a30028 /src/tools/url-encoder/url-encoder.vue | |
parent | 034c686896d0443ea587cd152535b2227234c011 (diff) | |
download | it-tools-afac5664c802c8480fe2c457bcfb7f5e26829cdf.tar.gz it-tools-afac5664c802c8480fe2c457bcfb7f5e26829cdf.tar.zst it-tools-afac5664c802c8480fe2c457bcfb7f5e26829cdf.zip |
feat(tool): url encode/decode
Diffstat (limited to 'src/tools/url-encoder/url-encoder.vue')
-rw-r--r-- | src/tools/url-encoder/url-encoder.vue | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/tools/url-encoder/url-encoder.vue b/src/tools/url-encoder/url-encoder.vue new file mode 100644 index 0000000..221184d --- /dev/null +++ b/src/tools/url-encoder/url-encoder.vue @@ -0,0 +1,100 @@ +<template> + <n-space item-style="flex:1"> + <n-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: 3 }" /> + </n-form-item> + + <n-form-item label="Your string encoded :"> + <n-input :value="encodeOutput" type="textarea" readonly placeholder="Your string encoded" + :autosize="{ minRows: 3 }" /> + </n-form-item> + + <n-space justify="center"> + <n-button @click="copyEncoded" secondary>Copy</n-button> + </n-space> + </n-card> + <n-card title="Encode"> + <n-form-item label="Your encode string :" :feedback="decodeValidation.message" + :validation-status="decodeValidation.status"> + <n-input v-model:value="decodeInput" type="textarea" placeholder="The string to decode" + :autosize="{ minRows: 3 }" /> + </n-form-item> + + <n-form-item label="Your string decoded :"> + <n-input :value="decodeOutput" type="textarea" readonly placeholder="Your string decoded" + :autosize="{ minRows: 3 }" /> + </n-form-item> + + <n-space justify="center"> + <n-button @click="copyDecoded" secondary>Copy</n-button> + </n-space> + </n-card> + </n-space> +</template> + +<script setup lang="ts"> +import { useCopy } from '@/composable/copy'; +import { useValidation } from '@/composable/validation'; +import { computed, ref } from 'vue' + +const encodeInput = ref('Hello world :)') +const encodeOutput = computed(() => { + try { + return encodeURIComponent(encodeInput.value) + } catch (_) { + return '' + } +}) + +const encodedValidation = useValidation({ + source: encodeInput, rules: [{ + validator: (value) => { + try { + encodeURIComponent(value) + return true + } catch (_) { + return false + } + }, + 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(() => { + try { + return decodeURIComponent(decodeInput.value) + } catch (_) { + return '' + } +}) + +const decodeValidation = useValidation({ + source: encodeInput, rules: [{ + validator: (value) => { + try { + decodeURIComponent(value) + return true + } catch (_) { + return false + } + }, + message: 'Impossible to parse this string' + }] +}) + +const { copy: copyDecoded } = useCopy({ source: decodeOutput, text: 'Decoded string copied to the clipboard' }) + + + +</script> + +<style lang="scss" scoped> +</style>
\ No newline at end of file |