diff --git a/packages/shared/src/components/BookmarkEmptyScreen.tsx b/packages/shared/src/components/BookmarkEmptyScreen.tsx new file mode 100644 index 0000000000..0217942f1e --- /dev/null +++ b/packages/shared/src/components/BookmarkEmptyScreen.tsx @@ -0,0 +1,35 @@ +import React, { ReactElement } from 'react'; +import Link from 'next/link'; +import BookmarkIcon from '../../icons/bookmark.svg'; +import { headerHeight } from '../styles/sizes'; +import sizeN from '../../macros/sizeN.macro'; +import { Button } from './buttons/Button'; + +export default function BookmarkEmptyScreen(): ReactElement { + return ( +
+ +

+ Your bookmark list is empty. +

+

+ Go back to your feed and bookmark posts you’d like to keep or read + later. Each post you bookmark will be stored here. +

+ + + +
+ ); +} diff --git a/packages/shared/src/components/BookmarkFeedLayout.tsx b/packages/shared/src/components/BookmarkFeedLayout.tsx new file mode 100644 index 0000000000..129f68069a --- /dev/null +++ b/packages/shared/src/components/BookmarkFeedLayout.tsx @@ -0,0 +1,79 @@ +import React, { + ReactElement, + ReactNode, + useContext, + useMemo, + useState, +} from 'react'; +import Link from 'next/link'; +import MagnifyingIcon from '../../icons/magnifying.svg'; +import { BOOKMARKS_FEED_QUERY, SEARCH_BOOKMARKS_QUERY } from '../graphql/feed'; +import AuthContext from '../contexts/AuthContext'; +import { CustomFeedHeader, FeedPage } from './utilities'; +import SearchEmptyScreen from './SearchEmptyScreen'; +import Feed, { FeedProps } from './Feed'; +import BookmarkEmptyScreen from './BookmarkEmptyScreen'; +import { Button } from './buttons/Button'; + +export type BookmarkFeedLayoutProps = { + isSearchOn: boolean; + searchQuery?: string; + children?: ReactNode; + searchChildren: ReactNode; + onSearchButtonClick?: () => unknown; +}; + +export default function BookmarkFeedLayout({ + searchQuery, + isSearchOn, + searchChildren, + children, +}: BookmarkFeedLayoutProps): ReactElement { + const { user, tokenRefreshed } = useContext(AuthContext); + const [showEmptyScreen, setShowEmptyScreen] = useState(false); + + const feedProps = useMemo>(() => { + if (isSearchOn && searchQuery) { + return { + feedQueryKey: ['bookmarks', user?.id ?? 'anonymous', searchQuery], + query: SEARCH_BOOKMARKS_QUERY, + variables: { query: searchQuery }, + emptyScreen: , + className: 'my-3', + }; + } + return { + feedQueryKey: ['bookmarks', user?.id ?? 'anonymous'], + query: BOOKMARKS_FEED_QUERY, + className: 'my-3', + onEmptyFeed: () => setShowEmptyScreen(true), + }; + }, [isSearchOn && searchQuery, user]); + + if (showEmptyScreen) { + return ; + } + + return ( + + {children} + + {!isSearchOn && ( + <> + + - - - ); - } - - return ( - - - - - Bookmarks - - {tokenRefreshed && ( - setShowEmptyScreen(true)} - className="my-3" - /> - )} - - ); -}; - -BookmarksPage.getLayout = getLayout; -BookmarksPage.layoutProps = mainFeedLayoutProps; - -export default BookmarksPage; diff --git a/packages/webapp/pages/bookmarks/index.tsx b/packages/webapp/pages/bookmarks/index.tsx new file mode 100644 index 0000000000..0836790307 --- /dev/null +++ b/packages/webapp/pages/bookmarks/index.tsx @@ -0,0 +1,28 @@ +import React, { ReactElement } from 'react'; +import { NextSeoProps } from 'next-seo/lib/types'; +import { NextSeo } from 'next-seo'; +import { + getBookmarkFeedLayout, + bookmarkFeedLayoutProps, +} from '../../components/layouts/BookmarkFeedPage'; +import { defaultOpenGraph, defaultSeo } from '../../next-seo'; + +const seo: NextSeoProps = { + title: `Your daily.dev bookmarks`, + titleTemplate: '%s', + openGraph: { ...defaultOpenGraph }, + ...defaultSeo, +}; + +const BookmarksPage = (): ReactElement => { + return ( + <> + + + ); +}; + +BookmarksPage.getLayout = getBookmarkFeedLayout; +BookmarksPage.layoutProps = bookmarkFeedLayoutProps; + +export default BookmarksPage; diff --git a/packages/webapp/pages/bookmarks/search.tsx b/packages/webapp/pages/bookmarks/search.tsx new file mode 100644 index 0000000000..0836790307 --- /dev/null +++ b/packages/webapp/pages/bookmarks/search.tsx @@ -0,0 +1,28 @@ +import React, { ReactElement } from 'react'; +import { NextSeoProps } from 'next-seo/lib/types'; +import { NextSeo } from 'next-seo'; +import { + getBookmarkFeedLayout, + bookmarkFeedLayoutProps, +} from '../../components/layouts/BookmarkFeedPage'; +import { defaultOpenGraph, defaultSeo } from '../../next-seo'; + +const seo: NextSeoProps = { + title: `Your daily.dev bookmarks`, + titleTemplate: '%s', + openGraph: { ...defaultOpenGraph }, + ...defaultSeo, +}; + +const BookmarksPage = (): ReactElement => { + return ( + <> + + + ); +}; + +BookmarksPage.getLayout = getBookmarkFeedLayout; +BookmarksPage.layoutProps = bookmarkFeedLayoutProps; + +export default BookmarksPage;