From 2bd688097b6643e3bbbc7606c6590c5ea8cc67b3 Mon Sep 17 00:00:00 2001 From: Moaz Dawalibi Date: Wed, 16 Oct 2024 15:07:19 +0300 Subject: [PATCH] privacy page --- data.json | 16 ++++++- package-lock.json | 61 +++++++++++++++++++++++++++ package.json | 1 + src/App.tsx | 57 +++++++++++++++++-------- src/components/UI/IconCircle.tsx | 15 +++++++ src/components/layout/NavBar.tsx | 5 ++- src/enums/RoutesEnums.ts | 13 +++--- src/pages/Main/Page.tsx | 24 +++++++++++ src/pages/NotFound/NotFound.tsx | 20 +++++++++ src/pages/Privacy/Page.tsx | 27 ++++++++++++ src/styles/App/classNames.scss | 30 +++++++++++++ src/styles/components/IconCircle.scss | 18 ++++++++ src/styles/components/Layout.scss | 6 +++ src/styles/components/index.scss | 1 + src/styles/pages/Privacy.scss | 47 +++++++++++++++++++++ src/styles/pages/index.scss | 1 + 16 files changed, 316 insertions(+), 26 deletions(-) create mode 100644 src/components/UI/IconCircle.tsx create mode 100644 src/pages/Main/Page.tsx create mode 100644 src/pages/NotFound/NotFound.tsx create mode 100644 src/pages/Privacy/Page.tsx create mode 100644 src/styles/components/IconCircle.scss create mode 100644 src/styles/pages/Privacy.scss diff --git a/data.json b/data.json index 4aaec39..7b2b2ca 100644 --- a/data.json +++ b/data.json @@ -5,7 +5,8 @@ "link3": "كيف يعمل", "link4": "لقطة الشاشة", "link5": "ملاحظة", - "link6": "اتصل بنا" + "link6": "اتصل بنا", + "link7":"الخصوصية" }, "Home": { "title": "احصل على تنزيل مجاني لتطبيق", @@ -191,5 +192,18 @@ }, "Setting": { "Logo": "/Setting/LOGO.png" + }, + "Privacy": { + "title":"الخصوصية : ", + "SubTitle1":"مقدمة", + "SubTitle2":"معلومات", + "SubTitle3":"خاتمة", + "introduction":"نحن في تطبيق ذاكر نولي أهمية كبيرة لحماية بيانات مستخدمينا والحفاظ على خصوصيتهم. تهدف هذه السياسة إلى شرح كيفية جمع، استخدام، تخزين وحماية البيانات الشخصية الخاصة بك عند استخدامك للتطبيق. باستخدامك لتطبيق ذاكر، فإنك توافق على الشروط المنصوص عليها في هذه السياسة.", + "description":"البيانات التي نقوم بجمعها: نقوم بجمع الأنواع التالية من البيانات لضمان تقديم تجربة تعليمية مخصصة ومحسنة: البيانات الشخصية: الاسم، رقم الهاتف، العنوان (بشكل نصي)، الجنس، والمستوى الدراسي (بكالوريا علمي أو أدبي). بيانات الاستخدام: الأسئلة التي يقوم المستخدم بحلها وجميع الاختبارات والإجابات الخاصة بالمستخدم لتحليل أدائه وتحديد نقاط القوة والضعف. بيانات إضافية غير مباشرة: عند استخدامك للتطبيق، قد نقوم بجمع بيانات عن الأنشطة داخل التطبيق مثل الأنماط الزمنية للاستخدام، مدة الجلسات، وعدد الاختبارات المحلولة لتحسين أداء التطبيق. كيفية جمع البيانات: البيانات الشخصية: يتم إدخالها يدويًا من قبل المستخدم عند التسجيل أو تحديث الملف الشخصي. الاختبارات والإجابات: يتم جمعها تلقائيًا عند استخدام ميزات التطبيق مثل حل الاختبارات. البيانات التحليلية: يتم جمعها تلقائيًا عبر النظام الداخلي للتطبيق لمراقبة سلوك الاستخدام (لا تشمل بيانات الجهاز أو الموقع الجغرافي). الغرض من جمع البيانات: نحن نقوم بجمع بياناتك الشخصية والاستخدام لتحقيق الأهداف التالية: تخصيص تجربة المستخدم: لضمان أن تكون التجربة التعليمية متناسبة مع مستوى الطالب واحتياجاته التعليمية. تحليل الأداء: جمع بيانات الاختبارات يساعدنا على تقديم تقارير مخصصة توضح نقاط القوة والضعف لدى الطالب لتحسين مستوى التحصيل العلمي. تحسين جودة التطبيق: عبر استخدام البيانات لتحليل التفاعل مع التطبيق وتعزيز الميزات وتحسين الأداء العام. مشاركة البيانات مع أطراف ثالثة: نحن نلتزم بعدم مشاركة بياناتك الشخصية أو بيانات الاستخدام مع أي طرف ثالث، إلا في الحالات الضرورية التالية: بموافقتك الصريحة: في حال قمت بالموافقة على مشاركة بياناتك لأغراض محددة. التزامات قانونية أو أوامر قضائية أو إجراءات قانونية: إذا تطلب منا القانون الكشف عن معلومات معينة امتثالًا له. ملفات تعريف الارتباط (Cookies): على الرغم من أن التطبيق لا يستخدم ملفات تعريف الارتباط بشكل مباشر، قد يتم استخدام ملفات مشابهة في حال تم إدماج مكونات ويب مستقبلية في التطبيق. هذه الملفات تساهم في تحسين تجربة المستخدم عبر حفظ تفضيلات الاستخدام وتقديم ميزات إضافية. تخزين البيانات: المكان ومدة التخزين: يتم تخزين البيانات على سيرفرات سحابية آمنة ويتم الاحتفاظ بالبيانات طالما كنت تستخدم التطبيق. بمجرد إيقاف الاستخدام لفترة طويلة، نحتفظ بالحق في الاحتفاظ بالبيانات لأغراض تحليلية أو إدارية. التدابير الأمنية: يتم استخدام تقنيات الأمان مثل تشفير البيانات أثناء النقل (SSL) لحماية المعلومات الشخصية. كما أن الوصول إلى البيانات المخزنة مقيد لموظفي الشركة المخولين فقط، ويتم تسجيل أي وصول لتلك البيانات لضمان الأمان والشفافية. حماية البيانات: نحن نتخذ كافة التدابير الممكنة لضمان حماية بياناتك من الوصول غير المصرح به أو التعديل أو الكشف. نعتمد على البروتوكولات الأمنية القياسية لتشفير البيانات أثناء النقل، ونراقب بشكل دوري الأنظمة الخاصة بنا لضمان عدم وجود ثغرات أمان. حقوق المستخدم: نحن نمنح مستخدمينا الحقوق التالية: الحق في الوصول: يمكنك الوصول إلى البيانات الشخصية التي قمنا بجمعها عنك من خلال حسابك في التطبيق. الحق في التعديل: يمكنك تعديل البيانات الشخصية الخاصة بك من خلال إعدادات الحساب. الحق في الاعتراض: في حال رغبت بعدم استخدام بياناتك لتحليل الأداء، يمكنك الاعتراض على ذلك من خلال إعدادات الحساب. الحق في تقييد المعالجة: يمكنك طلب تقييد معالجة بياناتك في حالات محددة. يرجى ملاحظة أنه لا يمكن للمستخدم طلب حذف البيانات بسبب طبيعة خدمات التطبيق التعليمية وتحليل الأداء المستمر. الأطفال والخصوصية: تطبيق ذاكر مخصص فقط للمستخدمين الذين يبلغون 18 عامًا أو أكثر (طلاب المرحلة الثانوية). نحن لا نقوم بجمع بيانات شخصية عن عمد من الأطفال دون السن المسموح به. إذا اكتشفنا أننا قمنا بجمع بيانات من مستخدم دون السن القانوني، سنقوم بحذف هذه البيانات على الفور. الإعلانات والتحليلات: نحن لا نقوم بعرض إعلانات داخل التطبيق، كما أننا لا نستخدم أدوات خارجية لتحليل بيانات المستخدم مثل Google Analytics. يتم التعامل مع كافة بيانات الاستخدام داخليًا لأغراض تحسين تجربة المستخدم وتحليل الأداء التعليمي. التغييرات على سياسة الخصوصية: نحتفظ بالحق في تعديل هذه السياسة من وقت لآخر لتتوافق مع التحديثات القانونية أو لتحسين مستوى حماية البيانات. في حال إجراء أي تغييرات جوهرية على سياسة الخصوصية، سيتم إعلام المستخدمين داخل التطبيق وسيتعين عليك الموافقة على التغييرات لمواصلة استخدام التطبيق. الامتثال للقوانين: نلتزم بجميع القوانين واللوائح المعمول بها المتعلقة بحماية البيانات الشخصية، بما في ذلك قوانين حماية البيانات المحلية والدولية مثل اللائحة العامة لحماية البيانات (GDPR)، وقانون حماية خصوصية المستهلك في كاليفورنيا (CCPA) في حال كان التطبيق متاحًا في تلك المناطق. التواصل معنا: في حال كان لديك أي استفسارات أو شكاوى بخصوص سياسة الخصوصية أو طريقة تعاملنا مع بياناتك الشخصية، يمكنك التواصل معنا عبر البريد الإلكتروني التالي: info@misbar.education.", + "conclusion":"نحن ملتزمون بحماية خصوصيتك وبياناتك الشخصية. إذا كان لديك أي استفسار أو كنت بحاجة إلى توضيحات إضافية، يرجى عدم التردد في التواصل معنا." + }, + "NotFound": { + "title":"عذرا الصفخة غير موجودة", + "description":"ارجع للصفحة الرئيسية" } } diff --git a/package-lock.json b/package-lock.json index 9ee80e5..162ebff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "react-dom": "^18.3.1", "react-icons": "^5.3.0", "react-player": "^2.16.0", + "react-router-dom": "^6.27.0", "swiper": "^11.1.14" }, "devDependencies": { @@ -1416,6 +1417,14 @@ "react-dom": ">=16.9.0" } }, + "node_modules/@remix-run/router": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", + "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", @@ -4033,6 +4042,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz", + "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==", + "dependencies": { + "@remix-run/router": "1.20.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz", + "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==", + "dependencies": { + "@remix-run/router": "1.20.0", + "react-router": "6.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/readdirp": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", @@ -5579,6 +5618,11 @@ "rc-util": "^5.38.0" } }, + "@remix-run/router": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", + "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==" + }, "@rollup/rollup-android-arm-eabi": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", @@ -7443,6 +7487,23 @@ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true }, + "react-router": { + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz", + "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==", + "requires": { + "@remix-run/router": "1.20.0" + } + }, + "react-router-dom": { + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz", + "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==", + "requires": { + "@remix-run/router": "1.20.0", + "react-router": "6.27.0" + } + }, "readdirp": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", diff --git a/package.json b/package.json index d390def..8694127 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "react-dom": "^18.3.1", "react-icons": "^5.3.0", "react-player": "^2.16.0", + "react-router-dom": "^6.27.0", "swiper": "^11.1.14" }, "devDependencies": { diff --git a/src/App.tsx b/src/App.tsx index 66eac71..d482190 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,25 +1,46 @@ +import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; +import { lazy, Suspense } from 'react'; +import { Spin } from 'antd'; import Layout from './components/layout/Layout'; -import DownloadPage from './pages/DownloadPage'; -import FeaturesPage from './pages/FeaturesPage'; -import HomePage from './pages/HomePage'; -import HowItWork from './pages/HowItWork'; -import NotePage from './pages/NotePage'; -import ScreenShoot from './pages/ScreenShoot'; -import VideoPage from './pages/VideoPage'; -import ContactPage from './pages/ContactPage'; import './styles/App/index.scss'; +const PrivacyPage = lazy(() => import("./pages/Privacy/Page")); +const Page = lazy(() => import("./pages/Main/Page")); +const NotFoundPage = lazy(() => import("./pages/NotFound/NotFound")); + const App = () => { return ( - - - - - - - - - - + + + }> + + + + + } + /> + }> + + + + + } + /> + }> + + + } + /> + + ); }; diff --git a/src/components/UI/IconCircle.tsx b/src/components/UI/IconCircle.tsx new file mode 100644 index 0000000..6799621 --- /dev/null +++ b/src/components/UI/IconCircle.tsx @@ -0,0 +1,15 @@ +import { ReactElement } from 'react' + +const IconCircle = ({icon,color,hoverColor}:{icon?:ReactElement,color?:string,hoverColor?:string}) => { + return ( +
+ + {icon} + +
+ ) +} + +export default IconCircle \ No newline at end of file diff --git a/src/components/layout/NavBar.tsx b/src/components/layout/NavBar.tsx index cae08f1..0f25a1b 100644 --- a/src/components/layout/NavBar.tsx +++ b/src/components/layout/NavBar.tsx @@ -22,6 +22,7 @@ const NavBar: React.FC = () => { { path: RoutesEnums.SCREEN_SHOOT, label: navBarData.link4 }, { path: RoutesEnums.NOTE, label: navBarData.link5 }, { path: RoutesEnums.CONTACT, label: navBarData.link6 }, + { path: RoutesEnums.PRIVACY, label: navBarData.link7 }, ]; const [Open, setOpen] = useState(false); const handleToggle = () => { @@ -56,8 +57,10 @@ const NavBar: React.FC = () => { const handleClick = () => { setActive(link.path); }; + console.log(link); + const isActive = - Active === '' && link.path === '#' ? true : Active === link.path; + Active === '' && link.path === '/#' ? true : Active === link.path; return (
  • { + return ( + <> + + + + + + + + + + ) +} + +export default Page \ No newline at end of file diff --git a/src/pages/NotFound/NotFound.tsx b/src/pages/NotFound/NotFound.tsx new file mode 100644 index 0000000..d4945a1 --- /dev/null +++ b/src/pages/NotFound/NotFound.tsx @@ -0,0 +1,20 @@ +import { Button } from 'antd' +import { useNavigate } from 'react-router-dom' +import { NotFound as NotFoundData } from '../../../data.json'; +import { ImSad2 } from 'react-icons/im'; + +const NotFound = () => { + const nav = useNavigate(); + return ( +
    + {NotFoundData.title} + + +
    + + ) +} + +export default NotFound \ No newline at end of file diff --git a/src/pages/Privacy/Page.tsx b/src/pages/Privacy/Page.tsx new file mode 100644 index 0000000..78adb5f --- /dev/null +++ b/src/pages/Privacy/Page.tsx @@ -0,0 +1,27 @@ +import { Privacy as PrivacyData } from '../../../data.json'; + +const Page = () => { + return ( +
    +

    {PrivacyData.title}

    + +
    +
    {PrivacyData.SubTitle1}
    +

    {PrivacyData.introduction}

    +
    + +
    +
    {PrivacyData.SubTitle2}
    +

    {PrivacyData.description}

    +
    + +
    +
    {PrivacyData.SubTitle3}
    +

    {PrivacyData.conclusion}

    +
    + +
    + ) +} + +export default Page \ No newline at end of file diff --git a/src/styles/App/classNames.scss b/src/styles/App/classNames.scss index 47fcfb4..194f386 100644 --- a/src/styles/App/classNames.scss +++ b/src/styles/App/classNames.scss @@ -14,3 +14,33 @@ } .spinner { } + + +.not_found{ + @include Flex; + text-align: center; + background: var(--thirdly); + color: var(--white); + font-size: 40px; + width: 100%;height: 100vh; + display: flex; flex-direction: column; + gap: 30px; +} + +.button { + outline: none; + border: none; + border-radius: 10px; + padding: 3vw 1vw; + background: var(--secondary); + color: var(--white); + display: flex; + align-items: center; + justify-content: center; + gap: 5px; + font-size: 20px; + width: 200px; + &:hover{ + color: var(--thirdly) !important; + } +} \ No newline at end of file diff --git a/src/styles/components/IconCircle.scss b/src/styles/components/IconCircle.scss new file mode 100644 index 0000000..34ae092 --- /dev/null +++ b/src/styles/components/IconCircle.scss @@ -0,0 +1,18 @@ +.icon_circle{ + width: 50px; + height: 50px; + border-radius: 50%; + border-color: var(--primary); + color: var(--primary); + @include Flex; text-align: center; + svg{ + color: var(--primary); + font-size: 30px; + } + &:hover{ + background: var(--primary); + svg{ + color: var(--white); + } + } +} \ No newline at end of file diff --git a/src/styles/components/Layout.scss b/src/styles/components/Layout.scss index 7b0cf20..8402a42 100644 --- a/src/styles/components/Layout.scss +++ b/src/styles/components/Layout.scss @@ -11,3 +11,9 @@ // z-index: 1000; // background: black; // } + + +.Layout{ + // display: flex;align-items: center;justify-content: center; flex-direction: column; + +} \ No newline at end of file diff --git a/src/styles/components/index.scss b/src/styles/components/index.scss index 2340e11..1558191 100644 --- a/src/styles/components/index.scss +++ b/src/styles/components/index.scss @@ -4,3 +4,4 @@ @import './NavBar.scss'; @import './Footer.scss'; @import './BackToTop.scss'; +@import './IconCircle.scss'; \ No newline at end of file diff --git a/src/styles/pages/Privacy.scss b/src/styles/pages/Privacy.scss new file mode 100644 index 0000000..51bc4de --- /dev/null +++ b/src/styles/pages/Privacy.scss @@ -0,0 +1,47 @@ +.privacy{ + display: flex; flex-direction: column; + width: 90%; + margin-inline: auto; + min-height: 100vh; + transform: translateY(130px); + gap: 30px; + h2{ + font-size: 40px; + color: var(--text); + } + h5{ + font-size: 30px; + color: var(--thirdly) !important; + } + p{ + color: rgb(97, 97, 97); + font-size: 18px; + } +} + + +@media screen and (max-width: 700px) { + .privacy{ + display: flex; flex-direction: column; + width: 90%; + margin-inline: auto; + min-height: 100vh; + transform: translateY(130px); + gap: 20px; + padding-bottom: 100px; + h2{ + font-size: 30px; + color: var(--text); + } + h5{ + font-size: 24px; + color: var(--thirdly) !important; + } + p{ + color: rgb(97, 97, 97); + font-size: 14px; + } + } + + } + \ No newline at end of file diff --git a/src/styles/pages/index.scss b/src/styles/pages/index.scss index d01a583..1d85835 100644 --- a/src/styles/pages/index.scss +++ b/src/styles/pages/index.scss @@ -6,3 +6,4 @@ @import './NotePage.scss'; @import './DownloadPage.scss'; @import './ContactPage.scss'; +@import './Privacy.scss';