<?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: Jack Vatcharat</title>
    <description>The latest articles on DEV Community by Jack Vatcharat (@gamertense).</description>
    <link>https://dev.to/gamertense</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%2F259698%2Ff38eb41b-2527-42a1-82bf-d5e4034ddea0.jpeg</url>
      <title>DEV Community: Jack Vatcharat</title>
      <link>https://dev.to/gamertense</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gamertense"/>
    <language>en</language>
    <item>
      <title>Simplify Responsive Design in React with useBreakpoints</title>
      <dc:creator>Jack Vatcharat</dc:creator>
      <pubDate>Tue, 21 Jan 2025 06:48:36 +0000</pubDate>
      <link>https://dev.to/gamertense/simplify-responsive-design-in-react-with-usebreakpoints-1nhf</link>
      <guid>https://dev.to/gamertense/simplify-responsive-design-in-react-with-usebreakpoints-1nhf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.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%2F427e5m50r1arigfs05e6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F427e5m50r1arigfs05e6.png" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When building modern web apps, having a responsive design that works smoothly on all screen sizes isn’t just nice to have—it’s a must. A great way to achieve this is by handling mobile and desktop views differently. That’s where the &lt;code&gt;useBreakpoints&lt;/code&gt; hook comes in! It’s a handy tool for developers to create user-friendly experiences across devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s the useBreakpoints Hook?
&lt;/h2&gt;

&lt;p&gt;The useBreakpoints hook is a custom React hook that taps into Material-UI's &lt;code&gt;useTheme&lt;/code&gt; and &lt;code&gt;useMediaQuery&lt;/code&gt; hooks. It figures out the current screen size, so you can decide what to show or how to style things based on whether someone’s on a phone or a computer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Flx9nxq22h4k5t6enuzot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flx9nxq22h4k5t6enuzot.png" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use useBreakpoints?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Better User Experience:&lt;/strong&gt; By customizing the interface for mobile and desktop users, you can make sure everyone gets the best experience. Mobile users see a sleek, simplified design, while desktop users get to enjoy a more detailed layout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaner Code:&lt;/strong&gt; No more scattered media queries all over your CSS files. The useBreakpoints hook lets you handle responsive logic right in your components, making your code easier to read and maintain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster Performance:&lt;/strong&gt; By showing only what’s needed for a specific screen size, you can reduce unnecessary data loading and speed up your app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project Consistency:&lt;/strong&gt; Using the useBreakpoints hook across your projects keeps things consistent and helps new team members quickly get up to speed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to Use the useBreakpoints Hook
&lt;/h2&gt;

&lt;p&gt;Here’s a quick walkthrough of setting up and using the useBreakpoints hook in a React app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Set Up the Hook
&lt;/h3&gt;

&lt;p&gt;First, create a custom hook using Material-UI's &lt;code&gt;useTheme&lt;/code&gt; and useMediaQuery to determine the screen size.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useMediaQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useTheme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mui/material&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Custom hook to get the current state of breakpoints based on the theme.
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useBreakpoints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useTheme&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isMd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMediaQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;breakpoints&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;only&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;isMd&lt;/span&gt;&lt;span class="p"&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;h3&gt;
  
  
  Step 2: Put the Hook to Work
&lt;/h3&gt;

&lt;p&gt;Now, use the &lt;code&gt;useBreakpoints&lt;/code&gt; hook in a component to display different layouts for mobile and desktop users. For instance, you can show a list for mobile users and a table for desktop users using Material-UI components.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useBreakpoints&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/Users/jack/Work/SGInnovate/frontend/packages/shared/ui/utils/breakpoints&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TableBody&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TableCell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TableContainer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TableHead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TableRow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ListItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Paper&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mui/material&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ResponsiveComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;isMdDown&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useBreakpoints&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Item 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Value 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Item 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Value 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Item 3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Value 3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;];&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="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isMdDown&lt;/span&gt; &lt;span class="p"&gt;?&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;List&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ListItem&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&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="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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;/ListItem&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&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;/List&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;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TableContainer&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Paper&lt;/span&gt;&lt;span class="p"&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;Table&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;TableHead&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;TableRow&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;TableCell&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TableCell&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="nx"&gt;TableCell&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Value&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TableCell&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;/TableRow&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;/TableHead&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="nx"&gt;TableBody&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TableRow&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&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;TableCell&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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;/TableCell&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="nx"&gt;TableCell&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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;/TableCell&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;/TableRow&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&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;/TableBody&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;/Table&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;/TableContainer&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&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;/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;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;ResponsiveComponent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that’s it! With the &lt;code&gt;useBreakpoints&lt;/code&gt; hook, you can make your app responsive and user-friendly without breaking a sweat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping It Up
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;useBreakpoints&lt;/code&gt; hook is a simple yet powerful tool that makes managing responsive designs in React a lot easier. By tailoring your UI for different screen sizes, you can create a seamless experience for your users while keeping your code clean and maintainable. Whether you’re building a complex web app or a simple site, this hook can help you deliver polished, professional results. So go ahead, give it a try, and watch your app adapt like a pro!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>mobile</category>
      <category>css</category>
    </item>
    <item>
      <title>กว่าจะมาเป็น Software Developer ในบริษัทข้ามชาติ ที่เจ้าของเป็นคนฝรั่งเศส!</title>
      <dc:creator>Jack Vatcharat</dc:creator>
      <pubDate>Sat, 11 Jan 2025 12:40:34 +0000</pubDate>
      <link>https://dev.to/gamertense/kwaacchamaaepn-software-developer-ainbrisathkhaamchaati-thiiecchaakhngepnkhnfrangess-4mkn</link>
      <guid>https://dev.to/gamertense/kwaacchamaaepn-software-developer-ainbrisathkhaamchaati-thiiecchaakhngepnkhnfrangess-4mkn</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A720%2Fformat%3Awebp%2F1%2A09YxL9fajpyrPEF6DZfCeA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A720%2Fformat%3Awebp%2F1%2A09YxL9fajpyrPEF6DZfCeA.jpeg" alt="กว่าจะมาเป็น Software Developer ในบริษัทข้ามชาติ ที่เจ้าของเป็นคนฝรั่งเศส!" width="720" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;สวัสดีครับ ผมชื่อแจ๊ค ในบทความนี้จะมาเล่าประสบการณ์ก่อนที่จะมาทำงานที่บริษัทปัจจุบัน PALO IT (Thailand) ที่มีบริษัทแม่ตั้งอยู่ที่ฝรั่งเศสครับ ท้าวความไปตอนเด็กผมชอบภาษาอังกฤษมาก แม้จะเรียนมัธยมสายวิทย์-คณิต แต่ผมมักจะฝึกฟังภาษาอังกฤษผ่านการเรียนวิชาอื่นๆ เช่น คณิต ก็จะมีช่อง &lt;a href="https://www.youtube.com/@khanacademy" rel="noopener noreferrer"&gt;Khan Academy&lt;/a&gt; กับเว็บ &lt;a href="https://www.mathsisfun.com" rel="noopener noreferrer"&gt;MathIsFun.com&lt;/a&gt; ที่เข้าไปบ่อยๆ เลยเป็นการปูพื้นฐานให้เรียนมหาวิทยาลัยคณะวิศวกรรมคอมพิวเตอร์ภาคอินเตอร์ครับ&lt;/p&gt;

&lt;h2&gt;
  
  
  KBTG
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F78fukchoallp9uhr80ju.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F78fukchoallp9uhr80ju.png" alt="KBTG" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;พอเรียนจบมาผมได้ทำงานที่ KBTG เผื่อใครไม่รู้จักนะครับ KBTG (KASIKORN Business-Technology Group) เป็นบริษัทพัฒนาเทคโนโลยีของกสิกร เรียกง่ายๆ ว่าบริษัทลูกน่ะแหละครับ และนับว่าโชคดีมากที่ได้ที่นี่เพราะอยู่ใกล้บ้านผมที่สุดและสมัยนั้นรถไฟฟ้า BTS ใกล้บ้านยังไม่เกิดครับ 555&lt;/p&gt;

&lt;p&gt;ทำที่ KBTG ได้ 2 ปี มีทั้งใช้ ReactJS, React Native, NodeJS, NestJS, Prisma, Go web framework อย่าง Echo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fvnzce7w8c4l6c73lwx46.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvnzce7w8c4l6c73lwx46.jpg" alt="Smart watch" width="740" height="740"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;โปรเจคที่ชอบสุดตอนอยู่ KBTG คือโปรเจคด้านสุขภาพ ซึ่งต้องเขียนแอพแล้วต่อกับ Apple Health เลยพบว่า Apple ไม่เหมือนเจ้าอื่นๆ คืออย่างพวก Fitbit, Garmin จะเก็บข้อมูลพวก heart rate (อัตราการเต้นของหัวใจ) การนอนหลับ สถิติการออกกำลังกายที่ server ของเค้าและเราสามารถดึงข้อมูลผ่าน API ได้เลย ส่วน Apple จะเก็บที่ iCloud ของ user จริงแต่นักพัฒนาไม่มีสิทธิ์ดึงได้ จึงเป็นความท้าทายที่เราต้องเขียนให้แอพดึงข้อมูลตอนเปิดแอพ แสดงผลบนแอพ แล้วเก็บที่ database ของเรา&lt;/p&gt;

&lt;h2&gt;
  
  
  Allianz Technology Thailand
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F8vtss6bwddhq4penpx3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F8vtss6bwddhq4penpx3e.png" alt="Image description" width="600" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;หลังจากนั้นผมก็ย้ายไป Allianz Technology Thailand ด้วยเหตุผล 3 ข้อ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;เพื่อนแนะนำว่า work-life balance ดีมาก (พิสูจน์แล้วว่าจริง )&lt;/li&gt;
&lt;li&gt;ที่ KBTG ไม่มีต่างชาติให้คุยภาษาอังกฤษด้วย ผมเจอคนเวียดนามนะครับ แต่เค้าอยู่คนละโปรเจคเลยไม่ได้คุยกันในการทำงาน&lt;/li&gt;
&lt;li&gt;หาประสบการณ์ใหม่ๆ&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ตอนทำที่นี่เป็น frontend developer และเขียน Angular อย่างเดียว ไม่เคยเขียนมาก่อน อาศัย On-the-job training เลยครับ&lt;/p&gt;

&lt;p&gt;ที่นี่ใช้ Scaled Agile Framework (SAFe) ซึ่งเหมาะมากกับบริษัทใหญ่ที่มีหลายทีมทำโปรเจคเดียวกัน เพื่อไม่ให้บทความยาวเกินไป ขอไม่อธิบายลงละเอียดถึง framework นี้นะครับ&lt;/p&gt;

&lt;h2&gt;
  
  
  PALO IT (Thailand)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fzid6vo69el9u3f8j9uwn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fzid6vo69el9u3f8j9uwn.png" alt="Image description" width="225" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ทำได้อยู่ 1 ปี คุยกับเพื่อนร่วมงานเลยรู้จักคนที่ย้ายไป PALO IT (Thailand) ติดต่อคุยกับเค้า คิดว่าน่าสนใจดีด้วยเหตุผล 3 ข้อ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;อยากใช้ MacBook Pro ตอนอยู่ Allianz ใช้คอม Lenovo CPU เป็น AMD Ryzen 5 และจอ resolution 1366x768p ถ้าไม่ต่อจอแยกคือดูแล้วปวดตามาก&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ผมทำงานที่ Allianz ตอนช่วงโควิด บริษัทอาจจะลดค่าใช้จ่ายพอดีครับ พี่ที่ทำงานใช้ HP จอยังเป็น full hd (1920x1080p) เลย&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ยังชอบเขียนแอพอยู่ ตอนอยู่ Allianz เขียนเว็บด้วย Angular v8 ซึ่งเก่ามาก ตอนนั้นล่าสุดน่าจะ v12 แล้ว&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;อยากเขียน backend บ้าง ตอนอยู่ Allianz เป็น frontend developer จึงเขียนแค่ frontend อย่างเดียว&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ผมแอบลังเลก่อนยื่นสมัครงานอยู่เพราะเรื่องนึง คือพี่ที่ทำงานก็เคยทำงานบริษัทขนาดเล็กมาก่อน แล้วเล่าให้ฟังว่าเคยเจอว่าบริษัทหมุนเงินไม่ทัน ขอจ่ายเงินเดือนครึ่งนึง หรือบางที่เลื่อนจ่ายเงินเดือนก็มี โชคดีว่าเพื่อนที่รู้จักทำที่นี่มาปีกว่าแล้ว + บริษัทนี้ไม่ได้ก่อตั้งโดยคนไทยแต่ก่อตั้งโดยคนฝรั่งเศสในปี 2009 และมีออฟฟิศกว่า 10 สาขาทั่วโลก แปลว่าตัดคำว่า startup ออกได้&lt;/p&gt;

&lt;p&gt;ตอนผมสัมภาษณ์มี 2 รอบ รอบแรกเป็นคนไทย รอบที่ 2 เป็นคนฝรั่งเศส ทั้งคู่สัมภาษณ์เป็นภาษาอังกฤษและมีโจทย์เขียนโปรแกรมให้ทำ ผมขอสปอยว่าแตกต่างจาก KBTG ที่ใช้ Codility อยากรู้ว่าโจทย์สัมภาษณ์คืออะไรให้สมัครเลยครับ 555&lt;/p&gt;

&lt;h3&gt;
  
  
  โปรเจคที่ PALO IT (Thailand)
&lt;/h3&gt;

&lt;p&gt;เกริ่นมานาน ขอเข้าส่วนที่ผมชอบมากกับการทำโปรเจคต่างๆ ในบริษัทนี้นะครับ ถ้าเป็นโปรเจคเขียนแอพบนมือถือที่ผมทำอยู่ ในทีมมีถึง 30 คน ได้ใช้ภาษาอังกฤษทำงานทุกวัน ต่างชาติที่มีคนฝรั่งเศส คนเยอรมัน คนฟิลิปปินส์ คนฮ่องกง คนจีน เขียนแอพด้วย React Native และเขียนหลังบ้านด้วย Java Spring Boot ครับ ซึ่งไม่ได้จำกัดว่าทุกโปรเจคเราจะใช้ framework เดียวกัน อยู่ที่การตกลงกับลูกค้าว่าเค้าต้องการอะไรเพื่อไป maintain ต่อครับ&lt;/p&gt;

&lt;p&gt;ที่นี่เราจะเป็น full stack developer กัน คือทำได้ทั้ง frontend และ backend ในโปรเจคผมจะเน้น frontend มากกว่าเพราะ requirement ต่างๆ จะหนักทางนั้นครับ&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fh9yvkqy3vwj4ddwb0zp8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fh9yvkqy3vwj4ddwb0zp8.png" alt="PALO IT application development" width="538" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;และนี่คือ system architecture อย่างง่าย&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fnamp4d47v1q3w0yqcojn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fnamp4d47v1q3w0yqcojn.png" alt="System Architecture" width="446" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;BFF ไม่ได้ย่อมาจาก Best Friends Forever นะครับ 555 ย่อมาจาก Backend For Frontend ที่ไม่เรียก backend เฉยๆ เพื่อให้เข้าใจว่าทำมาเพื่อแปลงข้อมูลสำหรับส่งให้ frontend โดยเฉพาะ เช่น เปิดแอพหน้านึงต้องไปต้องเรียกหลังบ้าน 3 เส้น หน้าที่ของ BFF คือเรียก 3 เส้นนั้น เพื่อให้ frontend เรียก BFF เส้นเดียวครับ&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Downstream API services คือระบบหลังบ้านของลูกค้า&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;ตอนพัฒนาแอพบนเครื่อง&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fet6tr7oddfyq5jmbtsox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fet6tr7oddfyq5jmbtsox.png" alt="Image description" width="447" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  End-to-end testing
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fvx8dpdiusmbhlfrapint.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvx8dpdiusmbhlfrapint.png" alt="Image description" width="800" height="731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;เพื่อที่จะทำ frontend app ให้มี bug น้อยที่สุด dev ทุกคนจึงต้องเขียน E2E (End-to-end testing) เพื่อต่อกับ simulator (จำลอง downstream api) และยึดตาม acceptance criteria ของ story นั้นๆ หลายคนคงเดาว่า "แบบนี้ก็ต้องมีเครื่องไว้รัน e2e ทุก story สิ" ใช่ครับ เราจะมีเครื่องไว้รันและหมั่นคอยเช็ค report ทุกวันว่าการทำ feature ใหม่ๆ ไปทำให้ของเก่าพังมั้ย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Q: รู้ได้อย่างไรว่า Downstream API ต้องการ request/response body หน้าตาแบบไหน เพราะมีหลาย service มาก?
A: เรายึดจาก API spec ที่ Business Analyst เตรียมให้ครับ หลังจาก sprint demo จบก็จะมี QA เตรียม data ไปทดสอบอีกทีบน UAT

Q: เราทดสอบแอพไปต่อ UAT เองได้มั้ย
A: ได้ครับ วิธีเดียวกับที่ปล่อยแอพให้ tester ทดสอบคือผ่าน App Center ข้อดีของเจ้านี้คือปล่อยให้โหลดได้ทั้ง iOS และ Android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;p&gt;ฝั่ง backend ก็มีเขียน test ต่อกับ simulator เช่นกัน เป็นการทดสอบว่า logic ถูกต้องไหม เช่น รับข้อมูล A จาก downstream ประมวลผลบางอย่างแล้วควรตอบกลับด้วยข้อมูล B  และเราตกลงกันว่า test coverage ต้องเป็น 100%&lt;/p&gt;

&lt;h3&gt;
  
  
  Management
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fsls2n0jmpo99x1ynj6j0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fsls2n0jmpo99x1ynj6j0.png" alt="Image description" width="740" height="740"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;แน่นอนว่าทีมที่ใหญ่ก็ต้องมีการจัดการที่ดี มี 4 squad แต่ละ squad มี 4-5 คน ก็จะมี scrum master, tech lead และ developer เพื่อดูแล feature ในหมวดนั้นๆ ทุกวันก็มี daily standup ก่อนที่จะเอา story เข้า sprint ก็มี story refinement ก่อนเริ่ม sprint ก็มี sprint planning พอจบ sprint ก็มี sprint retrospective เรียกได้ว่าใช้ Agile methodology ค่อนข้างเต็มรูปแบบเลยครับ&lt;/p&gt;

&lt;h3&gt;
  
  
  Work from home มั้ย?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fuxrwzo7d8nugy17no0rp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fuxrwzo7d8nugy17no0rp.jpg" alt="Remote working" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;คิดว่าหลายคนต้องการคำตอบ ผมเลยแบ่งเป็นหัวข้อใหม่เลยครับ 555 คำตอบคือ Hybrid หมายถึง WFH เป็นหลัก และเข้า office 1 ครั้ง/2 สัปดาห์เพื่อ demo ให้ลูกค้าดู ทั้งนี้ขึ้นอยู่กับโปรเจคนั้นๆ ว่าจำเป็นต้องเข้าออฟฟิศบ่อยแค่ไหนด้วยครับ&lt;/p&gt;




&lt;h2&gt;
  
  
  โปรเจคนอก PALO IT (Thailand)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ThailandCan
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F6nigsszrflq6ea70ptbe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F6nigsszrflq6ea70ptbe.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ผมได้โอกาสร่วมพัฒนาเว็บไซต์ &lt;a href="https://thailandcan.org/" rel="noopener noreferrer"&gt;https://thailandcan.org/&lt;/a&gt; โดยเฉพาะ landing page ที่ design ใหม่หมดโดย designer ของ PALO IT เอง ก็เป็นโอกาสดีในรื้อฟื้นทักษะการเขียน CSS แบบ responsive ให้ support ทั้งจอคอม แท็บเล็ตและมือถือครับ ตอนเขียนแอพคำนึงแต่มือถือ 555&lt;/p&gt;

&lt;h3&gt;
  
  
  Workshop
&lt;/h3&gt;

&lt;p&gt;นอกจากโปรเจคที่ได้ทำแล้ว มีโอกาสได้ก้าวออกจาก comfort zone ด้วยการไปช่วยพี่ Paco (Tech Lead) จัด Advanced Prompt Engineering workshop ในงาน KBTG Techtopia 2024&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F5c5eg386gf3jl3iczs8e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F5c5eg386gf3jl3iczs8e.jpg" alt="Image description" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;และก็เป็นจุดเริ่มต้นของการจัด workshop เองที่งาน JS Bangkok 2024 ในหัวข้อ From Nodes to Prompts: Exploring Prompt Engineering with Rivet &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fu343lxxvjlwfewr1b53n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fu343lxxvjlwfewr1b53n.png" alt="Image description" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ถ้าใครพลาดงานไหนไปก็ไม่เป็นไรครับ สามารถกดดูใน GitHub ได้เลย&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/palo-it-th/PALO-LLM-Playground" rel="noopener noreferrer"&gt;Advanced Prompt Engineering 2024 workshop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/palo-it-th/rivet-workshop" rel="noopener noreferrer"&gt;JS Bangkok 2024 workshop&lt;/a&gt; มีไฟล์ PDF อธิบายใน repo ด้วยนะ&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;ขอบคุณที่อ่านมาถึงตรงนี้ครับ หากใครอยากรู้เรื่องอะไรเพิ่มเติมสามารถพิมพ์คอมเม้นถามได้เลยนะครับ ถ้าตอบได้ก็จะตอบครับ และยังมีโปรเจคอื่นๆ ที่น่าสนใจอีก ไว้มีโอกาสจะมาเล่าให้ฟังนะครับ&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Boost Your AI Skills with Rivet: A Comprehensive Guide</title>
      <dc:creator>Jack Vatcharat</dc:creator>
      <pubDate>Mon, 11 Nov 2024 11:37:44 +0000</pubDate>
      <link>https://dev.to/gamertense/boost-your-ai-skills-with-rivet-a-comprehensive-guide-4ek3</link>
      <guid>https://dev.to/gamertense/boost-your-ai-skills-with-rivet-a-comprehensive-guide-4ek3</guid>
      <description>&lt;h3&gt;
  
  
  Introduction to Prompt Engineering
&lt;/h3&gt;

&lt;p&gt;Prompt engineering is a crucial aspect of working with AI models, particularly those developed by OpenAI. It involves crafting precise and effective prompts to guide the AI in generating the desired responses. This guide aims to provide a comprehensive overview of prompt engineering, drawing insights from the OpenAI documentation and demonstrating how to implement these techniques using the Rivet program.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Create This Article?
&lt;/h3&gt;

&lt;p&gt;Clear and effective communication is essential when leveraging advanced AI tools. The purpose of this article is to demystify the process of prompt engineering, making it accessible to both beginners and experienced users. By providing a step-by-step guide on using the Rivet program to create one-shot prompts, this article aims to empower users to harness the full potential of AI in their projects. It serves as a practical resource, helping users understand the logic behind each step and offering examples to illustrate key concepts, ensuring they can effectively communicate with AI models.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding One-Shot Prompts and Prompt Roles
&lt;/h3&gt;

&lt;h4&gt;
  
  
  One-Shot Prompt
&lt;/h4&gt;

&lt;p&gt;A one-shot prompt is a single example provided to the AI to demonstrate the desired style or format of the response. It helps the AI understand how to respond to similar inputs without needing multiple examples.&lt;/p&gt;

&lt;h4&gt;
  
  
  Prompt Roles
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fsvpmmiyw9h8m7r822ret.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fsvpmmiyw9h8m7r822ret.png" alt="Image description" width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System:&lt;/strong&gt; This prompt sets the overall instructions and guidelines for the AI. It defines the style and tone of the responses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User:&lt;/strong&gt; This prompt represents the input or question from the user. It simulates what a user might ask or say to the AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assistant:&lt;/strong&gt; This prompt provides the AI's response to the user prompt. It shows how the AI should reply based on the given input.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example from OpenAI Documentation
&lt;/h3&gt;

&lt;p&gt;If you go to &lt;a href="https://platform.openai.com/docs/guides/prompt-engineering/tactic-provide-examples" rel="noopener noreferrer"&gt;Tactic: Provide examples&lt;/a&gt; on the OpenAI Doc, you will see the following example (as of September 21, 2024):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F3s5hhkud56mhqco48ib5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F3s5hhkud56mhqco48ib5.png" alt="Image description" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reason they use the terms &lt;strong&gt;SYSTEM&lt;/strong&gt;, &lt;strong&gt;USER&lt;/strong&gt;, and &lt;strong&gt;ASSISTANT&lt;/strong&gt; is not just to indicate that &lt;strong&gt;ASSISTANT = AI&lt;/strong&gt;. They guide us that whenever we call an API, such as &lt;strong&gt;gpt-4o-mini&lt;/strong&gt;, we should not put everything in one prompt. We should create an array like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Answer in a consistent style.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Teach me about patience.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The river that carves the deepest valley flows from a modest spring; the grandest symphony originates from a single note; the most intricate tapestry begins with a solitary thread.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Teach me about the ocean.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&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;blockquote&gt;
&lt;p&gt;The example from the OpenAI Doc shows us that the AI won't answer how to be patient and what the ocean is because we provided an example that it should answer like a poem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, this article focuses on how to do this using the Rivet program, which is a no-code tool. So let's get started by creating a one-shot prompt in Rivet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before you begin, make sure you have the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://console.groq.com/keys" rel="noopener noreferrer"&gt;GroqAI&lt;/a&gt; or &lt;a href="https://platform.openai.com/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt; API Key: You’ll need an API key to access the AI services.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rivet.ironcladapp.com/" rel="noopener noreferrer"&gt;Rivet&lt;/a&gt; program installed: Ensure that the Rivet program is installed on your computer. You can download it from the official Rivet website.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to Create a One-Shot Prompt in Rivet
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1: Open the Rivet Program
&lt;/h4&gt;

&lt;p&gt;First, launch the Rivet program on your computer. If you don't have it installed yet, download and install it from the official website.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2: Create a New Project
&lt;/h4&gt;

&lt;p&gt;Once the program is open, create a new project. This will be the workspace where you'll build your one-shot prompt.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 3: Create a System Prompt Node
&lt;/h4&gt;

&lt;p&gt;In your new project, right-click on the canvas and select &lt;strong&gt;Add&lt;/strong&gt; =&amp;gt; &lt;strong&gt;Text&lt;/strong&gt; =&amp;gt; &lt;strong&gt;Prompt&lt;/strong&gt; to create a new prompt node.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fbjhxzdbhl7ut07s5hto2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fbjhxzdbhl7ut07s5hto2.png" alt="Image description" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the gear icon and set this node as the &lt;strong&gt;System Prompt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fbpyah8mr5jiclrs7irhn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fbpyah8mr5jiclrs7irhn.png" alt="Image description" width="472" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the following text: &lt;strong&gt;"Answer in a consistent style."&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4: Create a User Prompt Node
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Create another prompt node.&lt;/li&gt;
&lt;li&gt;Set this node as the &lt;strong&gt;User Prompt&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter the example input: "Teach me about patience."&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 5: Create an Assistant Prompt Node
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Create another prompt node.&lt;/li&gt;
&lt;li&gt;Set this node as the &lt;strong&gt;Assistant Prompt&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter the desired AI response to the user prompt. For example: "The river that carves the deepest valley flows from a modest spring; the grandest symphony originates from a single note; the most intricate tapestry begins with a solitary thread."&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 6: Create Another User Prompt Node
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Create one more prompt node.&lt;/li&gt;
&lt;li&gt;Set this node as the &lt;strong&gt;User Prompt&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter the task you want the AI to perform in this node. For example: "Teach me about the ocean."&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Step 7: Create an Assemble Prompt Node
&lt;/h4&gt;

&lt;p&gt;Create an assemble prompt node.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fhq5odh2hz0p5iechri25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fhq5odh2hz0p5iechri25.png" alt="Image description" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Draw lines from the system, user, and assistant prompt nodes to the assemble prompt node.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fqltq5xhj6f90sipz0aau.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fqltq5xhj6f90sipz0aau.png" alt="Image description" width="634" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 8: Add a Chat Node
&lt;/h4&gt;

&lt;p&gt;Create a chat node.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fi7ay8z5zz4janb9omjfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fi7ay8z5zz4janb9omjfo.png" alt="Image description" width="679" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the gear icon, expand the advanced section, and set the endpoint, custom model, and headers. The following screenshot shows an example of how to configure it for GroqAI. Replace &lt;code&gt;&amp;lt;your-api-key&amp;gt;&lt;/code&gt; with your GroqAI API key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fh2tvrk9kve4o5gzqd1j5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fh2tvrk9kve4o5gzqd1j5.png" alt="Image description" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Draw a line from the assemble prompt node to the chat node.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 9: Run the Prompt
&lt;/h4&gt;

&lt;p&gt;Click the &lt;strong&gt;Run&lt;/strong&gt; button to execute the prompt. The output will be generated based on the one-shot prompt you created. If you followed the example text in this guide, the AI response should maintain a consistent style, similar to the initial poetic response.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F1ahy0u2lyn1l062mb0ft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1ahy0u2lyn1l062mb0ft.png" alt="Image description" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Prompt engineering is a powerful tool for guiding AI models to generate desired responses. This guide has provided a clear, step-by-step process for creating one-shot prompts using the Rivet program. By understanding and applying these steps, you can effectively communicate with AI models, making your projects more efficient and impactful. Happy prompting!&lt;/p&gt;

</description>
      <category>promptengineering</category>
      <category>llm</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Harness AI for Free: A Beginner’s Guide to GroqAI API Keys</title>
      <dc:creator>Jack Vatcharat</dc:creator>
      <pubDate>Mon, 11 Nov 2024 11:29:36 +0000</pubDate>
      <link>https://dev.to/gamertense/harness-ai-for-free-a-beginners-guide-to-groqai-api-keys-433k</link>
      <guid>https://dev.to/gamertense/harness-ai-for-free-a-beginners-guide-to-groqai-api-keys-433k</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As a tech enthusiast, you know the value of integrating AI into your projects. However, many popular AI services, like the ChatGPT API, require pay-per-use fees. That’s why I’m excited to share how you can use GroqAI for free. This guide will walk you through the process of creating an API key from GroqAI, so you can start leveraging their powerful AI models without worrying about costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Create an API Key from GroqAI
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Step 1: Sign Up for GroqAI
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Visit the GroqAI website.&lt;/li&gt;
&lt;li&gt;If you don't already have an account, click on the "Sign Up" button and fill in your details. If you already have an account, simply log in.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Step 2: Navigate to the API Keys Section
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Once you're logged in, you'll be directed to your dashboard.&lt;/li&gt;
&lt;li&gt;Look for the "API Keys" option in the left-side navigation panel and click on it or go to &lt;a href="https://console.groq.com/keys" rel="noopener noreferrer"&gt;https://console.groq.com/keys&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fgssmh5ynl2cl1rg1kmuf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fgssmh5ynl2cl1rg1kmuf.png" alt="Image description" width="196" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 3: Create a New API Key
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Click on "Create API Key."&lt;/li&gt;
&lt;li&gt;A modal will pop up asking you to provide a name for your new API key. Choose a name that helps you easily identify it later.&lt;/li&gt;
&lt;li&gt;Click the "Submit" button to generate your API key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fdsi0ifo9mrbfo4z8s5jk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fdsi0ifo9mrbfo4z8s5jk.png" alt="Image description" width="686" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4: Secure Your API Key
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Once generated, copy the API key to your clipboard. You won't be able to view it again after closing the dialog box.&lt;/li&gt;
&lt;li&gt;Save the key in a secure location, such as a password manager, to ensure it doesn't get lost or exposed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Step 5: Start Using Your API Key
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Check out the &lt;a href="https://dev.to/gamertense/boost-your-ai-skills-with-rivet-a-comprehensive-guide-4ek3"&gt;blog post&lt;/a&gt; I wrote. Even if you’re a non-programmer, you can follow along because the program is a no-code tool. This way, you can practice prompt engineering without writing a single line of code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Creating an API key from GroqAI is a straightforward process that opens up a world of possibilities for integrating powerful AI models into your projects. Unlike other services that require pay-per-use fees, GroqAI offers a free option, making it accessible for tech enthusiasts and developers alike. By following the steps outlined in this guide, you can quickly generate and secure your API key, allowing you to start experimenting with AI without any cost concerns. Happy coding, and enjoy exploring the capabilities of GroqAI!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>promptengineering</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Getting Started with NativeWind: Using Tailwind CSS in React Native</title>
      <dc:creator>Jack Vatcharat</dc:creator>
      <pubDate>Sat, 21 Sep 2024 08:42:13 +0000</pubDate>
      <link>https://dev.to/gamertense/getting-started-with-nativewind-using-tailwind-css-in-react-native-13e6</link>
      <guid>https://dev.to/gamertense/getting-started-with-nativewind-using-tailwind-css-in-react-native-13e6</guid>
      <description>&lt;h3&gt;
  
  
  What is NativeWind?
&lt;/h3&gt;

&lt;p&gt;NativeWind is a library that allows you to use Tailwind CSS in React Native projects. It helps you style your mobile apps quickly and efficiently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Use NativeWind?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Easy to Use&lt;/strong&gt;: You can write styles directly in your components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent Design&lt;/strong&gt;: Tailwind CSS ensures your design is consistent across different components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast Development&lt;/strong&gt;: Quickly apply styles without writing a lot of custom CSS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before you start, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; installed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Native CLI&lt;/strong&gt; installed&lt;/li&gt;
&lt;li&gt;Basic knowledge of React Native&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step-by-Step Guide
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Create a New React Native Project
&lt;/h4&gt;

&lt;p&gt;If you haven't already, create a new React Native project using React Native CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx react-native init MyNativeWindApp
&lt;span class="nb"&gt;cd &lt;/span&gt;MyNativeWindApp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Install NativeWind
&lt;/h4&gt;

&lt;p&gt;Next, install NativeWind and its dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;nativewind
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; tailwindcss@3.3.2

&lt;span class="c"&gt;# Yarn&lt;/span&gt;
yarn add nativewind
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; tailwindcss@3.3.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Setup Tailwind CSS
&lt;/h4&gt;

&lt;p&gt;Run &lt;code&gt;npx tailwindcss init&lt;/code&gt; to create a &lt;code&gt;tailwind.config.js&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Add the paths to all of your component files in your &lt;code&gt;tailwind.config.js&lt;/code&gt; file. If you put your screens and components inside the &lt;code&gt;src&lt;/code&gt; folder, update &lt;code&gt;&amp;lt;custom-folder&amp;gt;&lt;/code&gt; with your folder name. For example, &lt;code&gt;'./src/**/*.{js,jsx,ts,tsx}'&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tailwind.config.js&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.{js,jsx,ts,tsx}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./&amp;lt;custom-folder&amp;gt;/**/*.{js,jsx,ts,tsx}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&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;blockquote&gt;
&lt;p&gt;Make sure &lt;code&gt;nativewind.d.ts&lt;/code&gt; file is created in your project's root directory with the following content:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;/// &amp;lt;reference types="nativewind/types" /&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// NOTE: This file should not be edited and should be committed with your source code. It is generated by NativeWind.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Configure Babel
&lt;/h4&gt;

&lt;p&gt;Add the NativeWind plugin to your Babel configuration. Open your &lt;code&gt;babel.config.js&lt;/code&gt; file and add the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;presets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;module:metro-react-native-babel-preset&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nativewind/babel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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;h4&gt;
  
  
  5. Use NativeWind in Your Components
&lt;/h4&gt;

&lt;p&gt;Now, you can start using NativeWind in your components. Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NativeWindStyleSheet&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nativewind&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&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;View&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;flex-1 justify-center items-center bg-blue-500&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;Text&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;text-white text-lg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NativeWind&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&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;/View&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;h2&gt;
  
  
  Button Component
&lt;/h2&gt;

&lt;p&gt;To add margin or padding to buttons, wrap them with a styled component using &lt;code&gt;styled(Button)&lt;/code&gt; as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nativewind&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Pressable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;StyleProp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ViewStyle&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;variantStyles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-white&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-black&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-blue-500&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-white&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;StyledPressable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Pressable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;
  &lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
  &lt;span class="nx"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;variantStyles&lt;/span&gt;
  &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;StyleProp&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ViewStyle&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;JSX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Element&lt;/span&gt; &lt;span class="p"&gt;{&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;StyledPressable&lt;/span&gt;
      &lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;onPress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onPress&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`rounded-lg p-2 my-1 &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-gray-300&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 
      &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;variantStyles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;background&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; active:bg-slate-500 `&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&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;Text&lt;/span&gt;
        &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`text-lg font-bold &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;variantStyles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; text-center`&lt;/span&gt;&lt;span class="p"&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="nx"&gt;title&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;/Text&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;/StyledPressable&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;span class="c1"&gt;// Export the styled component&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now use the Button component in your app. Notice that the &lt;code&gt;className&lt;/code&gt; prop is used to apply styles to the component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&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;View&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;flex-1 justify-center items-center&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;Text&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hello&lt;/span&gt; &lt;span class="nx"&gt;world&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&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="nx"&gt;Button&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Press Me&lt;/span&gt;&lt;span class="dl"&gt;"&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;mt-4&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="sr"&gt;/View&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;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp9v6mdllp1ne9ow1osn1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp9v6mdllp1ne9ow1osn1.png" alt="Image description" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;NativeWind makes it easy to style your React Native apps using Tailwind CSS. With this guide, you should be able to set up and start using NativeWind in your projects. Happy coding!&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>tailwindcss</category>
    </item>
  </channel>
</rss>
