diff --git a/package-lock.json b/package-lock.json index aa66f461c..e10f53a71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,15 +15,20 @@ "@types/node": "^16.18.76", "@types/react": "^18.2.48", "@types/react-dom": "^18.2.18", + "@types/react-router-dom": "^5.3.3", "bootstrap": "^5.3.2", "gh-pages": "^6.1.1", - "openai": "^4.26.0", + "openai": "^4.0.0", "react": "^18.2.0", "react-bootstrap": "^2.10.1", "react-dom": "^18.2.0", + "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4" + }, + "devDependencies": { + "@babel/plugin-proposal-private-property-in-object": "^7.21.11" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -740,9 +745,17 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, "engines": { "node": ">=6.9.0" }, @@ -1977,6 +1990,17 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -3126,6 +3150,14 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@remix-run/router": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", + "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@restart/hooks": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", @@ -3738,6 +3770,11 @@ "@types/node": "*" } }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -3871,6 +3908,25 @@ "@types/react": "*" } }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, "node_modules/@types/react-transition-group": { "version": "4.4.10", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", @@ -11767,9 +11823,9 @@ } }, "node_modules/openai": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.28.4.tgz", - "integrity": "sha512-RNIwx4MT/F0zyizGcwS+bXKLzJ8QE9IOyigDG/ttnwB220d58bYjYFp0qjvGwEFBO6+pvFVIDABZPGDl46RFsg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.0.0.tgz", + "integrity": "sha512-UHv70gIw20pxu9tiUueE9iS+4U4eTGiTgQr+zlJ5aX4oj6LUUp+7mBn0xAqilawftwUB/biohPth2vcZFmoNYw==", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", @@ -11778,8 +11834,7 @@ "digest-fetch": "^1.3.0", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7", - "web-streams-polyfill": "^3.2.1" + "node-fetch": "^2.6.7" }, "bin": { "openai": "bin/cli" @@ -13803,6 +13858,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", + "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "dependencies": { + "@remix-run/router": "1.15.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", + "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "dependencies": { + "@remix-run/router": "1.15.3", + "react-router": "6.22.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -16248,14 +16333,6 @@ "minimalistic-assert": "^1.0.0" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "engines": { - "node": ">= 8" - } - }, "node_modules/web-vitals": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", diff --git a/package.json b/package.json index d2189d12e..4ce62e7ab 100644 --- a/package.json +++ b/package.json @@ -10,12 +10,14 @@ "@types/node": "^16.18.76", "@types/react": "^18.2.48", "@types/react-dom": "^18.2.18", + "@types/react-router-dom": "^5.3.3", "bootstrap": "^5.3.2", "gh-pages": "^6.1.1", - "openai": "^4.26.0", + "openai": "^4.0.0", "react": "^18.2.0", "react-bootstrap": "^2.10.1", "react-dom": "^18.2.0", + "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4" @@ -45,5 +47,8 @@ "last 1 firefox version", "last 1 safari version" ] + }, + "devDependencies": { + "@babel/plugin-proposal-private-property-in-object": "^7.21.11" } } diff --git a/public/test_report.txt b/public/test_report.txt new file mode 100644 index 000000000..863bffca7 Binary files /dev/null and b/public/test_report.txt differ diff --git a/src/App.css b/src/App.css index 74b5e0534..33ef85b3f 100644 --- a/src/App.css +++ b/src/App.css @@ -1,33 +1,154 @@ .App { - text-align: center; + text-align: left; + margin-left: 30px; } .App-logo { height: 40vmin; pointer-events: none; } +#image { + width: 170px; + height: 70px; +} +/*this is the header */ +.App-header2{ + width : 100%; + margin-left: 5%; + margin: auto; + +} +.App-header3{ + width : 80%; + margin: auto; + margin-right: -100px; + margin-left: 200px; +} + +.navbar{ + margin: 15px auto; + display: flex; + align-items: center; +} +ul{ + flex: 1; + text-align: right; +} +ul li{ + display: inline-block; + list-style: none; + margin: 0 15px; +} +ul li .basicButton{ + text-decoration: none; + color: rgb(43, 27, 66); + padding: 0 10x; + position: relative; +} +ul li .basicButton::after{ + content: ''; + width: 0; + height: 20px; + background: #7b60cc; + position: absolute; + left: 50%; + transform: translateX(-50%); + top:-55px; + transition: 0.5s; +} +ul li a:hover::after{ + width: 1%; + +} +.banner{ + display: flex; + margin: 40px; +} +.banner .right-column h3{ + margin-left: 20%; +} +.left-column{ + flex-basis: 45%; +} +.right-column{ + flex-basis:55% ; +} + +.left-column img{ + width: 100%; + margin-top: 100px; +} @media (prefers-reduced-motion: no-preference) { .App-logo { animation: App-logo-spin infinite 20s linear; } } - +/*this is the page */ .App-header { - background-color: #282c34; - min-height: 100vh; + min-height: 75vh; display: flex; - flex-direction: column; - align-items: center; + flex-direction:column; + align-items: left; justify-content: center; font-size: calc(10px + 2vmin); - color: white; + color: rgb(116, 78, 198); +} +.App-header h1{ + font-size: 70px; + margin-top: 30px; + margin-right: 10px; + margin-left: 50px; + +} +.App-header h3{ + font-size: 25px; + margin-right: 100px; + margin-left: 0px; +} +.bg-custom{ + background-color:#645cc1!important; +} +span{ + color: #0e0d0f; } - .App-link { - color: #61dafb; + color: #5d0aa1; +} +.btn button{ + padding: 7 30px; + font-size: 15px; + margin-right: 15px; + outline: none; + border: 0px solid #441980; + border-radius: 20px; + cursor: pointer; + color: rgb(55, 30, 120); + background: transparent; + background:linear-gradient(#8067a3,#311e4d) ; + box-shadow: 0 2px 15px rgba(66, 60, 99, 0.26); + color:#e9eae9; + margin-top: 100px; } +.bottom3 { + + margin-right: 70%; +} + +.bottom h1{ + margin-left: -10px; +} + +.img{ + margin-left: -150px; +} + +.btn p{ + font-size: 13px; + color:#0e0d0f; + margin: 20px 0; +} @keyframes App-logo-spin { from { transform: rotate(0deg); @@ -35,4 +156,203 @@ to { transform: rotate(360deg); } + } +/* All Design on the Detailed Question Page---------------------------------------------------*/ + .detailed{ + justify-content: center; + + } + .detailed-header h1{ + min-height: 10vh; + display: flex; + flex-direction:column; + align-items: center; + justify-content: center; + font-size: calc(20px + 2vmin); + color: rgb(94, 56, 178); + background-color: transparent; + font-family:'Times New Roman', Times, serif; + } + + .detailed-header h2{ + min-height: 5vh; + width: 50%; + background-color: transparent; + display:block; + align-items: center; + justify-content: center; + color: #7b60cc; + text-align: right; + margin-left: 25%; + margin-right: 15%; + } + .bottom-2{ + font-size: 18px; + min-height: 5vh; + margin-left: 25%; + margin-right: 25%; + color:#441980; + + } + .BasicButton{ + padding: 7x 30px; + margin-right: 15px; + outline: none; + border: 1.5px solid #7f7396; + border-radius: 20px; + color: #645cc1; + background:transparent; + box-shadow: 0 2px 15px rgba(115, 96, 201, 0.26); + color:#8743ba; + } + + .BasicButton:hover{ + padding: 7x 30px; + margin-right: 15px; + outline: none; + border: 1.5px solid #7f7396; + border-radius: 20px; + color: #ffffff; + background-color: #645cc1; + box-shadow: 0 2px 15px rgba(138, 123, 212, 0.26); + color:#ffffff; + } + .detailed-results{ + margin-left: 8%; + margin-right: 8%; + } + + .CareerButton{ + padding: 7 30px; + font-size: 15px; + margin-left: 45%; + margin-top: 50px; + outline: none; + border: 0px solid #441980; + border-radius: 20px; + cursor: pointer; + color: rgb(55, 30, 120); + background: transparent; + background:linear-gradient(#8067a3,#311e4d) ; + box-shadow: 0 2px 15px rgba(66, 60, 99, 0.26); + color:#e9eae9; + } + .detailed-header h3{ + justify-content: center; + align-items: center; + margin-left: 43%; + + } + .Submit-Button{ + padding: 7x 30px; + margin-right: 15px; + outline: none; + border: 1.5px solid #7f7396; + border-radius: 20px; + color: #645cc1; + background:transparent; + box-shadow: 0 2px 15px rgba(115, 96, 201, 0.26); + color:#8743ba; + + } + .Submit-Button:hover{ + padding: 7x 30px; + margin-right: 15px; + outline: none; + border: 1.5px solid #7f7396; + border-radius: 20px; + color: #ffffff; + background-color: #645cc1; + box-shadow: 0 2px 15px rgba(138, 123, 212, 0.26); + color:#ffffff; + + } + .api{ + width:50%; + justify-content: center; + margin-left: 33%; + } + /* All design on Basic Question page---------------------------------------------------------------*/ + .detailed{ + justify-content: center; + } + .detailed img{ + width:100%; + height: 100%; + margin-left: 50%; + } + + .Basic-header h1{ + min-height: 6vh; + font-size: calc(20px + 2vmin); + color: rgb(94, 56, 178); + background-color: transparent; + justify-content: center; + margin-left: 43%; + font-family:Georgia, 'Times New Roman', Times, serif; + } + .Basic-header h2{ + width: 50%; + background-color: transparent; + display:block; + align-items: center; + justify-content: center; + color: #7b60cc; + text-align: right; + margin-left: 25%; + + } + .questionAsk{ + font-size: 18px; + min-height: 5vh; + align-items: center; + color:#441980; + margin-left: 31%; + } + .dropdown{ + font-size: 150px; + margin-right: 30%; + margin-left: 30%; + } + .bottom h2{ + margin-left: 6.5%; + } + .bottom img{ + margin-left: 44%; + } + .CareerBasicButton{ + margin-left: 45%; + padding: 7 30px; + font-size: 15px; + margin-right: 15px; + outline: none; + border: 0px solid #441980; + border-radius: 20px; + cursor: pointer; + color: rgb(55, 30, 120); + background: transparent; + background:linear-gradient(#8067a3,#311e4d) ; + box-shadow: 0 2px 15px rgba(66, 60, 99, 0.26); + color:#e9eae9; + + } + .basicGPTrespond{ + margin-left: 8%; + margin-right: 8%; + + } + /*survey page---------------------------------------------*/ + .questiontobeAsked{ + + } + .surveyHeader h1{ + min-height: 0; + flex-direction:column; + align-items: center; + justify-content: center; + font-size: calc(30px + 3vmin); + color: rgb(94, 56, 178); + background-color:transparent; + font-family:'Times New Roman', Times, serif; + } \ No newline at end of file diff --git a/src/App.test.tsx b/src/App.test.tsx index 2a68616d9..2ec85b914 100644 --- a/src/App.test.tsx +++ b/src/App.test.tsx @@ -1,9 +1,12 @@ -import React from 'react'; -import { render, screen } from '@testing-library/react'; +import { render } from '@testing-library/react'; import App from './App'; +import { BrowserRouter } from 'react-router-dom'; test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); + render( + + + + ); }); + diff --git a/src/App.tsx b/src/App.tsx index cbb4ca51a..f5845adcc 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,53 +1,78 @@ -import React, { useState } from 'react'; -import logo from './logo.svg'; -import './App.css'; -import { Button, Form } from 'react-bootstrap'; - -//local storage and API Key: key should be entered in by the user and will be stored in local storage (NOT session storage) -let keyData = ""; -const saveKeyData = "MYKEY"; -const prevKey = localStorage.getItem(saveKeyData); //so it'll look like: MYKEY: in the local storage when you inspect -if (prevKey !== null) { - keyData = JSON.parse(prevKey); -} - +import "./App.css"; +// importing components from react-router-dom package +import { + HashRouter as Router, + Routes, + Route, + Navigate, +} from "react-router-dom"; + +// import Home component +import Home from "./Components/Home"; +import DetailedQuestions from "./Components/DetailedQuestions"; +import BasicQuestions from "./Components/BasicQuestions"; +import About from "./Components/About" +import Survey from "./Components/Survey" + function App() { - const [key, setKey] = useState(keyData); //for api key input - - //sets the local storage item to the api key the user inputed - function handleSubmit() { - localStorage.setItem(saveKeyData, JSON.stringify(key)); - window.location.reload(); //when making a mistake and changing the key again, I found that I have to reload the whole site before openai refreshes what it has stores for the local storage variable - } + return ( + <> + {/* This is the alias of BrowserRouter i.e. Router */} + + + {/* This route is for home component + with exact path "/", in component props + we passes the imported component*/} + } + /> + {/* This route is for home component + with exact path "/", in component props + we passes the imported component*/} + } + /> - //whenever there's a change it'll store the api key in a local state called key but it won't be set in the local storage until the user clicks the submit button - function changeKey(event: React.ChangeEvent) { - setKey(event.target.value); - } - return ( -
-
- logo -

- Edit src/App.tsx and save to reload. -

- - Learn React - -
-
- API Key: - -

- -
-
- ); -} + + {/* This route is for about component + with exact path "/about", in component + props we passes the imported component*/} + } + /> + + {/* This route is for contactus component + with exact path "/contactus", in + component props we passes the imported component*/} + } + /> + {/* This route is for contactus component + with exact path "/contactus", in + component props we passes the imported component*/} + } + /> + + {/* If any route mismatches the upper + route endpoints then, redirect triggers + and redirects app to home component with to="/" */} + {/* */} + } + /> +
+
+ + ); +} + export default App; + diff --git a/src/Components/About.tsx b/src/Components/About.tsx new file mode 100644 index 000000000..78fdee1cc --- /dev/null +++ b/src/Components/About.tsx @@ -0,0 +1,196 @@ +import '../App.css'; +import { Button, Col, Container, Row } from 'react-bootstrap'; +import '../App'; +import { useNavigate } from 'react-router-dom'; +import {Link} from 'react-router-dom'; +import olivia from './logo-removebg-preview.png' +import Zahra from './Zahra1.jpg'; +import Olivia from './Olivia.png' +import Khadija from './Khadija.png' +import jacobPlaceHolder from './jacobPlaceHolder.jpg'; +import purpleLI from './pLinkedIn.png'; +import {OliviaLinkedIn} from './linkedInButton'; +//import { OliviaLinkedIn, KhadijaLinkedIn } from './linkedInButton'; +//import { JacobLinkedIn } from './linkedInButton'; +// import { KhadijaLinkedIn } from './linkedInButton'; + + + + +function About() { + const navigate = useNavigate(); + + const goToHome = () => { + + // This will navigate to second component + navigate('/Home'); + }; + const goToSurvey = () => { + + // This will navigate to second component + navigate('/Survey'); + }; + // const goToZahraLinkedIn = () => { + + + + return ( +
+
+
+ + logo +
    +
  • +
  • +
  • + +
+
+
+ +
+ +
+
+ +

About Us

+
+ +

+ + + logo +

+

+ + +

Olivia Karney

+ okarney@udel.edu +

+ +

+

+ + + logo +

+

+ + +

Khadija Mohammadi

+ khadija@udel.edu +

+
+ + + +
+

+

+ +
+ + + logo + + +

Zahra Temori

+ zahratm@udel.edu +

+
+ + + +
+ + + logo + + +

Jacob Whitman

+ jacobwhi@udel.edu +

+
+ + + +
+ +
+ + + + {/**/} + {/*

Zahra Temori

+ Email: zahratm@udel.edu +

+ + + + + + + +

*/} + {/*
*/} + +
+ {/*
*/} + + + + {/*
*/} + {/*
*/} +

+

+

+

+

+ + +
+ {/* + + + +

Discover your potential career path through our refined multiple-choice assessment.

+ + + +

Discover your potential career path through our comprehensive detailed questions.

+ +
+
*/} +
+
+ {/*
*/} + +
+ {/*
+ API Key: + +

+ +
*/} + {/*Created By: Olivia Karney, Khadija Mohammadi, Zahra Temori, and Jacob Whitman*/} +
+ +
+ ); +} + +export default About; + +/* +
  • Home
  • +
  • About
  • +
  • Contact
  • */ \ No newline at end of file diff --git a/src/Components/BasicQuestions.tsx b/src/Components/BasicQuestions.tsx new file mode 100644 index 000000000..fa7c3ee90 --- /dev/null +++ b/src/Components/BasicQuestions.tsx @@ -0,0 +1,606 @@ +import React, { useState } from 'react'; +import '../App.css'; +import { Button, Col, Container, Form, Row} from 'react-bootstrap'; +//import { Link } from 'react-router-dom'; +import { BasicExample } from '../progressBar'; +import { useNavigate } from 'react-router-dom'; +//import OpenAI from 'openai'; +import GIF from './gif.gif'; +import olivia from './logo-removebg-preview.png' +import sunrise from './lavender.png' +// function App(){ +// return There is actually something here +// } +//local storage and API Key: key should be entered in by the user and will be stored in local storage (NOT session storage) +let keyData = ""; + +const saveKeyData = "MYKEY"; +const prevKey = localStorage.getItem(saveKeyData); //so it'll look like: MYKEY: in the local storage when you inspect +if (prevKey !== null) { + keyData = JSON.parse(prevKey); +} + +function BasicQuestions() { + const [key, setKey] = useState(keyData); //for api key input + const [progress, setProgress] = useState(0) + + const [finished, setFinished] = useState (false); + + const [choice1, setChoice1] = useState("Select an option"); + const [choice2, setChoice2] = useState("Select an option"); + const [choice3, setChoice3] = useState("Select an option"); + const [choice4, setChoice4] = useState("Select an option"); + const [choice5, setChoice5] = useState("Select an option"); + const [choice6, setChoice6] = useState("Select an option"); + const [choice7, setChoice7] = useState("Select an option"); + + //sets the local storage item to the api key the user inputed + function handleSubmit() { + localStorage.setItem(saveKeyData, JSON.stringify(key)); + window.location.reload(); //when making a mistake and changing the key again, I found that I have to reload the whole site before openai refreshes what it has stores for the local storage variable + } + + //function handleIncrease() { + // setProgress(progress + 20); + //} + function updateProgress(originalValue: string, event: string){ + if (originalValue === "Select an option" && event !== "Select an option") { + setProgress(progress + 15) + } + else if (originalValue !== "Select an option" && event === "Select an option") { + setProgress(progress - 15) + } + } + + //HEADER FUNCTIONS + const navigate = useNavigate(); + + const goToHome = () => { + // This will navigate to first component + navigate('/Home'); + }; + + const goToAbout = () => { + + // This will navigate to second component + navigate('/About'); + }; + const goToSurvey = () => { + + // This will navigate to second component + navigate('/Survey'); + }; + + // function to handle get career choices button + //Validation Check #1: Make sure the user submits an API Key + + function handleGetCareerChoices() { + if (key === "") { + alert("Please submit an API Key!"); + } + else { + callOpenAIAPI(); + } + } + + //Gpt Integration: + /*const [response, setResponse] = useState(""); // Response from GPT*/ + + // send message to GPT function + + const API_KEY = key; + + //const openai = new OpenAI( + //{apiKey: API_KEY, dangerouslyAllowBrowser: true} + //); + // JSON Data storing 3 Different Career Options + const [career1Title, setCareer1Title] = useState(""); // Response from GPT + const [career2Title, setCareer2Title] = useState(""); // Response from GPT + const [career3Title, setCareer3Title] = useState(""); // Response from GPT + + const [career1, setCareer1] = useState(""); // Response from GPT + const [career2, setCareer2] = useState(""); // Response from GPT + const [career3, setCareer3] = useState(""); // Response from GPT + + + + let gptData = { + 'name': "gptData", + 'description': "data to be passed to gpt", + 'parameters': { + 'type': 'object', + 'properties': { + "CareerChoice1Title": { + "type": "string", + "description": "The title of your first career suggestion" + }, + "CareerChoice1": { + "type": "string", + "description": "A description of a career that would be a good fit for the user based on their responses to the questions. Do not list the title here." + }, + "CareerChoice2Title": { + "type": "string", + "description": "The title of your second career suggestion" + }, + "CareerChoice2": { + "type": "string", + "description": "A description of a career that would be a good fit for the user based on their responses to the questions. Do not list the title here." + }, + "CareerChoice3Title": { + "type": "string", + "description": "The title of your third career suggestion" + }, + "CareerChoice3": { + "type": "string", + "description": "A description of a career that would be a good fit for the user based on their responses to the questions. Do not list the title here." + } + }, + 'required': ['CareerChoice1Title', 'CareerChoice1', 'CareerChoice2', 'CareerChoice3'] + } +} + + async function callOpenAIAPI() { + + setFinished(true); + //const response = await getResponse(input); + await fetch('https://api.openai.com/v1/chat/completions', { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + API_KEY, + + }, + + body: JSON.stringify({ + "model": 'gpt-4-turbo', + "tools": [{"type": "function", "function": gptData}], + "messages": [{ + "role": "system", + "content": "You are an assistant that give career advise like a specialist"}, + {"role": "user", + "content": "Give a list of 3 potential career options based on the users responses to these questions. The title of the career in the CareerXTitle field must match the description of the career given. The questions and user's responses are listed below:" + + + `Which work environment aligns best with your interests?: ${choice1}` + + `Which personality traits do you resonate with the most?: ${choice2}` + + `Which of the following is true about you?: ${choice3}` + + `Which career-related activities do you find most fulfilling?: ${choice4}` + + `Which challenges are you eager to take on?: ${choice5}` + + `What would you do on a weekend?: ${choice6}` + + `Which academic area do you prefer?: ${choice7}` + + + }], + "temperature": 0.7, + + }) + }).then(response => response.json()) + .then(data => { + if (choice1&&choice2&&choice3&&choice4&&choice5&&choice6&&choice7 === "None of the above"){ + console.log("answer a question please") + alert("answer one question please"); + } + else{ + console.log('Response:', data); + const obj = JSON.parse(data.choices[0].message.tool_calls[0].function.arguments.toString()); + setCareer1Title(obj.CareerChoice1Title); + setCareer2Title(obj.CareerChoice2Title); + setCareer3Title(obj.CareerChoice3Title); + setCareer1(obj.CareerChoice1); + setCareer2(obj.CareerChoice2); + setCareer3(obj.CareerChoice3); + } + + + }) + .catch(error => { + console.error('Error:', error); + if (key === "") { + alert("No API Key submitted. Please submit an API Key!"); + } + else{ + alert("Invalid API key submitted. Please submit a valid API Key!"); + } + }) +}; + + +// code to test whether the api key validation checks are working or not +// comment in and out as needed + +// if (career1 !== "") { +// localStorage.clear(); +// } + + //whenever there's a change it'll store the api key in a local state called key but it won't be set in the local storage until the user clicks the submit button + function changeKey(event: React.ChangeEvent) { + setKey(event.target.value); + } + + function updateChoice1(event: React.ChangeEvent) { + updateProgress(choice1, event.target.value); + setChoice1(event.target.value); + } + + function updateChoice2(event: React.ChangeEvent) { + updateProgress(choice2, event.target.value); + setChoice2(event.target.value); +} +function updateChoice3(event: React.ChangeEvent) { + updateProgress(choice3, event.target.value); + setChoice3(event.target.value); +} +function updateChoice4(event: React.ChangeEvent) { + updateProgress(choice4, event.target.value); + setChoice4(event.target.value); +} +function updateChoice5(event: React.ChangeEvent) { + updateProgress(choice5, event.target.value); + setChoice5(event.target.value); +} +function updateChoice6(event: React.ChangeEvent) { + updateProgress(choice6, event.target.value); + setChoice6(event.target.value); +} +function updateChoice7(event: React.ChangeEvent) { + updateProgress(choice7, event.target.value); + setChoice7(event.target.value); +} + +/*const navigate = useNavigate(); + +const goToHome = () => { + // This will navigate to first component + navigate('/Home'); + };*/ + +// function OurHeader(){ +// const navigate = useNavigate(); + +// const goToHome = () => { +// // This will navigate to first component +// navigate('/Home'); +// }; + +// const goToAbout = () => { + +// // This will navigate to second component +// navigate('/About'); +// }; +// const goToSurvey = () => { + +// // This will navigate to second component +// navigate('/Survey'); +// }; + + +// /*function OurHeader(){*/ +// return( +//
    +//
    +//
    +// logo +//
    + +//
      +//
    • +//
    • +//
    • +//
    +//
    +//
    + + +// ) +// } + + + +//validation checks + /*return( +
    + + + +
    +

    The Career Helpi

    +
    + +
    + + ) +}*/ + + + return ( +
    +
    +
    + logo +
      +
    • +
    • +
    • +
    +
    +
    + +
    +
    +

    Basic Questions

    + + {/*

    Basic Questions

    */} +

    +

    +

    + +
    + 1. Which work environment aligns best with your interests? +
    + +
    + + + + + + + + + + + +
    + +
    + +

    + + + +
    + 2. Which personality traits do you resonate with the most? +
    +
    + + + + + + + + + + + + +
    + +
    + +

    + + + +
    + 3. Which of the following is true about you? +
    +
    + + + + + + + + + +
    + +
    + +

    + + + +
    + 4. Which career-related activities do you find most fulfilling? +
    +
    + + + + + + + + + + + +
    + +

    + + +
    + + +
    + 5. Which challenges are you eager to take on? +
    +
    + + + + + + + + + + + +
    + +
    + +

    + + +
    + 6. What would you do on a weekend? +
    +
    + + + + + + + + + + + +
    + +
    + +

    + + +
    + 7. Which academic area do you prefer? +
    +
    + + + + + + + + + + + +
    + +
    + + + + + +

    +
    + +
    + +{/**/} + +{/*finished ? Your responses have been seccussfully submitted!: */} + +

    +

    +

    + + + +
    + + + +

    + + + {finished && key !== "" ? +
    +
    + +

    + +

    Your Careers

    +
    + + + : } + + +

    + + {/*

    GPT Response

    + {finished ? GIF : } + {/*GIF*/} + + + {finished && career1 === "" && career2 === "" && career3 === "" ? GIF : + +
    + +
    {career1Title}
    + + {career1} + +

    +

    + +
    {career2Title}
    + + + {career2} + +

    +

    + +
    {career3Title}
    + + + {career3} +
    } +
    {/**/} + + +

    +

    + + + +
    +
    +
    + + + +
    + + +
    + + + + +

    + + + + + +
    +
    +
    +
    +
    +
    + + + ); +} +export default BasicQuestions; \ No newline at end of file diff --git a/src/Components/DetailedQuestions.tsx b/src/Components/DetailedQuestions.tsx new file mode 100644 index 000000000..ea4cef209 --- /dev/null +++ b/src/Components/DetailedQuestions.tsx @@ -0,0 +1,465 @@ +import React, { useState } from 'react'; +//import {OpenAI} from "openai" +import '../App.css'; +import { Button, Col, Container, Form, Row } from 'react-bootstrap'; +//import { Link } from 'react-router-dom'; +import { BasicExample } from '../progressBar'; +import { useNavigate } from 'react-router-dom'; +import "./gptResponse.json" +import GIF from './gif.gif'; +import olivia from './logo-removebg-preview.png'; +import sunrise from './PurpleBG.png' + + + +//local storage and API Key: key should be entered in by the user and will be stored in local storage (NOT session storage) +let keyData = ""; +const saveKeyData = "MYKEY"; + +const prevKey = localStorage.getItem(saveKeyData); //so it'll look like: MYKEY: in the local storage when you inspect +if (prevKey !== null) { + keyData = JSON.parse(prevKey); +} + +function DetailedQuestions() { + const [key, setKey] = useState(keyData); //for api key input + const [progress, setProgress] = useState(0) + const [finished, setFinished] = useState (false); + + function updateProgress(originalValue: string, event: string){ + if (originalValue === "" && event !== "") { + setProgress(progress + 15) + } + else if (originalValue !== "" && event === "") { + setProgress(progress - 15) + } + } + + + // HEADER FUNCTIONS + const navigate = useNavigate(); + + const goToHome = () => { + // This will navigate to first component + navigate('/Home'); + }; + + const goToAbout = () => { + + // This will navigate to second component + navigate('/About'); + }; + const goToSurvey = () => { + + // This will navigate to second component + navigate('/Survey'); + }; + + + + // function to handle get career choices button + //Validation Check #1: Make sure the user submits an API Key + + function handleGetCareerChoices() { + if (key === "") { + alert("Please submit an API Key!"); + } + else { + callOpenAIAPI(); + } + } + + + // CHATGPT THINGS + const [career1Title, setCareer1Title] = useState(""); // Response from GPT + const [career2Title, setCareer2Title] = useState(""); // Response from GPT + const [career3Title, setCareer3Title] = useState(""); // Response from GPT + + + const [career1, setCareer1] = useState(""); // Response from GPT + const [career2, setCareer2] = useState(""); // Response from GPT + const [career3, setCareer3] = useState(""); // Response from GPT + + +const API_KEY = key; + + + +// JSON Data storing 3 Different Career Options + +let gptData = { + 'name': "gptData", + 'description': "data to be passed to gpt", + 'parameters': { + 'type': 'object', + 'properties': { + "CareerChoice1Title": { + "type": "string", + "description": "The title of your first career suggestion" + }, + "CareerChoice1": { + "type": "string", + "description": "A description of a career that would be a good fit for the user based on their responses to the questions. If the user inputs a jumble of letters or responses that are not relevant to the question, your response is \"resubmit\"." + }, + "CareerChoice2Title": { + "type": "string", + "description": "The title of your second career suggestion" + }, + "CareerChoice2": { + "type": "string", + "description": "A description of a career that would be a good fit for the user based on their responses to the questions" + }, + "CareerChoice3Title": { + "type": "string", + "description": "The title of your third career suggestion" + }, + "CareerChoice3": { + "type": "string", + "description": "A description of a career that would be a good fit for the user based on their responses to the questions" + } + }, + 'required': ['CareerChoice1Title', 'CareerChoice1', 'CareerChoice2', 'CareerChoice3'] + } +} + + + async function callOpenAIAPI() { + + setFinished(true); + //const response = await getResponse(input); + await fetch('https://api.openai.com/v1/chat/completions', { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": "Bearer " + API_KEY, + + }, + body: JSON.stringify({ + "model": 'gpt-4-turbo', + //"response_format": {"type": "json_object"}, + "tools": [{"type": "function", "function": gptData}], + "messages": [{ + "role": "system", + "content": "You are an assistant that give career advise like a specialist"}, + + {"role": "user", + "content": "Give a list of 3 potential career options based on the users responses to these questions. The title of the career in the CareerXTitle field must match the description of the career given. The questions and user's responses are listed below:" + + + `Describe your hobbies and interests: ${q1Response}` + + `Describe your soft skills (teamwork, problem solving, leadership, communication, etc): ${q2Response}` + + `What subject areas intrigue you the most?: ${q3Response}` + + `Where do you envision your career path evolving towards?: ${q4Response}` + + `What technical skills do you possess or are interested in developing?: ${q5Response}` + + `What is your dream place to live?: ${q6Response}` + + `Describe your personal values: ${q7Response}` + + + }], + "temperature": 0.7, + + }) +}).then(response => response.json()) +.then(data => { + console.log('Response:', data); + const obj = JSON.parse(data.choices[0].message.tool_calls[0].function.arguments.toString()); + setCareer1Title(obj.CareerChoice1Title); + setCareer2Title(obj.CareerChoice2Title); + setCareer3Title(obj.CareerChoice3Title); + setCareer1(obj.CareerChoice1); + setCareer2(obj.CareerChoice2); + setCareer3(obj.CareerChoice3); + +}) +.catch(error => { + console.error('Error:', error); + }) +}; + + + //sets the local storage item to the api key the user inputed + function handleSubmit() { + localStorage.setItem(saveKeyData, JSON.stringify(key)); + window.location.reload(); //when making a mistake and changing the key again, I found that I have to reload the whole site before openai refreshes what it has stores for the local storage variable + } + + //whenever there's a change it'll store the api key in a local state called key but it won't be set in the local storage until the user clicks the submit button + function changeKey(event: React.ChangeEvent) { + updateProgress(q1Response,event.target.value); + setKey(event.target.value); + } + +// useState and update function for Question 1 + + const [q1Response, setQ1Response] = useState(""); + + function updateQ1Response(event: React.ChangeEvent) { + updateProgress(q1Response, event.target.value); + setQ1Response(event.target.value) + } + +// useState and update function for Question 2 + +const [q2Response, setQ2Response] = useState(""); + +function updateQ2Response(event: React.ChangeEvent) { + updateProgress(q2Response, event.target.value); + setQ2Response(event.target.value) +} + +// useState and update function for Question 3 + +const [q3Response, setQ3Response] = useState(""); + +function updateQ3Response(event: React.ChangeEvent) { + updateProgress(q3Response, event.target.value); + setQ3Response(event.target.value) +} + +// useState and update function for Question 4 + +const [q4Response, setQ4Response] = useState(""); + +function updateQ4Response(event: React.ChangeEvent) { + updateProgress(q4Response, event.target.value); + setQ4Response(event.target.value) +} + +// useState and update function for Question 5 + +const [q5Response, setQ5Response] = useState(""); + +function updateQ5Response(event: React.ChangeEvent) { + updateProgress(q5Response, event.target.value); + setQ5Response(event.target.value) +} + +// useState and update function for Question 6 + +const [q6Response, setQ6Response] = useState(""); + +function updateQ6Response(event: React.ChangeEvent) { + updateProgress(q6Response, event.target.value); + setQ6Response(event.target.value) +} + +// useState and update function for Question 7 + +const [q7Response, setQ7Response] = useState(""); + +function updateQ7Response(event: React.ChangeEvent) { + updateProgress(q7Response, event.target.value); + setQ7Response(event.target.value) +} + +// submit button useState + +//hook for buttons to work + + + +// function OurHeader(){ +// const navigate = useNavigate(); + +// const goToHome = () => { +// // This will navigate to first component +// navigate('/Home'); +// }; + +// const goToAbout = () => { + +// // This will navigate to second component +// navigate('/About'); +// }; +// const goToSurvey = () => { + +// // This will navigate to second component +// navigate('/Survey'); +// }; + +// return( +//
    +//
    +//
    +// logo +//
    +//
      +//
    • +//
    • +//
    • +//
    +//
    +//
    + +// ) +// } + + return ( +
    +
    + +
    + logo +
      +
    • +
    • +
    • +
    +
    +
    +
    +
    +

    Detailed Questions

    +

    +
    + +
    + + 1. Describe your hobbies and interests: + + + + + 2. Describe your soft skills (teamwork, problem solving, leadership, communication, etc): + + + + + 3. What subject areas intrigue you the most? + + + + + 4. Where do you envision your career path evolving towards? + + + + + 5. What technical skills do you possess or are interested in developing? + + + + + 6. What is your dream place to live? + + + + + 7. Describe your personal values: + + + + +
    + + + + +

    + +

    + + +

    + {finished && key !== "" ? +
    +
    + +

    + +

    Your Careers

    +
    + + + : } + +

    + + +
    + + {finished && career1 === "" && career2 === "" && career3 === "" ? GIF : career1 === "resubmit" && career2 === "resubmit" && career3 === "resubmit" ? Your responses have not adequately answered the questions. Please provide more information and resubmit! : +
    +
    {career1Title}
    + + {career1} + +

    +

    + +
    {career2Title}
    + + + {career2} + +

    +

    + +
    {career3Title}
    + + + {career3} +
    + } + + +
    + + +

    + + +
    + + + +
    + + +
    + + + + +

    + + + + + +
    +
    + +
    + +
    +
    + ); +} + +export default DetailedQuestions; \ No newline at end of file diff --git a/src/Components/Home.tsx b/src/Components/Home.tsx new file mode 100644 index 000000000..e04c81b91 --- /dev/null +++ b/src/Components/Home.tsx @@ -0,0 +1,188 @@ +//import React, { useState } from 'react'; +import '../App.css'; +import { Button, Col, Container, Row } from 'react-bootstrap'; +import '../App'; +//import { Link } from "react-router-dom"; +import { useNavigate } from 'react-router-dom'; +import olivia from './logo-removebg-preview.png' +import office from './office.gif'; +//import {office} from './careervideo.mp4' +//local storage and API Key: key should be entered in by the user and will be stored in local storage (NOT session storage) +// let keyData = ""; +// const saveKeyData = "MYKEY"; +// const prevKey = localStorage.getItem(saveKeyData); //so it'll look like: MYKEY: in the local storage when you inspect +// if (prevKey !== null) { +// keyData = JSON.parse(prevKey); +// } + + + +// function BasicQuestions() { +// return ( +//
    +// +// +// +//
    +// ); +// } + +// function DetailedQuestions() { + + +// return ( +//
    +// +// +// +//
    + +// ); +// } + +// function OurHeader(){ +// const navigate = useNavigate(); +// const goToAbout = () => { + +// // This will navigate to second component +// navigate('/About'); +// }; +// const goToSurvey = () => { + +// // This will navigate to second component +// navigate('/Survey'); +// }; +// const goToHome = () => { + +// // This will navigate to second component +// navigate('/Home'); +// }; + + +// /*function OurHeader(){*/ +// return( +//
    +//
    +//
    +// logo +//
    + +//
      +//
    • +//
    • +//
    • +//
    +//
    +//
    + +// ) +// } + +function Home() { + const navigate = useNavigate(); + + const goToBasic = () => { + + // This will navigate to second component + navigate('/BasicQuestions'); + }; + const goToDetailed = () => { + + // This will navigate to first component + navigate('/DetailedQuestions'); + }; + + // the following lines were moved from the "Our Header Function" + + const goToAbout = () => { + + // This will navigate to second component + navigate('/About'); + }; + const goToSurvey = () => { + + // This will navigate to second component + navigate('/Survey'); + }; + const goToHome = () => { + + // This will navigate to second component + navigate('/Home'); + }; + + + + + // } + return ( +
    +
    +
    + + logo +
      +
    • +
    • +
    • +
    +
    +
    + {/**/} + +
    +
    +
    +
    + {/**/} + office + +
    +
    +

    CareerExplorer

    +

    Explore your future career with us!

    +
    + + + + +

    Discover your potential career path through our refined multiple-choice assessment.

    + + + +

    Discover your potential career path through our comprehensive detailed questions.

    + +
    +
    +
    +
    +
    + +

    +

    + + + +
    + {/*
    + API Key: + +

    + +
    */} + {/*Created By: Olivia Karney, Khadija Mohammadi, Zahra Temori, and Jacob Whitman*/} +
    +
    + ); +} + +export default Home; + +/* +
  • Home
  • +
  • About
  • +
  • Contact
  • */ \ No newline at end of file diff --git a/src/Components/Khadija.png b/src/Components/Khadija.png new file mode 100644 index 000000000..66eed2f0f Binary files /dev/null and b/src/Components/Khadija.png differ diff --git a/src/Components/Olivia.png b/src/Components/Olivia.png new file mode 100644 index 000000000..e57a2a109 Binary files /dev/null and b/src/Components/Olivia.png differ diff --git a/src/Components/Purple.png b/src/Components/Purple.png new file mode 100644 index 000000000..3b52d0fdc Binary files /dev/null and b/src/Components/Purple.png differ diff --git a/src/Components/PurpleBG.png b/src/Components/PurpleBG.png new file mode 100644 index 000000000..1af0c9f26 Binary files /dev/null and b/src/Components/PurpleBG.png differ diff --git a/src/Components/Survey.tsx b/src/Components/Survey.tsx new file mode 100644 index 000000000..ce8efedaa --- /dev/null +++ b/src/Components/Survey.tsx @@ -0,0 +1,346 @@ +import '../App.css'; +import '../App'; +import { useNavigate } from 'react-router-dom'; +import olivia from './logo-removebg-preview.png' +import React, { useState } from 'react'; +import { Button, Form} from 'react-bootstrap'; +//import sunrise from './purpl.png' + + + + +function Survey() { + + const [ques1, setQues1] = useState(""); + const [ques2, setQues2] = useState(""); + const [ques3, setQues3] = useState(""); + const [ques4, setQues4] = useState(""); + const [ques5, setQues5] = useState(""); + + + const [finished, setFinished] = useState (false); + function submitVisibility(): void { + setFinished(!finished); + } + + + + function updateQues1(event: React.ChangeEvent) { + setQues1(event.target.value); + console.log(event); + } + + function updateQues2(event: React.ChangeEvent) { + setQues2(event.target.value); + console.log(event); + } + function updateQues3(event: React.ChangeEvent) { + setQues3(event.target.value); + console.log(event); + + } + function updateQues4(event: React.ChangeEvent) { + setQues4(event.target.value); + console.log(event); + + } + function updateQues5(event: React.ChangeEvent) { + setQues5(event.target.value); + console.log(event); + + } + + + + + const navigate = useNavigate(); + + const goToHome = () => { + + // This will navigate to second component + navigate('/Home'); + }; + const goToAbout = () => { + + // This will navigate to second component + navigate('/About'); + }; + + + + + + return ( +
    +
    +
    + + logo +
      +
    • +
    • +
    • + +
    +
    +
    +
    + + +
    +
    +
    + {/**/} +

    Survey

    +

    + +
    + 1. You feel that your results were accurate! +
    + +
    + + + + +
    +
    + + +
    + 2. The site was easily readable and user friendly! +
    + +
    + + + + +
    +
    + + +
    + 3. You would recommend the quizzes to your friends! +
    + +
    + + + + +
    +
    + +
    + 4. The quiz kept you engaged throughout! +
    + +
    + + + + +
    +
    + + 5. Do you have any suggestions for improving the quiz experience? + + +

    + +
    + +
    +

    + {/**/} + {finished ?

    Thank You for Taking the Survey!

    : null} + + + +
    + +
    + {/* person + person */} +
    + {/* + + + +

    Discover your potential career path through our refined multiple-choice assessment.

    + + + +

    Discover your potential career path through our comprehensive detailed questions.

    + +
    +
    */} +
    +
    +
    + +
    + +

    + +
    +
    +); +} +export default Survey; + +/* +
  • Home
  • +
  • About
  • +
  • Contact
  • */ \ No newline at end of file diff --git a/src/Components/Zahra1.jpg b/src/Components/Zahra1.jpg new file mode 100644 index 000000000..58b031345 Binary files /dev/null and b/src/Components/Zahra1.jpg differ diff --git a/src/Components/careerpic.png b/src/Components/careerpic.png new file mode 100644 index 000000000..79153f293 Binary files /dev/null and b/src/Components/careerpic.png differ diff --git a/src/Components/gif.gif b/src/Components/gif.gif new file mode 100644 index 000000000..bc875074b Binary files /dev/null and b/src/Components/gif.gif differ diff --git a/src/Components/gitIcon.png b/src/Components/gitIcon.png new file mode 100644 index 000000000..9490ffc6d Binary files /dev/null and b/src/Components/gitIcon.png differ diff --git a/src/Components/gptResponse.json b/src/Components/gptResponse.json new file mode 100644 index 000000000..92f100594 --- /dev/null +++ b/src/Components/gptResponse.json @@ -0,0 +1,15 @@ +{ + "CareerChoice1": { + "type": "string", + "description": "A description of a career that would be a good fit for the user based on their responses to the questions" + }, + "CareerChoice2": { + "type": "string", + "description": "A description of a career that would be a good fit for the user based on their responses to the questions" + }, + "CareerChoice3": { + "type": "string", + "description": "A description of a career that would be a good fit for the user based on their responses to the questions" + } + +} \ No newline at end of file diff --git a/src/Components/jacobPlaceHolder.jpg b/src/Components/jacobPlaceHolder.jpg new file mode 100644 index 000000000..0bb32b0b3 Binary files /dev/null and b/src/Components/jacobPlaceHolder.jpg differ diff --git a/src/Components/khadijaPlaceHolder.jpg b/src/Components/khadijaPlaceHolder.jpg new file mode 100644 index 000000000..402d9275d Binary files /dev/null and b/src/Components/khadijaPlaceHolder.jpg differ diff --git a/src/Components/lavender.png b/src/Components/lavender.png new file mode 100644 index 000000000..f69d0904a Binary files /dev/null and b/src/Components/lavender.png differ diff --git a/src/Components/linkedInButton.tsx b/src/Components/linkedInButton.tsx new file mode 100644 index 000000000..ea11cf475 --- /dev/null +++ b/src/Components/linkedInButton.tsx @@ -0,0 +1,58 @@ +import purpleLI from './pLinkedIn.png' +import {Link} from 'react-router-dom' +import { Button } from 'react-bootstrap'; + + +function OliviaLinkedIn():JSX.Element { + return ( +
    + + + + +
    + ); +} + +// function KhadijaLinkedIn():JSX.Element { +// return ( +//
    +// + +// +// +//
    +// ); +// } + +// function ZahraLinkedIn():JSX.Element { +// return ( +//
    +// + +// +// +//
    +// ); +// } + +// function JacobLinkedIn():JSX.Element { +// return ( +//
    +// + +// +// +//
    +// ); +// } + +export {OliviaLinkedIn};//, KhadijaLinkedIn, ZahraLinkedIn, JacobLinkedIn}; diff --git a/src/Components/logo-removebg-preview.png b/src/Components/logo-removebg-preview.png new file mode 100644 index 000000000..8dd81caef Binary files /dev/null and b/src/Components/logo-removebg-preview.png differ diff --git a/src/Components/logo.png b/src/Components/logo.png new file mode 100644 index 000000000..f454b12e9 Binary files /dev/null and b/src/Components/logo.png differ diff --git a/src/Components/office(2).gif b/src/Components/office(2).gif new file mode 100644 index 000000000..7e7e8ee3a Binary files /dev/null and b/src/Components/office(2).gif differ diff --git a/src/Components/office.gif b/src/Components/office.gif new file mode 100644 index 000000000..7e7e8ee3a Binary files /dev/null and b/src/Components/office.gif differ diff --git a/src/Components/pLinkedIn.png b/src/Components/pLinkedIn.png new file mode 100644 index 000000000..667f29800 Binary files /dev/null and b/src/Components/pLinkedIn.png differ diff --git a/src/Components/test.png b/src/Components/test.png new file mode 100644 index 000000000..71f27c289 Binary files /dev/null and b/src/Components/test.png differ diff --git a/src/Zahra1.jpg b/src/Zahra1.jpg new file mode 100644 index 000000000..58b031345 Binary files /dev/null and b/src/Zahra1.jpg differ diff --git a/src/gif.gif b/src/gif.gif new file mode 100644 index 000000000..bc875074b Binary files /dev/null and b/src/gif.gif differ diff --git a/src/index.html b/src/index.html new file mode 100644 index 000000000..462351189 --- /dev/null +++ b/src/index.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + + React App + + + + +
    + + + \ No newline at end of file diff --git a/src/index.tsx b/src/index.tsx index 032464fb6..3a112626c 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,16 +1,16 @@ import React from 'react'; -import ReactDOM from 'react-dom/client'; +import ReactDOM from 'react-dom'; import './index.css'; -import App from './App'; +import 'bootstrap/dist/css/bootstrap.min.css'; +//import RootRouter from './router'; // Import the RootRouter component that manages all routes import reportWebVitals from './reportWebVitals'; +import App from './App'; -const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement -); -root.render( +ReactDOM.render( - + , + document.getElementById('root') ); // If you want to start measuring performance in your app, pass a function diff --git a/src/lavender.png b/src/lavender.png new file mode 100644 index 000000000..f69d0904a Binary files /dev/null and b/src/lavender.png differ diff --git a/src/logo1.svg b/src/logo1.svg new file mode 100644 index 000000000..895b46c42 --- /dev/null +++ b/src/logo1.svg @@ -0,0 +1,1409 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/progressBar.tsx b/src/progressBar.tsx new file mode 100644 index 000000000..89212ede0 --- /dev/null +++ b/src/progressBar.tsx @@ -0,0 +1,15 @@ +import ProgressBar from 'react-bootstrap/ProgressBar'; +import './App.css' +interface Bar { + progress: number +} +export function BasicExample({progress}: Bar):JSX.Element { + return ( +
    +
    + +
    +
    + ); +} +