diff --git a/src/app/(home)/activities/page.tsx b/src/app/(home)/activities/page.tsx new file mode 100644 index 00000000..20e2c99b --- /dev/null +++ b/src/app/(home)/activities/page.tsx @@ -0,0 +1,33 @@ +import { Hydrate, dehydrate } from "@tanstack/react-query" + +import { HomeFeed } from "~/components/home/HomeFeed" +import { HomeSidebar } from "~/components/home/HomeSidebar" +import getQueryClient from "~/lib/query-client" +import { prefetchGetFeed, prefetchGetShowcase } from "~/queries/home.server" + +async function Activities() { + const queryClient = getQueryClient() + await prefetchGetShowcase(queryClient) + await prefetchGetFeed( + { + type: "latest", + }, + queryClient, + ) + const dehydratedState = dehydrate(queryClient) + + return ( + +
+
+
+ +
+ +
+
+
+ ) +} + +export default Activities diff --git a/src/components/common/SearchInput.tsx b/src/components/common/SearchInput.tsx index 4bd7576e..5a492096 100644 --- a/src/components/common/SearchInput.tsx +++ b/src/components/common/SearchInput.tsx @@ -1,7 +1,7 @@ -import { useTranslation } from "next-i18next" -import { useRouter } from "next/router" +import { useRouter } from "next/navigation" import { useForm } from "react-hook-form" +import { useTranslation } from "~/lib/i18n/client" import { cn } from "~/lib/utils" export const SearchInput: React.FC<{ @@ -10,7 +10,7 @@ export const SearchInput: React.FC<{ onSubmit?: (value?: string) => void }> = ({ value, noBorder, onSubmit }) => { const router = useRouter() - const { t } = useTranslation(["common", "site"]) + const { t } = useTranslation("common") const form = useForm({ defaultValues: { diff --git a/src/components/main/MainFeed.tsx b/src/components/home/HomeFeed.tsx similarity index 89% rename from src/components/main/MainFeed.tsx rename to src/components/home/HomeFeed.tsx index bc3eb852..b9754e27 100644 --- a/src/components/main/MainFeed.tsx +++ b/src/components/home/HomeFeed.tsx @@ -1,11 +1,12 @@ -import { useTranslation } from "next-i18next" +"use client" + import Link from "next/link" -import { useRouter } from "next/router" +import { useRouter } from "next/navigation" import { memo, useEffect, useState } from "react" import reactStringReplace from "react-string-replace" import { Virtuoso } from "react-virtuoso" -import { useAccountState } from "@crossbell/connect-kit" +import { useAccountState, useConnectModal } from "@crossbell/connect-kit" import { Switch } from "@headlessui/react" import { CharacterFloatCard } from "~/components/common/CharacterFloatCard" @@ -14,6 +15,7 @@ import { Image } from "~/components/ui/Image" import { Tabs } from "~/components/ui/Tabs" import { Tooltip } from "~/components/ui/Tooltip" import { useDate } from "~/hooks/useDate" +import { useTranslation } from "~/lib/i18n/client" import { getStorage, setStorage } from "~/lib/storage" import { ExpandedNote } from "~/lib/types" import type { FeedType, SearchType } from "~/models/home.model" @@ -31,7 +33,7 @@ const Post = ({ keyword?: string }) => { const router = useRouter() - const { t } = useTranslation(["common", "site"]) + const { t } = useTranslation("common") const date = useDate() if ( @@ -159,12 +161,13 @@ const Post = ({ const MemoedPost = memo(Post) -export const MainFeed: React.FC<{ - type?: FeedType +export const HomeFeed: React.FC<{ noteIds?: string[] keyword?: string -}> = ({ type, noteIds, keyword }) => { - const { t } = useTranslation(["common", "site"]) +}> = ({ noteIds, keyword }) => { + const { t } = useTranslation("common") + + const [feedType, setFeedType] = useState("latest") const currentCharacterId = useAccountState( (s) => s.computed.account?.characterId, @@ -174,7 +177,7 @@ export const MainFeed: React.FC<{ const [searchType, setSearchType] = useState("latest") const feed = useGetFeed({ - type: type, + type: feedType, characterId: currentCharacterId, noteIds: noteIds, daysInterval: hotInterval, @@ -182,7 +185,7 @@ export const MainFeed: React.FC<{ searchType, }) - const hasFiltering = type === "latest" + const hasFiltering = feedType === "latest" const [aiFiltering, setAiFiltering] = useState(true) @@ -226,8 +229,35 @@ export const MainFeed: React.FC<{ }, ] + const connectModal = useConnectModal() + + const tabs = [ + { + text: "Latest", + onClick: () => setFeedType("latest"), + active: feedType === "latest", + }, + { + text: "Hottest", + onClick: () => setFeedType("hot"), + active: feedType === "hot", + }, + { + text: "Following", + onClick: () => { + if (!currentCharacterId) { + connectModal.show() + } else { + setFeedType("following") + } + }, + active: feedType === "following", + }, + ] + return ( <> +
{hasFiltering && (
@@ -263,10 +293,10 @@ export const MainFeed: React.FC<{
)} - {type === "hot" && ( + {feedType === "hot" && ( )} - {type === "search" && ( + {feedType === "search" && ( )} diff --git a/src/components/main/MainSidebar.tsx b/src/components/home/HomeSidebar.tsx similarity index 97% rename from src/components/main/MainSidebar.tsx rename to src/components/home/HomeSidebar.tsx index 8352b37a..d6893f39 100644 --- a/src/components/main/MainSidebar.tsx +++ b/src/components/home/HomeSidebar.tsx @@ -1,4 +1,5 @@ -import { useTranslation } from "next-i18next" +"use client" + import { useState } from "react" import { CharacterFloatCard } from "~/components/common/CharacterFloatCard" @@ -6,12 +7,13 @@ import { SearchInput } from "~/components/common/SearchInput" import { Image } from "~/components/ui/Image" import { UniLink } from "~/components/ui/UniLink" import { getSiteLink } from "~/lib/helpers" +import { useTranslation } from "~/lib/i18n/client" import { useGetShowcase } from "~/queries/home" import topics from "../../../data/topics.json" import { FollowAllButton } from "../common/FollowAllButton" -export function MainSidebar({ hideSearch }: { hideSearch?: boolean }) { +export function HomeSidebar({ hideSearch }: { hideSearch?: boolean }) { const showcaseSites = useGetShowcase() const { t } = useTranslation("index") diff --git a/src/components/ui/Tabs.tsx b/src/components/ui/Tabs.tsx index 0771cec1..92fabb01 100644 --- a/src/components/ui/Tabs.tsx +++ b/src/components/ui/Tabs.tsx @@ -1,7 +1,7 @@ -import { useTranslation } from "next-i18next" import React from "react" import { Tooltip } from "~/components/ui/Tooltip" +import { useTranslation } from "~/lib/i18n/client" import { cn } from "~/lib/utils" import { UniLink } from "./UniLink" @@ -19,7 +19,7 @@ export const Tabs: React.FC<{ items: TabItem[]; className?: string }> = ({ items, className, }) => { - const { t } = useTranslation(["dashboard"]) + const { t } = useTranslation("dashboard") return (