Create a context to wrap the fetch.
import { createContext, useContext } from "react";
const API = {| const TEST_DATA = [ | |
| ["OUTLOOK", "TEMPERATURE", "HUMIDITY", "WIND", "PLAY"], | |
| ["SUNNY", "HOT", "HIGH", "WEAK", "NO"], | |
| ["SUNNY", "HOT", "HIGH", "STRONG", "NO"], | |
| ["OVERCAST", "HOT", "HIGH", "WEAK", "YES"], | |
| ["RAIN", "MILD", "HIGH", "WEAK", "YES"], | |
| ["RAIN", "COOL", "NORMAL", "WEAK", "YES"], | |
| ["RAIN", "COOL", "NORMAL", "STRONG", "NO"], | |
| ["OVERCAST", "COOL", "NORMAL", "STRONG", "YES"], | |
| ["SUNNY", "MILD", "HIGH", "WEAK", "NO"], | 
| // SETUP | |
| function generateData(n) { | |
| const ids = new Array(n).fill(0).map((_, i) => i); | |
| return { | |
| notebooks: ids.map((x) => ({ id: x })), | |
| prices: ids | |
| .map((x) => [ | |
| { | |
| entityId: x, | |
| price: 100, | 
| type ErrorBoundariesProps<TContext> = | |
| | { | |
| children: ReactNode; | |
| errorFallback: ReactNode | ((props: { error: Error }) => ReactNode); | |
| onError?: (error: Error, context: TContext) => void; | |
| } | |
| | { | |
| children: ReactNode; | |
| errorFallback: | 
| import React from 'react'; | |
| import { | |
| createContext, | |
| useContext, | |
| useState, | |
| } from 'react'; | |
| export function HomePage() { | |
| const [s, setS] = useState(1); | |
| const setValue = (v: number) => | 
| // imagine this function is out of the file | |
| function fetchUser(id: number, signal: AbortSignal) { | |
| return fetch(`/user/${id}`, { signal }).then(x=>x.json()); | |
| } | |
| function UserDetails({ userId }: { userId: number }) { | |
| const [user, setUser] = useState(null); | |
| useEffect(() => { | |
| const abortController = new AbortController(); | |
| fetchUser(userId, abortController.signal).then(setUser); | 
| type DelayOptions = | |
| | { timeout: number; shouldFail?: boolean } | |
| | { timeout?: number; shouldFail: boolean }; | |
| function delayed<T>( | |
| data: T, | |
| options: DelayOptions = { shouldFail: false, timeout: 1500 } | |
| ) { | |
| const { shouldFail, timeout } = options | |
| return new Promise<T>((resolve, reject) => { | 
| import { useEffect, useState } from 'react'; | |
| export default Page; | |
| function Page() { | |
| const [visible, setVisible] = useState(true); | |
| const hideCounter = () => setVisible(false); | |
| return ( | |
| <main> | 
| Питання | Наслідки | 
|---|---|
| Маленькі (не стандартні) екрани? Якщо так(1), то який мінімальний розмір | Починаємо з мобільної верстки | 
| Які браузери підтримуємо? | Працюємо на найбільш екзотичному браузері або ставимо browserstack | 
| Мультимовність? |