diff --git a/package-lock.json b/package-lock.json index 876a791..b0f2563 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "iconsax-react": "^0.0.8", "leaflet": "^1.9.4", "moment-jalaali": "^0.10.4", + "qrcode.react": "^4.2.0", "rc-rate": "^2.13.1", "react": "^19.1.1", "react-dom": "^19.1.1", @@ -46,6 +47,7 @@ "@types/leaflet": "^1.9.21", "@types/moment-jalaali": "^0.7.9", "@types/node": "^24.10.1", + "@types/qrcode.react": "^1.0.5", "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", "@vitejs/plugin-react": "^5.0.0", @@ -2383,6 +2385,16 @@ "undici-types": "~7.16.0" } }, + "node_modules/@types/qrcode.react": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/qrcode.react/-/qrcode.react-1.0.5.tgz", + "integrity": "sha512-BghPtnlwvrvq8QkGa1H25YnN+5OIgCKFuQruncGWLGJYOzeSKiix/4+B9BtfKF2wf5ja8yfyWYA3OXju995G8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react": { "version": "19.1.11", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.11.tgz", @@ -4987,6 +4999,15 @@ "node": ">=6" } }, + "node_modules/qrcode.react": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-4.2.0.tgz", + "integrity": "sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", diff --git a/package.json b/package.json index 8c10cdf..b229362 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "iconsax-react": "^0.0.8", "leaflet": "^1.9.4", "moment-jalaali": "^0.10.4", + "qrcode.react": "^4.2.0", "rc-rate": "^2.13.1", "react": "^19.1.1", "react-dom": "^19.1.1", @@ -48,6 +49,7 @@ "@types/leaflet": "^1.9.21", "@types/moment-jalaali": "^0.7.9", "@types/node": "^24.10.1", + "@types/qrcode.react": "^1.0.5", "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", "@vitejs/plugin-react": "^5.0.0", diff --git a/src/pages/settings/GeneralSettings.tsx b/src/pages/settings/GeneralSettings.tsx index b2299da..fc5bb3a 100644 --- a/src/pages/settings/GeneralSettings.tsx +++ b/src/pages/settings/GeneralSettings.tsx @@ -28,6 +28,22 @@ const validationSchema = yup.object({ .min(1, 'حداقل یک شماره تماس الزامی است') .of(yup.string().required('شماره تماس الزامی است')), instagram: yup.string().url('لینک اینستاگرام معتبر نیست').nullable(), + domain: yup + .string() + .nullable() + .test('domain-or-url', 'آدرس وب‌سایت معتبر نیست', (value) => { + if (!value) return true + const trimmed = value.trim() + if (/^https?:\/\//i.test(trimmed)) { + try { + new URL(trimmed) + return true + } catch { + return false + } + } + return /^([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}(\/.*)?$/.test(trimmed) + }), address: yup.string().required('آدرس الزامی است'), latitude: yup.number().required('انتخاب موقعیت روی نقشه الزامی است'), longitude: yup.number().required('انتخاب موقعیت روی نقشه الزامی است'), @@ -52,6 +68,7 @@ const GeneralSettings: FC = () => { menuColor: '#000000', phones: [''], instagram: '', + domain: '', address: '', latitude: 0, longitude: 0, @@ -112,6 +129,7 @@ const GeneralSettings: FC = () => { ? [restaurantData.phone] : [''], instagram: restaurantData.instagram || '', + domain: restaurantData.domain || '', address: restaurantData.address || '', latitude: restaurantData.latitude || 0, longitude: restaurantData.longitude || 0, @@ -206,6 +224,22 @@ const GeneralSettings: FC = () => { /> +
+ +

+ در صورتی که دامنه خریداری کرده اید آدرس دامنه خریداری شده رو وارد کنید +

+
+