import { GetStaticProps } from "next"; import { useMemo, useState } from "react"; import { useBoolean } from "usehooks-ts"; import { AppLayout, AppLayoutRequired } from "components/AppLayout"; import { Switch } from "components/Inputs/Switch"; import { PanelHeader } from "components/PanelComponents/PanelHeader"; import { ContentPanel, ContentPanelWidthSizes } from "components/Panels/ContentPanel"; import { SubPanel } from "components/Panels/SubPanel"; import { GetPostsPreviewQuery } from "graphql/generated"; import { getReadySdk } from "graphql/sdk"; import { prettySlug } from "helpers/formatters"; import { Icon } from "components/Ico"; import { WithLabel } from "components/Inputs/WithLabel"; import { TextInput } from "components/Inputs/TextInput"; import { Button } from "components/Inputs/Button"; import { useDeviceSupportsHover } from "hooks/useMediaQuery"; import { filterHasAttributes, isDefinedAndNotEmpty } from "helpers/others"; import { SmartList } from "components/SmartList"; import { getOpenGraph } from "helpers/openGraph"; import { compareDate } from "helpers/date"; import { TranslatedPreviewCard } from "components/PreviewCard"; import { HorizontalLine } from "components/HorizontalLine"; import { cIf } from "helpers/className"; import { getLangui } from "graphql/fetchLocalData"; import { sendAnalytics } from "helpers/analytics"; import { useIsTerminalMode } from "hooks/useIsTerminalMode"; import { Terminal } from "components/Cli/Terminal"; import { useLocalData } from "contexts/LocalDataContext"; import { useContainerQueries } from "contexts/ContainerQueriesContext"; /* * ╭─────────────╮ * ────────────────────────────────────────╯ CONSTANTS ╰────────────────────────────────────────── */ const DEFAULT_FILTERS_STATE = { searchName: "", keepInfoVisible: true, }; /* * ╭────────╮ * ──────────────────────────────────────────╯ PAGE ╰───────────────────────────────────────────── */ interface Props extends AppLayoutRequired { posts: NonNullable["data"]; } const News = ({ posts, ...otherProps }: Props): JSX.Element => { const { isContentPanelAtLeast4xl } = useContainerQueries(); const { langui } = useLocalData(); const hoverable = useDeviceSupportsHover(); const [searchName, setSearchName] = useState(DEFAULT_FILTERS_STATE.searchName); const { value: keepInfoVisible, toggle: toggleKeepInfoVisible, setValue: setKeepInfoVisible, } = useBoolean(DEFAULT_FILTERS_STATE.keepInfoVisible); const isTerminalMode = useIsTerminalMode(); const subPanel = useMemo( () => ( { setSearchName(name); if (isDefinedAndNotEmpty(name)) { sendAnalytics("News", "Change search term"); } else { sendAnalytics("News", "Clear search term"); } }} /> {hoverable && ( { toggleKeepInfoVisible(); sendAnalytics("News", `Always ${keepInfoVisible ? "hide" : "show"} info`); }} /> )}