diff --git a/lesson_25/JBEY/package-lock.json b/lesson_25/JBEY/package-lock.json index 3a93970a6..ad9666717 100644 --- a/lesson_25/JBEY/package-lock.json +++ b/lesson_25/JBEY/package-lock.json @@ -11,11 +11,12 @@ "@tanstack/react-query": "^5.62.7", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router-dom": "^7.5.3" + "react-router-dom": "^7.0.2" }, "devDependencies": { "@stylistic/eslint-plugin": "^2.12.1", "@trivago/prettier-plugin-sort-imports": "^5.2.0", + "@types/node": "^22.15.17", "@types/react": "^19.0.1", "@types/react-dom": "^19.0.2", "@typescript-eslint/eslint-plugin": "^8.18.0", @@ -1806,6 +1807,12 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -1820,6 +1827,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, "node_modules/@types/react": { "version": "19.0.1", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.1.tgz", @@ -3353,11 +3370,12 @@ } }, "node_modules/react-router": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz", - "integrity": "sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.0.2.tgz", + "integrity": "sha512-m5AcPfTRUcjwmhBzOJGEl6Y7+Crqyju0+TgTQxoS4SO+BkWbhOrcfZNq6wSWdl2BBbJbsAoBUb8ZacOFT+/JlA==", "license": "MIT", "dependencies": { + "@types/cookie": "^0.6.0", "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0", "turbo-stream": "2.4.0" @@ -3376,12 +3394,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.3.tgz", - "integrity": "sha512-cK0jSaTyW4jV9SRKAItMIQfWZ/D6WEZafgHuuCb9g+SjhLolY78qc+De4w/Cz9ybjvLzShAmaIMEXt8iF1Cm+A==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.0.2.tgz", + "integrity": "sha512-VJOQ+CDWFDGaWdrG12Nl+d7yHtLaurNgAQZVgaIy7/Xd+DojgmYLosFfZdGz1wpxmjJIAkAMVTKWcvkx1oggAw==", "license": "MIT", "dependencies": { - "react-router": "7.5.3" + "react-router": "7.0.2" }, "engines": { "node": ">=20.0.0" @@ -3653,6 +3671,13 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/update-browserslist-db": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", diff --git a/lesson_25/JBEY/package.json b/lesson_25/JBEY/package.json index b1ab5044c..ca932917e 100644 --- a/lesson_25/JBEY/package.json +++ b/lesson_25/JBEY/package.json @@ -14,11 +14,12 @@ "@tanstack/react-query": "^5.62.7", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router-dom": "^7.5.3" + "react-router-dom": "^7.0.2" }, "devDependencies": { "@stylistic/eslint-plugin": "^2.12.1", "@trivago/prettier-plugin-sort-imports": "^5.2.0", + "@types/node": "^22.15.17", "@types/react": "^19.0.1", "@types/react-dom": "^19.0.2", "@typescript-eslint/eslint-plugin": "^8.18.0", diff --git a/lesson_25/JBEY/src/components/button/button.scss b/lesson_25/JBEY/src/components/button/button.scss new file mode 100644 index 000000000..349a57589 --- /dev/null +++ b/lesson_25/JBEY/src/components/button/button.scss @@ -0,0 +1,14 @@ +.programs-section { + .custom-button { + display: block; + margin: 1rem auto 0; + padding: 10px 20px; + background-color: #ff8000; + color: white; + font-size: 16px; + border: none; + border-radius: 4px; + cursor: pointer; + transition: background-color 0.2s; + } +} diff --git a/lesson_25/JBEY/src/components/button/button.tsx b/lesson_25/JBEY/src/components/button/button.tsx new file mode 100644 index 000000000..9c72327fe --- /dev/null +++ b/lesson_25/JBEY/src/components/button/button.tsx @@ -0,0 +1,30 @@ +// This file defines a Button component in React with TypeScript. +// This is simply the button that you're clicking on to get from page to page. +import './Button.scss'; + +type ButtonProps = { + label: string; + onClick?: () => void; + type?: 'button' | 'submit' | 'reset'; + disabled?: boolean; +}; + +const Button: React.FC = ({ + label, + onClick, + type = 'button', + disabled = false, +}) => { + return ( + + ); +}; + +export default Button; diff --git a/lesson_25/JBEY/src/components/header/Header.tsx b/lesson_25/JBEY/src/components/header/Header.tsx index 2f9ee3830..df91eb006 100644 --- a/lesson_25/JBEY/src/components/header/Header.tsx +++ b/lesson_25/JBEY/src/components/header/Header.tsx @@ -20,9 +20,6 @@ export const Header: React.FC = () => {
  • Contact
  • -
  • - Add New Program -
  • diff --git a/lesson_25/JBEY/src/components/program/AddProgramPage.tsx b/lesson_25/JBEY/src/components/program/AddProgramPage.tsx deleted file mode 100644 index 2ba7ae29f..000000000 --- a/lesson_25/JBEY/src/components/program/AddProgramPage.tsx +++ /dev/null @@ -1,50 +0,0 @@ -// AddProgramPage.tsx -import React, {useState} from 'react'; - -const AddProgramPage: React.FC = () => { - const [title, setTitle] = useState(''); - const [description, setDescription] = useState(''); - const [submitted, setSubmitted] = useState(false); - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - // You would usually send this data to a server or context here - console.log('New Program:', {title, description}); - setSubmitted(true); - setTitle(''); - setDescription(''); - }; - - return ( -
    -

    Add New Program

    - {submitted &&

    Program submitted!

    } -
    -
    - -
    - setTitle(e.target.value)} - required - /> -
    -
    - -
    -