aboutsummaryrefslogtreecommitdiff
path: root/src/tools/url-encoder/url-encoder.vue
diff options
context:
space:
mode:
authorGravatar Corentin Thomasset <corentin.thomasset74@gmail.com> 2022-04-13 13:29:44 +0200
committerGravatar Corentin Thomasset <corentin.thomasset74@gmail.com> 2022-04-13 13:29:44 +0200
commitafac5664c802c8480fe2c457bcfb7f5e26829cdf (patch)
tree034221a9ae212dae928d9a127c6dd0ac12a30028 /src/tools/url-encoder/url-encoder.vue
parent034c686896d0443ea587cd152535b2227234c011 (diff)
downloadit-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.vue100
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