|
3 | 3 | import type { InterestSubject } from "common/types"; |
4 | 4 | import { useRouter } from "next/navigation"; |
5 | 5 | import { useEffect, useState } from "react"; |
| 6 | +import { MdAdd, MdClose } from "react-icons/md"; |
6 | 7 | import FullScreenCircularProgress from "~/components/common/FullScreenCircularProgress"; |
7 | 8 | import { useAlert } from "~/components/common/alert/AlertProvider"; |
8 | 9 | import { search, update, useMyInterests } from "../../../api/subject"; |
@@ -36,6 +37,8 @@ export default function EditInterest() { |
36 | 37 | if (searchQuery) { |
37 | 38 | const result = await search(searchQuery); |
38 | 39 | setSearchResult(result); |
| 40 | + } else { |
| 41 | + setSearchResult([]); |
39 | 42 | } |
40 | 43 | })(); |
41 | 44 | }, [searchQuery]); |
@@ -68,48 +71,82 @@ export default function EditInterest() { |
68 | 71 | ) : !data ? ( |
69 | 72 | <p>データがありません。</p> |
70 | 73 | ) : ( |
71 | | - <div className="overflow-y-scroll"> |
72 | | - <div className="h-full"> |
73 | | - <ul> |
74 | | - {draftSubjects.map((subject, index) => ( |
75 | | - <li key={subject.id}> |
76 | | - {subject.name} |
77 | | - <button |
78 | | - type="button" |
79 | | - className="btn btn-sm" |
80 | | - onClick={() => |
81 | | - setDraftSubjects((prev) => { |
82 | | - const copy = [...prev]; |
83 | | - copy.splice(index, 1); |
84 | | - return copy; |
85 | | - }) |
86 | | - } |
| 74 | + <div className="h-full overflow-y-scroll"> |
| 75 | + <div className="mx-auto flex h-full max-w-lg flex-col px-4"> |
| 76 | + <div className="flex-1"> |
| 77 | + <div className="flex flex-wrap gap-2 p-2"> |
| 78 | + {draftSubjects.map((subject, index) => ( |
| 79 | + <span |
| 80 | + key={subject.id} |
| 81 | + className="rounded-md bg-[#F7FCFF] px-2 py-1 text-md text-primary" |
87 | 82 | > |
88 | | - x |
89 | | - </button> |
90 | | - </li> |
91 | | - ))} |
92 | | - </ul> |
93 | | - <input |
94 | | - type="text" |
95 | | - value={searchInput} |
96 | | - onChange={(e) => setSearchInput(e.target.value)} |
97 | | - /> |
98 | | - <ul> |
99 | | - {searchResult.map((subject) => ( |
100 | | - <li key={subject.id}> |
101 | | - {subject.name} |
| 83 | + #{subject.name} |
| 84 | + <button |
| 85 | + type="button" |
| 86 | + className="btn btn-circle btn-xs ml-1" |
| 87 | + onClick={() => |
| 88 | + setDraftSubjects((prev) => { |
| 89 | + const copy = [...prev]; |
| 90 | + copy.splice(index, 1); |
| 91 | + return copy; |
| 92 | + }) |
| 93 | + } |
| 94 | + > |
| 95 | + <MdClose className="text-xs" /> |
| 96 | + </button> |
| 97 | + </span> |
| 98 | + ))} |
| 99 | + </div> |
| 100 | + <div className="mt-2 w-full"> |
| 101 | + <input |
| 102 | + type="text" |
| 103 | + value={searchInput} |
| 104 | + onChange={(e) => setSearchInput(e.target.value)} |
| 105 | + placeholder="興味分野タグを検索" |
| 106 | + className="input input-bordered w-full" |
| 107 | + /> |
| 108 | + </div> |
| 109 | + <ul className="mt-2"> |
| 110 | + {searchResult.length !== 0 ? ( |
| 111 | + searchResult |
| 112 | + .filter( |
| 113 | + (subject) => |
| 114 | + !draftSubjects.some((draft) => draft.id === subject.id), |
| 115 | + ) |
| 116 | + .map((subject) => ( |
| 117 | + <li key={subject.id}> |
| 118 | + <button |
| 119 | + type="button" |
| 120 | + className="btn btn-ghost inline-flex h-full w-full justify-start p-2" |
| 121 | + onClick={() => |
| 122 | + setDraftSubjects((prev) => [...prev, subject]) |
| 123 | + } |
| 124 | + > |
| 125 | + <span className="font-normal text-lg"> |
| 126 | + #{subject.name} |
| 127 | + </span> |
| 128 | + </button> |
| 129 | + </li> |
| 130 | + )) |
| 131 | + ) : ( |
| 132 | + <li key="empty" className="p-2 text-gray-500"> |
| 133 | + {searchQuery |
| 134 | + ? "検索結果がありません" |
| 135 | + : "興味分野を検索してみましょう"} |
| 136 | + </li> |
| 137 | + )} |
| 138 | + <li className="flex w-full items-center justify-center py-2"> |
102 | 139 | <button |
103 | 140 | type="button" |
104 | | - className="btn btn-sm" |
105 | | - onClick={() => setDraftSubjects((prev) => [...prev, subject])} |
| 141 | + className="btn btn-secondary px-6 font-normal" |
106 | 142 | > |
107 | | - + |
| 143 | + <MdAdd /> |
| 144 | + タグを新規作成 |
108 | 145 | </button> |
109 | 146 | </li> |
110 | | - ))} |
111 | | - </ul> |
112 | | - <div className="flex justify-between"> |
| 147 | + </ul> |
| 148 | + </div> |
| 149 | + <div className="my-2 flex justify-between"> |
113 | 150 | <button type="button" className="btn btn-sm" onClick={handleBack}> |
114 | 151 | 設定画面に戻る |
115 | 152 | </button> |
|
0 commit comments