> For the complete documentation index, see [llms.txt](https://oms-frontend.gitbook.io/oms-frontend/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://oms-frontend.gitbook.io/oms-frontend/coding-conventions/react-tech-stack.md).

# React Tech Stack

Teach Stack & Project Structure

## <mark style="background-color:blue;">#Stack Lists</mark>

> ### State management &#x20;
>
> redux , redux-thunk , redux-persist , context-api
>
> <img src="https://lh5.googleusercontent.com/XHpNziloAjPFBAs5e5jRHKVTQqqfFnEBZhOkKPpZoVKmTExAoZV8mY0d7MbaLeEUQTQ4fZcI1jbZtUs0YzUsBizv8VLJBIuJPb6160LVWsF8dxV-wYLDBsPcLD32ONzkQ9CC0JGUgQaYldOs-_P5_q7ySb8YiGQcUGDtbYY7B7Ome7sFVuT1z33Ayn3hZw" alt="" data-size="line">

> ### Css framework
>
> tailwindcss , styled components , mui&#x20;
>
> optional : headlessui
>
> <img src="https://lh3.googleusercontent.com/04szcN-Dn6fe3fJYG_V6KO5XPDLzeu1Ek82TGKzKxh4WjpDFcxwdzmTh2nY136--5hMGCAQCWY24zlbANLArBdEsjgKTP4xqJdF1PSW1VLTu2EgxX4NH2QYmg0dfHOGkXRTqJ_Hh0aCNnQfxP6Q4ech8AbIHH0cchJIrmlnZFW4AiG5gbtxTNqn93hW7Yg" alt="" data-size="line"><img src="https://lh3.googleusercontent.com/RCBCAkDqCggURW9wrHbc6-QGsxBSo_rVRnN6KRXbWGS0xZMvr2A2YY2HwXfCpg_3jZqWdsJi74DF2Q2F-Ku7FEzrmOeipULnFSx0qk8FIH8lAIJnCq43_tDH8k5_ps88uvTUv7iYbHrr8L1CmpPS7VQxkLet4bpIxHY5A1Y0H-L-TKoCbQQL6h8BmHfKdA" alt="" data-size="line">

> ### Router
>
> react-router-dom
>
> <img src="https://lh6.googleusercontent.com/QqidAEeOTTn898dYAg_CIqz99EjgbbN4N0lubewxGw_RO9WO8bCECLxzxYZjeG6iVwEJrFSekMJhZ2XwmGwezHG7ET2vNHq0zbR37pe5BRWDWUcOqdocB4MhoJb_ecwp_tJot5Y71HQ_CD9QzUlWUd-Fhf2CmeA4uX-pOne4phYsMqsK037Pie0dBy3AKQ" alt="" data-size="line">

> ### Http Request & Data Fetching
>
> fetch (native js) , react-query
>
> <img src="https://blog.theodo.com/static/bb12ede8ede50acc8cdb447e7dc8bf6e/6fe88/rq-logo.png" alt="" data-size="line">

> ### Table management
>
> react-table
>
> <img src="https://camo.githubusercontent.com/3a0030f5e55b56e43c5939b92ed2fbc3cb494988fa5fea7e7654ac3750f9b101/68747470733a2f2f72656163742d7461626c652d76372e74616e737461636b2e636f6d2f5f6e6578742f7374617469632f696d616765732f6c6f676f2d6c696768742d36366434646439313039303034333332633836333339316536643163623330392e737667" alt="" data-size="line">

> ### Form management
>
> react-hook-form
>
> <img src="https://lh5.googleusercontent.com/NS3CdA-S8z8fA5XV6IO1n_qXsJJSM5JqypocI4pUl0BsgZG7-RWXRIXZv6qOblTd0u2TxHgAcnNxWaGccYO8hUxk1MBFmPA6al4JV1I4fRsryHNYiwIgLgisfhweYfU8Ij2O-eF_S3HQPXC4fu3MqSbc9sWf3Wav9duQyrowZL5HGYbTIibI2MHv4CSchw" alt="" data-size="line">

> ### Languague
>
> react-i18n
>
> <img src="https://lh6.googleusercontent.com/AMz5n7rdn3BEXPopD6upVZMSboi8q-X4Ju0E87U1IY7oXYtIByn3BtRvmJIHxIamorurWfs4XWj6md2CyWx2tOg5wDCWVZ4ytbkocWrpmeFK4Mchb9BqTXbQUeutLzKwMwZgMXcFpA5Ov2l2gn2r6WA_7-40zx68nPSyQ5ydnnTkNvCEpa1aUi0l6Vx02Q" alt="" data-size="line">

> ### Deployment
>
> Build Docker file
>
> <img src="https://lh5.googleusercontent.com/fwgf9mztCIqjZ2bOU6XdMaa3nnlhUsVS-Jxtp0p3jXZD0qOZ3Y57AwUIDyJWHRG4vgpExT_YtF3RWOKZNcOSrtp0pmBUmqSTHzQqUafNpaIwcxzpKHvKhk9TsBlnNI5ZN6gJAt78ZfQjGDKieN39AnnH3loF7NWQXtAeuFdDy-JemIkVwS5AxHZ6BhuS8w" alt="" data-size="line">

> ### **Test**
>
> Jest(Unit Test)
>
> <img src="https://2891568135-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ft9KwCIANnSY0qzCC9yH3%2Fuploads%2FFnolPKHwhl49ISf7htX6%2Fjest-logo-png-transparent.png?alt=media&amp;token=07a92050-2c9e-45b6-b438-1da0f3ddc458" alt="" data-size="line">

> Date picker
>
> Mui Date Picker
>
> <img src="https://2891568135-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ft9KwCIANnSY0qzCC9yH3%2Fuploads%2FqTyJiO40WaAeThozVT5G%2Flogo.png?alt=media&amp;token=aebf718c-6670-4aa1-9598-788e8384bd32" alt="" data-size="line">

> Charting&#x20;
>
> Victory chart
>
> <img src="https://2891568135-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ft9KwCIANnSY0qzCC9yH3%2Fuploads%2FN0fkpJn977siUEZ6Wfjy%2F%E0%B8%94%E0%B8%B2%E0%B8%A7%E0%B8%99%E0%B9%8C%E0%B9%82%E0%B8%AB%E0%B8%A5%E0%B8%94.png?alt=media&amp;token=4e3798c6-ddff-419b-9322-a1959b08c8c1" alt="" data-size="line">

## <mark style="background-color:blue;">#Naming convention</mark>

> **Varible** : CamelCase
>
> **Function** : CamelCase
>
> **Varible Config** : Screnming Snake Case
>
> **Component** : Upper Camel Case
>
> **File , Folder** : lower camel case,
>
> **Action Store** : Screnming Snake Case
>
> #### Type Interface or Type Assertions :&#x20;
>
> 1. Use [PascalCase](https://dirask.com/posts/Programming-PascalCase-definition-with-example-DLrW6j) for interface names.
> 2. Use [camelCase](https://dirask.com/posts/Programming-camelCase-definition-with-example-1RvaM1) for interface members.
> 3. Use "I" as a prefix for interface names.
> 4. Use "Props" end of interface name
>
> #### State :&#x20;
>
> Use "use" prefix for state name and use "set" prefix for setState

## <mark style="background-color:blue;">#Proejct Structure</mark>

![](https://2891568135-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ft9KwCIANnSY0qzCC9yH3%2Fuploads%2F0mkeilJ3lwZ35f7aFGOc%2F%E0%B8%A0%E0%B8%B2%E0%B8%9E%E0%B8%96%E0%B9%88%E0%B8%B2%E0%B8%A2%E0%B8%AB%E0%B8%99%E0%B9%89%E0%B8%B2%E0%B8%88%E0%B8%AD%202566-03-29%20%E0%B9%80%E0%B8%A7%E0%B8%A5%E0%B8%B2%2015.38.51.png?alt=media\&token=2cc5d208-f1e2-47bc-9f97-0d7893d824b6)

{% hint style="info" %}
assets - ที่เก็บไฟล์ Static เช่น รูปภาพ , font

component - ที่เก็บไฟล์ component ต่างๆ

config - ที่เก็บ config หรือ ค่าคงที่ต่างๆ

Hoc - ที่เก็บไฟล์ HOC หรือ higher order component

hook - ที่เก็บไฟล์ custom hook

page - ที่เก็บไฟล์หน้าหลักของ page

route - ที่เก็บไฟล์สำหรับไว้สร้างหน้า route ต่างๆ

service - ที่เก็บไฟล์สำหรับเรียก service หรือ api&#x20;

store - ที่เก็บไฟล์ของ store ใน redux

styles - ที่เก็บไฟล์สำหรับ custom css

\_\_test\_\_ - ที่เก็บไฟล์สำหรับเขียน unit test

themes - ที่เก็บไฟล์สำหรับ custom themes ของ tailwind

type - ที่เก็บไฟล์สำหรับ global type

utils - ที่เก็บไฟล์สำหรับฟั่งชั่นที่ใช้หลายๆที่&#x20;
{% endhint %}

## <mark style="background-color:blue;">#Pages</mark>

ใน folder pages จะแบ่ง folder ตามชื่อ หน้านั้นๆ(path) โดยแต่ละ folder path จะมี folder แยกย่อยดังนี้

* components - สำหรับไฟล์ component ที่ใช้เฉพาะในหน้านั้นๆ
* contexts - สำหรับไฟล์ context ที่ใช้เฉพาะในหน้านั้นๆ
* types - สำหรับไฟล์ .ts ที่ใช้เฉพาะในหน้านั้นๆ

![](https://2891568135-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Ft9KwCIANnSY0qzCC9yH3%2Fuploads%2F6AIblqPEt9fz3nbHKLRQ%2F%E0%B8%A0%E0%B8%B2%E0%B8%9E%E0%B8%96%E0%B9%88%E0%B8%B2%E0%B8%A2%E0%B8%AB%E0%B8%99%E0%B9%89%E0%B8%B2%E0%B8%88%E0%B8%AD%202566-03-29%20%E0%B9%80%E0%B8%A7%E0%B8%A5%E0%B8%B2%2015.43.43.png?alt=media\&token=63f51743-51c8-4bc8-84ea-d90c1e2f8fad)

{% hint style="info" %}
Design Component

อย่าพยามสร้าง component ที่ nested เกิน 3ขั้น ควรจะ compose ให้ได้มากที่สุด ถ้าเราพยายามที่จะ reuse โค๊ดมากเกินไป มันจะกลายเป็นทำให้ทุกอย่างมัน depend กันเกินไป เวลามี requried ใหม่ๆเข้ามามันไม่สามารถ scale ได้ดีเท่าที่ควร
{% endhint %}
