(cb: () => void, deps: Array<unknown>)
| 1418 | |
| 1419 | // this is wrong, need to potentially update deps and cb |
| 1420 | export const useEffect = (cb: () => void, deps: Array<unknown>) => { |
| 1421 | if (!currentTreeRef.renderTree) { |
| 1422 | throw new Error("Cannot call use effect outside of a react component"); |
| 1423 | } |
| 1424 | if (!currentTreeRef.renderTree.currentlyRendering) { |
| 1425 | throw new Error("Component being called outside of react internals"); |
| 1426 | } |
| 1427 | const currentlyRendering = currentTreeRef.renderTree?.currentlyRendering; |
| 1428 | |
| 1429 | if (!currentlyRendering) { |
| 1430 | throw new Error("Cannot call use effect outside of a react component"); |
| 1431 | } |
| 1432 | |
| 1433 | if (currentlyRendering.kind === "empty-slot") { |
| 1434 | throw new Error("A slot will never call a hook"); |
| 1435 | } |
| 1436 | |
| 1437 | const currentStateOrder = |
| 1438 | currentTreeRef.renderTree.currentLocalCurrentHookOrder; |
| 1439 | currentTreeRef.renderTree.currentLocalCurrentHookOrder += 1; |
| 1440 | if (!currentlyRendering.hasRendered) { |
| 1441 | currentlyRendering.hooks.push({ |
| 1442 | kind: "effect", |
| 1443 | cb, |
| 1444 | deps, |
| 1445 | cleanup: null, |
| 1446 | }); |
| 1447 | } |
| 1448 | |
| 1449 | const effect = currentlyRendering.hooks[currentStateOrder]; |
| 1450 | |
| 1451 | if (effect.kind !== "effect") { |
| 1452 | throw new Error( |
| 1453 | "Called hooks in different order compared to previous render" |
| 1454 | ); |
| 1455 | } |
| 1456 | |
| 1457 | if ( |
| 1458 | effect.deps.length !== deps.length || |
| 1459 | !effect.deps.every((dep, index) => { |
| 1460 | const newDep = deps[index]; |
| 1461 | return newDep === dep; |
| 1462 | }) |
| 1463 | ) { |
| 1464 | effect.deps = deps; |
| 1465 | effect.cb = cb; |
| 1466 | } |
| 1467 | }; |
| 1468 | |
| 1469 | export const useMemo = <T>(fn: () => T, deps: Array<unknown>): T => { |
| 1470 | if (!currentTreeRef.renderTree) { |
nothing calls this directly
no outgoing calls
no test coverage detected