Skip to content

Commit

Permalink
bk
Browse files Browse the repository at this point in the history
  • Loading branch information
eliasrosa committed Sep 26, 2023
1 parent 2770efd commit 199106a
Show file tree
Hide file tree
Showing 11 changed files with 220 additions and 72 deletions.
13 changes: 10 additions & 3 deletions src/@types/ContextTypes.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,17 @@ export interface SidebarContextType {
toggleSidebar: () => void
}

interface ModalConfig {
title: ReactNode
content: ReactNode
closeBtnTitle?: string
}

export interface ModalContextType {
showModal: boolean
title: string | null
content: ReactNode | null
title: ReactNode
content?: ReactNode
closeBtnTitle?: string
closeModal: () => void
openModal: ({ title: string, content: ReactNode }) => void
openModal: (config: ModalConfig) => void
}
6 changes: 4 additions & 2 deletions src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import '../styles/output.css'
import Loading from './loading'
import { HeaderMobile } from '@/components/layout/HeaderMobile'
import Modal from '@/components/common/Modal'
import { Term } from '@/components/common/Term'

const inter = Inter({
weight: ['100', '200', '300', '400', '500', '600', '700', '800', '900'],
Expand Down Expand Up @@ -42,8 +43,10 @@ export default function RootLayout({ children }: { children: ReactNode }) {
className={inter.className}
suppressHydrationWarning={true}
>
<body className="bg-gray-50 text-gray-800">
<body className="bg-gray-50 text-gray-800">
<AppProvider>
<Modal />
<Term />
<HeaderMobile />
<div className="grid min-h-screen grid-cols-1 lg:grid-cols-[16rem_1fr]">
<Sidebar />
Expand All @@ -52,7 +55,6 @@ export default function RootLayout({ children }: { children: ReactNode }) {
</Main>
</div>
<ToastContainer {...toastConfig} />
<Modal />
</AppProvider>
</body>
</html>
Expand Down
18 changes: 9 additions & 9 deletions src/components/common/Modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,23 @@ import { useModal } from '@/hooks/useModal'
import { Button, Title } from '@tremor/react'

export default function Modal() {
const { showModal, title, content, closeModal } = useModal()
const { showModal, title, content, closeBtnTitle, closeModal } = useModal()

return (
<>
{showModal ? (
<>
<div className="justify-center items-center flex overflow-x-hidden overflow-y-auto fixed inset-0 z-50 outline-none focus:outline-none">
<div className="relative min-w-full px-12 my-6 mx-auto lg:min-w-[50%]">
<div className="relative min-w-full p-12 my-6 mx-auto max-h-full lg:min-w-[50%] lg:max-w-[50%]">
<div className="border-0 rounded-lg shadow-lg relative flex flex-col w-full bg-white outline-none focus:outline-none">
<div className="flex items-start justify-between p-5 border-b border-solid border-slate-200 rounded-t">
<Title className="text-gray-600">{title}</Title>
<div className="flex items-start justify-between p-4 border-b border-solid border-slate-200 rounded-t">
<div className="text-gray-600 w-full text-xl font-semibold font-">
{title}
</div>
</div>
<div className="relative p-6 flex-auto text-slate-600">
{content}
</div>
<div className="flex items-center justify-end p-6 border-t border-solid border-slate-200 rounded-b">
<Button onClick={closeModal}>Fechar</Button>
<div className="relative p-4 text-slate-600">{content}</div>
<div className="flex items-center justify-end p-4 border-t border-solid border-slate-200 rounded-b">
<Button onClick={closeModal}>{closeBtnTitle}</Button>
</div>
</div>
</div>
Expand Down
46 changes: 46 additions & 0 deletions src/components/common/Term.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
'use client'

import { useModal } from '@/hooks/useModal'
import { useEffect } from 'react'

const TermContent = () => {
return (
<>
<p className="mb-4">Prezado usuário,</p>

<p className="mb-4">
gostaríamos de informar que nosso site utiliza cookies e tecnologias
semelhantes do seu navegador para aprimorar sua experiência de navegação
e fornecer funcionalidades personalizadas.
</p>

<p className="mb-4">
Os dados armazenados não contém informações pessoais sensíveis, como
nome, endereço ou alguma outra informação de indentificação. Nosso
compromisso com a privacidade é reforçado pela conformidade com a Lei
Geral de Proteção de Dados (LGPD), que garanta a proteção de suas
informações pessoais.
</p>

<p className="mb-4">
Ao continuar navegando em nosso site, você está concordando com o uso
destas tecnologias.
</p>
</>
)
}

export function Term() {
const { openModal } = useModal()

useEffect(() => {
openModal({
content: <TermContent />,
title: 'Termos de uso',
closeBtnTitle: 'Aceito e continuar navegando',
})
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])

return <></>
}
27 changes: 21 additions & 6 deletions src/components/common/TooltipHelper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,35 @@

import { ReactNode } from 'react'
import { useModal } from '@/hooks/useModal'
import { Question } from '@phosphor-icons/react'
import { QuestionMarkCircleIcon } from '@heroicons/react/solid'

type Props = {
type HelperTitleProps = {
title: string
children: ReactNode
}

export function TooltipHelper({ title, children }: Props) {
export function HelperTitle({ title }: HelperTitleProps) {
return (
<div className="flex justify-between">
{title}
<QuestionMarkCircleIcon className="text-blue-500 h-8" />
</div>
)
}

type TooltipHelperProps = {
title: string
content: ReactNode
}

export function TooltipHelper({ title, content }: TooltipHelperProps) {
const { openModal } = useModal()

return (
<div>
<button onClick={() => openModal({ title, content: children })}>
<Question className="text-blue-500" size={20} />
<button
onClick={() => openModal({ content, title: HelperTitle({ title }) })}
>
<QuestionMarkCircleIcon className="text-blue-500 w-5" />
</button>
</div>
)
Expand Down
3 changes: 1 addition & 2 deletions src/components/layout/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export function Sidebar() {
return (
<aside
className={cn(
'sidebar bg-blue-500 transition-all duration-200 ease-in fixed top-0 bottom-0 z-50 -left-64 p-2 overflow-y-auto',
'sidebar bg-blue-500 transition-all duration-200 ease-in fixed top-0 bottom-0 z-30 -left-64 p-2 overflow-y-auto',
'lg:left-0 lg:relative',
isOpen && 'left-0',
)}
Expand All @@ -29,7 +29,6 @@ export function Sidebar() {
icon={Calculator}
href="/simulation"
/>
<SidebarMenuItem label="Ajuda" icon={Question} href="/help" />
</ul>
</div>
</aside>
Expand Down
2 changes: 1 addition & 1 deletion src/components/pages/home/tickers-table/HeaderCell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export function HeaderCell({ title, helper }: Props) {
<TableHeaderCell>
<div className="text-center flex flex-row justify-center gap-1">
{title}
{helper && <TooltipHelper title={title}>{helper}</TooltipHelper>}
{helper && <TooltipHelper title={title} content={helper} />}
</div>
</TableHeaderCell>
)
Expand Down
88 changes: 88 additions & 0 deletions src/components/pages/home/tickers-table/Helpers.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import { Callout } from '@tremor/react'
import { ReactNode } from 'react'

import { ExclamationCircleIcon } from '@heroicons/react/solid'

interface HelperContentProps {
formula?: string
children: ReactNode
}

export const HelperContent = ({ children, formula }: HelperContentProps) => {
return (
<>
<div>{children}</div>
{formula && (
<div className="border p-4 mt-4 bg-gray-100">
<span className="font-semibold mr-2">Cálculo:</span>
{formula}
</div>
)}
</>
)
}

export const HelperPVP = () => {
return (
<HelperContent formula="Preço atual do ativo / Valor patrimonial da ação (VPA)">
Essa métrica reflete o montante que o mercado está disposto a investir no
patrimônio da empresa. Quando é inferior a 1, sugere que a empresa está
sendo comercializada por um valor inferior ao seu valor patrimonial real.
</HelperContent>
)
}

export const HelperDY = () => {
return (
<HelperContent formula="Rendimentos pagos no período de 12 meses / Preço atual da ação">
O Dividend Yield é uma métrica financeira que representa a porcentagem do
dividendo distribuídos pela empresa nos últimos 12 meses em relação ao seu
preço de mercado por ação. É usado por investidores para avaliar o retorno
de dividendos potencial de um investimento em ações. Quanto maior o
Dividend Yield, maior o potencial de renda gerada pelos dividendos.
</HelperContent>
)
}

export const HelperLastDividend = () => {
return (
<HelperContent formula="Rendimentos pagos no período de 12 meses / Preço atual da ação">
Último redimento pago
</HelperContent>
)
}

export const HelperSumDividends = () => {
return (
<HelperContent>
Soma dos redimentos pagos dos últimos 12 meses
</HelperContent>
)
}

export const HelperTicker = () => {
return (
<HelperContent>
Nome do indetificador do ativo da empresa, também conhecido como papel,
symbol, ticker, ticket, etc...
</HelperContent>
)
}

export const HelperPrice = () => {
return (
<HelperContent>
Valor atual do ativo
<Callout
title="Aviso Importante:"
color="yellow"
icon={ExclamationCircleIcon}
className="mt-4"
>
Por favor, esteja ciente de que os preços das ações exibidos podem ter
um atraso de até 15 minutos. Recomendamos consultar fontes financeiras
em tempo real para informações atualizadas.
</Callout>
</HelperContent>
)
}
4 changes: 3 additions & 1 deletion src/components/pages/home/tickers-table/Row.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ export function Row({ ticker }: Props) {
<BtnVisibility ticker={ticker} isDisabled={true} />
<BtnRemove ticker={ticker} isDisabled={true} />
</Cell>
<TableCell className="text-center text-gray-400">...</TableCell>
<TableCell className="text-center text-gray-400">
Carregando...
</TableCell>
<TableCell colSpan={5} />
</TableRow>
)
Expand Down
54 changes: 12 additions & 42 deletions src/components/pages/home/tickers-table/Table.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,46 +9,16 @@ import {
} from '@tremor/react'

import { usePortfolios } from '@/hooks/usePortfolios'
import { Row } from './Row'
import { HeaderCell } from './HeaderCell'

const HelperPVP = () => {
return (
<>
<p>Preço sobre o Valor Patrimonial</p>
<p className="my-6">
Essa métrica reflete o montante que o mercado está disposto a investir
no patrimônio da empresa. Quando é inferior a 1, sugere que a empresa
está sendo comercializada por um valor inferior ao seu valor patrimonial
real.
</p>
<p>Cálculo: Preço atual do ativo / Valor patrimonial da ação (VPA)</p>
</>
)
}

const HelperDY = () => {
return (
<>
<p>Dividend Yield</p>
<p className="my-6">
Mostra o rendimento obtido por uma ação através dos proventos
distribuídos pela empresa nos últimos 12 meses
</p>
<p>
Cálculo: Rendimentos pagos no período de 12 meses / Preço atual da ação
</p>
</>
)
}

const HelperLastDividend = () => {
return <p>Último redimento pago</p>
}

const HelperSumDividends = () => {
return <p>Soma dos redimentos pagos dos últimos 12 meses</p>
}
import { Row } from './Row'
import {
HelperDY,
HelperLastDividend,
HelperPVP,
HelperPrice,
HelperSumDividends,
HelperTicker,
} from './Helpers'

export function Table() {
const { tickers } = usePortfolios()
Expand All @@ -57,9 +27,9 @@ export function Table() {
<TremorTable>
<TableHead>
<TableRow>
<TableHeaderCell />
<HeaderCell title="Papel" />
<HeaderCell title="Valor Atual" />
<HeaderCell title="" />
<HeaderCell title="Papel" helper={<HelperTicker />} />
<HeaderCell title="Valor Atual" helper={<HelperPrice />} />
<HeaderCell title="PV/P" helper={<HelperPVP />} />
<HeaderCell title="DY 12M" helper={<HelperDY />} />
<HeaderCell title="Últ. Rend." helper={<HelperLastDividend />} />
Expand Down
Loading

0 comments on commit 199106a

Please sign in to comment.