<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lukman Isiaka</title>
    <description>The latest articles on DEV Community by Lukman Isiaka (@codellyson).</description>
    <link>https://dev.to/codellyson</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F73933%2F1a889cd6-2f21-4d97-b4f1-148d181d34fd.jpg</url>
      <title>DEV Community: Lukman Isiaka</title>
      <link>https://dev.to/codellyson</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codellyson"/>
    <language>en</language>
    <item>
      <title>Notes From Four Years of AI-Assisted Coding</title>
      <dc:creator>Lukman Isiaka</dc:creator>
      <pubDate>Mon, 11 May 2026 13:33:38 +0000</pubDate>
      <link>https://dev.to/codellyson/notes-from-four-years-of-ai-assisted-coding-1oal</link>
      <guid>https://dev.to/codellyson/notes-from-four-years-of-ai-assisted-coding-1oal</guid>
      <description>&lt;p&gt;The day I couldn't work was the day it really hit me. I'd burned through my Claude Code messages for the day, stared at the rate-limit screen, and just... stopped. That was the moment I realized my life had been completely revolutionized, and that I was paying for it.&lt;br&gt;
Let me back up.&lt;br&gt;
I've had access to AI-assisted coding for about four years, since the days when GitHub Copilot was the real deal. Back then, having something quietly suggesting the next line of code in the background felt like the future. But Copilot had its problems. It couldn't suggest multi-line edits (I hated that), and the latency. I don't know if it was peculiar to this part of the world or an internal GitHub thing, but the slowness on every tab used to anger me deeply.&lt;br&gt;
Then ChatGPT dropped. I was scrolling Twitter randomly the day the demo came out, and watching it, it dawned on me that the world as we knew it was about to change, especially for software developers. The concept of autonomous agents handling or aiding coding tasks started making the rounds. What I didn't know was that Copilot's quiet competitor was already on the rise.&lt;br&gt;
Then Cursor showed up. Every problem I'd had with Copilot, Cursor had shipped a solution to from the get-go. Multi-line edits, faster suggestions, the works. And the cherry on top, I witnessed an AI agent build, debug, and fix errors for the first time. For a while I was still stuck on Copilot out of habit, but the moment I actually got my hands dirty with Cursor, I switched sides immediately. Cursor became my right hand man.&lt;br&gt;
I thought Cursor was the pinnacle. Oh boy, was I wrong.&lt;br&gt;
The moment is fuzzy now, but if I remember correctly, I saw a demo somewhere of someone interacting with an AI agent through the terminal. Later I learned the tool was Claude Code. The initial release was madness. It unleashed something in me. I've always had the knack for building virtually anything that pops into my head, but Claude Code made it feel almost frictionless. Until it didn't. As with every other nice thing, the cracks showed up. Rate limits. Context consumption. Token costs. And then came the day I described at the top. The day I just stopped, because I'd run out of messages.&lt;br&gt;
I build faster now. I ship more. I complete tasks I wouldn't have attempted four years ago. But I pay for it with cognition and my cash.&lt;br&gt;
The cognition part is the one that bothers me. I notice I reach for the agent before I've even thought through the problem. I skim code I would have read line by line two years ago. When an API goes down or the context gets too long, I feel something close to panic. Not because the task is hard, but because I've forgotten what it feels like to sit with a hard task alone. That's the real bill.&lt;br&gt;
Two lessons from all of this. One, in this market, innovate fast or your competition kicks you out. Cursor ate Copilot's lunch in months. Two, rely on AI tools, but keep every one of your instincts active while you do. The day you stop noticing the tradeoff is the day the tradeoff wins.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>claudecode</category>
      <category>cursor</category>
    </item>
    <item>
      <title>Submission for the DEV Weekend Challenge: Community</title>
      <dc:creator>Lukman Isiaka</dc:creator>
      <pubDate>Mon, 02 Mar 2026 22:15:17 +0000</pubDate>
      <link>https://dev.to/codellyson/submission-for-the-dev-weekend-challenge-community-bl7</link>
      <guid>https://dev.to/codellyson/submission-for-the-dev-weekend-challenge-community-bl7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;web development community&lt;/strong&gt;. We pour hours into building apps, but understanding &lt;em&gt;why users get frustrated&lt;/em&gt; remains one of the hardest problems. Enterprise tools like FullStory and Hotjar are expensive and privacy-heavy. Indie developers, small teams, and open-source maintainers are left guessing and reading through support tickets or hoping users speak up.&lt;/p&gt;

&lt;p&gt;Reev exists because every web developer deserves to know when their UI is failing users, without needing a six-figure analytics budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Reev&lt;/strong&gt; is a lightweight, open-source UX frustration detector that automatically catches real user frustration on your website and asks them what went wrong -right in the moment.&lt;/p&gt;

&lt;p&gt;Drop a single &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag on your site and Reev detects &lt;strong&gt;4 types of UX frustration&lt;/strong&gt; in real time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rage Clicks&lt;/strong&gt; - 3+ rapid clicks on the same element within 1.5 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dead Links&lt;/strong&gt; - same-origin links that return errors or timeout&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broken Images&lt;/strong&gt; - images that fail to load, including dynamically added ones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Form Frustration&lt;/strong&gt; - users clearing and retyping the same form field repeatedly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flow Suggestions&lt;/strong&gt; - guide frustrated users to the right page with navigation hints, created manually, auto-discovered from pageview data, or imported from your sitemap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When frustration is detected, an inline popover appears next to the problem element asking the user &lt;em&gt;"What went wrong?"&lt;/em&gt;. Their feedback is sent to your dashboard with full context -browser, device, the element they interacted with, and recent errors.&lt;/p&gt;

&lt;p&gt;The dashboard then groups repeated feedback into &lt;strong&gt;patterns&lt;/strong&gt; -so if 5 users report the same dead link on your pricing page, you see one actionable pattern instead of 5 separate reports.&lt;/p&gt;

&lt;p&gt;The tracker is &lt;strong&gt;~7KB, zero dependencies&lt;/strong&gt;, and works on any website or framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://reev.kreativekorna.com" rel="noopener noreferrer"&gt;reev.kreativekorna.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick setup - add to any site in 60 seconds:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReevConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://unpkg.com/reev.js/dist/reev.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}({&lt;/span&gt;
  &lt;span class="na"&gt;projectId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;your-project-id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://reev.kreativekorna.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/codellyson" rel="noopener noreferrer"&gt;
        codellyson
      &lt;/a&gt; / &lt;a href="https://github.com/codellyson/reev" rel="noopener noreferrer"&gt;
        reev
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Reev&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;UX is hard. Reev makes it simple.&lt;/p&gt;

&lt;p&gt;Reev is a lightweight, open-source UX frustration detector with real-time feedback collection. Install a script on your site, and Reev catches frustration as it happens - rage clicks, dead links, broken images, form frustration. When issues occur, users can provide instant feedback via inline popovers. The dashboard groups repeated feedback into patterns so you can fix problems fast.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;1. Install   → Paste a &amp;lt;script&amp;gt; tag on your site
2. Detect    → Reev watches for rage clicks, dead links, broken images, and form frustration
3. Collect   → Users submit feedback when issues are detected (optional inline popovers)
4. Fix       → Reports and patterns tell you what's wrong, what users said, and where
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What Reev detects&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;How it works&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Rage clicks&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;3+ clicks on the same element within 1.5 seconds&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;strong&gt;Dead links&lt;/strong&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Same-origin links that return errors or&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/p&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/codellyson/reev" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tracker library&lt;/strong&gt; (&lt;code&gt;reevjs/&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vanilla TypeScript compiled to a single IIFE bundle via esbuild&lt;/li&gt;
&lt;li&gt;Zero dependencies - uses native browser APIs (MutationObserver, PerformanceObserver)&lt;/li&gt;
&lt;li&gt;Configured via &lt;code&gt;window.ReevConfig&lt;/code&gt; -supports toggling each detector, popover theme (dark/light), cooldowns, and debug mode&lt;/li&gt;
&lt;li&gt;Self-initializes on DOMContentLoaded, no method calls needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dashboard &amp;amp; API&lt;/strong&gt; (&lt;code&gt;app/&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; (App Router) with React 18 and TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; (Neon-compatible) for event and feedback storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NextAuth.js&lt;/strong&gt; for authentication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TanStack Query&lt;/strong&gt; for data fetching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; + &lt;strong&gt;Framer Motion&lt;/strong&gt; for the UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How detection works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The tracker detects frustration client-side and shows a feedback popover&lt;/li&gt;
&lt;li&gt;User feedback is sent to &lt;code&gt;POST /api/events&lt;/code&gt; and stored in a dedicated feedback table&lt;/li&gt;
&lt;li&gt;When 2+ feedback reports share the same issue type and page URL, a &lt;strong&gt;pattern&lt;/strong&gt; is automatically created&lt;/li&gt;
&lt;li&gt;The dashboard shows individual reports (&lt;code&gt;/reports&lt;/code&gt;) and recurring patterns (&lt;code&gt;/patterns&lt;/code&gt;), filterable by status and issue type&lt;/li&gt;
&lt;li&gt;A separate &lt;code&gt;/flows&lt;/code&gt; page lets you manage navigation suggestions -create them manually, auto-discover common page transitions from pageview data, or import from a sitemap&lt;/li&gt;
&lt;li&gt;Flow widget is configurable per-project: display mode (on frustration or always), position, theme, and max suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key architectural decisions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSONB storage for flexible event data -no schema migrations needed when adding new event types&lt;/li&gt;
&lt;li&gt;Ring buffers for context capture (last 5 errors, last 10 breadcrumbs) lightweight memory footprint&lt;/li&gt;
&lt;li&gt;Rate limiting (60 req/min per IP, max 50 events per batch, 512KB max payload) to prevent abuse&lt;/li&gt;
&lt;li&gt;Privacy-first: no session replay, no PII collection just enough context to fix the problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Submitted By: &lt;a href="https://github.com/codellyson" rel="noopener noreferrer"&gt;codellyson&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to parse HTML to React</title>
      <dc:creator>Lukman Isiaka</dc:creator>
      <pubDate>Thu, 19 May 2022 17:24:07 +0000</pubDate>
      <link>https://dev.to/codellyson/how-to-parse-html-to-react-38im</link>
      <guid>https://dev.to/codellyson/how-to-parse-html-to-react-38im</guid>
      <description>&lt;p&gt;Recently, I have been working on a project, one of the requirement was that I should implement a Rich Text Editor and render the text firstly in a preview card as truncated text as shown in the image below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyi9jhlqqaqwlxvc1gni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyi9jhlqqaqwlxvc1gni.png" alt="text truncated preview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Secondly, The main view, is where users get to read the content in detail. This was not a problem in particular as React provides us with a built-in solution to render raw HTML. &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;React built-in solution to my problem &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt; works same way like vanilla JavaScript &lt;code&gt;innerHTML&lt;/code&gt;. this is a risky solution because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This solution by default exposes you to Cross Site Scripting (&lt;a href="https://portswigger.net/web-security/cross-site-scripting" rel="noopener noreferrer"&gt;XSS&lt;/a&gt;), to be safe you'd have to use it alongside another package &lt;code&gt;dom-purify&lt;/code&gt; to sanitize your HTML input.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The text rendered by this solution cannot be truncated because the way &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt; works is by passing it as an attribute to a JSX element &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;dangerouslySetInnerHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;//htmlInput&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;and one of my project requirement is to have a preview of the content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;After doing so many research, I bumped into a package called &lt;code&gt;html-to-react&lt;/code&gt; it's available on NPM, actively maintained and about 577k weekly downloads perfect! &lt;/p&gt;

&lt;p&gt;The best thing about this package is that it solves the two problems I listed above. &lt;/p&gt;

&lt;p&gt;I can now do &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;HtmlToReactParser&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html-to-react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactTruncate&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-truncated-component&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// other imports&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Wiki&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// other functions&lt;/span&gt;
&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wiki-card&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ReactTruncate&lt;/span&gt; &lt;span class="nx"&gt;numberOfLines&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;lineHeight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt; 
       &lt;span class="nx"&gt;ellipsis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-hero__desc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; 
             &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;HtmlToReactParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Parser&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ReactTruncate&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Using the package this way, you will be able to truncate you r text anyhow you want and also render your HTML content nice and clean.&lt;/p&gt;

&lt;p&gt;Peace ✌🏽.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
