{product.name}
24 |{new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(product.price)}{itemInCart}
26 | 27 |├── .gitignore
├── lesson11
├── src
│ ├── vite-env.d.ts
│ ├── model
│ │ ├── ListItem.ts
│ │ └── FullList.ts
│ ├── main.ts
│ ├── templates
│ │ └── ListTemplate.ts
│ └── css
│ │ └── style.css
├── package.json
├── .gitignore
├── tsconfig.json
└── index.html
├── lesson12
├── src
│ ├── vite-env.d.ts
│ ├── components
│ │ ├── Heading.tsx
│ │ ├── Section.tsx
│ │ ├── List.tsx
│ │ └── Counter.tsx
│ ├── main.tsx
│ ├── index.css
│ ├── App.tsx
│ └── assets
│ │ └── react.svg
├── vite.config.ts
├── tsconfig.node.json
├── .gitignore
├── index.html
├── package.json
├── tsconfig.json
└── public
│ └── vite.svg
├── lesson13
├── src
│ ├── vite-env.d.ts
│ ├── main.tsx
│ ├── index.css
│ ├── App.tsx
│ └── assets
│ │ └── react.svg
├── vite.config.ts
├── tsconfig.node.json
├── .gitignore
├── index.html
├── package.json
├── tsconfig.json
└── public
│ └── vite.svg
├── lesson14
├── src
│ ├── vite-env.d.ts
│ ├── App.tsx
│ ├── main.tsx
│ ├── index.css
│ ├── Counter.tsx
│ └── assets
│ │ └── react.svg
├── vite.config.ts
├── tsconfig.node.json
├── .gitignore
├── index.html
├── package.json
├── tsconfig.json
└── public
│ └── vite.svg
├── lesson15
├── src
│ ├── vite-env.d.ts
│ ├── main.tsx
│ ├── App.tsx
│ ├── Counter.tsx
│ ├── index.css
│ ├── context
│ │ └── CounterContext.tsx
│ └── assets
│ │ └── react.svg
├── vite.config.ts
├── tsconfig.node.json
├── .gitignore
├── index.html
├── package.json
├── tsconfig.json
└── public
│ └── vite.svg
├── lesson16
├── src
│ ├── vite-env.d.ts
│ ├── images
│ │ ├── item0001.jpg
│ │ ├── item0002.jpg
│ │ └── item0003.jpg
│ ├── App.tsx
│ ├── main.tsx
│ ├── context
│ │ ├── ProductsProvider.tsx
│ │ └── CartProvider.tsx
│ ├── index.css
│ └── assets
│ │ └── react.svg
├── vite.config.ts
├── tsconfig.node.json
├── .gitignore
├── index.html
├── data
│ └── products.json
├── package.json
├── tsconfig.json
└── public
│ └── vite.svg
├── lesson17
├── src
│ ├── vite-env.d.ts
│ ├── images
│ │ ├── item0001.jpg
│ │ ├── item0002.jpg
│ │ └── item0003.jpg
│ ├── hooks
│ │ ├── useCart.tsx
│ │ └── useProducts.tsx
│ ├── main.tsx
│ ├── components
│ │ ├── Nav.tsx
│ │ ├── Footer.tsx
│ │ ├── Header.tsx
│ │ ├── ProductList.tsx
│ │ ├── Cart.tsx
│ │ ├── Product.tsx
│ │ └── CartLineItem.tsx
│ ├── App.tsx
│ ├── context
│ │ ├── ProductsProvider.tsx
│ │ └── CartProvider.tsx
│ ├── index.css
│ └── assets
│ │ └── react.svg
├── vite.config.ts
├── tsconfig.node.json
├── .gitignore
├── index.html
├── data
│ └── products.json
├── package.json
├── tsconfig.json
└── public
│ └── vite.svg
├── lesson01
├── build
│ ├── js
│ │ └── main.js
│ └── index.html
├── src
│ └── main.ts
└── tsconfig.json
├── lesson02
├── build
│ ├── js
│ │ └── main.js
│ └── index.html
├── src
│ └── main.ts
└── tsconfig.json
├── lesson06
├── build
│ ├── index.html
│ └── js
│ │ └── main.js
└── src
│ └── main.ts
├── lesson07
├── build
│ ├── index.html
│ └── js
│ │ └── main.js
└── src
│ └── main.ts
├── lesson08
├── build
│ ├── index.html
│ └── js
│ │ └── main.js
└── src
│ └── main.ts
├── lesson09
├── build
│ ├── index.html
│ └── js
│ │ └── main.js
└── src
│ └── main.ts
├── lesson03
├── build
│ ├── index.html
│ └── js
│ │ └── main.js
├── src
│ └── main.ts
└── tsconfig.json
├── lesson04
├── build
│ ├── index.html
│ └── js
│ │ └── main.js
├── src
│ └── main.ts
└── tsconfig.json
├── lesson05
├── build
│ ├── js
│ │ ├── main.js
│ │ └── copyright.js
│ └── index.html
├── src
│ ├── copyright.ts
│ └── main.ts
└── tsconfig.json
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .vscode
3 |
--------------------------------------------------------------------------------
/lesson11/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
{children}
13 |Copyright ©
25 | 26 | 27 | -------------------------------------------------------------------------------- /lesson05/build/js/copyright.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | // Original JS code 3 | // const year = document.getElementById("year") 4 | // const thisYear = new Date().getFullYear() 5 | // year.setAttribute("datetime", thisYear) 6 | // year.textContent = thisYear 7 | // 1st variation: 8 | // let year: HTMLElement | null 9 | // year = document.getElementById("year") 10 | // let thisYear: string 11 | // thisYear = new Date().getFullYear().toString() 12 | // if (year) { 13 | // year.setAttribute("datetime", thisYear) 14 | // year.textContent = thisYear 15 | // } 16 | // 2nd variation: 17 | const year = document.getElementById("year"); 18 | const thisYear = new Date().getFullYear().toString(); 19 | year.setAttribute("datetime", thisYear); 20 | year.textContent = thisYear; 21 | -------------------------------------------------------------------------------- /lesson05/src/copyright.ts: -------------------------------------------------------------------------------- 1 | // Original JS code 2 | // const year = document.getElementById("year") 3 | // const thisYear = new Date().getFullYear() 4 | // year.setAttribute("datetime", thisYear) 5 | // year.textContent = thisYear 6 | 7 | // 1st variation: (Beginner) 8 | // let year: HTMLElement | null 9 | // year = document.getElementById("year") 10 | // let thisYear: string 11 | // thisYear = new Date().getFullYear().toString() 12 | // if (year) { 13 | // year.setAttribute("datetime", thisYear) 14 | // year.textContent = thisYear 15 | // } 16 | 17 | // 2nd variation: (with Type Assertion) 18 | const year = document.getElementById("year") as HTMLSpanElement 19 | const thisYear: string = new Date().getFullYear().toString() 20 | year.setAttribute("datetime", thisYear) 21 | year.textContent = thisYear 22 | 23 | -------------------------------------------------------------------------------- /lesson17/src/components/Footer.tsx: -------------------------------------------------------------------------------- 1 | import useCart from "../hooks/useCart" 2 | 3 | type PropsType = { 4 | viewCart: boolean, 5 | } 6 | 7 | const Footer = ({ viewCart }: PropsType) => { 8 | const { totalItems, totalPrice } = useCart() 9 | 10 | const year: number = new Date().getFullYear() 11 | 12 | const pageContent = viewCart 13 | ?Shopping Cart © {year}
14 | : ( 15 | <> 16 |Total Items: {totalItems}
17 |Total Price: {totalPrice}
18 |Shopping Cart © {year}
19 | > 20 | ) 21 | 22 | const content = ( 23 | 26 | ) 27 | 28 | return content 29 | } 30 | export default Footer -------------------------------------------------------------------------------- /lesson11/src/model/ListItem.ts: -------------------------------------------------------------------------------- 1 | export interface Item { 2 | id: string, 3 | item: string, 4 | checked: boolean, 5 | } 6 | 7 | export default class ListItem implements Item { 8 | 9 | constructor( 10 | private _id: string = '', 11 | private _item: string = '', 12 | private _checked: boolean = false, 13 | ) { } 14 | 15 | get id(): string { 16 | return this._id 17 | } 18 | 19 | set id(id: string) { 20 | this._id = id 21 | } 22 | 23 | get item(): string { 24 | return this._item 25 | } 26 | 27 | set item(item: string) { 28 | this._item = item 29 | } 30 | 31 | get checked(): boolean { 32 | return this._checked 33 | } 34 | 35 | set checked(checked: boolean) { 36 | this._checked = checked 37 | } 38 | } -------------------------------------------------------------------------------- /lesson15/src/Counter.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react' 2 | import { useCounter } from './context/CounterContext' 3 | import { useCounterText } from './context/CounterContext' 4 | 5 | type ChildrenType = { 6 | children: (num: number) => ReactNode 7 | } 8 | 9 | const Counter = ({ children }: ChildrenType) => { 10 | const { count, increment, decrement } = useCounter() 11 | const { text, handleTextInput } = useCounterText() 12 | 13 | return ( 14 | <> 15 |Total Items: {totalItems}
18 |Total Price: {totalPrice}
19 |Loading...
12 | 13 | if (products?.length) { 14 | pageContent = products.map(product => { 15 | const inCart: boolean = cart.some(item => item.sku === product.sku) 16 | 17 | return ( 18 |Total Items: {totalItems}
32 |Total Price: {totalPrice}
33 | 36 |{new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(product.price)}{itemInCart}
26 | 27 |