Skip to content

Commit f454ed5

Browse files
authored
[#136] πŸ› λΉŒλ“œ μ—λŸ¬ ν•΄κ²° (#195)
* [#136] ♻️ turn checkbox button from button tag into div tag * [#136] πŸ› add handleChange methods to send down to select components * [#136] ♻️ change data structure of selected values in select component into set * [#136] πŸ› solve light build issues * [#136] πŸ› solve set using array methods property issues * [#136] πŸ—‘οΈ remove select stories
1 parent 347d9f3 commit f454ed5

File tree

8 files changed

+42
-164
lines changed

8 files changed

+42
-164
lines changed

β€Žsrc/app/(pages)/team/page.tsxβ€Ž

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ export default function TeamPage(): JSX.Element {
247247
console.log(`κΈ°μ‘΄ twMergeEx : ${twMergeEx(mergeText)}`)
248248

249249
const [techStack, setTechstack] = useState<string[]>([])
250-
const [position, setPosition] = useState('')
250+
const [position, setPosition] = useState<string[]>([])
251251
const [order, setOrder] = useState<'recent' | 'like'>('recent')
252252
const { isOpen: onRecruitment, toggle: toggleRecruitment } = useToggle()
253253
const {
@@ -261,12 +261,11 @@ export default function TeamPage(): JSX.Element {
261261
} = usePagination({ totalItems: 20, itemsPerPage: 10, buttonsPerPage: 10 })
262262
const [teamType, setTeamType] = useState<TeamType>('STUDY')
263263

264-
const handleTechStack = (newValue: string) => {
265-
if (techStack.includes(newValue)) {
266-
setTechstack(prev => prev.filter(item => item !== newValue))
267-
} else {
268-
setTechstack(prev => [...prev, newValue])
269-
}
264+
const handleTechStackChange = (values: string[]) => {
265+
setTechstack(() => values)
266+
}
267+
const handlePositionChange = (values: string[]) => {
268+
setPosition(() => values)
270269
}
271270

272271
return (
@@ -355,7 +354,7 @@ export default function TeamPage(): JSX.Element {
355354
options={stackOptions}
356355
isMulti={true}
357356
isSearchable={true}
358-
onChange={setTechstack}
357+
onChange={handleTechStackChange}
359358
>
360359
<Select.Trigger placeholder='기술 μŠ€νƒ' />
361360
<Select.Menu className='w-246'>
@@ -366,7 +365,7 @@ export default function TeamPage(): JSX.Element {
366365
options={positionOptions}
367366
isMulti={true}
368367
isSearchable={false}
369-
onChange={setPosition}
368+
onChange={handlePositionChange}
370369
>
371370
<Select.Trigger placeholder='ν¬μ§€μ…˜' />
372371
<Select.Menu className='w-216' />

β€Žsrc/app/(pages)/test-page/page.tsxβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default function Page(): JSX.Element {
2222
<h2>{team.teamTitle}</h2>
2323
<h3>{team.teamIsActive}</h3>
2424
<p>{team.teamContent}</p>
25-
<h5>{team.member.nickname}</h5>
25+
<h5>{team.writer.nickname}</h5>
2626
</li>
2727
))}
2828
</ul>

β€Žsrc/components/common/input/CheckboxInput.tsxβ€Ž

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { IcCheck, IcCheckboxCheck } from '@/assets/IconList'
2+
import { twMergeEx } from '@/lib/twMerge'
23
import clsx from 'clsx'
34
import { twMerge } from 'tailwind-merge'
45

56
import { handleKeyDown } from '@/utils/handleKeyDown'
67
import { toggleCheckbox } from '@/utils/toggleCheckbox'
7-
import { twMergeEx } from '@/lib/twMerge'
88

99
export interface CheckboxInputProps
1010
extends React.InputHTMLAttributes<HTMLInputElement> {
@@ -71,7 +71,7 @@ export const CheckboxInput = ({
7171
{...props}
7272
className='hidden'
7373
/>
74-
<button
74+
<span
7575
role='checkbox'
7676
tabIndex={0}
7777
aria-checked={checked}
@@ -81,7 +81,7 @@ export const CheckboxInput = ({
8181
className={buttonClass}
8282
>
8383
{getIconForState(variant, checked)}
84-
</button>
84+
</span>
8585
<span className={labelTextClass}>{label}</span>
8686
</label>
8787
)

β€Žsrc/components/shared/select/Select.tsxβ€Ž

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { CheckboxInput, TextInput } from '@/components/common/input'
99

1010
interface SelectContextType {
1111
options: Option[]
12-
selectedValues: string[]
12+
selectedValues: Set<string>
1313
searchTerm: string
1414
isMulti: boolean
1515
setSearchTerm: (value: string) => void
@@ -46,7 +46,7 @@ export const Select = ({
4646
children,
4747
disabled = false,
4848
}: SelectProps): JSX.Element => {
49-
const [selectedValues, setSelectedValues] = useState<string[]>([])
49+
const [selectedValues, setSelectedValues] = useState<Set<string>>(new Set())
5050
const [searchTerm, setSearchTerm] = useState<string>('')
5151

5252
const filteredOptions = options.filter(option =>
@@ -55,19 +55,27 @@ export const Select = ({
5555

5656
const toggleValue = (value: string) => {
5757
setSelectedValues(prev => {
58-
const newValues = prev.includes(value)
59-
? prev.filter(v => v !== value)
60-
: isMulti
61-
? [...prev, value]
62-
: [value]
63-
if (JSON.stringify(newValues) !== JSON.stringify(prev)) {
64-
onChange(newValues)
58+
const newValues = new Set(prev)
59+
60+
if (newValues.has(value)) {
61+
newValues.delete(value)
62+
} else {
63+
if (isMulti) {
64+
newValues.add(value)
65+
} else {
66+
return new Set([value])
67+
}
6568
}
69+
70+
if (JSON.stringify([...newValues]) !== JSON.stringify([...prev])) {
71+
onChange([...newValues])
72+
}
73+
6674
return newValues
6775
})
6876
}
6977

70-
const isSelected = (value: string) => selectedValues.includes(value)
78+
const isSelected = (value: string) => selectedValues.has(value)
7179

7280
return (
7381
<SelectContext.Provider
@@ -100,17 +108,18 @@ const Trigger = ({
100108

101109
const { selectedValues, isMulti, options, disabled } = useSelectContext()
102110
const selectedLabel = isMulti
103-
? selectedValues.length
104-
? `${selectedValues[0]}` +
105-
(selectedValues.length > 1 ? ` μ™Έ ${selectedValues.length - 1}개` : '')
111+
? selectedValues.size
112+
? `${selectedValues.values().next().value}` +
113+
(selectedValues.size > 1 ? ` μ™Έ ${selectedValues.size - 1}개` : '')
106114
: ''
107-
: options.find(o => o.value === selectedValues[0])?.label || ''
115+
: options.find(o => o.value === selectedValues.values().next().value)
116+
?.label || ''
108117
const triggerStyle = cn({
109118
'pointer-events-none cursor-not-allowed': disabled,
110119
})
111120
const triggerBoxClass = cn(
112121
'h-48 w-210 justify-between p-12 text-body1 font-medium text-gray-500 focus:border-primary-normal',
113-
{ 'text-gray-800': selectedValues.length },
122+
{ 'text-gray-800': selectedValues.size },
114123
{ 'bg-gray-200 text-gray-400': disabled },
115124
className
116125
)

β€Žsrc/middleware.tsβ€Ž

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,14 @@ import { requestNewToken } from '@/services/auth/auth'
66

77
import { middlewareBufferTime } from './constants/auth'
88

9-
requestNewToken
10-
119
export const config = {
1210
matcher: ['/protected', '/protected/:path*'],
1311
}
1412

1513
export async function middleware(req: NextRequest): Promise<NextResponse> {
16-
let cookies = req.cookies
17-
let oldAccessToken = cookies.get('accessToken')?.value as string
18-
let refreshToken = cookies.get('refreshToken')?.value as string
14+
const cookies = req.cookies
15+
const oldAccessToken = cookies.get('accessToken')?.value as string
16+
const refreshToken = cookies.get('refreshToken')?.value as string
1917

2018
console.log('Access Token:', oldAccessToken)
2119
console.log('Refresh Token:', refreshToken)
@@ -27,7 +25,7 @@ export async function middleware(req: NextRequest): Promise<NextResponse> {
2725

2826
try {
2927
let decodedToken = jwt.decode(oldAccessToken) as { exp?: number }
30-
let currentTime = Math.floor(Date.now() / 1000)
28+
const currentTime = Math.floor(Date.now() / 1000)
3129
let expirationTime = decodedToken?.exp
3230

3331
if (expirationTime && expirationTime > currentTime) {
@@ -44,7 +42,7 @@ export async function middleware(req: NextRequest): Promise<NextResponse> {
4442
if (newTokenResponse.success && newTokenResponse.result) {
4543
const newAccessToken = newTokenResponse.result.accessToken
4644
const response = NextResponse.next()
47-
45+
4846
// μƒˆλ‘œμš΄ Access Token λ””μ½”λ”©
4947
decodedToken = jwt.decode(newAccessToken) as { exp?: number }
5048
expirationTime = decodedToken?.exp || 0

β€Žsrc/services/team/index.tsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ApiResponse } from '@/types/api/ApiResponse.types'
12
import {
23
AddTeamMemberRequest,
34
AddTeamMemberResponse,

β€Žsrc/stories/shared/select/MultiSelect.stories.tsxβ€Ž

Lines changed: 0 additions & 75 deletions
This file was deleted.

β€Žsrc/stories/shared/select/Select.stories.tsxβ€Ž

Lines changed: 0 additions & 54 deletions
This file was deleted.

0 commit comments

Comments
Β (0)