diff --git a/src/components/common/FormItem.vue b/src/components/common/FormItem.vue index 6bb934f40..1ea5867a0 100644 --- a/src/components/common/FormItem.vue +++ b/src/components/common/FormItem.vue @@ -35,6 +35,7 @@ import CustomFormValue from '@/components/common/CustomFormValue.vue' import FormColorPicker from '@/components/common/FormColorPicker.vue' import FormImageUpload from '@/components/common/FormImageUpload.vue' import InputSlider from '@/components/common/InputSlider.vue' +import UrlInput from '@/components/common/UrlInput.vue' import { FormItem } from '@/types/settingTypes' const formValue = defineModel('formValue') @@ -91,6 +92,8 @@ function getFormComponent(item: FormItem): Component { return FormImageUpload case 'color': return FormColorPicker + case 'url': + return UrlInput default: return InputText } diff --git a/src/components/common/UrlInput.vue b/src/components/common/UrlInput.vue new file mode 100644 index 000000000..6af0a53a6 --- /dev/null +++ b/src/components/common/UrlInput.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/types/settingTypes.ts b/src/types/settingTypes.ts index ec2ea60b2..6b27b8a0e 100644 --- a/src/types/settingTypes.ts +++ b/src/types/settingTypes.ts @@ -8,6 +8,7 @@ export type SettingInputType = | 'text' | 'image' | 'color' + | 'url' | 'hidden' export type SettingCustomRenderer = ( diff --git a/src/utils/formatUtil.ts b/src/utils/formatUtil.ts index 7de9f7164..e408cfaaa 100644 --- a/src/utils/formatUtil.ts +++ b/src/utils/formatUtil.ts @@ -204,3 +204,12 @@ export function processDynamicPrompt(input: string): string { return result.replace(/\\([{}|])/g, '$1') } + +export function isValidUrl(url: string): boolean { + try { + new URL(url) + return true + } catch { + return false + } +} diff --git a/src/utils/networkUtil.ts b/src/utils/networkUtil.ts new file mode 100644 index 000000000..65ea23bd8 --- /dev/null +++ b/src/utils/networkUtil.ts @@ -0,0 +1,12 @@ +import axios from 'axios' + +const VALID_STATUS_CODES = [200, 201, 301, 302, 307, 308] +export const checkUrlReachable = async (url: string): Promise => { + try { + const response = await axios.head(url) + // Additional check for successful response + return VALID_STATUS_CODES.includes(response.status) + } catch { + return false + } +}