Skip to content

Commit

Permalink
feat: component header in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
RodrigoNet0 committed Jul 17, 2024
2 parents 804fbf8 + be0c5b7 commit d819849
Show file tree
Hide file tree
Showing 23 changed files with 262 additions and 90 deletions.
17 changes: 12 additions & 5 deletions .storybook/preview.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import type { Preview } from "@storybook/react";
import "../src/index.css";
import "./themes.css"

import { withThemeByClassName } from "@storybook/addon-themes";



const preview: Preview = {
tags: ['autodocs'],
parameters: {
Expand All @@ -14,12 +13,20 @@ const preview: Preview = {
date: /Date$/i,
},
},
backgrounds: {
default: 'dark',
values: [
{
name: 'dark',
value: '#0f0f0f',
},
],
},
},

decorators: [withThemeByClassName({
themes: {
light: 'light',
dark: 'dark',
light: 'theme-light',
dark: 'theme-dark',
},
defaultTheme: 'dark',
})]
Expand Down
3 changes: 3 additions & 0 deletions .storybook/themes.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.theme-dark {
background-color: #0f0f0f;
}
Binary file removed src/assets/Group 1.png
Binary file not shown.
6 changes: 6 additions & 0 deletions src/assets/frontend-day.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions src/components/Header/Header.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import imageHeader from "@/assets/Group 1.png"
import logoFrontEnd from "@/assets/frontend-day.svg"
import { Separator } from "@/components/ui/separator"
import { HeaderProps } from "./types";


export const Header = ({ label }: HeaderProps) => {
return (
<div className="flex items-center justify-center flex-col gap-5">
<img src={imageHeader} />
<img src={logoFrontEnd} />
<p className="text-2xl text-white font-bold">{label}</p>
<Separator className="w-20 h-1 rounded-2xl bg-[#7c3aed]" />
</div>
Expand Down
4 changes: 4 additions & 0 deletions src/components/SpeakerCard/SpeakerCard.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ const meta: Meta<typeof SpeakerCard> = {
name: { control: "text" },
role: { control: "text" },
onChangeMode: { action: "mode changed" },
hour: { control: "text" },
isSaved: { control: "boolean" },
},
} satisfies Meta<typeof SpeakerCard>;

Expand All @@ -28,5 +30,7 @@ export const Default: Story = {
imageUrl: "",
name: "Abraão",
role: "Developer",
hour: "10:00",
isSaved: true,
},
};
2 changes: 2 additions & 0 deletions src/components/SpeakerCard/SpeakerCard.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ test("renders SpeakerCard", () => {
role="Developer"
tags={["Frontend", "Convida", "Comunidade"]}
label="Typescript morreu?"
hour="10:00"
isSaved={true}
/>
);
const element = getByText(/Typescript morreu?/i);
Expand Down
25 changes: 16 additions & 9 deletions src/components/SpeakerCard/SpeakerCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { ProfileCard } from "../ProfileCard";
import { Badge } from "../ui/badge";
import { Card } from "../ui/card";
import { SpeakerCardProps } from "./types";
import { Togglebutton } from "../Togglebutton";
import { ToggleButton } from "../ToggleButton";

export const SpeakerCard = ({
label,
Expand All @@ -13,32 +13,39 @@ export const SpeakerCard = ({
name,
role,
hour,
<<<<<<< HEAD
=======
isSaved,
>>>>>>> be0c5b7783381cf9f53e4a934126eeefeddc806a
onChangeMode,
}: SpeakerCardProps) => {
const handleToggleSave = () => {
onChangeMode(!isSaved);
};

return (
<<<<<<< HEAD
<Card className="p-5 max-w-[500px] flex items-start flex-col justify-center bg-transparent border gap-4 border-[#D9B1FF] rounded-lg ">
=======
<Card className="max-w-[500px] p-5 w-full flex items-start flex-col justify-center bg-transparent border gap-4 border-[#D9B1FF] rounded-lg ">
>>>>>>> be0c5b7783381cf9f53e4a934126eeefeddc806a
<div className="flex gap-3 justify-between items-start w-full">
<span className="text-[#A190B2] text-sm">{hour}</span>
<h1 className="text-[#E6D5F7] mt-0 pt-0 w-full text-wrap whitespace-normal text-base break-words">
{label}
</h1>
<Togglebutton initialMode={true} onModeChange={onChangeMode} />{" "}
<ToggleButton isSaved={isSaved} onToggle={handleToggleSave} />
</div>
<div className="flex gap-2 w-full justify-start overflow-x-auto scrollbar-cards [&::-webkit-scrollbar]:hidden">
{tags.map((tag: string) => (
{tags.map((tag: string, index) => (
<Badge
key={index}
variant="outline"
className="bg-white text-[#A855F7] font-thin rounded-lg"
>
{tag}
</Badge>
))}
<Badge
variant="outline"
className="bg-white text-[#A855F7] font-thin rounded-lg"
>
Carreira
</Badge>
</div>
<div className=" flex-cols p-2 w-full">
<Separator className="w-full h-[0.3px] mb-4 bg-[#D9B1FF] rounded-xl" />
Expand Down
4 changes: 4 additions & 0 deletions src/components/SpeakerCard/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,9 @@ export interface SpeakerCardProps extends ProfileCardProps {
label: string
tags: string[]
hour: string
<<<<<<< HEAD
=======
isSaved: boolean
>>>>>>> be0c5b7783381cf9f53e4a934126eeefeddc806a
onChangeMode: (mode: boolean) => void
}
87 changes: 87 additions & 0 deletions src/components/SpeakerSection/SpeakerSection.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import type { Meta, StoryObj } from "@storybook/react";
import { SpeakerSection } from "./SpeakerSection";

export type Story = StoryObj<typeof SpeakerSection>;

const meta: Meta<typeof SpeakerSection> = {
title: "Components/SpeakerSection",
tags: ["autodocs"],
component: SpeakerSection,
argTypes: {
handleCardModeChange: { action: "handleCardModeChange" },
liveTalk: { control: "object" },
savedCardIds: { control: undefined },
sectionTitle: { control: "text" },
},
} satisfies Meta<typeof SpeakerSection>;

export default meta;

export const FrontEndCE: Story = {
args: {
liveTalk: {
id: 1,
hour: "10:00",
title: "Como se tornar um desenvolvedor Front-End",
tags: ["Javascript", "React", "Carreira"],
room: "Test Room",
speaker: {
image: "test.jpg",
title: "Jean Livino",
role: "CEO Hackaton",
company: "FrontEnd CE",
bio: "Test bio",
social_link: "https://test.com",
id: 1,
},
},
savedCardIds: [],
sectionTitle: "Front-End CE",
},
};

export const Comunidade: Story = {
args: {
liveTalk: {
id: 1,
hour: "11:00",
title: "Como entrar na comunidade!",
tags: ["Javascript", "React", "Carreira"],
room: "Test Room",
speaker: {
image: "test.jpg",
title: "Andressa Morais",
role: "CEO Hackaton",
company: "FrontEnd CE",
bio: "Test bio",
social_link: "https://test.com",
id: 1,
},
},
savedCardIds: [],
sectionTitle: "Comunidade",
},
};

export const Convida: Story = {
args: {
liveTalk: {
id: 1,
hour: "11:00",
title: "Fui convidado para um evento, e agora?",
tags: ["Javascript", "React", "Carreira"],
room: "Test Room",
speaker: {
image: "test.jpg",
title: "Bruno Oliveira",
role: "CEO Hackaton",
company: "FrontEnd CE",
bio: "Test bio",
social_link: "https://test.com",
id: 1,
},
},
savedCardIds: [],
sectionTitle: "Convida",
},
};
24 changes: 24 additions & 0 deletions src/components/SpeakerSection/SpeakerSection.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { render } from '@testing-library/react';
import { SpeakerSection } from './SpeakerSection';

test('renders SpeakerComponent', () => {
const liveTalk = {
id: 1,
hour: '10:00',
title: 'Test Talk',
tags: ['tag1', 'tag2'],
room: 'Test Room',
speaker: {
image: 'test.jpg',
title: 'Test Speaker',
role: 'Test Role',
company: 'Test Company',
bio: 'Test Bio',
social_link: 'https://test.com',
id: 1,
},
};
const { getByText } = render(<SpeakerSection handleCardModeChange={() => {}} liveTalk={liveTalk} savedCardIds={[]} sectionTitle="Test Section" />);
const element = getByText(/Test Section/i);
expect(element).toBeInTheDocument();
});
32 changes: 32 additions & 0 deletions src/components/SpeakerSection/SpeakerSection.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { SpeakerCard } from "@/components/SpeakerCard";
import { Button } from "@/components/ui/button";
import { SpeakerSectionProps } from "./types";

export const SpeakerSection = ({ sectionTitle, liveTalk, savedCardIds, handleCardModeChange }: SpeakerSectionProps) => {

return (
<section className="w-full">
{liveTalk && (
<div className="flex flex-col items-center w-full">
<Button className="max-w-[500px] w-full mt-8 bg-[#261537] justify-start pl-5 text-base font-semibold hover:bg-[#261537] text-[#E6D5F7]">
{sectionTitle}
</Button>
<div className="flex flex-col items-center gap-6 mt-6 w-full">
<SpeakerCard
isSaved={savedCardIds.includes(liveTalk.id)}
onChangeMode={(mode) => handleCardModeChange(liveTalk.id, mode)}
key={liveTalk.id}
hour={liveTalk.hour}
label={liveTalk.title}
tags={liveTalk.tags}
imageUrl={liveTalk.speaker.image}
imageFallback={liveTalk.speaker.title[0]}
name={liveTalk.speaker.title}
role={liveTalk.speaker.role}
/>
</div>
</div>
)}
</section>
);
};
3 changes: 3 additions & 0 deletions src/components/SpeakerSection/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { SpeakerSection } from "./SpeakerSection"

export { SpeakerSection }
8 changes: 8 additions & 0 deletions src/components/SpeakerSection/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { Palestra } from "@/api/types";

export interface SpeakerSectionProps {
liveTalk: Palestra | undefined;
savedCardIds: number[];
sectionTitle: string;
handleCardModeChange: (cardId: number, newMode: boolean) => void;
}
30 changes: 30 additions & 0 deletions src/components/ToggleButton/ToggleButton.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import type { Meta, StoryObj } from "@storybook/react";
import { ToggleButton } from "./ToggleButton";
import { action } from "@storybook/addon-actions";

export type Story = StoryObj<typeof ToggleButton>;

const meta: Meta<typeof ToggleButton> = {
title: "Components/ToggleButton",
component: ToggleButton,
argTypes: {
isSaved: { control: "boolean" },
onToggle: { action: "mode changed" },
},
} satisfies Meta<typeof ToggleButton>;

export default meta;

export const PlusButton: Story = {
args: {
isSaved: true,
onToggle: action("mode changed"),
},
};

export const MinusButton: Story = {
args: {
isSaved: false,
onToggle: action("mode changed"),
},
};
8 changes: 8 additions & 0 deletions src/components/ToggleButton/ToggleButton.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { render } from '@testing-library/react';
import { ToggleButton } from './ToggleButton';

test('renders Togglebutton', () => {
const { getByTestId } = render(<ToggleButton isSaved={true} onToggle={() => (true)} />);
const element = getByTestId("toggleButton");
expect(element).toBeInTheDocument();
});
14 changes: 14 additions & 0 deletions src/components/ToggleButton/ToggleButton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { CircleMinus, CirclePlus } from "lucide-react";

type ToggleButtonProps = {
isSaved: boolean;
onToggle: (isSaved: boolean) => void;
};

export const ToggleButton = ({ isSaved, onToggle }: ToggleButtonProps) => {
return (
<div data-testid="toggleButton" onClick={() => onToggle(!isSaved)}>
{isSaved ? ( <CircleMinus color="#ffffff" /> ) : ( <CirclePlus color="#ffffff" /> )}
</div>
);
};
3 changes: 3 additions & 0 deletions src/components/ToggleButton/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { ToggleButton } from "./ToggleButton"

export { ToggleButton }
4 changes: 4 additions & 0 deletions src/components/ToggleButton/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export type ToggleButtonProps = {
isSaved: boolean;
onToggle: (isSaved: boolean) => void;
};
Loading

0 comments on commit d819849

Please sign in to comment.