diff --git a/.vscode/settings.json b/.vscode/settings.json
index 56adebf..043e4c5 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -29,5 +29,6 @@
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
- }
+ },
+ "prettier.configPath": "react-advanced-tag1/.prettierrc.mjs"
}
diff --git a/react-advanced-tag1/.prettierrc.mjs b/react-advanced-tag1/.prettierrc.mjs
new file mode 100644
index 0000000..202bd46
--- /dev/null
+++ b/react-advanced-tag1/.prettierrc.mjs
@@ -0,0 +1,12 @@
+/**
+ * @see https://prettier.io/docs/configuration
+ * @type {import("prettier").Config}
+ */
+const config = {
+ trailingComma: "es5",
+ tabWidth: 2,
+ semi: false,
+ singleQuote: true,
+};
+
+export default config;
\ No newline at end of file
diff --git a/react-advanced-tag1/package-lock.json b/react-advanced-tag1/package-lock.json
index ec30ece..fae4452 100644
--- a/react-advanced-tag1/package-lock.json
+++ b/react-advanced-tag1/package-lock.json
@@ -27,6 +27,7 @@
"eslint-plugin-react-refresh": "^0.4.19",
"globals": "^15.15.0",
"jsdom": "^26.0.0",
+ "prettier": "3.5.3",
"typescript": "~5.7.2",
"typescript-eslint": "^8.24.1",
"vite": "^6.2.0",
@@ -4257,6 +4258,22 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/prettier": {
+ "version": "3.5.3",
+ "resolved": "https://bin.sbb.ch/artifactory/api/npm/npm/prettier/-/prettier-3.5.3.tgz",
+ "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
"node_modules/pretty-format": {
"version": "27.5.1",
"resolved": "https://bin.sbb.ch/artifactory/api/npm/npm/pretty-format/-/pretty-format-27.5.1.tgz",
diff --git a/react-advanced-tag1/package.json b/react-advanced-tag1/package.json
index 9bf392e..0d9f79d 100644
--- a/react-advanced-tag1/package.json
+++ b/react-advanced-tag1/package.json
@@ -13,7 +13,8 @@
"test:watch": "vitest --watch",
"test:coverage": "vitest --coverage",
"test:coverage:report": "vitest --coverage --reporter=html",
- "test:coverage:report:open": "vitest --coverage --reporter=html && open coverage/index.html"
+ "test:coverage:report:open": "vitest --coverage --reporter=html && open coverage/index.html",
+ "prettier": "prettier ./src --write"
},
"dependencies": {
"react": "^19.0.0",
@@ -35,9 +36,10 @@
"eslint-plugin-react-refresh": "^0.4.19",
"globals": "^15.15.0",
"jsdom": "^26.0.0",
+ "prettier": "3.5.3",
"typescript": "~5.7.2",
"typescript-eslint": "^8.24.1",
"vite": "^6.2.0",
"vitest": "^3.1.1"
}
-}
+}
\ No newline at end of file
diff --git a/react-advanced-tag1/src/App.css b/react-advanced-tag1/src/App.css
index 80815d6..57094a9 100644
--- a/react-advanced-tag1/src/App.css
+++ b/react-advanced-tag1/src/App.css
@@ -1,5 +1,3 @@
-
-
.logo {
height: 6em;
padding: 1.5em;
@@ -36,7 +34,7 @@
color: #888;
}
-input[type="text"] {
+input[type='text'] {
border-radius: 6px;
padding: 1rem 0.5rem;
}
diff --git a/react-advanced-tag1/src/App.tsx b/react-advanced-tag1/src/App.tsx
index 8707ae1..e6f4c04 100644
--- a/react-advanced-tag1/src/App.tsx
+++ b/react-advanced-tag1/src/App.tsx
@@ -13,20 +13,21 @@ import ModalPage from './pages/ModalPage'
import { HocPage } from './pages/HocPage'
function App() {
-
- return
-
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
-
-
+ return (
+
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+
+
+ )
}
export default App
diff --git a/react-advanced-tag1/src/common/components/ComponentWrapper/ComponentWrapper.css b/react-advanced-tag1/src/common/components/ComponentWrapper/ComponentWrapper.css
index d847ffb..b64230c 100644
--- a/react-advanced-tag1/src/common/components/ComponentWrapper/ComponentWrapper.css
+++ b/react-advanced-tag1/src/common/components/ComponentWrapper/ComponentWrapper.css
@@ -10,10 +10,10 @@
}
.component-content {
- width: 100%;
- max-width: 800px;
- background-color: #888;
- border-radius: 8px;
- padding: 20px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ width: 100%;
+ max-width: 800px;
+ background-color: #888;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
diff --git a/react-advanced-tag1/src/common/components/ComponentWrapper/ComponentWrapper.tsx b/react-advanced-tag1/src/common/components/ComponentWrapper/ComponentWrapper.tsx
index d27d829..6ec464b 100644
--- a/react-advanced-tag1/src/common/components/ComponentWrapper/ComponentWrapper.tsx
+++ b/react-advanced-tag1/src/common/components/ComponentWrapper/ComponentWrapper.tsx
@@ -1,17 +1,18 @@
import './ComponentWrapper.css'
interface ComponentWrapperProps {
- title?: string;
- children: React.ReactNode;
+ title?: string
+ children: React.ReactNode
+}
+export default function ComponentWrapper({
+ children,
+ title,
+}: ComponentWrapperProps): React.ReactElement {
+ console.log('ComponentWrapper rendered:', title)
+ return (
+
+ {title &&
{title} }
+
{children}
+
+ )
}
-export default function ComponentWrapper({ children, title }: ComponentWrapperProps): React.ReactElement {
- console.log("ComponentWrapper rendered:", title);
- return (
-
- {title &&
{title} }
-
- {children}
-
-
- );
-}
\ No newline at end of file
diff --git a/react-advanced-tag1/src/common/components/Footer.test.tsx b/react-advanced-tag1/src/common/components/Footer.test.tsx
index 55c05d0..a23653d 100644
--- a/react-advanced-tag1/src/common/components/Footer.test.tsx
+++ b/react-advanced-tag1/src/common/components/Footer.test.tsx
@@ -1,10 +1,10 @@
-import { render, screen } from "@testing-library/react";
-import Footer from "./Footer";
-import { describe, it, expect } from "vitest";
+import { render, screen } from '@testing-library/react'
+import Footer from './Footer'
+import { describe, it, expect } from 'vitest'
-describe("Footer Component", () => {
- it("should render the footer with correct content", () => {
- render();
- expect(screen.getByText(/© 2025 Your Company/i)).toBeDefined();
- });
-});
+describe('Footer Component', () => {
+ it('should render the footer with correct content', () => {
+ render()
+ expect(screen.getByText(/© 2025 Your Company/i)).toBeDefined()
+ })
+})
diff --git a/react-advanced-tag1/src/common/components/Footer.tsx b/react-advanced-tag1/src/common/components/Footer.tsx
index e4e81b3..ee85525 100644
--- a/react-advanced-tag1/src/common/components/Footer.tsx
+++ b/react-advanced-tag1/src/common/components/Footer.tsx
@@ -1,10 +1,10 @@
function Footer() {
- console.log("Footer rendered");
- return (
-
- );
+ console.log('Footer rendered')
+ return (
+
+ )
}
-export default Footer;
\ No newline at end of file
+export default Footer
diff --git a/react-advanced-tag1/src/common/components/Header/Navigation.tsx b/react-advanced-tag1/src/common/components/Header/Navigation.tsx
index c7e6f50..c9efe35 100644
--- a/react-advanced-tag1/src/common/components/Header/Navigation.tsx
+++ b/react-advanced-tag1/src/common/components/Header/Navigation.tsx
@@ -1,16 +1,35 @@
-export default function Navigation () {
- return (
-
-
- );
-}
\ No newline at end of file
+export default function Navigation() {
+ return (
+
+
+
+ )
+}
diff --git a/react-advanced-tag1/src/common/components/Header/index.tsx b/react-advanced-tag1/src/common/components/Header/index.tsx
index 9019224..592b7d1 100644
--- a/react-advanced-tag1/src/common/components/Header/index.tsx
+++ b/react-advanced-tag1/src/common/components/Header/index.tsx
@@ -1,13 +1,13 @@
-import Navigation from "./Navigation";
+import Navigation from './Navigation'
const Header = () => {
- console.log("Header rendered");
- return (
-
- );
+ console.log('Header rendered')
+ return (
+
+ )
}
-export default Header;
\ No newline at end of file
+export default Header
diff --git a/react-advanced-tag1/src/common/components/Modal.css b/react-advanced-tag1/src/common/components/Modal.css
index 4f1f7ea..259c414 100644
--- a/react-advanced-tag1/src/common/components/Modal.css
+++ b/react-advanced-tag1/src/common/components/Modal.css
@@ -15,4 +15,4 @@
background-color: red;
padding: 20px;
border-radius: 5px;
-}
\ No newline at end of file
+}
diff --git a/react-advanced-tag1/src/common/components/Modal.tsx b/react-advanced-tag1/src/common/components/Modal.tsx
index 67d0225..7338910 100644
--- a/react-advanced-tag1/src/common/components/Modal.tsx
+++ b/react-advanced-tag1/src/common/components/Modal.tsx
@@ -1,18 +1,25 @@
-import'./Modal.css';
+import './Modal.css'
interface ModalProps {
- open?: boolean;
- onClose?: () => void;
+ open?: boolean
+ onClose?: () => void
}
-export default function Modal({ open= true, onClose }: ModalProps): React.ReactElement {
- console.log("Modal rendered");
- return (
- onClose && onClose()}>
-
-
Modal
-
This is a modal component.
-
-
- );
-}
\ No newline at end of file
+export default function Modal({
+ open = true,
+ onClose,
+}: ModalProps): React.ReactElement {
+ console.log('Modal rendered')
+ return (
+ onClose && onClose()}
+ >
+
+
Modal
+
This is a modal component.
+
+
+ )
+}
diff --git a/react-advanced-tag1/src/common/components/exercises/EffectExercises/index.tsx b/react-advanced-tag1/src/common/components/exercises/EffectExercises/index.tsx
index 8b737d6..6f262f6 100644
--- a/react-advanced-tag1/src/common/components/exercises/EffectExercises/index.tsx
+++ b/react-advanced-tag1/src/common/components/exercises/EffectExercises/index.tsx
@@ -1,26 +1,24 @@
-import { useEffect, useState } from "react"
+import { useEffect, useState } from 'react'
export default function EffectExercises() {
+ const [counter, setCounter] = useState(0)
- const [counter, setCounter] = useState(0);
+ useEffect(() => {
+ console.log('EffectExercises mounted')
+ const interval = setInterval(() => {
+ setCounter((prevCounter) => prevCounter + 1)
+ }, 1000)
+ return () => {
+ console.log('EffectExercises unmounted')
+ clearInterval(interval)
+ }
+ }, [counter])
+ return (
+
+ Effect Exercises
+ Counter: {counter}
- useEffect(() => {
- console.log("EffectExercises mounted");
- const interval = setInterval(() => {
- setCounter(prevCounter => prevCounter + 1);
- }
- , 1000);
- return () => {
- console.log("EffectExercises unmounted");
- clearInterval(interval);
- }
- }, [counter]);
- return (
-
- Effect Exercises
- Counter: {counter}
-
- setCounter(0)}>Reset
-
- )
-}
\ No newline at end of file
+ setCounter(0)}>Reset
+
+ )
+}
diff --git a/react-advanced-tag1/src/common/components/exercises/HocExercise/DogImages.tsx b/react-advanced-tag1/src/common/components/exercises/HocExercise/DogImages.tsx
index cf57902..022c241 100644
--- a/react-advanced-tag1/src/common/components/exercises/HocExercise/DogImages.tsx
+++ b/react-advanced-tag1/src/common/components/exercises/HocExercise/DogImages.tsx
@@ -1,18 +1,17 @@
-import withLoader, { LoaderData } from "./WithLoader";
-import './DogImages.css';
+import withLoader, { LoaderData } from './WithLoader'
+import './DogImages.css'
interface DogImagesProps {
- data: LoaderData;
+ data: LoaderData
}
-function DogImages({data}: DogImagesProps) {
- return data.message.map((img, index) => (
-
- ));
+function DogImages({ data }: DogImagesProps) {
+ return data.message.map((img, index) => (
+
+ ))
}
-const DogImagesWithLoader = withLoader(DogImages, "https://dog.ceo/api/breed/labrador/images/random/6");
-export default DogImagesWithLoader;
\ No newline at end of file
+const DogImagesWithLoader = withLoader(
+ DogImages,
+ 'https://dog.ceo/api/breed/labrador/images/random/6'
+)
+export default DogImagesWithLoader
diff --git a/react-advanced-tag1/src/common/components/exercises/HocExercise/WithLoader.tsx b/react-advanced-tag1/src/common/components/exercises/HocExercise/WithLoader.tsx
index 53de648..d7ece0c 100644
--- a/react-advanced-tag1/src/common/components/exercises/HocExercise/WithLoader.tsx
+++ b/react-advanced-tag1/src/common/components/exercises/HocExercise/WithLoader.tsx
@@ -1,50 +1,44 @@
-
-import { ComponentType, useEffect, useState } from "react";
+import { ComponentType, useEffect, useState } from 'react'
export type LoaderData = {
- message: string[];
- status: string;
+ message: string[]
+ status: string
}
interface WithLoaderProps {
- data: LoaderData;
+ data: LoaderData
}
// HOC definition
export default function withLoader(
- WrappedComponent: ComponentType
,
- url: string,
+ WrappedComponent: ComponentType
,
+ url: string
) {
- return function WithLoaderComponent(props: P) {
- const [data, setData] = useState(null);
+ return function WithLoaderComponent(props: P) {
+ const [data, setData] = useState(null)
- useEffect(() => {
- async function fetchData() {
- try {
- const response = await fetch(url);
- const json = await response.json();
- // setData(json);
+ useEffect(() => {
+ async function fetchData() {
+ try {
+ const response = await fetch(url)
+ const json = await response.json()
+ // setData(json);
- setTimeout(() => {
- setData(json);
- }
- , 5000);
- }
- catch (error) {
- console.error("Error fetching data:", error);
- }
- }
-
- fetchData();
- }, []);
-
- if (!data) {
- return Loading...
;
+ setTimeout(() => {
+ setData(json)
+ }, 5000)
+ } catch (error) {
+ console.error('Error fetching data:', error)
}
+ }
- return (
-
- );
-
- };
-}
\ No newline at end of file
+ fetchData()
+ }, [])
+
+ if (!data) {
+ return Loading...
+ }
+
+ return
+ }
+}
diff --git a/react-advanced-tag1/src/common/components/exercises/HocExercise/dogimages.css b/react-advanced-tag1/src/common/components/exercises/HocExercise/dogimages.css
index a902cb6..01ef18b 100644
--- a/react-advanced-tag1/src/common/components/exercises/HocExercise/dogimages.css
+++ b/react-advanced-tag1/src/common/components/exercises/HocExercise/dogimages.css
@@ -3,4 +3,4 @@
height: 100px;
border-radius: 50%;
margin: 10px;
-}
\ No newline at end of file
+}
diff --git a/react-advanced-tag1/src/common/components/exercises/MemoCallback/Search.tsx b/react-advanced-tag1/src/common/components/exercises/MemoCallback/Search.tsx
index 1fc07c1..892d860 100644
--- a/react-advanced-tag1/src/common/components/exercises/MemoCallback/Search.tsx
+++ b/react-advanced-tag1/src/common/components/exercises/MemoCallback/Search.tsx
@@ -1,12 +1,18 @@
-import React, { memo } from "react";
+import React, { memo } from 'react'
interface SearchProps {
- onChange: (text: string) => void;
+ onChange: (text: string) => void
}
function Search({ onChange }: SearchProps): React.ReactElement {
- console.log("Search rendered");
- return onChange(e.target.value)} placeholder="Search user..." />;
+ console.log('Search rendered')
+ return (
+ onChange(e.target.value)}
+ placeholder="Search user..."
+ />
+ )
}
-export default memo(Search);
\ No newline at end of file
+export default memo(Search)
diff --git a/react-advanced-tag1/src/common/components/exercises/MemoCallback/index.test.tsx b/react-advanced-tag1/src/common/components/exercises/MemoCallback/index.test.tsx
index ab5c674..1868c44 100644
--- a/react-advanced-tag1/src/common/components/exercises/MemoCallback/index.test.tsx
+++ b/react-advanced-tag1/src/common/components/exercises/MemoCallback/index.test.tsx
@@ -1,42 +1,44 @@
-import { render, screen, fireEvent } from "@testing-library/react";
-import MemoCallback from "./index";
-import { describe, it, expect } from "vitest";
-import { users } from "../../../utils/shuffle";
+import { render, screen, fireEvent } from '@testing-library/react'
+import MemoCallback from './index'
+import { describe, it, expect } from 'vitest'
+import { users } from '../../../utils/shuffle'
+describe('MemoCallback Component', () => {
+ it('should render the component with initial users', () => {
+ render( )
+ users.forEach((user) => {
+ expect(screen.getByText(user)).toBeDefined()
+ })
+ })
+ it('should filter users based on search input', () => {
+ render( )
+ const searchInput = screen.getByPlaceholderText(/search/i)
-describe("MemoCallback Component", () => {
- it("should render the component with initial users", () => {
- render( );
- users.forEach((user) => {
- expect(screen.getByText(user)).toBeDefined();
- });
- });
+ fireEvent.change(searchInput, { target: { value: 'a' } })
+ const filteredUsers = users.filter((user) =>
+ user.toLowerCase().includes('a')
+ )
+ filteredUsers.forEach((user) => {
+ expect(screen.getByText(user)).toBeDefined()
+ })
- it("should filter users based on search input", () => {
- render( );
- const searchInput = screen.getByPlaceholderText(/search/i);
+ const nonMatchingUsers = users.filter(
+ (user) => !user.toLowerCase().includes('a')
+ )
+ nonMatchingUsers.forEach((user) => {
+ expect(screen.queryByText(user)).not.toBeDefined()
+ })
+ })
- fireEvent.change(searchInput, { target: { value: "a" } });
- const filteredUsers = users.filter((user) => user.toLowerCase().includes("a"));
- filteredUsers.forEach((user) => {
- expect(screen.getByText(user)).toBeDefined();
- });
+ it('should shuffle users when the shuffle button is clicked', () => {
+ render( )
+ const shuffleButton = screen.getByText(/shuffle/i)
- const nonMatchingUsers = users.filter((user) => !user.toLowerCase().includes("a"));
- nonMatchingUsers.forEach((user) => {
- expect(screen.queryByText(user)).not.toBeDefined();
- });
- });
+ const initialOrder = screen.getAllByText(/./).map((el) => el.textContent)
+ fireEvent.click(shuffleButton)
+ const shuffledOrder = screen.getAllByText(/./).map((el) => el.textContent)
- it("should shuffle users when the shuffle button is clicked", () => {
- render( );
- const shuffleButton = screen.getByText(/shuffle/i);
-
- const initialOrder = screen.getAllByText(/./).map((el) => el.textContent);
- fireEvent.click(shuffleButton);
- const shuffledOrder = screen.getAllByText(/./).map((el) => el.textContent);
-
- expect(initialOrder).not.toEqual(shuffledOrder);
- });
-});
\ No newline at end of file
+ expect(initialOrder).not.toEqual(shuffledOrder)
+ })
+})
diff --git a/react-advanced-tag1/src/common/components/exercises/MemoCallback/index.tsx b/react-advanced-tag1/src/common/components/exercises/MemoCallback/index.tsx
index 0882f8e..3614ec4 100644
--- a/react-advanced-tag1/src/common/components/exercises/MemoCallback/index.tsx
+++ b/react-advanced-tag1/src/common/components/exercises/MemoCallback/index.tsx
@@ -1,33 +1,31 @@
-import { useCallback, useState } from "react";
-import Search from "./Search";
-import { users, shuffleArray } from "../../../utils/shuffle";
+import { useCallback, useState } from 'react'
+import Search from './Search'
+import { users, shuffleArray } from '../../../utils/shuffle'
export default function MemoCallback() {
- console.log("MemoCallback rendered");
+ console.log('MemoCallback rendered')
- const [allUsers, setAllUsers] = useState(users);
+ const [allUsers, setAllUsers] = useState(users)
- const handleSearch = useCallback((text: string) => {
- const filteredUsers = users.filter((user) => {
- return user.toLowerCase().includes(text.toLowerCase());
- });
- setAllUsers(filteredUsers);
- }, []);
+ const handleSearch = useCallback((text: string) => {
+ const filteredUsers = users.filter((user) => {
+ return user.toLowerCase().includes(text.toLowerCase())
+ })
+ setAllUsers(filteredUsers)
+ }, [])
- const handleShuffle = () => {
- setAllUsers(shuffleArray(users));
- };
+ const handleShuffle = () => {
+ setAllUsers(shuffleArray(users))
+ }
- const ListOfUsers = allUsers.map((user) => {
- return {user}
;
- });
- return (
-
-
Shuffle
-
-
- {ListOfUsers}
-
-
- );
+ const ListOfUsers = allUsers.map((user) => {
+ return {user}
+ })
+ return (
+
+
Shuffle
+
+
{ListOfUsers}
+
+ )
}
diff --git a/react-advanced-tag1/src/common/components/exercises/RefExercise/index.tsx b/react-advanced-tag1/src/common/components/exercises/RefExercise/index.tsx
index 2431a7e..119c0e6 100644
--- a/react-advanced-tag1/src/common/components/exercises/RefExercise/index.tsx
+++ b/react-advanced-tag1/src/common/components/exercises/RefExercise/index.tsx
@@ -1,83 +1,112 @@
-import { FormEvent, useRef, useState } from "react";
-import useLocalStorage from "../../../hooks/useLocalStorage";
+import { FormEvent, useRef, useState } from 'react'
+import useLocalStorage from '../../../hooks/useLocalStorage'
interface FormValues {
- email: string;
- password: string;
+ email: string
+ password: string
}
export default function RefExercise(): React.ReactElement {
- console.log("RefExercise rendered");
+ console.log('RefExercise rendered')
- const emailRef = useRef(null);
- const passwordRef = useRef(null);
- const {setStoredValue, value: formDataValues} = useLocalStorage("formdata", {
- email: "",
- password: ""
- } );
-
- const handleSubmit = () => {
- console.log("submit", {
- email: emailRef.current?.value,
- password: passwordRef.current?.value
- });
- setStoredValue({
- email: emailRef.current?.value || "",
- password: passwordRef.current?.value || ""
- });
- passwordRef.current?.focus();
+ const emailRef = useRef(null)
+ const passwordRef = useRef(null)
+ const { setStoredValue, value: formDataValues } = useLocalStorage(
+ 'formdata',
+ {
+ email: '',
+ password: '',
}
+ )
- const [formData, setFormData] = useState({
- strasse: "",
- city: ""
- });
+ const handleSubmit = () => {
+ console.log('submit', {
+ email: emailRef.current?.value,
+ password: passwordRef.current?.value,
+ })
+ setStoredValue({
+ email: emailRef.current?.value || '',
+ password: passwordRef.current?.value || '',
+ })
+ passwordRef.current?.focus()
+ }
- const handleChange = (event: React.ChangeEvent) => {
- setFormData({
- ...formData,
- [event.target.name]: event.target.value
- });
- }
+ const [formData, setFormData] = useState({
+ strasse: '',
+ city: '',
+ })
- const handleChangeSubmit = () => {
- const strasse = document.querySelector('input[name="strasse"]') as HTMLInputElement;
- const city = document.querySelector('input[name="city"]') as HTMLInputElement;
- console.log("submit", {
- strasse: strasse.value,
- city: city.value
- });
- }
-
- function handleFormSubmit(e: FormEvent) {
- e.preventDefault();
- const data = new FormData(e.target as HTMLFormElement);
- console.log('handleFormSubmit', {
- email: data.get('email'),
- password: data.get('password')
- });
- }
- return (
-
- );
-}
\ No newline at end of file
+ const handleChangeSubmit = () => {
+ const strasse = document.querySelector(
+ 'input[name="strasse"]'
+ ) as HTMLInputElement
+ const city = document.querySelector(
+ 'input[name="city"]'
+ ) as HTMLInputElement
+ console.log('submit', {
+ strasse: strasse.value,
+ city: city.value,
+ })
+ }
+
+ function handleFormSubmit(e: FormEvent) {
+ e.preventDefault()
+ const data = new FormData(e.target as HTMLFormElement)
+ console.log('handleFormSubmit', {
+ email: data.get('email'),
+ password: data.get('password'),
+ })
+ }
+ return (
+
+ )
+}
diff --git a/react-advanced-tag1/src/common/components/exercises/UserEffect.tsx b/react-advanced-tag1/src/common/components/exercises/UserEffect.tsx
index 5f68395..87a60a9 100644
--- a/react-advanced-tag1/src/common/components/exercises/UserEffect.tsx
+++ b/react-advanced-tag1/src/common/components/exercises/UserEffect.tsx
@@ -1,66 +1,97 @@
-import { useEffect, useState } from "react";
+import { useEffect, useState } from 'react'
interface User {
- id: number;
- name: string;
- email: string;
- website: string;
+ id: number
+ name: string
+ email: string
+ website: string
}
export default function UserEffect() {
- const [user, setUser] = useState();
- const [userId, setUserId] = useState(0);
- const [loading, setLoading] = useState(false);
+ const [user, setUser] = useState()
+ const [userId, setUserId] = useState(0)
+ const [loading, setLoading] = useState(false)
- useEffect(() => {
- console.log("UserEffect mounted");
+ useEffect(() => {
+ console.log('UserEffect mounted')
- if (userId === 0) {
- return;
+ if (userId === 0) {
+ return
+ }
+
+ const start = performance.now() // Start measuring performance
+
+ setLoading(true)
+
+ // Using AbortController to cancel the fetch request if the component unmounts
+ // or if the userId changes before the fetch completes
+ const controller = new AbortController()
+ const signal = controller.signal
+
+ fetch(`https://jsonplaceholder.typicode.com/users/${userId}`, {
+ signal: signal,
+ })
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error('Network response was not ok')
}
+ return response.json()
+ })
+ .then((data) => {
+ setUser(data)
+ const end = performance.now() // End measuring performance
+ const timeTaken = end - start // Calculate the time taken
+ console.log(`Fetch completed in ${Math.round(timeTaken)} milliseconds`)
+ setLoading(false)
+ })
+ .catch((error) => {
+ console.error('There was a problem with the fetch operation:', error)
+ })
+ return () => {
+ console.log('UserEffect unmounted')
+ // Cleanup function to abort the fetch request if the component unmounts
+ // or if the userId changes before the fetch completes
+ controller.abort('Fetch aborted')
+ }
+ }, [userId])
- const start = performance.now(); // Start measuring performance
+ return (
+
+ users Effect Exercise
- setLoading(true);
+ {userId === 0 && Please select a user
}
+ {loading || userId === 0 ? (
+ Loading...
+ ) : (
+
+ [{user?.id}] {user?.name}: {user?.website}
+
+ )}
- // Using AbortController to cancel the fetch request if the component unmounts
- // or if the userId changes before the fetch completes
- const controller = new AbortController();
- const signal = controller.signal;
-
- fetch(`https://jsonplaceholder.typicode.com/users/${userId}`, {signal: signal}).then(response => {
- if (!response.ok) {
- throw new Error("Network response was not ok");
- }
- return response.json();
- }).then(data => {
- setUser(data);
- const end = performance.now(); // End measuring performance
- const timeTaken = end - start; // Calculate the time taken
- console.log(`Fetch completed in ${Math.round(timeTaken)} milliseconds`);
- setLoading(false);
- }).catch(error => {
- console.error("There was a problem with the fetch operation:", error);
- });
- return () => {
- console.log("UserEffect unmounted");
- // Cleanup function to abort the fetch request if the component unmounts
- // or if the userId changes before the fetch completes
- controller.abort('Fetch aborted');
- }
- }, [userId]);
-
- return (
-
- users Effect Exercise
-
- {userId === 0 && Please select a user
}
- {loading || userId === 0 ? Loading...
: [{user?.id}] {user?.name}: {user?.website}
}
-
- setUserId(1)} style={{padding: 10, border: '1px solid gray'}}>User 1
- setUserId(2)} style={{padding: 10, border: '1px solid gray'}}>User 2
- setUserId(3)} style={{padding: 10, border: '1px solid gray'}}>User 3
- setUserId(4)} style={{padding: 10, border: '1px solid gray'}}>User 4
-
- )
-}
\ No newline at end of file
+ setUserId(1)}
+ style={{ padding: 10, border: '1px solid gray' }}
+ >
+ User 1
+
+ setUserId(2)}
+ style={{ padding: 10, border: '1px solid gray' }}
+ >
+ User 2
+
+ setUserId(3)}
+ style={{ padding: 10, border: '1px solid gray' }}
+ >
+ User 3
+
+ setUserId(4)}
+ style={{ padding: 10, border: '1px solid gray' }}
+ >
+ User 4
+
+
+ )
+}
diff --git a/react-advanced-tag1/src/common/components/exercises/UserOverview.tsx b/react-advanced-tag1/src/common/components/exercises/UserOverview.tsx
index 1cd08d2..2a1752f 100644
--- a/react-advanced-tag1/src/common/components/exercises/UserOverview.tsx
+++ b/react-advanced-tag1/src/common/components/exercises/UserOverview.tsx
@@ -1,33 +1,45 @@
-import { useFetch } from "../../hooks/useFetch";
-import { useMediaQuery } from "../../hooks/useMediaQuery";
+import { useFetch } from '../../hooks/useFetch'
+import { useMediaQuery } from '../../hooks/useMediaQuery'
export function UserOverview() {
- const {data, loading, error} = useFetch("https://jsonplaceholder.typicode.com/users");
+ const { data, loading, error } = useFetch(
+ 'https://jsonplaceholder.typicode.com/users'
+ )
- const isMobile = useMediaQuery('(max-width: 600px)');
+ const isMobile = useMediaQuery('(max-width: 600px)')
- console.log("isMobile", isMobile);
+ console.log('isMobile', isMobile)
- if (error) {
- return Error: {error}
;
- }
- if (loading) {
- return Loading...
;
- }
- if (!data) {
- return No data available
;
- }
- return (
-
-
User Overview
-
-
Total Users: {data.length}
-
- );
+ if (error) {
+ return Error: {error}
+ }
+ if (loading) {
+ return Loading...
+ }
+ if (!data) {
+ return No data available
+ }
+ return (
+
+
User Overview
+
+
Total Users: {data.length}
+
+ )
}
diff --git a/react-advanced-tag1/src/common/components/globals/Heading.tsx b/react-advanced-tag1/src/common/components/globals/Heading.tsx
index 713ce22..8fd0064 100644
--- a/react-advanced-tag1/src/common/components/globals/Heading.tsx
+++ b/react-advanced-tag1/src/common/components/globals/Heading.tsx
@@ -1,8 +1,8 @@
-export default function Heading({title = "Hallo Teilnehmer"}: {title?: string}): React.ReactElement {
- console.log("Heading rendered");
- return (
-
- {title}
-
- );
-}
\ No newline at end of file
+export default function Heading({
+ title = 'Hallo Teilnehmer',
+}: {
+ title?: string
+}): React.ReactElement {
+ console.log('Heading rendered')
+ return {title}
+}
diff --git a/react-advanced-tag1/src/common/hooks/useFetch.ts b/react-advanced-tag1/src/common/hooks/useFetch.ts
index 7736339..ab181bc 100644
--- a/react-advanced-tag1/src/common/hooks/useFetch.ts
+++ b/react-advanced-tag1/src/common/hooks/useFetch.ts
@@ -1,49 +1,44 @@
-import { useEffect, useState } from "react";
+import { useEffect, useState } from 'react'
interface User {
- id: number;
- name: string;
- email: string;
- website: string;
+ id: number
+ name: string
+ email: string
+ website: string
}
export function useFetch(url: string) {
- const [data, setData] = useState(null);
- const [loading, setLoading] = useState(true);
- const [error, setError] = useState(null);
+ const [data, setData] = useState(null)
+ const [loading, setLoading] = useState(true)
+ const [error, setError] = useState(null)
- // alternativ
- // const [fetchValues, setFetchValues] = useState({
- // data: null,
- // loading: true,
- // error: null,
- // });
+ // alternativ
+ // const [fetchValues, setFetchValues] = useState({
+ // data: null,
+ // loading: true,
+ // error: null,
+ // });
- useEffect(() => {
- async function fetchData() {
- try {
- const response = await fetch(url);
- if (!response.ok) {
- setError("Network response was not ok");
- throw new Error("Network response was not ok");
- }
- const data = await response.json();
- setData(data);
- setError(null);
-
- } catch (error) {
- console.error("Error fetching data:", error);
- setError("Error fetching data");
- }
- finally {
- setLoading(false);
- }
+ useEffect(() => {
+ async function fetchData() {
+ try {
+ const response = await fetch(url)
+ if (!response.ok) {
+ setError('Network response was not ok')
+ throw new Error('Network response was not ok')
}
- fetchData();
-
+ const data = await response.json()
+ setData(data)
+ setError(null)
+ } catch (error) {
+ console.error('Error fetching data:', error)
+ setError('Error fetching data')
+ } finally {
+ setLoading(false)
+ }
+ }
+ fetchData()
+ }, [url])
- }, [url]);
-
- return { data, loading, error };
-
-}
\ No newline at end of file
+ return { data, loading, error }
+}
diff --git a/react-advanced-tag1/src/common/hooks/useLocalStorage.ts b/react-advanced-tag1/src/common/hooks/useLocalStorage.ts
index 7d0192b..5c748de 100644
--- a/react-advanced-tag1/src/common/hooks/useLocalStorage.ts
+++ b/react-advanced-tag1/src/common/hooks/useLocalStorage.ts
@@ -1,39 +1,43 @@
-import { useState } from "react";
+import { useState } from 'react'
-export default function useLocalStorage(key: string, initialValue: T | null) {
- const [value, setValue] = useState(() => {
- try {
- if (typeof window === "undefined") {
- return initialValue;
- }
- const storedValue = localStorage.getItem(key);
- return storedValue ? JSON.parse(storedValue) : initialValue;
- } catch (error) {
- console.error("Error reading from localStorage", error);
- return initialValue;
- }
- });
- const setStoredValue = (newValue: T) => {
- try {
- const valueToStore = newValue instanceof Function ? newValue(value) : newValue;
- setValue(valueToStore);
- if (typeof window !== "undefined") {
- localStorage.setItem(key, JSON.stringify(valueToStore));
- }
- } catch (error) {
- console.error("Error writing to localStorage", error);
- }
+export default function useLocalStorage(
+ key: string,
+ initialValue: T | null
+) {
+ const [value, setValue] = useState(() => {
+ try {
+ if (typeof window === 'undefined') {
+ return initialValue
+ }
+ const storedValue = localStorage.getItem(key)
+ return storedValue ? JSON.parse(storedValue) : initialValue
+ } catch (error) {
+ console.error('Error reading from localStorage', error)
+ return initialValue
}
+ })
+ const setStoredValue = (newValue: T) => {
+ try {
+ const valueToStore =
+ newValue instanceof Function ? newValue(value) : newValue
+ setValue(valueToStore)
+ if (typeof window !== 'undefined') {
+ localStorage.setItem(key, JSON.stringify(valueToStore))
+ }
+ } catch (error) {
+ console.error('Error writing to localStorage', error)
+ }
+ }
- const removeStoredValue = () => {
- try {
- if (typeof window !== "undefined") {
- localStorage.removeItem(key);
- }
- setValue(null);
- } catch (error) {
- console.error("Error removing from localStorage", error);
- }
+ const removeStoredValue = () => {
+ try {
+ if (typeof window !== 'undefined') {
+ localStorage.removeItem(key)
+ }
+ setValue(null)
+ } catch (error) {
+ console.error('Error removing from localStorage', error)
}
- return {value, setStoredValue, removeStoredValue};
-}
\ No newline at end of file
+ }
+ return { value, setStoredValue, removeStoredValue }
+}
diff --git a/react-advanced-tag1/src/common/hooks/useMediaQuery.ts b/react-advanced-tag1/src/common/hooks/useMediaQuery.ts
index f234bef..05a98c9 100644
--- a/react-advanced-tag1/src/common/hooks/useMediaQuery.ts
+++ b/react-advanced-tag1/src/common/hooks/useMediaQuery.ts
@@ -1,5 +1,4 @@
-import { useEffect, useState } from "react";
-
+import { useEffect, useState } from 'react'
/**
* Custom hook to check if a media query matches the current viewport.
@@ -7,25 +6,25 @@ import { useEffect, useState } from "react";
* @returns A boolean indicating whether the media query matches.
*/
export function useMediaQuery(query: string) {
- const [matches, setMatches] = useState(false);
+ const [matches, setMatches] = useState(false)
- useEffect(() => {
- const mediaQueryList = window.matchMedia(query);
- const handleChange = (event: MediaQueryListEvent) => {
- setMatches(event.matches);
- };
+ useEffect(() => {
+ const mediaQueryList = window.matchMedia(query)
+ const handleChange = (event: MediaQueryListEvent) => {
+ setMatches(event.matches)
+ }
- // Set the initial value
- setMatches(mediaQueryList.matches);
+ // Set the initial value
+ setMatches(mediaQueryList.matches)
- // Add event listener
- mediaQueryList.addEventListener('change', handleChange);
+ // Add event listener
+ mediaQueryList.addEventListener('change', handleChange)
- // Cleanup function to remove the event listener
- return () => {
- mediaQueryList.removeEventListener('change', handleChange);
- };
- }, [query]);
+ // Cleanup function to remove the event listener
+ return () => {
+ mediaQueryList.removeEventListener('change', handleChange)
+ }
+ }, [query])
- return matches;
-}
\ No newline at end of file
+ return matches
+}
diff --git a/react-advanced-tag1/src/common/stores/counter-store.ts b/react-advanced-tag1/src/common/stores/counter-store.ts
index 862d617..fe562b4 100644
--- a/react-advanced-tag1/src/common/stores/counter-store.ts
+++ b/react-advanced-tag1/src/common/stores/counter-store.ts
@@ -1,15 +1,15 @@
-import { create } from "zustand";
+import { create } from 'zustand'
interface CounterState {
- count: number;
- increment: () => void;
- decrement: () => void;
+ count: number
+ increment: () => void
+ decrement: () => void
}
const useCounterStore = create((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
decrement: () => set((state) => ({ count: state.count - 1 })),
-}));
+}))
-export default useCounterStore;
\ No newline at end of file
+export default useCounterStore
diff --git a/react-advanced-tag1/src/common/utils/shuffle.test.ts b/react-advanced-tag1/src/common/utils/shuffle.test.ts
index ad2d792..a3b7f9d 100644
--- a/react-advanced-tag1/src/common/utils/shuffle.test.ts
+++ b/react-advanced-tag1/src/common/utils/shuffle.test.ts
@@ -1,22 +1,22 @@
-import { describe, it, expect } from 'vitest';
-import { shuffleArray, users } from './shuffle';
+import { describe, it, expect } from 'vitest'
+import { shuffleArray, users } from './shuffle'
describe('shuffleArray', () => {
- it('should shuffle the array and return a new order', () => {
- const originalArray = [...users];
- const shuffledArray = shuffleArray([...users]);
+ it('should shuffle the array and return a new order', () => {
+ const originalArray = [...users]
+ const shuffledArray = shuffleArray([...users])
- expect(shuffledArray).not.toEqual(originalArray); // Ensure the order is different
- expect(shuffledArray.sort()).toEqual(originalArray.sort()); // Ensure all elements are still present
- });
+ expect(shuffledArray).not.toEqual(originalArray) // Ensure the order is different
+ expect(shuffledArray.sort()).toEqual(originalArray.sort()) // Ensure all elements are still present
+ })
- it('should return an empty array when input is empty', () => {
- const result = shuffleArray([]);
- expect(result).toEqual([]);
- });
+ it('should return an empty array when input is empty', () => {
+ const result = shuffleArray([])
+ expect(result).toEqual([])
+ })
- it('should handle arrays with one element', () => {
- const result = shuffleArray(['onlyElement']);
- expect(result).toEqual(['onlyElement']);
- });
-});
+ it('should handle arrays with one element', () => {
+ const result = shuffleArray(['onlyElement'])
+ expect(result).toEqual(['onlyElement'])
+ })
+})
diff --git a/react-advanced-tag1/src/common/utils/shuffle.ts b/react-advanced-tag1/src/common/utils/shuffle.ts
index 7be7435..d453266 100644
--- a/react-advanced-tag1/src/common/utils/shuffle.ts
+++ b/react-advanced-tag1/src/common/utils/shuffle.ts
@@ -1,11 +1,10 @@
-export function shuffleArray(array: string[]){
- for(let i = array.length -1; i>0; i--){
-
- const j = Math.floor(Math.random()* (i +1));
- [array[i], array[j]] = [array[j], array[i]];
- }
-
- return [...array]
+export function shuffleArray(array: string[]) {
+ for (let i = array.length - 1; i > 0; i--) {
+ const j = Math.floor(Math.random() * (i + 1))
+ ;[array[i], array[j]] = [array[j], array[i]]
+ }
+
+ return [...array]
}
-export const users =['John', 'Peter', 'Stefanie', 'Marta', 'Klaus', 'Anna']
\ No newline at end of file
+export const users = ['John', 'Peter', 'Stefanie', 'Marta', 'Klaus', 'Anna']
diff --git a/react-advanced-tag1/src/layouts/MainLayout.css b/react-advanced-tag1/src/layouts/MainLayout.css
index 6ee3ccb..5a47318 100644
--- a/react-advanced-tag1/src/layouts/MainLayout.css
+++ b/react-advanced-tag1/src/layouts/MainLayout.css
@@ -1,56 +1,55 @@
#root {
- width: 100%;
+ width: 100%;
}
header {
- background-color: #1a1a1a;
- color: #ffffff;
- padding: 1rem;
- text-align: center;
+ background-color: #1a1a1a;
+ color: #ffffff;
+ padding: 1rem;
+ text-align: center;
}
header nav {
- display: flex;
- justify-content: center;
- gap: 2rem;
+ display: flex;
+ justify-content: center;
+ gap: 2rem;
}
header nav ul {
- list-style: none;
- padding: 0;
+ list-style: none;
+ padding: 0;
}
header nav li {
- display: inline;
+ display: inline;
}
header nav a {
- color: #ffffff;
- text-decoration: none;
- font-weight: bold;
- padding: 0.5rem 1rem;
- transition: background-color 0.3s, color 0.3s;
+ color: #ffffff;
+ text-decoration: none;
+ font-weight: bold;
+ padding: 0.5rem 1rem;
+ transition:
+ background-color 0.3s,
+ color 0.3s;
}
header nav a:hover {
- text-decoration: underline;
+ text-decoration: underline;
}
header nav a.active {
- text-decoration: underline;
+ text-decoration: underline;
}
-
-
footer {
- background-color: #1a1a1a;
- color: #ffffff;
- padding: 1rem;
- text-align: center;
+ background-color: #1a1a1a;
+ color: #ffffff;
+ padding: 1rem;
+ text-align: center;
}
-
.content {
- max-width: 1280px;
- margin: 0 auto;
- padding: 2rem;
- text-align: center;
-}
\ No newline at end of file
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
diff --git a/react-advanced-tag1/src/layouts/MainLayout.tsx b/react-advanced-tag1/src/layouts/MainLayout.tsx
index 43b6dd4..4d206c9 100644
--- a/react-advanced-tag1/src/layouts/MainLayout.tsx
+++ b/react-advanced-tag1/src/layouts/MainLayout.tsx
@@ -1,31 +1,33 @@
-import { useState } from "react";
+import { useState } from 'react'
import './MainLayout.css'
-import Footer from "../common/components/Footer";
-import Header from "../common/components/Header";
+import Footer from '../common/components/Footer'
+import Header from '../common/components/Header'
-export default function MainLayout({children}: {children: React.ReactNode | React.ReactElement | React.ReactElement[]}): React.ReactElement {
-
-
- const [clicked, setClicked] = useState(false);
+export default function MainLayout({
+ children,
+}: {
+ children: React.ReactNode | React.ReactElement | React.ReactElement[]
+}): React.ReactElement {
+ const [clicked, setClicked] = useState(false)
function handleClick() {
- setClicked(!clicked);
+ setClicked(!clicked)
- console.log("clicked", clicked);
+ console.log('clicked', clicked)
}
- console.log("MainLayout rendered", clicked);
+ console.log('MainLayout rendered', clicked)
return (
<>
-
+
-
- {children}
+
+ {children}
- Click
-
+
Click
+
-
+
>
- );
-}
\ No newline at end of file
+ )
+}
diff --git a/react-advanced-tag1/src/main.tsx b/react-advanced-tag1/src/main.tsx
index 32938e4..2b21104 100644
--- a/react-advanced-tag1/src/main.tsx
+++ b/react-advanced-tag1/src/main.tsx
@@ -9,5 +9,5 @@ createRoot(document.getElementById('root')!).render(
- ,
+
)
diff --git a/react-advanced-tag1/src/pages/ComponentWrapperPage.tsx b/react-advanced-tag1/src/pages/ComponentWrapperPage.tsx
index 5f83371..3fd0610 100644
--- a/react-advanced-tag1/src/pages/ComponentWrapperPage.tsx
+++ b/react-advanced-tag1/src/pages/ComponentWrapperPage.tsx
@@ -1,11 +1,11 @@
-import ComponentWrapper from "../common/components/ComponentWrapper/ComponentWrapper";
+import ComponentWrapper from '../common/components/ComponentWrapper/ComponentWrapper'
export default function ComponentWrapperPage() {
- return (
-
-
- Hallo
-
-
- );
-}
\ No newline at end of file
+ return (
+
+
+ Hallo
+
+
+ )
+}
diff --git a/react-advanced-tag1/src/pages/EffectExercisesPage.tsx b/react-advanced-tag1/src/pages/EffectExercisesPage.tsx
index 998437d..917dd86 100644
--- a/react-advanced-tag1/src/pages/EffectExercisesPage.tsx
+++ b/react-advanced-tag1/src/pages/EffectExercisesPage.tsx
@@ -1,12 +1,11 @@
-import EffectExercises from "../common/components/exercises/EffectExercises";
-import Heading from "../common/components/globals/Heading";
-
+import EffectExercises from '../common/components/exercises/EffectExercises'
+import Heading from '../common/components/globals/Heading'
export default function EffectExercisesPage() {
- return (
-
-
-
-
- );
-}
\ No newline at end of file
+ return (
+
+
+
+
+ )
+}
diff --git a/react-advanced-tag1/src/pages/FormsPage.tsx b/react-advanced-tag1/src/pages/FormsPage.tsx
index 5aec0ba..bc781b7 100644
--- a/react-advanced-tag1/src/pages/FormsPage.tsx
+++ b/react-advanced-tag1/src/pages/FormsPage.tsx
@@ -1,11 +1,11 @@
-import RefExercise from "../common/components/exercises/RefExercise";
-import Heading from "../common/components/globals/Heading";
+import RefExercise from '../common/components/exercises/RefExercise'
+import Heading from '../common/components/globals/Heading'
export default function FormsPage() {
- return (
-
-
-
-
- );
-}
\ No newline at end of file
+ return (
+
+
+
+
+ )
+}
diff --git a/react-advanced-tag1/src/pages/HocPage.tsx b/react-advanced-tag1/src/pages/HocPage.tsx
index 1d89473..8c5d43a 100644
--- a/react-advanced-tag1/src/pages/HocPage.tsx
+++ b/react-advanced-tag1/src/pages/HocPage.tsx
@@ -1,6 +1,5 @@
-import ComponentWrapper from "../common/components/ComponentWrapper/ComponentWrapper";
-import DogImagesWithLoader from "../common/components/exercises/HocExercise/DogImages";
-
+import ComponentWrapper from '../common/components/ComponentWrapper/ComponentWrapper'
+import DogImagesWithLoader from '../common/components/exercises/HocExercise/DogImages'
export function HocPage() {
return (
@@ -8,4 +7,4 @@ export function HocPage() {
)
-}
\ No newline at end of file
+}
diff --git a/react-advanced-tag1/src/pages/HomePage.tsx b/react-advanced-tag1/src/pages/HomePage.tsx
index e052766..46a19e0 100644
--- a/react-advanced-tag1/src/pages/HomePage.tsx
+++ b/react-advanced-tag1/src/pages/HomePage.tsx
@@ -1,10 +1,10 @@
-import Heading from "../common/components/globals/Heading";
+import Heading from '../common/components/globals/Heading'
export default function HomePage() {
- return (
- <>
-
- Willkommen auf der Startseite!
- >
- );
-}
\ No newline at end of file
+ return (
+ <>
+
+ Willkommen auf der Startseite!
+ >
+ )
+}
diff --git a/react-advanced-tag1/src/pages/MemoCallbackPage.tsx b/react-advanced-tag1/src/pages/MemoCallbackPage.tsx
index 20d5b9b..99ee020 100644
--- a/react-advanced-tag1/src/pages/MemoCallbackPage.tsx
+++ b/react-advanced-tag1/src/pages/MemoCallbackPage.tsx
@@ -1,11 +1,11 @@
-import MemoCallback from "../common/components/exercises/MemoCallback";
-import Heading from "../common/components/globals/Heading";
+import MemoCallback from '../common/components/exercises/MemoCallback'
+import Heading from '../common/components/globals/Heading'
export default function MemoCallbackPage() {
- return (
- <>
-
-
- >
- )
-}
\ No newline at end of file
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/react-advanced-tag1/src/pages/ModalPage.tsx b/react-advanced-tag1/src/pages/ModalPage.tsx
index b84a610..da68a16 100644
--- a/react-advanced-tag1/src/pages/ModalPage.tsx
+++ b/react-advanced-tag1/src/pages/ModalPage.tsx
@@ -1,14 +1,18 @@
-import { useState } from "react";
-import { createPortal } from "react-dom";
-import ComponentWrapper from "../common/components/ComponentWrapper/ComponentWrapper";
-import Modal from "../common/components/Modal";
+import { useState } from 'react'
+import { createPortal } from 'react-dom'
+import ComponentWrapper from '../common/components/ComponentWrapper/ComponentWrapper'
+import Modal from '../common/components/Modal'
export default function ModalPage() {
- const [modalOpen, setModalOpen] = useState(false);
- return (
-
- setModalOpen(!modalOpen)}>Toggle Modal
- {modalOpen && createPortal( setModalOpen(false)}/>,document.getElementById("modal") as HTMLElement)}
-
- );
-}
\ No newline at end of file
+ const [modalOpen, setModalOpen] = useState(false)
+ return (
+
+ setModalOpen(!modalOpen)}>Toggle Modal
+ {modalOpen &&
+ createPortal(
+ setModalOpen(false)} />,
+ document.getElementById('modal') as HTMLElement
+ )}
+
+ )
+}
diff --git a/react-advanced-tag1/src/pages/UsersPage.tsx b/react-advanced-tag1/src/pages/UsersPage.tsx
index 74b332c..f98c556 100644
--- a/react-advanced-tag1/src/pages/UsersPage.tsx
+++ b/react-advanced-tag1/src/pages/UsersPage.tsx
@@ -1,13 +1,13 @@
-import UserEffect from "../common/components/exercises/UserEffect";
-import { UserOverview } from "../common/components/exercises/UserOverview";
-import Heading from "../common/components/globals/Heading";
+import UserEffect from '../common/components/exercises/UserEffect'
+import { UserOverview } from '../common/components/exercises/UserOverview'
+import Heading from '../common/components/globals/Heading'
export default function UsersPage() {
- return (
-
-
-
-
-
- );
-}
\ No newline at end of file
+ return (
+
+
+
+
+
+ )
+}
diff --git a/react-advanced-tag1/src/pages/ZustandCounterPage.tsx b/react-advanced-tag1/src/pages/ZustandCounterPage.tsx
index 281ef58..29a288c 100644
--- a/react-advanced-tag1/src/pages/ZustandCounterPage.tsx
+++ b/react-advanced-tag1/src/pages/ZustandCounterPage.tsx
@@ -1,18 +1,18 @@
-import ComponentWrapper from "../common/components/ComponentWrapper/ComponentWrapper";
-import useCounterStore from "../common/stores/counter-store";
+import ComponentWrapper from '../common/components/ComponentWrapper/ComponentWrapper'
+import useCounterStore from '../common/stores/counter-store'
export default function ZustandCounterPage() {
- const {decrement, increment} = useCounterStore();
+ const { decrement, increment } = useCounterStore()
return (
-
- Increment
- Decrement
-
-
- );
+
+ Increment
+ Decrement
+
+
+ )
}
function CounterValue() {
- const count = useCounterStore((state) => state.count);
- return Count: {count}
;
-}
\ No newline at end of file
+ const count = useCounterStore((state) => state.count)
+ return Count: {count}
+}