기상 시간 | 오전..? |
---|---|
전날 취침 시간 | 왜 오전,,,? |
컨디션 | 이상하게좋다! |
<개인>
import axios from "axios";
import client from "../../client/client";
/**
* @author yeowool
* @description searchInput을 props로 받아서 검색 조건에 맞는 id 배열을 return
**/
const getAllUserId = (searchInput: string) => {
// 요청메소드 + 요청정보
return axios.get(`/members/search?id=${searchInput}`, {
baseURL: process.env.NEXT_PUBLIC_API_URL,
headers: {
withCredentials: true,
"Content-Type": `application/json`,
},
});
};
export default getAllUserId;
이렇게 get요청을 보내고 뒤에 사용자가 입력하는 input을 넣는다.
import axios from "axios";
import client from "../../client/client";
/**
* @author yeowool
* @description searchInput을 props로 받아서 검색 조건에 맞는 id 배열을 return
**/
const getAllUserId = (searchInput: string) => {
// 요청메소드 + 요청정보
return axios.get(`/members/search?id=${searchInput}`, {
baseURL: process.env.NEXT_PUBLIC_API_URL,
headers: {
withCredentials: true,
"Content-Type": `application/json`,
},
});
};
export default getAllUserId;
useGetAllUsers.tsximport {
useQuery,
useQueryClient,
useQueryErrorResetBoundary,
} from "react-query";
import getUserId from "../../apis/user/getUserId";
const useGetAllUsers = (searchInput: string) => {
return useQuery(["get/useGetAllUser"], () => getUserId(searchInput), {
enabled: false,
});
};
export default useGetAllUsers;
AddShareContainer.tsximport BoardModalContainer from "./BoardModalContainer";
import Search from "./Search";
import React, { useEffect, useState } from "react";
import { useRecoilState } from "recoil";
import { modalOpenState } from "../recoil/calendarAtom";
import useGetAllUsers from "../hooks/user/useGetAllUsers";
import ShareNoticeContainer from "./ShareNoticeContainer";
interface idType {
id: string;
}
interface ShareProps {
changeShare: (share: string) => void;
}
const AddShareContainer = ({ changeShare }: ShareProps) => {
const [open, setOpen] = useRecoilState(modalOpenState);
const [input, setInput] = useState<string>("");
const [categoryList, setCategoryList] = useState<Array<idType>>([]);
const [tagList, setTagList] = useState<Array<idType>>([]);
const [isNotEmpty, setisNotEmpty] = useState<boolean>(false);
const [searchTag, setsearchTag] = useState<string>("");
const { data: allUsers, refetch: allUsersRefetch } = useGetAllUsers(input);
const Tagging = (e: any) => {
allUsersRefetch();
const userId = e.target.value;
setsearchTag(userId);
const newTagList = tagList;
newTagList.push({ id: e.target.value });
setTagList(newTagList);
setInput("");
};
const deleteTagItem = (id: string) => {
for (let i = 0; i < tagList.length; i++) {
if (tagList[i].id === id) {
setTagList(
tagList.filter((element, index) => {
return element.id !== id;
}),
);
}
}
};
useEffect(() => {
if (allUsers !== undefined) {
const userSearch = allUsers.data;
const filterdUserTags = userSearch.filter((x: { id: string }) =>
x.id.includes(input),
);
const filteredTagLists = filterdUserTags
.map((el: any) => el.id)
.filter((el: any) => !tagList.map(el => el.id).includes(el))
.map((el: any) => ({ id: el }));
setisNotEmpty(true);
setCategoryList(filteredTagLists);
}
let sendtags: string = "";
for (let i = 0; i < tagList.length; i++) {
if (i === tagList.length - 1) {
sendtags += tagList[i].id;
} else {
sendtags += tagList[i].id + ",";
}
}
changeShare(sendtags);
}, [allUsers]);
const inputChange = async (e: any) => {
const inputValue = e.target.value;
if (inputValue !== "") {
await setInput(inputValue);
await allUsersRefetch();
} else {
setisNotEmpty(false);
setInput("");
}
};
useEffect(() => {
if (open === false) {
setTagList([]);
changeShare("");
setInput("");
}
}, [open]);
return (
<>
<BoardModalContainer>
<div className="flex flex-row w-full h-fit justify-between items-center p-0.5">
<div className=" w-full h-fit inline-flex relative items-start flex-rap">
<div className="w-fit h-fit flex ">
<Search />
</div>
<div className="pl-2 w-full h-fit flex flex-col flex-rapo ">
<input
type="text"
value={input}
placeholder="공유하고 싶은 사람을 검색하세요!"
className="ml-1 w-full font-SCDream3 text-left text-sm md:text-sm lg:text-sm p-1 rounded-md text-gray-700 outline-none"
onChange={inputChange}
/>
<div className="w-full h-full flex items-baseline flex-row flex-wrap">
{tagList.map((tagItem, index) => {
return (
<div
key={index}
onClick={() => deleteTagItem(tagItem.id)}
className="mr-2 mb-2 text-white pr-3 pl-2 pm-2 cursor-pointer inline-flex justify-center w-fit h-full hover:bg-red-400 bg-btnOrange rounded-full"
>
<p className="pb-1">{tagItem.id}</p>
<button className="text-lg">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="3"
stroke="currentColor"
className="w-4 h-4"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
);
})}
{tagList.length !== 0 ? (
<p className="text-xs font-SCDream3 text-gray-700 min-w-fit">
님과 함께합니다
</p>
) : null}
</div>
<div
className={`w-full ${isNotEmpty && input ? null : "hidden"}`}
// className={`pl-2 w-full h-fit max-h-28 flex flex-col flex-rap ${
// tagList.length === 0 ? null : "overflow-x-auto "
// }`}
role="menu"
>
<div className="w-full h-full flex items-baseline flex-row flex-wrap flex-rap ">
{categoryList.map((el: { id: string }) => {
return (
<button
key={el.id}
className="my-1 mr-5 pb-1 text-white pr-3 pl-2 pm-3 cursor-pointer inline-flex justify-center w-fit h-full hover:bg-btnOrange bg-underbar rounded-full "
onClick={Tagging}
value={el.id}
>
{el.id}
</button>
);
})}
</div>
</div>
</div>
</div>
</div>
</BoardModalContainer>
</>
);
};
export default AddShareContainer;
[React, typescript] 다른 컴포넌트에 props로 함수 넘겨주기
// 인터페이스 선언
interface ShareProps {
changeShare: (share: string) => void;
}
// props 선언
const AddShareContainer = ({ changeShare }: ShareProps) => {
...
// 최종 선택한 태그 props에 담기
changeShare(sendtags);
...
// 태깅이 이루어지는 컴포넌트 inport
import AddShareContainer from "./AddShareContainer";
...
// 태그유저값 상태선언
const [share, setShare] = useState<any>([]);
...
// props함수 선언
const changeShare = (share: string) => {
setShare(share);
};
...
// 태그 렌더와 함께 props조건에 맞추어 작성
<AddShareContainer changeShare={changeShare} />
나는 아직 기능 구현에 급급해서 어떤게 더 효율적인지 생각을 못했던 듯 하다.
다른 팀원의 말을 들으니 정말 그렇겠구나 라는 생각을 했다.
나중에 비슷한 기능을 구현 할 경우 거기에서는 100명의 유저가 아닌 더 많은 유저를 대상으로 기능을 구현 할 텐데 이렇게 기능이 어떻게 하면 효율적으로 구현 될 수 있을까에 대한 고민의 중요성을 깨닫게 된 날이었다.