Skip to content

Themaoqiu/twitter-clone

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

5 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Twitter Clone ๐Ÿฆ

ไธ€ไธชๅŸบไบŽ Next.js 16 ๆž„ๅปบ็š„ๅ…จๆ ˆ Twitter ๅ…‹้š†้กน็›ฎ,ๅฎž็Žฐไบ†็คพไบคๅช’ไฝ“็š„ๆ ธๅฟƒๅŠŸ่ƒฝใ€‚

๐Ÿ“‹ ็›ฎๅฝ•

๐Ÿ› ๏ธ ๆŠ€ๆœฏๆ ˆ

ๆ ธๅฟƒๆก†ๆžถ

  • Next.js 16 - React ๅ…จๆ ˆๆก†ๆžถ
  • TypeScript - ็ฑปๅž‹ๅฎ‰ๅ…จ
  • React 18 - UI ๅบ“

ๆ•ฐๆฎๅบ“ & ่ฎค่ฏ

  • Prisma - ORM ๆ•ฐๆฎๅบ“ๅทฅๅ…ท
  • NextAuth.js - ่บซไปฝ่ฎค่ฏ
  • MongoDB / PostgreSQL - ๆ•ฐๆฎๅบ“

UI ็ป„ไปถ

  • Tailwind CSS - ๆ ทๅผๆก†ๆžถ
  • Radix UI - ๆ— ๅคด็ป„ไปถๅบ“
  • React Icons - ๅ›พๆ ‡ๅบ“
  • Sonner - Toast ้€š็Ÿฅ
  • React Dropzone - ๆ–‡ไปถไธŠไผ 

ๆ•ฐๆฎ่Žทๅ–

  • SWR - React Hooks ๆ•ฐๆฎ่Žทๅ–ๅบ“
  • Axios - HTTP ๅฎขๆˆท็ซฏ

โœจ ๅŠŸ่ƒฝ็‰นๆ€ง

๐Ÿ‘ค ็”จๆˆทๅŠŸ่ƒฝ

  • โœ… ็”จๆˆทๆณจๅ†Œ/็™ปๅฝ•/็™ปๅ‡บ
  • โœ… ไธชไบบ่ต„ๆ–™็ผ–่พ‘ (ๅคดๅƒใ€ๅฐ้ขใ€ไธชไบบ็ฎ€ไป‹)
  • โœ… ็”จๆˆทๅ…ณๆณจ/ๅ–ๆถˆๅ…ณๆณจ
  • โœ… ็”จๆˆทไธป้กตๅฑ•็คบ

๐Ÿ“ ๅธ–ๅญๅŠŸ่ƒฝ

  • โœ… ๅ‘ๅธƒๆŽจๆ–‡(ๆ”ฏๆŒๅ›พ็‰‡ไธŠไผ )
  • โœ… ็‚น่ตž/ๅ–ๆถˆ็‚น่ตžๆŽจๆ–‡
  • โœ… ่ฏ„่ฎบๆŽจๆ–‡
  • โœ… ๆŽจๆ–‡่ฏฆๆƒ…้กต
  • โœ… ๆŽจๆ–‡ๆ—ถ้—ด็บฟๅฑ•็คบ

๐Ÿ”” ้€š็Ÿฅ็ณป็ปŸ

  • โœ… ๅ…ณๆณจ้€š็Ÿฅ
  • โœ… ็‚น่ตž้€š็Ÿฅ
  • โœ… ่ฏ„่ฎบ้€š็Ÿฅ
  • โœ… ้€š็Ÿฅๆœช่ฏปๆ ‡่ฎฐ

๐ŸŽจ UI/UX

  • โœ… ๅ“ๅบ”ๅผ่ฎพ่ฎก
  • โœ… ๆจกๆ€ๆก†ไบคไบ’
  • โœ… Toast ๆ็คบ
  • โœ… ๅŠ ่ฝฝ็Šถๆ€
  • โœ… ้”™่ฏฏๅค„็†

๐Ÿ“ ้กน็›ฎ็ป“ๆž„

twitter-clone/
โ”œโ”€โ”€ ๐Ÿ“ฑ app/                          # Next.js App Router
โ”‚   โ”œโ”€โ”€ api/                        # API ่ทฏ็”ฑ
โ”‚   โ”‚   โ”œโ”€โ”€ auth/[...nextauth]/    # NextAuth ่ฎค่ฏ็ซฏ็‚น
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ route.ts           # ๐Ÿ”‘ ่ฎค่ฏ้…็ฝฎ (CredentialsProvider)
โ”‚   โ”‚   โ”œโ”€โ”€ comments/              # ๐Ÿ’ฌ ่ฏ„่ฎบ API
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ route.ts           # ๅˆ›ๅปบ่ฏ„่ฎบ,่งฆๅ‘้€š็Ÿฅ
โ”‚   โ”‚   โ”œโ”€โ”€ current/               # ๐Ÿ‘ค ่Žทๅ–ๅฝ“ๅ‰็”จๆˆท
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ route.ts           # ่ฟ”ๅ›žไผš่ฏ็”จๆˆทไฟกๆฏ
โ”‚   โ”‚   โ”œโ”€โ”€ edit/                  # โœ๏ธ ็ผ–่พ‘็”จๆˆท่ต„ๆ–™
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ route.ts           # ๆ›ดๆ–ฐ็”จๆˆทๅ/็ฎ€ไป‹/ๅคดๅƒ/ๅฐ้ข
โ”‚   โ”‚   โ”œโ”€โ”€ follow/                # ๐Ÿค ๅ…ณๆณจ/ๅ–ๆถˆๅ…ณๆณจ
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ route.ts           # ๅค„็†ๅ…ณๆณจ้€ป่พ‘,ๅˆ›ๅปบ้€š็Ÿฅ
โ”‚   โ”‚   โ”œโ”€โ”€ like/                  # โค๏ธ ็‚น่ตž/ๅ–ๆถˆ็‚น่ตž
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ route.ts           # ๅค„็†็‚น่ตž้€ป่พ‘,ๅˆ›ๅปบ้€š็Ÿฅ
โ”‚   โ”‚   โ”œโ”€โ”€ notifications/         # ๐Ÿ”” ้€š็Ÿฅ API
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ [userId]/
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ route.ts       # ่Žทๅ–็”จๆˆท้€š็Ÿฅๅˆ—่กจ
โ”‚   โ”‚   โ”œโ”€โ”€ posts/                 # ๐Ÿ“ ๆŽจๆ–‡ API
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ route.ts           # ๅˆ›ๅปบๆŽจๆ–‡,่Žทๅ–ๆŽจๆ–‡ๅˆ—่กจ
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ [postId]/
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ route.ts       # ่Žทๅ–ๅ•ๆกๆŽจๆ–‡่ฏฆๆƒ…
โ”‚   โ”‚   โ”œโ”€โ”€ register/              # ๐Ÿ“‹ ็”จๆˆทๆณจๅ†Œ
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ route.ts           # ๅˆ›ๅปบๆ–ฐ็”จๆˆท (bcrypt ๅŠ ๅฏ†)
โ”‚   โ”‚   โ””โ”€โ”€ users/                 # ๐Ÿ‘ฅ ็”จๆˆทไฟกๆฏ
โ”‚   โ”‚       โ”œโ”€โ”€ route.ts           # ่Žทๅ–็”จๆˆทๅˆ—่กจ
โ”‚   โ”‚       โ””โ”€โ”€ [userId]/
โ”‚   โ”‚           โ””โ”€โ”€ route.ts       # ่Žทๅ–ๆŒ‡ๅฎš็”จๆˆทไฟกๆฏ
โ”‚   โ”œโ”€โ”€ notifications/             # ๐Ÿ”” ้€š็Ÿฅ้กต้ข
โ”‚   โ”‚   โ””โ”€โ”€ page.tsx               # ๆ˜พ็คบ้€š็Ÿฅๅˆ—่กจ
โ”‚   โ”œโ”€โ”€ posts/[postId]/           # ๐Ÿ“„ ๆŽจๆ–‡่ฏฆๆƒ…้กต
โ”‚   โ”‚   โ””โ”€โ”€ page.tsx               # ๆŽจๆ–‡่ฏฆๆƒ… + ่ฏ„่ฎบ
โ”‚   โ”œโ”€โ”€ users/[userid]/           # ๐Ÿ‘ค ็”จๆˆทไธป้กต
โ”‚   โ”‚   โ””โ”€โ”€ page.tsx               # ็”จๆˆท่ต„ๆ–™ + ๆŽจๆ–‡ๅˆ—่กจ
โ”‚   โ”œโ”€โ”€ layout.tsx                 # ๐Ÿ—๏ธ ๆ นๅธƒๅฑ€ (ไพง่พนๆ +ๅ†…ๅฎน+ๅ…ณๆณจๆ )
โ”‚   โ”œโ”€โ”€ page.tsx                   # ๐Ÿ  ้ฆ–้กต (ๆŽจๆ–‡ๆต)
โ”‚   โ””โ”€โ”€ globals.css                # ๐ŸŽจ ๅ…จๅฑ€ๆ ทๅผ
โ”‚
โ”œโ”€โ”€ ๐ŸŽจ components/                   # React ็ป„ไปถ
โ”‚   โ”œโ”€โ”€ layout/                    # ๅธƒๅฑ€็ป„ไปถ
โ”‚   โ”‚   โ”œโ”€โ”€ Sidebar.tsx           # ๐Ÿ“ ไพง่พนๆ ๅฏผ่ˆช (้ฆ–้กต/้€š็Ÿฅ/ไธชไบบ)
โ”‚   โ”‚   โ”œโ”€โ”€ SidebarItem.tsx       # ๐Ÿ”˜ ไพง่พนๆ ๅ•้กน (้ซ˜ไบฎ/่ทฏ็”ฑ)
โ”‚   โ”‚   โ”œโ”€โ”€ SidebarLogo.tsx       # ๐Ÿฆ Twitter Logo
โ”‚   โ”‚   โ”œโ”€โ”€ SidebarTwitterButton.tsx # โœ๏ธ ๅ‘ๆŽจๆŒ‰้’ฎ (ๆ‰“ๅผ€็™ปๅฝ•)
โ”‚   โ”‚   โ””โ”€โ”€ FollowBar.tsx         # ๐Ÿ‘ฅ ๆŽจ่ๅ…ณๆณจๆ  (็”จๆˆทๅˆ—่กจ)
โ”‚   โ”œโ”€โ”€ modals/                    # ๅผน็ช—็ป„ไปถ
โ”‚   โ”‚   โ”œโ”€โ”€ LoginModal.tsx        # ๐Ÿ” ็™ปๅฝ•ๅผน็ช— (้‚ฎ็ฎฑ/ๅฏ†็ )
โ”‚   โ”‚   โ”œโ”€โ”€ RegisterModal.tsx     # ๐Ÿ“ ๆณจๅ†Œๅผน็ช— (้‚ฎ็ฎฑ/ๅฏ†็ /็”จๆˆทๅ)
โ”‚   โ”‚   โ””โ”€โ”€ EditModal.tsx         # โœ๏ธ ็ผ–่พ‘่ต„ๆ–™ๅผน็ช— (ไธŠไผ ๅ›พ็‰‡)
โ”‚   โ”œโ”€โ”€ posts/                     # ๆŽจๆ–‡็›ธๅ…ณ็ป„ไปถ
โ”‚   โ”‚   โ”œโ”€โ”€ PostFeed.tsx          # ๐Ÿ“ฐ ๆŽจๆ–‡ๆต (ๆ— ้™ๅŠ ่ฝฝ)
โ”‚   โ”‚   โ”œโ”€โ”€ PostItem.tsx          # ๐Ÿ“„ ๅ•ๆกๆŽจๆ–‡ๅก็‰‡ (็‚น่ตž/่ฏ„่ฎบ)
โ”‚   โ”‚   โ”œโ”€โ”€ CommentFeed.tsx       # ๐Ÿ’ฌ ่ฏ„่ฎบๆต
โ”‚   โ”‚   โ””โ”€โ”€ CommendItem.tsx       # ๐Ÿ’ฌ ๅ•ๆก่ฏ„่ฎบ
โ”‚   โ”œโ”€โ”€ users/                     # ็”จๆˆท็›ธๅ…ณ็ป„ไปถ
โ”‚   โ”‚   โ”œโ”€โ”€ UserBio.tsx           # ๐Ÿ“‹ ็”จๆˆท็ฎ€ไป‹ (ๅ…ณๆณจๆŒ‰้’ฎ/็ปŸ่ฎก)
โ”‚   โ”‚   โ””โ”€โ”€ UserHero.tsx          # ๐Ÿ–ผ๏ธ ็”จๆˆทๅฐ้ข (็ผ–่พ‘ๆŒ‰้’ฎ)
โ”‚   โ”œโ”€โ”€ Avatar.tsx                 # ๐Ÿ‘ค ๅคดๅƒ็ป„ไปถ (็‚นๅ‡ป่ทณ่ฝฌ)
โ”‚   โ”œโ”€โ”€ Button.tsx                 # ๐Ÿ”˜ ๆŒ‰้’ฎ็ป„ไปถ (ๅคš็งๆ ทๅผ)
โ”‚   โ”œโ”€โ”€ Form.tsx                   # โœ๏ธ ๅ‘ๆŽจ่กจๅ• (ๆ–‡ๆœฌ+ๅ›พ็‰‡)
โ”‚   โ”œโ”€โ”€ Header.tsx                 # ๐Ÿ“Œ ้กต้ขๅคด้ƒจ (่ฟ”ๅ›žๆŒ‰้’ฎ+ๆ ‡้ข˜)
โ”‚   โ”œโ”€โ”€ ImageUpload.tsx            # ๐Ÿ“ธ ๅ›พ็‰‡ไธŠไผ  (Cloudinary)
โ”‚   โ”œโ”€โ”€ Input.tsx                  # ๐Ÿ“ ่พ“ๅ…ฅๆก†็ป„ไปถ
โ”‚   โ”œโ”€โ”€ Modal.tsx                  # ๐ŸชŸ ๆจกๆ€ๆก†ๅŸบ็ก€็ป„ไปถ
โ”‚   โ””โ”€โ”€ NotificationsFeed.tsx      # ๐Ÿ”” ้€š็Ÿฅๆต
โ”‚
โ”œโ”€โ”€ ๐Ÿช hooks/                        # ่‡ชๅฎšไน‰ Hooks
โ”‚   โ”œโ”€โ”€ useCurrentUser.ts         # ๐Ÿ‘ค ่Žทๅ–ๅฝ“ๅ‰็”จๆˆท (SWR)
โ”‚   โ”œโ”€โ”€ useUser.ts                # ๐Ÿ‘ค ่Žทๅ–ๆŒ‡ๅฎš็”จๆˆท (SWR)
โ”‚   โ”œโ”€โ”€ useUsers.ts               # ๐Ÿ‘ฅ ่Žทๅ–็”จๆˆทๅˆ—่กจ (SWR)
โ”‚   โ”œโ”€โ”€ usePost.ts                # ๐Ÿ“„ ่Žทๅ–ๅ•ๆกๆŽจๆ–‡ (SWR)
โ”‚   โ”œโ”€โ”€ usePosts.ts               # ๐Ÿ“ฐ ่Žทๅ–ๆŽจๆ–‡ๅˆ—่กจ (SWR)
โ”‚   โ”œโ”€โ”€ useLike.ts                # โค๏ธ ็‚น่ตž้€ป่พ‘ (ไน่ง‚ๆ›ดๆ–ฐ)
โ”‚   โ”œโ”€โ”€ useFollow.ts              # ๐Ÿค ๅ…ณๆณจ้€ป่พ‘ (ไน่ง‚ๆ›ดๆ–ฐ)
โ”‚   โ”œโ”€โ”€ useNotifications.ts       # ๐Ÿ”” ้€š็Ÿฅ้€ป่พ‘ (SWR)
โ”‚   โ”œโ”€โ”€ useLoginModal.ts          # ๐Ÿ” ็™ปๅฝ•ๅผน็ช—็Šถๆ€ (Zustand)
โ”‚   โ”œโ”€โ”€ useRegisterModal.ts       # ๐Ÿ“ ๆณจๅ†Œๅผน็ช—็Šถๆ€ (Zustand)
โ”‚   โ””โ”€โ”€ useEditModal.ts           # โœ๏ธ ็ผ–่พ‘ๅผน็ช—็Šถๆ€ (Zustand)
โ”‚
โ”œโ”€โ”€ ๐Ÿ”ง lib/                          # ๅทฅๅ…ทๅบ“
โ”‚   โ”œโ”€โ”€ prismadb.ts               # ๐Ÿ’พ Prisma ๅฎขๆˆท็ซฏๅ•ไพ‹
โ”‚   โ”œโ”€โ”€ serverAuth.ts             # ๐Ÿ”‘ ๆœๅŠก็ซฏ่ฎค่ฏๅทฅๅ…ท
โ”‚   โ”œโ”€โ”€ fetcher.ts                # ๐Ÿ”„ SWR fetcher (Axios)
โ”‚   โ””โ”€โ”€ utils.ts                  # ๐Ÿ› ๏ธ ๅทฅๅ…ทๅ‡ฝๆ•ฐ (cn, clsx)
โ”‚
โ”œโ”€โ”€ ๐Ÿ—„๏ธ prisma/                      # Prisma ้…็ฝฎ
โ”‚   โ””โ”€โ”€ schema.prisma             # ๐Ÿ“Š ๆ•ฐๆฎๅบ“ๆจกๅž‹ๅฎšไน‰
โ”‚                                 # - User (็”จๆˆท)
โ”‚                                 # - Post (ๆŽจๆ–‡)
โ”‚                                 # - Comment (่ฏ„่ฎบ)
โ”‚                                 # - Notification (้€š็Ÿฅ)
โ”‚
โ”œโ”€โ”€ ๐Ÿ“ ้…็ฝฎๆ–‡ไปถ
โ”‚   โ”œโ”€โ”€ .env                      # ๐Ÿ” ็Žฏๅขƒๅ˜้‡
โ”‚   โ”œโ”€โ”€ next.config.ts            # โš™๏ธ Next.js ้…็ฝฎ
โ”‚   โ”œโ”€โ”€ tailwind.config.ts        # ๐ŸŽจ Tailwind ้…็ฝฎ
โ”‚   โ”œโ”€โ”€ tsconfig.json             # ๐Ÿ“˜ TypeScript ้…็ฝฎ
โ”‚   โ”œโ”€โ”€ prisma.config.ts          # ๐Ÿ’พ Prisma ้…็ฝฎ
โ”‚   โ”œโ”€โ”€ components.json           # ๐ŸŽจ Shadcn UI ้…็ฝฎ
โ”‚   โ””โ”€โ”€ package.json              # ๐Ÿ“ฆ ไพ่ต–็ฎก็†
โ”‚
โ””โ”€โ”€ ๐Ÿ–ผ๏ธ public/                      # ้™ๆ€่ต„ๆบ
    โ””โ”€โ”€ images/
        โ””โ”€โ”€ placeholder.png       # ๅ ไฝๅ›พ

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

1๏ธโƒฃ ๅ…‹้š†้กน็›ฎ

git clone <repository-url>
cd twitter-clone

2๏ธโƒฃ ๅฎ‰่ฃ…ไพ่ต–

npm install

3๏ธโƒฃ ้…็ฝฎ็Žฏๅขƒๅ˜้‡

ๅˆ›ๅปบ .env ๆ–‡ไปถๅนถ้…็ฝฎไปฅไธ‹ๅ˜้‡:

# ๆ•ฐๆฎๅบ“
DATABASE_URL="your_database_url"

# NextAuth
NEXTAUTH_SECRET="your_nextauth_secret"
NEXTAUTH_URL="http://localhost:3000"

4๏ธโƒฃ ๅˆๅง‹ๅŒ–ๆ•ฐๆฎๅบ“

# ็”Ÿๆˆ Prisma Client
npx prisma generate

# ๅŒๆญฅๆ•ฐๆฎๅบ“็ป“ๆž„
npx prisma db push

# (ๅฏ้€‰) ๆ‰“ๅผ€ Prisma Studio ๆŸฅ็œ‹ๆ•ฐๆฎ
npx prisma studio

5๏ธโƒฃ ๅฏๅŠจๅผ€ๅ‘ๆœๅŠกๅ™จ

npm run dev

ๆ‰“ๅผ€ http://localhost:3000 ๆŸฅ็œ‹ๅบ”็”จใ€‚

๐Ÿ” ็Žฏๅขƒๅ˜้‡้…็ฝฎ

ๅ˜้‡ๅ ่ฏดๆ˜Ž ๅฟ…้œ€ ็คบไพ‹
DATABASE_URL ๆ•ฐๆฎๅบ“่ฟžๆŽฅ URL โœ… mongodb+srv://... ๆˆ– postgresql://...
NEXTAUTH_SECRET NextAuth ๅฏ†้’ฅ โœ… ไฝฟ็”จ openssl rand -base64 32 ็”Ÿๆˆ
NEXTAUTH_URL ๅบ”็”จ URL โœ… http://localhost:3000
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME Cloudinary ไบ‘ๅ็งฐ โŒ ็”จไบŽๅ›พ็‰‡ไธŠไผ 

๐Ÿ“ฆ ้ƒจ็ฝฒ

Vercel โšก

  1. ๆŽจ้€ไปฃ็ ๅˆฐ GitHub
  2. ๅœจ Vercel ๅฏผๅ…ฅ้กน็›ฎ
  3. ้…็ฝฎ็Žฏๅขƒๅ˜้‡
  4. ้ƒจ็ฝฒ ๐Ÿš€

Deploy with Vercel

๐ŸŽฏ ๆ ธๅฟƒๆ–‡ไปถ่ฏดๆ˜Ž

๐Ÿ”‘ ่ฎค่ฏ็›ธๅ…ณ

  • app/api/auth/[...nextauth]/route.ts

    • NextAuth ้…็ฝฎ
    • CredentialsProvider ้‚ฎ็ฎฑๅฏ†็ ็™ปๅฝ•
    • bcrypt ๅฏ†็ ้ชŒ่ฏ
  • lib/serverAuth.ts

    • ๆœๅŠก็ซฏ่ฎค่ฏๅทฅๅ…ท
    • ้ชŒ่ฏ็”จๆˆทไผš่ฏ
    • ่ฟ”ๅ›žๅฝ“ๅ‰็”จๆˆท
  • hooks/useCurrentUser.ts

    • ๅฎขๆˆท็ซฏ่Žทๅ–ๅฝ“ๅ‰็”จๆˆท
    • ไฝฟ็”จ SWR ็ผ“ๅญ˜

๐Ÿ’พ ๆ•ฐๆฎๅบ“

  • prisma/schema.prisma

    • ๆ•ฐๆฎๅบ“ๆจกๅž‹ๅฎšไน‰
    • User: ็”จๆˆทไฟกๆฏใ€ๅ…ณๆณจๅ…ณ็ณปใ€็‚น่ตžๅˆ—่กจ
    • Post: ๆŽจๆ–‡ๅ†…ๅฎนใ€ไฝœ่€…ใ€็‚น่ตžๆ•ฐใ€่ฏ„่ฎบ
    • Comment: ่ฏ„่ฎบๅ†…ๅฎนใ€ไฝœ่€…ใ€ๆ‰€ๅฑžๆŽจๆ–‡
    • Notification: ้€š็Ÿฅ็ฑปๅž‹ใ€ๆŽฅๆ”ถ่€…ใ€ๅ‘้€่€…
  • lib/prismadb.ts

    • Prisma ๅฎขๆˆท็ซฏๅ•ไพ‹
    • ้˜ฒๆญขๅผ€ๅ‘็Žฏๅขƒ้‡ๅคๅฎžไพ‹ๅŒ–

๐ŸŽฃ ๆ ธๅฟƒ Hooks

  • hooks/useLike.ts โญ

    • ็‚น่ตžๅŠŸ่ƒฝๆ ธๅฟƒ้€ป่พ‘
    • ไฝฟ็”จ SWR ไน่ง‚ๆ›ดๆ–ฐ
    • ๅŽ็ซฏ่ฟ”ๅ›žๆœ€ๆ–ฐๆ•ฐๆฎ่ฆ†็›–็ผ“ๅญ˜
    • ๆœช็™ปๅฝ•ๆ—ถๆ‰“ๅผ€็™ปๅฝ•ๅผน็ช—
  • hooks/useFollow.ts

    • ๅ…ณๆณจๅŠŸ่ƒฝ้€ป่พ‘
    • ไน่ง‚ๆ›ดๆ–ฐๅ…ณๆณจ็Šถๆ€
    • ่งฆๅ‘้€š็Ÿฅๅˆ›ๅปบ
  • hooks/usePost.ts & hooks/usePosts.ts

    • ๆŽจๆ–‡ๆ•ฐๆฎ่Žทๅ–
    • SWR ่‡ชๅŠจ็ผ“ๅญ˜ๅ’Œ้‡ๆ–ฐ้ชŒ่ฏ
    • ๆ”ฏๆŒๆŒ‰็”จๆˆท ID ็ญ›้€‰

๐ŸŽจ UI ็ป„ไปถ

  • components/Form.tsx

    • ๅ‘ๆŽจ่กจๅ•
    • ๆ”ฏๆŒๆ–‡ๆœฌๅ’Œๅ›พ็‰‡
    • ๅญ—็ฌฆ่ฎกๆ•ฐ
  • components/posts/PostItem.tsx

    • ๆŽจๆ–‡ๅก็‰‡
    • ๆ˜พ็คบไฝœ่€…ใ€ๅ†…ๅฎนใ€ๆ—ถ้—ด
    • ็‚น่ตžใ€่ฏ„่ฎบไบคไบ’
  • components/layout/Sidebar.tsx

    • ไพง่พนๆ ๅฏผ่ˆช
    • ๅ“ๅบ”ๅผ่ฎพ่ฎก
    • ้ซ˜ไบฎๅฝ“ๅ‰้กต้ข

๐Ÿ“ก API ่ทฏ็”ฑ

  • app/api/like/route.ts

    • POST: ็‚น่ตžๆŽจๆ–‡
    • DELETE: ๅ–ๆถˆ็‚น่ตž
    • ๅˆ›ๅปบ็‚น่ตž้€š็Ÿฅ
  • app/api/follow/route.ts

    • POST: ๅ…ณๆณจ็”จๆˆท
    • DELETE: ๅ–ๆถˆๅ…ณๆณจ
    • ๅˆ›ๅปบๅ…ณๆณจ้€š็Ÿฅ
  • app/api/posts/route.ts

    • GET: ่Žทๅ–ๆŽจๆ–‡ๅˆ—่กจ (ๆ”ฏๆŒ userId ๅ‚ๆ•ฐ)
    • POST: ๅˆ›ๅปบๆ–ฐๆŽจๆ–‡

ๅผ€ๅ‘ๆต็จ‹

  1. Fork ๆœฌไป“ๅบ“
  2. ๅˆ›ๅปบ็‰นๆ€งๅˆ†ๆ”ฏ (git checkout -b feature/AmazingFeature)
  3. ๆไบคๆ›ดๆ”น (git commit -m 'Add some AmazingFeature')
  4. ๆŽจ้€ๅˆฐๅˆ†ๆ”ฏ (git push origin feature/AmazingFeature)
  5. ๅผ€ๅฏ Pull Request

Made with โค๏ธ using Next.js

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors