Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/components/button/Button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ interface ButtonProps extends React.ComponentPropsWithoutRef<'button'> {
| 'green-normal-01'
| 'green-light-03'
| 'gray-normal-03'
| 'gray-normal-02'
| 'gray-darker';
isSubmitting?: boolean;
}
Expand Down Expand Up @@ -40,7 +41,8 @@ export default function Button({
type TextClassType =
| 'text-green-normal-01'
| 'text-gray-darker'
| 'text-white';
| 'text-white'
| 'text-gray-dark-02';

let textClass: TextClassType = color.text;

Expand Down
38 changes: 0 additions & 38 deletions src/components/tab/Tab.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,6 @@ describe('Tab ์ปดํฌ๋„ŒํŠธ', () => {
});
});

it('ํ™œ์„ฑํ™”๋œ ํƒญ์€ ์˜ฌ๋ฐ”๋ฅธ ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค', () => {
render(
<Tab
items={items}
activeTab="ํƒญ1"
onTabChange={mockOnTabChange}
tabType="MAIN_TAB"
/>,
);

const activeTab = screen.getByText('ํƒญ1');
expect(activeTab).toHaveClass('border-green-dark-01', 'text-green-dark-01');
});

it('ํƒญ ํด๋ฆญ์‹œ onTabChange๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•œ๋‹ค', () => {
render(
<Tab
Expand All @@ -54,28 +40,4 @@ describe('Tab ์ปดํฌ๋„ŒํŠธ', () => {

expect(mockOnTabChange).toHaveBeenCalledWith('ํƒญ2');
});

it('tabType์— ๋”ฐ๋ผ ์˜ฌ๋ฐ”๋ฅธ ํ…์ŠคํŠธ ํฌ๊ธฐ๊ฐ€ ์ ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค', () => {
const { rerender } = render(
<Tab
items={items}
activeTab="ํƒญ1"
onTabChange={mockOnTabChange}
tabType="MAIN_TAB"
/>,
);

expect(screen.getByText('ํƒญ1')).toHaveClass('text-xl');

rerender(
<Tab
items={items}
activeTab="ํƒญ1"
onTabChange={mockOnTabChange}
tabType="SUB_TAB"
/>,
);

expect(screen.getByText('ํƒญ1')).toHaveClass('text-lg');
});
});
60 changes: 38 additions & 22 deletions src/components/tab/Tab.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { TabType } from '@/constants/tabs';
import Button from '@/components/button/Button';

interface TabProps<T extends string> {
items: readonly T[];
Expand All @@ -7,36 +8,51 @@ interface TabProps<T extends string> {
tabType: TabType;
}

const getTabStyles = {
main: {
base: 'text-xl border-b-2 rounded-none px-4 py-2 transition-all',
active: 'border-green-dark-01 text-green-dark-01',
inactive: 'border-transparent text-gray-dark-02 hover:text-green-dark-01',
},
container: 'flex gap-2',
};

function Tab<T extends string>({
items,
activeTab,
onTabChange,
tabType,
}: TabProps<T>) {
const getTabStyle = () => {
switch (tabType) {
case 'MAIN_TAB':
return 'text-xl';
case 'SUB_TAB':
return 'text-lg';
}
};
const renderMainTab = (item: T) => (
<button
key={item}
onClick={() => onTabChange(item)}
className={`${getTabStyles.main.base} ${
activeTab === item
? getTabStyles.main.active
: getTabStyles.main.inactive
}`}
>
{item}
</button>
);

const renderSubTab = (item: T) => (
<Button
key={item}
text={item}
size="modal"
fillType="outline"
themeColor={activeTab === item ? 'green-normal-01' : 'gray-normal-02'}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ž…๋ ฅ ์กฐ๊ฑด ์ถฉ์กฑ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ƒ‰์„ ๋ณด์—ฌ์ฃผ์–ด์•ผ ํ•˜๋Š” ์ž‘์—…(disabled๊ฐ€ true ์ผ ๋•Œ ํšŒ์ƒ‰, false ์ผ ๋•Œ ์ดˆ๋ก์ƒ‰)์„ button ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ๊ตณ์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์•„๋„ ๋  ๊ฒƒ ๊ฐ™๋„ค์š”..
์ƒ์œ„์—์„œ disabled ๊ด€๋ จ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•ด์„œ ์ƒ‰์ƒ๋งŒ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š”!
์ข‹์€ ์ฐธ๊ณ ๊ฐ€ ๋์Šต๋‹ˆ๋‹ค!

onClick={() => onTabChange(item)}
/>
);

return (
<div className="flex border-b border-gray-dark-02">
{items.map((item) => (
<button
key={item}
onClick={() => onTabChange(item)}
className={`${getTabStyle()} px-4 py-2 font-semibold hover:scale-105 ${
activeTab === item
? 'border-b-2 border-green-dark-01 text-green-dark-01'
: 'text-gray-dark-02'
}`}
>
{item}
</button>
))}
<div className={getTabStyles.container}>
{items.map((item) =>
tabType === 'SUB_TAB' ? renderSubTab(item) : renderMainTab(item),
)}
</div>
);
}
Expand Down
5 changes: 5 additions & 0 deletions src/constants/button.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ export const COLOR_GROUPS = {
text: 'text-gray-darker',
border: 'border-gray-darker',
},
'gray-normal-02': {
bg: 'bg-gray-normal-02',
text: 'text-gray-dark-02',
border: 'border-gray-normal-02',
},
'gray-darker': {
bg: 'bg-gray-darker',
text: 'text-gray-darker',
Expand Down