From 585e38eb53a5d2bec5d8a05d30f001d2c2052a8d Mon Sep 17 00:00:00 2001 From: polubis Date: Tue, 25 Nov 2025 12:22:40 +0100 Subject: [PATCH] wip --- cypress/e2e/docs-display.cy.ts | 5 + cypress/e2e/docs-loading.cy.ts | 20 +++ ...w-heading-Mediator Implementation.snap.png | Bin 75801 -> 75801 bytes ...ications Management with Mediator.snap.png | Bin 74816 -> 74816 bytes ...iew-heading-Other Use Cases Ideas.snap.png | Bin 74440 -> 74449 bytes .../document-preview-heading-Summary.snap.png | Bin 90645 -> 90645 bytes ...Big Mediators - God Classes Issue.snap.png | Bin 76419 -> 76397 bytes gatsby-node.ts | 9 +- src/api-4markdown-contracts/contracts.ts | 12 ++ src/api-4markdown-contracts/dtos.ts | 57 +++++--- src/containers/document-layout.container.tsx | 133 +++++++++++++----- src/models/page-models.ts | 3 +- .../document-comments.container.tsx | 4 +- 13 files changed, 178 insertions(+), 65 deletions(-) diff --git a/cypress/e2e/docs-display.cy.ts b/cypress/e2e/docs-display.cy.ts index c3023c7b..1678fefa 100644 --- a/cypress/e2e/docs-display.cy.ts +++ b/cypress/e2e/docs-display.cy.ts @@ -13,6 +13,11 @@ const now = new Date(); const getDocsResponse: { result: PublicDocumentDto[] } = { result: [ { + score: { + average: 3.5, + count: 10, + values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, id: `e9799f7b-013e-4231-88fe-e2072514f96a` as Atoms["DocumentId"], commentsCount: 0, name: `Mediator pattern in TypeScript`, diff --git a/cypress/e2e/docs-loading.cy.ts b/cypress/e2e/docs-loading.cy.ts index 439c704a..f3e5ed83 100644 --- a/cypress/e2e/docs-loading.cy.ts +++ b/cypress/e2e/docs-loading.cy.ts @@ -13,6 +13,11 @@ const now = new Date(); const getDocsResponse: { result: DocumentDto[] } = { result: [ { + score: { + average: 3.5, + count: 10, + values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, id: `e9799f7b-013e-4231-88fe-e2072514f96a` as Atoms["DocumentId"], commentsCount: 1, name: `Mediator pattern in TypeScript`, @@ -41,6 +46,11 @@ const getDocsResponse: { result: DocumentDto[] } = { }, }, { + score: { + average: 3.5, + count: 10, + values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, id: `8548ede2-5eb7-43b1-83ff-ecf0c75c6f18` as Atoms["DocumentId"], name: `Ideas for articles`, commentsCount: 1, @@ -51,6 +61,11 @@ const getDocsResponse: { result: DocumentDto[] } = { path: `/ideas-for-articles/` as Atoms["Path"], }, { + score: { + average: 3.5, + count: 10, + values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, id: `8c6bf351-80a1-487a-b08b-ec8bbaaf2f6b` as Atoms["DocumentId"], name: `All about JavaScript promises`, code: "# All About **JavaScript Promises**\n\nProblems are the root of invention and progress. One of the most annoying issues that JavaScript developers faced several years ago was **Callback Hell**. The insane syntax and complexity of code frustrated many developers and made JavaScript appear unattractive to others.\n\nNow, the language is much more developer-friendly thanks to some abstractions that have been created. One of them is the `Promise`. Today, we'll learn everything about this API and master it. \n\n## Problems With **Callbacks**\n\nTake a look at Callback Hell - the main reason for `Promise` involvement:\n\n```javascript\n// Simulating asynchronous operations with callbacks.\nfunction asyncOperation1(callback) {\n setTimeout(() => {\n console.log(\"Operation 1 complete\");\n callback(null, \"Result of operation 1\");\n }, 1000);\n}\n\nfunction asyncOperation2(result1, callback) {\n setTimeout(() => {\n console.log(\"Operation 2 complete with input:\", result1);\n callback(null, \"Result of operation 2\");\n }, 1000);\n}\n\n// Callback hell example\nasyncOperation1((err, result1) => {\n if (err) {\n console.error(\"Error in operation 1:\", err);\n return;\n }\n asyncOperation2(result1, (err, result2) => {\n if (err) {\n console.error(\"Error in operation 2:\", err);\n return;\n }\n console.log(\"Final result:\", result2);\n });\n});\n```\n\nThe **JavaScript community** has created memes highlighting how insanely difficult it is to understand this syntax.\n\n![Callback Hell Meme](https://firebasestorage.googleapis.com/v0/b/markdown-b9f5e.appspot.com/o/AQf2hcbxgSevVmNGPhRZTJg4M7D3%2Fimages%2F7b96b4a6-a896-435b-8f9e-7b02383c20c7?alt=media)\n*Meme*\n\nIn addition, callbacks themselves are stateless and lack a unified structure. Different libraries may implement callbacks in various ways to pass an error, response, or other data, leading to inconsistencies.\n\n```javascript\n// Inconsistency...\nlib1((err, data) => {\n if (err) {\n return;\n }\n\n lib2(({ err, data }) => {\n if (err) {\n return;\n }\n\n // Do other stuff...\n });\n});\n```\n\nNext, you may notice the duplication of error handling logic. Every time, you need to add an if statement at every nested level of the code.\n\n```javascript\nlib1((err, data) => {\n // The repeated part.\n if (err) { \n return;\n }\n```\n\nIt's not the end yet :D. With the callback approach, we can clearly see that the behavior of each callback often depends on the previous one. As a result, the code we need to write to handle such behavior becomes very complex. Imagine needing to change the order of callbacks - good luck with that...\n\n```javascript\nasyncOperation1((err, result1) => {\n if (err) {\n console.error(\"Error in operation 1:\", err);\n return;\n }\n asyncOperation2(result1, (err, result2) => {\n if (err) {\n console.error(\"Error in operation 2:\", err);\n return;\n }\n console.log(\"Final result:\", result2);\n });\n});\n```\n\nLastly, there is a lack of easy control over code behavior. Imagine **React** without a built-in `useEffect` hook, where you would need to write convoluted code to listen for state changes or component updates - it would be a nightmare. To address this, **React** implemented a pattern called **Inversion of Control**. **React** provides an API to execute certain functions, and as developers, we only need to provide a function without worrying about when or how it will be called. **React** handles the invocation for us; we just specify the logic.\n\n```javascript\nconst ExampleComponent = () => {\n const [count, setCount] = useState(0);\n\n // useEffect runs after every render.\n useEffect(() => {\n // This is the effect logic.\n console.log(`Component rendered with count: ${count}`);\n\n // Optionally return a cleanup function.\n return () => {\n console.log(`Cleaning up after count: ${count}`);\n };\n }, [count]); // Dependency array, effect runs when `count` changes.\n}\n```\n\nWith callbacks, we need to specify the way and moment **imperatively**. That's why the `Promise` was added to the language - to solve these problems and make the syntax much easier to work with. Here is the same version of async code management, but now implemented with promises instead of callbacks.\n\n```javascript\nasyncOperation1()\n .then((result1) => {\n return asyncOperation2(result1);\n })\n .then((result2) => {\n return asyncOperation3(result2);\n })\n .then((result3) => {\n console.log(\"Final result:\", result3);\n })\n .catch((err) => {\n console.error(\"Error:\", err);\n });\n```\n\n## **Promises** In Theory\n\nHere is a documentation definition:\n\n> A `Promise` in **JavaScript** is an object representing the eventual completion (or failure) of an asynchronous operation and its resulting value. It provides a cleaner and more manageable way to deal with asynchronous code compared to traditional **callback-based** approaches.\n\nThe `Promise` may have three states:\n\n1. **Pending**: the initial state, neither fulfilled nor rejected.\n2. **Fulfilled**: the operation completed successfully.\n3. **Rejected**: the operation failed.\n\nThe best way to understand promises is to compare them with a real-life situation. Imagine a letter that you're sending to a family member. The letter is hidden inside an envelope. Without the envelope, the letter carrier can see what you've sent, which is risky. Additionally, to provide information about where the letter should be delivered, you would need to destroy or change the form of the letter by including this information at the top or bottom. A much better way is to hide the letter inside an envelope.\n\nComparing this to promises, the delivery is an action that can have three possible states, just like a `Promise`(pending, fulfilled, or rejected). The **envelope** is a `Promise`, and the information attached to the envelope, like the destination address, is `Promise` metadata.\n\n> **Promises** are not only implemented in **JavaScript**. Although a **Promise** is not officially a design pattern, it is widely used to handle **asynchronous** operations. Promises are also implemented in languages such as `C#`, `Python`, `Java`, `Rust`, and `Swift`.\n\nIn summary, it's a way to describe an asynchronous operation that takes time to complete, attach metadata to it, and react to changes in the operation's state. Here is the diagram from [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise): \n\n![Promise Docs Diagram](https://firebasestorage.googleapis.com/v0/b/markdown-b9f5e.appspot.com/o/AQf2hcbxgSevVmNGPhRZTJg4M7D3%2Fimages%2Fcac52b06-13d3-4da2-b7db-9472e5b04447?alt=media)\n*Promise Diagram From Documentation*\n\n## Basic **Promise** Syntax\n\nLet's examine the theory. Imagine we're writing an app that allows users to send virtual letters. We have the following process:\n\n1. Writing a letter.\n2. Delivering the letter.\n3. Receiving a payment.\n\nAll of these are asynchronous operations may take time. It makes them perfect candidates for using a `Promise`. Additionally, we want to handle all errors that may occur during this process.\n\n```javascript\ninterface Letter {\n id: string;\n content: string;\n}\n\nconst writeLetter = (content: string): Promise => {\n return fetch(`/api/letter/create`, { method: 'post', body: content }).then(\n (res) => res.json()\n );\n};\n\nconst deliverLetter = (letter: Letter): Promise => {\n return fetch(`/api/letter/deliver`, {\n method: 'post',\n body: JSON.stringify(letter),\n }).then((res) => res.json());\n};\n\nconst receivePayment = (): Promise => {\n return fetch(`/api/payment/receive`).then((res) => res.json());\n};\n\nconst deliveryProcess = () => {\n writeLetter('My letter content')\n .then((letter) => deliverLetter(letter))\n .then(() => receivePayment())\n .catch((e: unknown) => {\n console.log(e);\n })\n .finally(() => {\n // It's \"fulfilled\" or \"rejected\" here.\n // Or we may call it \"settled\". \n });\n};\n\n// It runs the whole process.\ndeliveryProcess();\n```\n\nAs you saw, we've chained several asynchronous operations into one big process. Each `.then` continues the next step in the process - an API call that moves the process forward. After each step is fulfilled, the next `Promise` is created, and the next steps are involved. If an error occurs (rejected), we handle it once inside the `.catch` block.\n\nOn the other hand, whether the `Promise` is fulfilled or rejected, we can handle logic inside `.finally()` - such as clean-ups, logging, state resets, and many other aspects.\n\n> It's really important to understand that a `Promise` can be chained as many times as needed. It is simply a wrapper for an asynchronous operation. Thanks to the `then`, `catch`, and `finally` methods, it allows us to handle any process at a high level without unnecessary nesting.\n\n## The **Async** and **Await** Keywords\n\nThis makes promises even simpler. Instead of directly calling `then`, `catch`, or `finally`, we can use `async` and `await` to wrap code with built-in JavaScript exception handling.\n\n```javascript\ninterface Letter {\n id: string;\n content: string;\n}\n\nconst writeLetter = async (content: string): Promise => {\n return (\n await fetch(`/api/letter/create`, { method: 'post', body: content })\n ).json();\n};\n\nconst deliverLetter = async (letter: Letter): Promise => {\n return (\n await fetch(`/api/letter/deliver`, {\n method: 'post',\n body: JSON.stringify(letter),\n })\n ).json();\n};\n\nconst receivePayment = async (): Promise => {\n return (await fetch(`/api/payment/receive`)).json();\n};\n\nconst deliveryProcess = async () => {\n try {\n const letter = await writeLetter('My letter content');\n await deliverLetter(letter);\n await receivePayment();\n } catch (e: unknown) {\n console.log(e);\n } finally {\n // It's \"fulfilled\" or \"rejected\" here.\n }\n};\n\n// It runs the whole process.\ndeliveryProcess();\n```\n\nThe `async` keyword allows us to use `await`. Without the `async` keyword, we'll get a syntax error when trying to use `await`. Additionally, after declaring a function as `async`, we get the following behavior:\n\n1. If the function returns a value, the `Promise` is resolved with that value.\n2. If the function throws an error, the `Promise` is rejected with that error.\n\nEssentially, it automatically calls the `then` and `catch` methods for us, allowing us to write more linear code with less boilerplate - especially when transforming blocks like `.then(() => somePromiseFn())` to `await somePromiseFn()`.\n\nNow about `await`:\n\n1. When the `await` keyword is used, the `async` function is paused until the `Promise` is settled (fulfilled or rejected).\n2. If the `Promise` is fulfilled, the `await` expression returns the resolved value.\n3. If the `Promise` is rejected, the `await` expression throws the rejected value (similar to the `throw` statement).\n\nIn summary, it's just syntactic sugar, similar to how `class` is to the object prototype.\n\n## Converting **Async** Operations To **Promises**\n\nSometimes you're using legacy APIs, or you don't like the way they handle asynchronous operations. The `Promise` offers a way to handle such scenarios easily by converting async operations into `Promise` objects. Let's say you have a legacy library in the NodeJS for reading files:\n\n```javascript\nimport { read } from \"file-reader\";\n\nread(`/path-to-file`, (err, file) => {\n if (err) {\n console.log(err);\n return;\n }\n\n console.log(file);\n});\n```\n\nYou can easily convert it to a promise-based version with the following code:\n\n```javascript\nconst readPromise = (onSuccess) => {\n return new Promise((resolve, reject) => {\n read(`/path-to-file`, (err, file) => {\n if (err) {\n // The \"return\" ensures that \"resolve\" code is not called when an error occurs.\n return reject(err); \n }\n // In this case \"return\" is optional, as there is nothing more after this line.\n onSuccess();\n resolve(file);\n });\n });\n};\n```\n\nWe've used a `Promise` constructor that takes `resolve` and `reject` functions, allowing us to craft our custom `Promise` mechanism. Notice the important `return` statement in the error handling block. Without it, `onSuccess` could be called even when an error occurs, which is invalid behavior.\n\nIn the example code, we did not add `return` to `resolve`. In this case, it's fine, but if you have more complicated logic with multiple `if` statements, it's necessary to avoid bugs. To ensure consistency and avoid forgetting, I always add `return` to both `resolve` and `reject`.\n\n```javascript\nif (something) return reject(err);\nif (somethingElse) return resolve();\nreturn resolve();\n```\n\nThere is an ESLint plugin called [Consistent Return](https://eslint.org/docs/latest/rules/consistent-return) to help ensure that `return` statements are consistent.\n\n> Adding a `return` before `resolve` is generally a good practice, especially in functions with more complex logic. It ensures that the function exits immediately after calling `resolve` or `reject`, preventing any accidental execution of subsequent code. Choose this approach and be consistent.\n\n## **Promises** Chaining\n\nTo understand how it works, let's consider that we have several functions that return promises. Some of them will reject.\n\n```javascript\nconst randomPromiseFactory = (reject: boolean) => () =>\n reject ? Promise.reject(new Error('Error')) : Promise.resolve();\n\nconst p1 = randomPromiseFactory(false);\nconst p2 = randomPromiseFactory(true);\nconst p3 = randomPromiseFactory(false);\nconst p4 = randomPromiseFactory(false);\nconst p5 = randomPromiseFactory(true);\n```\n\nIn this code, the `p2` and `p5` functions will reject a value - the `reject` function will be called. All others will fulfill, meaning the `resolve` function will be called. Now, we want to achieve the following scenario:\n\n1. Call `p1`.\n2. Call `p2`.\n3. If any of the above fail, call `p3`.\n4. Call `p4` regardless of whether `p3` fails or succeeds.\n\nWe can use the following syntax:\n\n```javascript\n// Version 1\nconst chain = () => {\n p1()\n .then(() => p2())\n .catch(() => p3())\n .then(() => p4());\n};\n```\n\n```javascript\n// Version 2\nconst chain = async () => {\n try {\n await p1();\n await p2();\n } catch {\n await p3();\n }\n await p4();\n};\n```\n\nAs you saw, we've transformed each function invocation that returns a `Promise` into other promises to achieve the desired algorithm. What's really cool is that the nesting doesn't matter - you can have a deeply nested promise chain and catch errors at the top, or map the outcomes and handle them in the next `.then` blocks. Examine the following scenario:\n\n```javascript\nconst step1 = () => {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve('Step 1 complete');\n }, 1000);\n });\n};\n\nconst step2 = () => {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n reject('Error in step 2');\n }, 1000);\n });\n};\n\nconst step3 = () => {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve('Step 3 complete');\n }, 1000);\n });\n};\n\nstep1()\n .then(result => {\n console.log(result);\n return step2().then(step2Result => {\n console.log(step2Result);\n return step3();\n });\n })\n .then(result => {\n console.log(result);\n })\n .catch(error => {\n console.error('Caught error:', error);\n });\n\n// Output:\n// Step 1 complete\n// Caught error: Error in step 2\n```\n\nIn this example:\n\n- **Step 1** completes successfully and logs \"Step 1 complete\".\n- **Step 2** fails, and the error is caught by the `.catch()` block, logging \"Caught error: Error in step 2\".\n- **Step 3** is not called because the chain was interrupted by the rejection in **Step 2**.\n\n## **Static Methods** To Handle **Promises**\n\n### Promise.resolve(value)\n\nReturns a `Promise` that is resolved with the given value.\n\n```javascript\nPromise.resolve('Success').then(value => {\n console.log(value); // \"Success\"\n});\n```\n\n### Promise.reject(reason)\n\nReturns a `Promise` that is rejected with the given reason.\n\n```javascript\nPromise.reject('Error').catch(reason => {\n console.log(reason); // \"Error\"\n});\n```\n\n### Promise.all(iterable)\n\nReturns a `Promise` that resolves when all of the promises in the iterable have resolved. It rejects when any `Promise` in the iterable rejects.\n\n```javascript\nlet promise1 = Promise.resolve(1);\nlet promise2 = Promise.resolve(2);\n\nPromise.all([promise1, promise2]).then(values => {\n console.log(values); // [1, 2]\n});\n```\n\n### Promise.allSettled(iterable)\n\nReturns a `Promise` that resolves when all of the promises in the iterable have settled (either fulfilled or rejected). It never rejects. Instead, it passes an array to the fulfilled callback.\n\n```javascript\nlet promise1 = Promise.resolve(1);\nlet promise2 = Promise.reject('Error');\n\nPromise.allSettled([promise1, promise2]).then(results => {\n results.forEach(result => console.log(result.status));\n // \"fulfilled\"\n // \"rejected\"\n});\n```\n\n### Promise.any(iterable)\n\nReturns a `Promise` that resolves as soon as one of the promises in the iterable resolves, with the value from that promise. If no promises resolve or all rejects, it rejects with an `AggregateError`.\n\n```javascript\nlet promise1 = Promise.reject(\"Error\");\nlet promise2 = new Promise((resolve) => setTimeout(resolve, 100, \"two\"));\nlet promise3 = new Promise((resolve) => setTimeout(resolve, 200, \"one\"));\n\nPromise.any([promise1, promise2, promise3])\n .then((value) => {\n console.log(value); // It will prompt \"two\".\n })\n .catch((error) => {\n if (error instanceof AggregateError) {\n console.error(\n \"All promises were rejected. AggregateError:\",\n error.errors\n );\n } else {\n console.error(\"An unexpected error occurred:\", error);\n }\n });\n```\n\n**Use case**: You're developing an email sending service built on top of three different email providers. You want to send an email to a user following a system action. Using `Promise.any`, the `Promise` will resolve as soon as the fastest service sends the email. If all providers fail, you can handle the error using `AggregateError`.\n\n### Promise.race(iterable)\n\n`Promise.race` resolves or rejects as soon as one of the promises in the iterable it receives settles, regardless of whether the outcome is a resolution or rejection. Essentially, it returns the result of the fastest promise.\n\n```javascript\nlet promise1 = new Promise((resolve) => setTimeout(resolve, 500, 'one'));\nlet promise2 = new Promise((resolve) => setTimeout(resolve, 100, 'two'));\nlet promise3 = Promise.reject(\"Error\");\n\nPromise.race([promise1, promise2]).then(value => {\n console.log(value); // Prompts \"two\".\n});\n\nPromise.race([promise1, promise2, promise3])\n .then((value) => {\n // It will be not called due to one rejection in \"promise3\".\n console.log(value);\n })\n .catch((error) => {\n // It will go to error \"catch\" block. \n console.error(\"An unexpected error occurred:\", error);\n });\n```\n\n> **Use Case**: You have several instances of a backend API managed by a custom load balancer, located in various parts of the world. You aim to route a request to the instance closest to the user to retrieve their data. Therefore, you want to return the result to the user immediately after receiving a response or rejection from the first instance that processes the request. \n\n### Promise.withResolvers()\n\nThis method is useful when you need to create and control a `Promise` instance that will be resolved or rejected later, often within a callback or asynchronous mechanism.\n\n```javascript\n// Example usage: Waiting for a button click.\nconst { promise, resolve, reject } = Promise.withResolvers();\n\nconst button = document.createElement('button');\nbutton.textContent = 'Click me';\ndocument.body.appendChild(button);\n\nbutton.addEventListener('click', () => {\n resolve('Button was clicked');\n button.remove(); // Clean up the button after it is clicked.\n});\n\n// Handling the promise.\npromise\n .then(message => {\n console.log(message);\n })\n .catch(error => {\n console.error(error);\n });\n\n// The promise will be resolved when the button is clicked.\n```\n\nThe key point here is that the `Promise` is not resolved immediately. It resolves only when the `resolve` function is called via a click event, which then triggers the `promise.then` method. This is possible because the `resolve` and `reject` functions are assigned to variables in a higher scope, allowing us to call them from anywhere without unnecessary nesting.\n\n## FAQs\n\n**If I call `resolve` or `reject` multiple times, will the `.then` or `.catch` handlers be called the same number of times?**\n\nNo, calling `resolve` or `reject` multiple times on a single promise will not cause the `.then` or `.catch` handlers to be called multiple times. Once a promise is settled (either fulfilled or rejected), its state is final and cannot be changed. Subsequent calls to `resolve` or `reject` will have no effect.\n\nHere’s an example to illustrate this behavior:\n\n```javascript\nconst promise = new Promise((resolve, reject) => {\n resolve('First value');\n resolve('Second value');\n reject('Error');\n});\n\npromise\n .then(value => {\n console.log('Resolved with:', value);\n })\n .catch(error => {\n console.error('Rejected with:', error);\n });\n\n// Logs: \"Resolved with: First value\"\n```\n\n**Should I always use `return` when using `Promise.reject` or `Promise.resolve`?**\n\nYes, it is generally a good practice to use `return` when calling `Promise.resolve` or `Promise.reject` inside a function, especially within complex logic or asynchronous callbacks. This ensures that the promise chain is properly maintained and can help avoid unexpected behaviors in future code changes.\n\nIf you have any logic under `reject` or `resolve`, it will still be executed. Remember, both `resolve` and `reject` may be called multiple times, but only the first call will affect the state of the promise. Subsequent calls will have no effect on the promise's state, but they may affect the logic within your function. Consider the following example:\n\n```javascript\nconst readPromise = () => {\n return new Promise((resolve, reject) => {\n read(`/path-to-file`, (err, file) => {\n if (err) {\n return reject(err); \n }\n // Ensure this function is not called if an error occurs.\n myOtherComplexFunction(); \n resolve(file);\n });\n });\n};\n```\n\nIn this example, using `return` with `reject` ensures that `myOtherComplexFunction()` is not called if an error occurs. Without the `return` statement, `myOtherComplexFunction()` would still be executed even if there was an error, which is undesirable behavior.\n\nSo, always adding a `return` statement for `reject` and `resolve` can help prevent such issues and keep your logic clear and predictable. This practice is already explained in the article to ensure you maintain proper promise behavior.\n\n**How do Promises work under the hood?**\n\nIn JavaScript, the execution of promises is managed by the **event loop** and the **microtask queue**. When a `Promise` is resolved or rejected, the corresponding `.then`, `.catch`, or `.finally` handlers are placed in the microtask queue.\n\nHere's the relevant API:\n\n```javascript\nqueueMicrotask(callback);\n```\n\nIt's important to understand that the callbacks passed to `.then`, `.catch`, and `.finally` are added to the **microtask queue**, not the internal logic of the **Promise** itself. The promise's internal logic is handled immediately in a synchronous manner.\n\n**What is the difference between `Promise.race` and `Promise.any`?**\n\nThe name `Promise.any` might seem misleading. While both functions aim to find the fastest `Promise`, they handle resolve and reject differently. Here are the differences:\n\n`Promise.race` takes multiple promises and returns the result of the first promise that settles, regardless of whether it resolves or rejects. It's like a race where the first promise to finish, for better or worse, ends the race.\n\n`Promise.any` takes multiple promises and returns the result of the first promise that resolves successfully. It ignores any promises that reject unless all of them fail. If all promises reject, it throws an `AggregateError`. Think of it as a contest where the first success wins, but all failures are ignored unless everyone fails.\n\n## Summary\n\nWow, that was a huge article, but I hope everything is now clear about the `Promise` concept. I found it useful to write this article because it refreshed my knowledge and clarified some gaps in my understanding. The most important concepts you should remember after reading this article are:\n\n1. A `Promise` is an object representing the eventual completion or failure of an **async operation**, with three possible states: **pending**, **fulfilled**, and **rejected**.\n2. The **fulfilled** or **rejected** states are collectively known as **settled**.\n3. A `Promise` is in the **pending** state immediately after the `Promise` instance is created.\n4. The **fulfilled** state occurs when the `resolve` function is called.\n5. The **rejected** state occurs when the `reject` function is called.\n6. Promises can be chained with `.then()` and `.catch()` methods, allowing for complex asynchronous workflows.\n7. The `async` and `await` provide syntactic sugar to work with Promises more easily.\n8. The `Promise` API has many static methods, such as `Promise.all`, `Promise.race`, `Promise.allSettled`, and `Promise.any`, to simplify logic.\n9. You can wrap current non-promise-based APIs with the `Promise` constructor to make them return promises.\n\nRemember to practice using this API to fully understand it. It can be particularly challenging on the backend with **Node.js**, and any gaps or misunderstandings can lead to many bugs later on.\n", @@ -79,6 +94,11 @@ const getDocsResponse: { result: DocumentDto[] } = { commentsCount: 1, }, { + score: { + average: 3, + values: [1, 2], + count: 2, + }, id: `1d8a4011-28a8-4720-b8df-9eb72819a181` as Atoms["DocumentId"], name: `Writing a parsing utility for Zod`, code: "# Writing a **Parsing Utility** For **Zod**\n\n**Zod** is a great library, there's no doubt about that. However, sometimes you may find yourself dealing with repetitive boilerplate code that the library may generate. The most common situation I've noticed is the preparation for **parsing** the schema and reading the validation result. This is especially prevalent on the backend side, where most validation occurs. Without a utility, you need to produce and repeat the following code:\n\n```javascript\n// It's just a part of a larger application code (but repetitive).\ntry {\n await schema.strict().parseAsync(payload);\n // Do some logic...\n} catch (err) {\n // Do some logic...\n logger.error(`Error occurred in ${name}`);\n logger.error(err);\n throw errors.invalidSchema(name);\n}\n```\n\nIf this code is duplicated in one or two files, it's not a problem. However, if duplicated in more than five places, it starts to become a warning sign. The typical parsing mechanism always looks similar in the context of any application. It involves:\n\n1. Schema to validate.\n2. Validating the schema.\n3. If an error occurs, parsing the error and throwing it.\n4. If no error, doing nothing or returning values.\n\nAdditionally, when performing validation, I try to be consistent. If the code is repeated across **n** files, there is a possibility that I may forget to use the `strict` or `parseAsync` function. You may not need them at all, but I mention them in the context of consistency, which might otherwise not be achieved.\n\nWith all this in mind, let's write a small utility for **Zod** parsing to remove some boilerplate and repetitiveness.\n\n## Implementation Of The **Parse** Function\n\nLet's design the contract of the function first. We want to have the following, easy-to-use signature.\n\n```javascript\nconst schema = z.object({\n id: z.string(),\n});\n// In this case, it should throw an error.\nconst result = parse(schema, { id: 1 });\n// In this case, it will return an object, correctly typed by \"Zod\".\nconst result1 = parse(schema, { id: \"1\" });\n```\n\nNow `parse` function implementation.\n\n```javascript\n// @@@ parse.ts\nimport { z, AnyZodObject } from 'zod';\nimport { errors } from './errors';\n\n// Validation of the passed generic schema \n// if it matches the Zod schema object.\nconst parse = async (\n schema: TSchema,\n payload: unknown,\n): Promise> => {\n try {\n // We're adding \"strict()\" and \"parseAsync()\" to every \n // call and staying consistent.\n const result = await schema.strict().parseAsync(payload);\n return result;\n } catch (e: unknown) {\n // If an error occurs, we're using a common \n // formatting utility. \n throw errors.schema(e);\n }\n};\n\nexport { parse };\n```\n\nFirst of all, we've created a generic type `TSchema` that must at least have the shape of `AnyZodObject`, imported from the **Zod** library. Then, we've passed a **payload**, which is really important here and is of type `unknown`. But why? When dealing with backend stuff, you don't have any guarantee that the passed object from the frontend is the type of object you expect. Frontend developers may pass anything, so it's naive to try typing it another way. The only valid option is to check it at runtime, and after doing so, we achieve **type safety**.\n\n> Type safety ensures that the types defined at compile time are strictly enforced at runtime, preventing type errors and ensuring consistent behavior. You can read more about this topic in the following article: [Why you should start using Zod](https://4markdown.com/why-you-should-start-using-zod/).\n\nSecondly, we wrapped all validation code in a repetitive `try, catch` block. Next, we've executed the validation, and we're returning the parsed values. If parsing fails, an exception will be thrown, and then we're parsing this exception object with the `errors.schema` utility function (I'll explain it in a second). The error is also of type `unknown` to force us, developers, to perform additional checks (type guards) before reading any information from such an object.\n\nThird, we're doing type inference with `z.infer` to produce a nice type for the consumer of this utility.\n\nLastly, here's a simple utility file `errors.ts` that contains the parsing logic for error objects:\n\n```javascript\nimport { https } from 'firebase-functions';\nimport { z } from 'zod';\n\nconst error = (\n code: https.FunctionsErrorCode,\n symbol: string,\n content: unknown,\n): https.HttpsError =>\n // It's an error object from Firebase, \n // but it can be anything else depending on the tech stack.\n new https.HttpsError(\n code,\n JSON.stringify({\n symbol,\n content,\n }),\n );\n\nconst errors = {\n internal: (content = `Something went wrong`) =>\n error(`internal`, `internal`, content),\n schema: (e: unknown) => {\n // Checking if the error is really a \"Zod\" error.\n if (e instanceof z.ZodError) {\n return error(\n `invalid-argument`,\n `invalid-schema`,\n // Mapping errors to the data supported by the frontend.\n e.errors.map(({ message, path }) => ({ message, key: path[0] })),\n );\n }\n\n return errors.internal();\n },\n};\n\nexport { errors };\n```\n\nThis file is responsible for typical error maintenance in the app. It may vary based on the tech stack you're using; in this example, we're returning **Firebase** error objects with content from **Zod** library. \n\n## Usage and Comparison\n\nNow, instead of having a lot of duplicated code, we can use a simple function to handle the **parsing** logic.\n\n```javascript\nconst before = async (payload: unknown) => {\n const schema = z.object({\n id: z.string(),\n });\n\n try {\n const result = await schema.strict().parseAsync(payload);\n // Do some logic...\n } catch (e: unknown) {\n throw errors.schema(e);\n }\n};\n```\n\n```javascript\nconst after = async (payload: unknown) => {\n const schema = z.object({\n id: z.string(),\n });\n\n const result = await parse(schema, payload);\n};\n```\n\nThe entire validation algorithm, parsing, and type inference are encapsulated in a single function. We've removed repetition and ensured the consistency of the validation mechanism. Now, all parsing involves a simple `strict` call and ensures that it uses `parseAsync` to boost performance slightly.\n\nThis approach really shines when you consider the amount of code you avoid writing and maintaining, especially when you have 10+ endpoints or similar use cases. As I mentioned at the beginning, it's not worth considering such **facades** for something that is not repeated multiple times and annoying to work with.\n\n## Summary\n\nToday we've created a useful utility function, `parse`, which is an implementation of the **facade pattern**. We've encapsulated some repetitive logic within a separate module. Instead of leaking this logic into every piece of application code, we now simply call the utility function and achieve the expected outcome.\n\nThe most important aspects to remember after reading this article are:\n\n1. If you have repetitive logic, wrap it into a **facade** and evaluate the benefits it provides.\n2. We've learned how to maintain and utilize built-in **Zod** generics.\n3. We've learned how to validate and parse errors using **Zod**.\n\n> Want to learn more about the **facade pattern**? Check out [The use case for facade pattern](https://4markdown.com/the-use-case-for-facade-pattern/) article.", diff --git a/cypress/snapshots/docs-display.cy.ts/document-preview-heading-Mediator Implementation.snap.png b/cypress/snapshots/docs-display.cy.ts/document-preview-heading-Mediator Implementation.snap.png index f45452c4c391dd68b137872788cf9b677e817029..2e87d9315d8525352406deffdb0c179f6b54c67b 100644 GIT binary patch delta 87 zcmbPvfo0|emJPDzLXSC`6kw>}I4e`S<>ZfM)|<1;Z-@w6Afy!T6l!aqFPt$s+T3>Y dB%k8jB1;bVEt^zvC7uBYJYD@<);T3K0RUZRAF%)c delta 105 zcmbPvfo0|emJPDzlcUY~h1>;L9HFSiT2H{@bmAm)+0D`B&qb6ZniM!-=uYWzLAXMe qhkenJm3@b0CTE%JZJy*)d|RZU+HcuPuWx4gTe~DWM4fE4V3@ delta 90 zcmX?bg5|&omJJU#Pu{(jN2ou@OLOTI5Ye~u^?Lc!4k?r`4v#^rv^l3O3mdKI;Vst0Q0dZ*Z=?k diff --git a/cypress/snapshots/docs-display.cy.ts/document-preview-heading-Other Use Cases Ideas.snap.png b/cypress/snapshots/docs-display.cy.ts/document-preview-heading-Other Use Cases Ideas.snap.png index 2316e1be6ca905c26c1742c25b08ab602719034d..e4f91d62a2d9da9ae6d9023604a09837da619665 100644 GIT binary patch delta 22890 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 AiU0rr delta 22874 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 delta 18522 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 Ckcj#K diff --git a/cypress/snapshots/docs-display.cy.ts/document-preview-heading-Too Big Mediators - God Classes Issue.snap.png b/cypress/snapshots/docs-display.cy.ts/document-preview-heading-Too Big Mediators - God Classes Issue.snap.png index efdf4a485b5dde439b5e5d51ca244067c710a1d7..6122e0276d443dbad0a45509337a9cdec54d0278 100644 GIT binary patch delta 23999 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ÎyPZ7xee?GnmCU)R%PRk9&^IevY^^s* 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 K#Z>CshyMr3F-=1N diff --git a/gatsby-node.ts b/gatsby-node.ts index 0f778386..a4c188db 100644 --- a/gatsby-node.ts +++ b/gatsby-node.ts @@ -283,11 +283,12 @@ export const createPages: GatsbyNode["createPages"] = async ({ actions }) => { const topDocuments = getTopDocuments(trustedDocuments, documentsPerPage).map< EducationPageModel["documents"]["top"][number] - >(({ author, name, id, path, rating, cdate, commentsCount }) => ({ + >(({ author, name, id, path, rating, cdate, commentsCount, score }) => ({ name, id, path, rating, + score, cdate, commentsCount, author: @@ -322,6 +323,7 @@ export const createPages: GatsbyNode["createPages"] = async ({ actions }) => { name, id, path, + score, commentsCount, rating, cdate, @@ -332,6 +334,7 @@ export const createPages: GatsbyNode["createPages"] = async ({ actions }) => { id, path, rating, + score, commentsCount, cdate, description, @@ -369,6 +372,7 @@ export const createPages: GatsbyNode["createPages"] = async ({ actions }) => { ({ author, name, + score, id, path, rating, @@ -383,6 +387,7 @@ export const createPages: GatsbyNode["createPages"] = async ({ actions }) => { path, rating, cdate, + score, description, tags, author: @@ -412,6 +417,7 @@ export const createPages: GatsbyNode["createPages"] = async ({ actions }) => { id, path, rating, + score, cdate, description, tags, @@ -421,6 +427,7 @@ export const createPages: GatsbyNode["createPages"] = async ({ actions }) => { id, path, rating, + score, cdate, description, commentsCount, diff --git a/src/api-4markdown-contracts/contracts.ts b/src/api-4markdown-contracts/contracts.ts index 2d1ed2e9..db560d88 100644 --- a/src/api-4markdown-contracts/contracts.ts +++ b/src/api-4markdown-contracts/contracts.ts @@ -238,6 +238,18 @@ type UserProfileCommentsContracts = type AccountsContracts = Contract<`getYourAccount`, YourAccountDto>; type DocumentsContracts = + | Contract< + `addDocumentScore`, + { + average: number; + count: number; + values: Atoms["ScoreValue"][]; + }, + { + documentId: Atoms["DocumentId"]; + score: Atoms["ScoreValue"]; + } + > | Contract< `getYourDocuments`, ( diff --git a/src/api-4markdown-contracts/dtos.ts b/src/api-4markdown-contracts/dtos.ts index 50c1a4c0..2f4fa5b5 100644 --- a/src/api-4markdown-contracts/dtos.ts +++ b/src/api-4markdown-contracts/dtos.ts @@ -163,7 +163,7 @@ export type FullMindmapDto = MindmapDto & { isAuthorTrusted: boolean; }; -type Base = { +type Base = Prettify<{ id: Atoms["DocumentId"]; name: string; commentsCount: number; @@ -172,31 +172,44 @@ type Base = { cdate: Atoms["UTCDate"]; sharedForGroups?: Atoms["AccessGroupId"][]; path: Atoms["Path"]; -}; + score: { + average: number; + count: number; + values: Atoms["ScoreValue"][]; + }; +}>; -export type PrivateDocumentDto = Base & { - visibility: "private"; -}; +export type PrivateDocumentDto = Prettify< + Base & { + visibility: "private"; + } +>; -export type PublicDocumentDto = Base & { - visibility: "public"; - author: UserProfileDto | null; - rating: Atoms["Rating"]; -}; +export type PublicDocumentDto = Prettify< + Base & { + visibility: "public"; + author: UserProfileDto | null; + rating: Atoms["Rating"]; + } +>; -export type PermanentDocumentDto = Base & { - visibility: `permanent`; - description: string; - tags: string[]; - author: UserProfileDto | null; - rating: Atoms["Rating"]; -}; +export type PermanentDocumentDto = Prettify< + Base & { + visibility: `permanent`; + description: string; + tags: string[]; + author: UserProfileDto | null; + rating: Atoms["Rating"]; + } +>; -export type ManualDocumentDto = Base & { - visibility: "manual"; - author: UserProfileDto | null; - rating: Atoms["Rating"]; -}; +export type ManualDocumentDto = Prettify< + Base & { + visibility: "manual"; + author: UserProfileDto | null; + rating: Atoms["Rating"]; + } +>; export type DocumentDto = | PrivateDocumentDto diff --git a/src/containers/document-layout.container.tsx b/src/containers/document-layout.container.tsx index 180d668a..4500c83c 100644 --- a/src/containers/document-layout.container.tsx +++ b/src/containers/document-layout.container.tsx @@ -10,8 +10,6 @@ import { BiLogoMarkdown, } from "react-icons/bi"; import { Button } from "design-system/button"; -import { useCopy } from "development-kit/use-copy"; -import { Status } from "design-system/status"; import { seeInDocumentsCreatorAct } from "acts/see-in-documents-creator.act"; import { Link, navigate } from "gatsby"; import { meta } from "../../meta"; @@ -28,9 +26,18 @@ import { useResourceCompletionToggle, useResourcesCompletionState, } from "modules/resource-completions"; -import { API4MarkdownPayload, Atoms } from "api-4markdown-contracts"; +import { + API4MarkdownDto, + API4MarkdownPayload, + Atoms, +} from "api-4markdown-contracts"; import { CommentTrigger } from "components/comment-trigger"; import { DocumentCommentsModule } from "modules/document-comments"; +import { ScorePicker } from "components/score-picker"; +import { useCopy } from "development-kit/use-copy"; +import { useMutation2 } from "core/use-mutation-2"; +import { getAPI } from "api-4markdown"; +import { toast } from "design-system/toast"; const MarkdownWidget = React.lazy(() => import("components/markdown-widget").then(({ MarkdownWidget }) => ({ @@ -39,6 +46,7 @@ const MarkdownWidget = React.lazy(() => ); const CONTENT_ID = `document-layout-content`; +const COMMENTS_CONTAINER_ID = `document-layout-comments`; const ResourceCompletionTriggerContainer = () => { const [{ document }] = useDocumentLayoutContext(); @@ -105,6 +113,34 @@ const DocumentLayoutContainer = () => { navigate(meta.routes.home); }; + const addScoreMutation = useMutation2>({ + onFail: (error) => { + toast.error({ + title: "Failed to add score", + children: error.message, + }); + }, + onOk: (data) => { + setDocumentLayoutState(({ document, yourRate }) => ({ + document: { + ...document, + score: { + average: data.average, + count: data.count, + values: data.values, + }, + }, + yourRate, + })); + }, + }); + + const addScore = (score: Atoms["ScoreValue"]): void => { + addScoreMutation.start(() => + getAPI().call("addDocumentScore")({ documentId: document.id, score }), + ); + }; + return ( <>
@@ -120,16 +156,7 @@ const DocumentLayoutContainer = () => { -
- - - { - window.scrollTo({ - top: Math.max( - window.document.documentElement.scrollHeight, - window.document.body.scrollHeight, - ), - }); - }} - /> + i={2} + onClick={sectionsModal.on} + > + + + +
+ + { + window.document + .getElementById(COMMENTS_CONTAINER_ID) + ?.scrollIntoView(); + }} + /> +
{document.visibility === `permanent` && ( @@ -206,18 +248,32 @@ const DocumentLayoutContainer = () => {
)} - - - setDocumentLayoutState(({ document, yourRate }) => ({ - yourRate, - document: { ...document, commentsCount: count }, - })) - } - commentsCount={document.commentsCount} - className="mt-10" - /> + +
+ +
+ + + +
+ + setDocumentLayoutState(({ document, yourRate }) => ({ + yourRate, + document: { ...document, commentsCount: count }, + })) + } + commentsCount={document.commentsCount} + className="mt-10" + /> +
@@ -229,7 +285,6 @@ const DocumentLayoutContainer = () => { )} - {copyState.is === `copied` && Document markdown copied} ); }; diff --git a/src/models/page-models.ts b/src/models/page-models.ts index 58f2292e..e3b587f8 100644 --- a/src/models/page-models.ts +++ b/src/models/page-models.ts @@ -23,13 +23,14 @@ type RichEducationDocumentModel = Pick< | "description" | "tags" | "commentsCount" + | "score" > & { author: EducationDocumentAvatarModel; }; type LightEducationDocumentModel = Pick< PermanentDocumentDto, - "id" | "path" | "name" | "rating" | "cdate" | "commentsCount" + "id" | "path" | "name" | "rating" | "cdate" | "commentsCount" | "score" > & { author: EducationDocumentAvatarModel; }; diff --git a/src/modules/document-comments/containers/document-comments.container.tsx b/src/modules/document-comments/containers/document-comments.container.tsx index 4f6adc1a..d0a49223 100644 --- a/src/modules/document-comments/containers/document-comments.container.tsx +++ b/src/modules/document-comments/containers/document-comments.container.tsx @@ -65,7 +65,7 @@ const DocumentCommentsContainer = ({ return ( <> -
+

Comments{" "} @@ -172,7 +172,7 @@ const DocumentCommentsContainer = ({ )} )} -

+ {commentForm.is === "on" && ( )}