diff --git a/backend/src/controllers/userController.js b/backend/src/controllers/userController.js index de10150..548661d 100644 --- a/backend/src/controllers/userController.js +++ b/backend/src/controllers/userController.js @@ -1,3 +1,4 @@ +import User from "../models/User.js"; export const authMe = async (req, res) => { try { const user = req.user; // lấy từ authMiddleware @@ -9,4 +10,20 @@ export const authMe = async (req, res) => { console.error("Lỗi khi gọi authMe", error); return res.status(500).json({ message: "Lỗi hệ thống" }); } -}; \ No newline at end of file +}; + +export const searchUserByUserName = async (req, res) => { + try { + const {username} = req.query; + if(!username || username.trim() === ""){ + return res.status(400).json({message:"Hay nhap username"}) + } + + const user = await User.findOne({username}).select("_id displayName userName avartarUrl"); + + return res.status(200).json({user}); + } catch (error) { + console.error("Loi xay ra khi search user by username:",error); + return res.status(500).json({message:"Loi he thong"}) + } +}; diff --git a/backend/src/routes/userRoute.js b/backend/src/routes/userRoute.js index c359aba..bc3c447 100644 --- a/backend/src/routes/userRoute.js +++ b/backend/src/routes/userRoute.js @@ -1,8 +1,9 @@ import express from "express"; -import { authMe } from "../controllers/userController.js"; +import { authMe, searchUserByUserName } from "../controllers/userController.js"; const router = express.Router(); router.get("/me", authMe); +router.get("/search",searchUserByUserName) export default router; \ No newline at end of file diff --git a/frontend/src/components/AddFriendModal/SearchForm.tsx b/frontend/src/components/AddFriendModal/SearchForm.tsx new file mode 100644 index 0000000..7ab45f8 --- /dev/null +++ b/frontend/src/components/AddFriendModal/SearchForm.tsx @@ -0,0 +1,94 @@ +import type { FieldErrors, UseFormRegister } from "react-hook-form"; +import type { IFormValues } from "../chat/modals/AddFriendModal"; +import { Label } from "../ui/label"; +import { Input } from "../ui/input"; +import { DialogClose, DialogFooter } from "../ui/dialog"; +import { Button } from "../ui/button"; +import { LoaderIcon, Search } from "lucide-react"; + +interface SearchFormProps { + register: UseFormRegister; + errors: FieldErrors; + loading: boolean; + usernameValue: string; + isFound: boolean | null; + searchedUsername: string; + onSubmit?: (e: React.FormEvent) => void; + onCancel: () => void; +} + +const SearchForm = ({ + register, + errors, + loading, + usernameValue, + isFound, + searchedUsername, + onSubmit, + onCancel, +}: SearchFormProps) => { + return ( +
+
+ + + {errors.username && ( +

{errors.username.message}

+ )} + + {isFound === false && ( + + Không tìm thấy người dùng + @{searchedUsername} + + )} +
+ + + + + + + + +
+ ); +}; + +export default SearchForm; diff --git a/frontend/src/components/AddFriendModal/SendFriendRequest.tsx b/frontend/src/components/AddFriendModal/SendFriendRequest.tsx new file mode 100644 index 0000000..47f0f3e --- /dev/null +++ b/frontend/src/components/AddFriendModal/SendFriendRequest.tsx @@ -0,0 +1,76 @@ +import type { UseFormRegister } from "react-hook-form"; +import type { IFormValues } from "../chat/modals/AddFriendModal"; +import { Label } from "../ui/label"; +import { Textarea } from "../ui/textarea"; +import { DialogFooter } from "../ui/dialog"; +import { Button } from "../ui/button"; +import { LoaderIcon, UserPlus } from "lucide-react"; + +interface SendRequestProps { + register: UseFormRegister; + loading: boolean; + searchedUserName: string; + onSubmit?: (e: React.FormEvent) => void; + onBack: () => void; +} +const SendFriendRequest = ({ + register, + loading, + searchedUserName, + onSubmit, + onBack, +}: SendRequestProps) => { + return ( +
+
+ + Đã tìm thấy@{searchedUserName} + +
+ +