From 19106501aab1903358c5b62a5b547eb0b70e8b65 Mon Sep 17 00:00:00 2001 From: Egor Aristov Date: Tue, 4 Feb 2025 19:31:25 +0300 Subject: [PATCH] url encoding and decoding --- .../wizard-vue/src/components/Copyable.vue | 2 + frontend/wizard-vue/src/pages/WizardPage.vue | 28 ++++++++- frontend/wizard-vue/src/urlmaker/index.ts | 63 +++++++++++++++++++ frontend/wizard-vue/tsconfig.json | 7 ++- 4 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 frontend/wizard-vue/src/urlmaker/index.ts diff --git a/frontend/wizard-vue/src/components/Copyable.vue b/frontend/wizard-vue/src/components/Copyable.vue index 7e46352..7b8da9a 100644 --- a/frontend/wizard-vue/src/components/Copyable.vue +++ b/frontend/wizard-vue/src/components/Copyable.vue @@ -41,6 +41,8 @@ div.copyable { span.contents { flex: 1; padding: 4px; + overflow: hidden; + text-align: left; } span.copy { diff --git a/frontend/wizard-vue/src/pages/WizardPage.vue b/frontend/wizard-vue/src/pages/WizardPage.vue index 1091206..46c0a6a 100644 --- a/frontend/wizard-vue/src/pages/WizardPage.vue +++ b/frontend/wizard-vue/src/pages/WizardPage.vue @@ -5,6 +5,7 @@ import {type Field, fields, type Specs} from "@/urlmaker/specs.ts"; import Btn from "@/components/Btn.vue"; import Copyable from "@/components/Copyable.vue"; import EditUrlModal from "@/components/EditUrlModal.vue"; +import {decodeUrl, encodeUrl} from "@/urlmaker"; const emptySpecs = fields.reduce((o, f) => { o[f.name] = f.default; @@ -13,9 +14,9 @@ const emptySpecs = fields.reduce((o, f) => { const specs = reactive(emptySpecs); const formValid = ref(false); -watch(specs, (value, oldValue) => { +watch(specs, (value) => { formValid.value = fields.every(field => ( - specs[field.name].length === 0 && !(field as Field).required || field.validate(specs[field.name]).ok + value[field.name].length === 0 && !(field as Field).required || field.validate(value[field.name]).ok )); }); @@ -23,12 +24,33 @@ const existingLink = ref(""); const link = ref(""); const editModalVisible = ref(false); +watch(existingLink, async (value) => { + if(!value) return; + existingLink.value = ""; + try { + Object.assign(specs, await decodeUrl(value)); + link.value = ""; + } catch (e) { + console.log(e); + alert(`Decoding error: ${e}`); + } +}); + +async function generateLink() { + try { + link.value = await encodeUrl(specs); + } catch (e) { + console.log(e); + alert(`Encoding error: ${e}`); + } +} +