diff --git a/README.md b/README.md
index 826146bcb..e8bda6e55 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,7 @@
[](https://github.com/omnivore-app/omnivore/actions/workflows/run-tests.yaml)
[](https://discord.gg/h2z5rppzz9)
+
[](https://twitter.com/OmnivoreApp)

diff --git a/packages/api/src/services/popular_reads.ts b/packages/api/src/services/popular_reads.ts
index 7f79406d5..89d067c1b 100644
--- a/packages/api/src/services/popular_reads.ts
+++ b/packages/api/src/services/popular_reads.ts
@@ -153,7 +153,7 @@ const popularReads = [
author: 'The Omnivore Team',
description: 'Get the most out of Omnivore by learning how to use it.',
previewImage:
- 'https://proxy-prod.omnivore-image-cache.app/88x88,sBp_gMyIp8Y4Mje8lzL39vzrBQg5m9KbprssrGjCbbHw/https://substackcdn.com/image/fetch/w_1200,h_600,c_limit,f_jpg,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F658efff4-341a-4720-8cf6-9b2bdbedfaa7_800x668.gif',
+ 'https://proxy-prod.omnivore-image-cache.app/320x320,sxQnqya1QNApB7ZAGPj9K20AU6sw0UAnjmAIy2ub8hUU/https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F658efff4-341a-4720-8cf6-9b2bdbedfaa7_800x668.gif',
publishedAt: new Date('2021-10-13'),
siteName: 'Omnivore Blog',
},
@@ -164,7 +164,7 @@ const popularReads = [
author: 'Omnivore',
description: 'Learn how to save articles on iOS.',
previewImage:
- 'https://proxy-prod.omnivore-image-cache.app/260x260,suM2fz_-6_1PDsQDursGPD2bQqnpgGH9Ymj-IVb5dUR4/https://substackcdn.com/image/youtube/w_728,c_limit/k6RkIqepAig',
+ 'https://proxy-prod.omnivore-image-cache.app/320x320,sWDfv7sARTIdAlx6Rw_6t-QwL3T9aniEJRa1-jVaglNg/https://substackcdn.com/image/youtube/w_728,c_limit/k6RkIqepAig',
publishedAt: new Date('2021-10-19'),
siteName: 'Omnivore Blog',
},
@@ -175,7 +175,7 @@ const popularReads = [
author: 'The Omnivore Team',
description: 'Use labels to organize your Omnivore library.',
previewImage:
- 'https://proxy-prod.omnivore-image-cache.app/88x88,sSLRtT7zJbaNFEUbqDe9jbr3nloPsdjaqQXUqISk_x7E/https://substackcdn.com/image/fetch/w_1200,h_600,c_limit,f_jpg,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4ec9f3c-baef-464b-8d3a-0b8a384874d3_960x711.gif',
+ 'https://proxy-prod.omnivore-image-cache.app/320x320,sTgJ5Q0XIg_EHdmPWcxtXFmkjn8T6hkJt7S9ziClagYo/https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf07af7-5cdb-4ecc-aace-1a46de3e9c58_1827x1090.png',
publishedAt: new Date('2022-04-18'),
siteName: 'Omnivore Blog',
},
@@ -199,7 +199,7 @@ const popularReads = [
description:
'At the end of 2014 I received an email informing me that I had read over a million words in the ‘read it later’ app Pocket',
previewImage:
- 'https://proxy-prod.omnivore-image-cache.app/88x88,sVITWrJo3Wdi5LY3qSXX9aGytwKKteF8bth4z1MNz-PI/https://i0.wp.com/fortelabs.co/wp-content/uploads/2015/11/1rPXwIczUJRCE54v8FfAHGw.jpeg?fit=2000%2C844&ssl=1',
+ 'https://proxy-prod.omnivore-image-cache.app/320x320,sGN5R34M5z068QMXDZD32CQD6mCbxc47hWXm__JVUePE/https://fortelabs.com/wp-content/uploads/2015/11/1rPXwIczUJRCE54v8FfAHGw.jpeg',
publishedAt: new Date('2022-01-24'),
siteName: 'Forte Labs',
},
diff --git a/packages/web/components/elements/Button.tsx b/packages/web/components/elements/Button.tsx
index 6a407e770..831fc58cc 100644
--- a/packages/web/components/elements/Button.tsx
+++ b/packages/web/components/elements/Button.tsx
@@ -20,7 +20,7 @@ export const Button = styled('button', {
},
ctaDarkYellow: {
border: '1px solid transparent',
- fontSize: '13px',
+ fontSize: '14px',
fontWeight: 500,
fontFamily: 'Inter',
borderRadius: '5px',
@@ -77,8 +77,8 @@ export const Button = styled('button', {
fontFamily: 'Inter',
borderRadius: '8px',
cursor: 'pointer',
- color: 'white',
p: '10px 12px',
+ color: '$thTextContrast2',
bg: 'rgb(125, 125, 125, 0.3)',
'&:hover': {
bg: 'rgb(47, 47, 47, 0.1)',
diff --git a/packages/web/components/elements/DropdownElements.tsx b/packages/web/components/elements/DropdownElements.tsx
index b601b7f6b..1e42d61ba 100644
--- a/packages/web/components/elements/DropdownElements.tsx
+++ b/packages/web/components/elements/DropdownElements.tsx
@@ -53,7 +53,7 @@ export const DropdownContent = styled(Content, {
borderRadius: '6px',
outline: '1px solid #323232',
border: '1px solid $grayBorder',
- boxShadow: '$cardBoxShadow',
+ boxShadow: '0px 1px 2px 0px rgba(0, 0, 0, 0.05);',
'--arrow-visibility': '',
'&[data-side="top"]': {
'--arrow-visibility': 'collapse',
diff --git a/packages/web/components/elements/FeatureHelpBox.tsx b/packages/web/components/elements/FeatureHelpBox.tsx
new file mode 100644
index 000000000..9390dddb3
--- /dev/null
+++ b/packages/web/components/elements/FeatureHelpBox.tsx
@@ -0,0 +1,131 @@
+import { HStack, SpanBox, VStack } from './LayoutPrimitives'
+import { theme } from '../tokens/stitches.config'
+import { Button } from './Button'
+import { CloseIcon } from './icons/CloseIcon'
+import { HelpfulSlothImage } from './images/HelpfulSlothImage'
+import { ArrowSquareOut } from 'phosphor-react'
+import { useEffect, useState } from 'react'
+
+type FeatureHelpBoxProps = {
+ helpTitle: string
+ helpMessage: string
+
+ helpCTAText?: string
+ onClickCTA?: () => void
+
+ docsMessage: string
+ docsDestination: string
+
+ onDismiss: () => void
+}
+
+export const FeatureHelpBox = (props: FeatureHelpBoxProps) => {
+ const [display, setDisplay] = useState(false)
+
+ useEffect(() => {
+ setDisplay(true)
+ }, [])
+
+ if (!display) {
+ return <>>
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ )
+}
+
+const HelpSection = (props: FeatureHelpBoxProps) => {
+ return (
+
+
+
+ {props.helpTitle}
+
+
+
+ {props.helpMessage}
+
+ {props.helpCTAText && props.onClickCTA && (
+
+ )}
+
+
+
+ )
+}
diff --git a/packages/web/components/elements/LabelColorDropdown.tsx b/packages/web/components/elements/LabelColorDropdown.tsx
index 26e015bff..69d7a79e9 100644
--- a/packages/web/components/elements/LabelColorDropdown.tsx
+++ b/packages/web/components/elements/LabelColorDropdown.tsx
@@ -4,11 +4,8 @@ import { Box, HStack } from './LayoutPrimitives'
import { StyledText } from './StyledText'
import {
LabelColorDropdownProps,
- LabelColorObject,
LabelOptionProps,
} from '../../utils/settings-page/labels/types'
-import { labelColorObjects } from '../../utils/settings-page/labels/labelColorObjects'
-import { LabelColor } from '../../lib/networking/fragments/labelFragment'
import { TwitterPicker } from 'react-color'
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'
diff --git a/packages/web/components/elements/SuggestionBox.tsx b/packages/web/components/elements/SuggestionBox.tsx
new file mode 100644
index 000000000..fd01bf44d
--- /dev/null
+++ b/packages/web/components/elements/SuggestionBox.tsx
@@ -0,0 +1,127 @@
+import Link from 'next/link'
+import { HStack, SpanBox, VStack } from './LayoutPrimitives'
+import { ArrowRightIcon } from './icons/ArrowRightIcon'
+import { theme } from '../tokens/stitches.config'
+import { ReactNode } from 'react'
+import { Button } from './Button'
+import { CloseIcon } from './icons/CloseIcon'
+
+export type SuggestionAction = {
+ url: string
+ text: string
+}
+
+type SuggestionBoxProps = {
+ helpMessage: string
+ suggestions: SuggestionAction[]
+
+ size?: 'large' | 'small'
+ background?: string
+
+ dismissible?: boolean
+ onDismiss?: () => void
+}
+
+type InternalOrExternalLinkProps = {
+ link: string
+ children: ReactNode
+}
+
+const InternalOrExternalLink = (props: InternalOrExternalLinkProps) => {
+ const isExternal = props.link.startsWith('https')
+
+ return (
+
+ {!isExternal ? (
+ {props.children}
+ ) : (
+
+ {props.children}
+
+ )}
+
+ )
+}
+
+export const SuggestionBox = (props: SuggestionBoxProps) => {
+ return (
+
+
+ {props.dismissible && (
+
+
+
+ )}
+ {props.helpMessage}
+ {props.suggestions.map((suggestion, idx) => {
+ return (
+
+
+ <>{suggestion.text}>
+
+
+
+ )
+ })}
+
+
+ )
+}
diff --git a/packages/web/components/elements/icons/CloseIcon.tsx b/packages/web/components/elements/icons/CloseIcon.tsx
new file mode 100644
index 000000000..384f28150
--- /dev/null
+++ b/packages/web/components/elements/icons/CloseIcon.tsx
@@ -0,0 +1,39 @@
+/* eslint-disable functional/no-class */
+/* eslint-disable functional/no-this-expression */
+import { IconProps } from './IconProps'
+
+import React from 'react'
+
+export class CloseIcon extends React.Component {
+ render() {
+ const size = (this.props.size || 26).toString()
+ const color = (this.props.color || '#2A2A2A').toString()
+
+ return (
+
+ )
+ }
+}
diff --git a/packages/web/components/elements/images/HelpfulOwlImage.tsx b/packages/web/components/elements/images/HelpfulOwlImage.tsx
new file mode 100644
index 000000000..140877c2e
--- /dev/null
+++ b/packages/web/components/elements/images/HelpfulOwlImage.tsx
@@ -0,0 +1,12 @@
+import Image from 'next/image'
+
+export const HelpfulOwlImage = () => {
+ return (
+
+ )
+}
diff --git a/packages/web/components/elements/images/HelpfulSlothImage.tsx b/packages/web/components/elements/images/HelpfulSlothImage.tsx
new file mode 100644
index 000000000..95c152a43
--- /dev/null
+++ b/packages/web/components/elements/images/HelpfulSlothImage.tsx
@@ -0,0 +1,12 @@
+import Image from 'next/image'
+
+export const HelpfulSlothImage = () => {
+ return (
+
+ )
+}
diff --git a/packages/web/components/patterns/ArticleNotes.tsx b/packages/web/components/patterns/ArticleNotes.tsx
index 438e834ff..a4a786b99 100644
--- a/packages/web/components/patterns/ArticleNotes.tsx
+++ b/packages/web/components/patterns/ArticleNotes.tsx
@@ -25,7 +25,6 @@ MdEditor.use(Plugins.TabInsert, {
tabMapValue: 1, // note that 1 means a '\t' instead of ' '.
})
-console.log()
MdEditor.use(Counter)
type NoteSectionProps = {
diff --git a/packages/web/components/patterns/DropdownMenu.tsx b/packages/web/components/patterns/DropdownMenu.tsx
deleted file mode 100644
index de09ce225..000000000
--- a/packages/web/components/patterns/DropdownMenu.tsx
+++ /dev/null
@@ -1,99 +0,0 @@
-import { ReactNode, useMemo, useState } from 'react'
-import { HStack, VStack } from './../elements/LayoutPrimitives'
-import { Dropdown, DropdownOption } from '../elements/DropdownElements'
-import { StyledText } from '../elements/StyledText'
-import { Button } from '../elements/Button'
-import { currentThemeName } from '../../lib/themeUpdater'
-import { Check } from 'phosphor-react'
-
-export type HeaderDropdownAction =
- | 'apply-dark-theme'
- | 'apply-light-theme'
- | 'navigate-to-install'
- | 'navigate-to-emails'
- | 'navigate-to-labels'
- | 'navigate-to-profile'
- | 'navigate-to-subscriptions'
- | 'navigate-to-api'
- | 'navigate-to-integrations'
- | 'increaseFontSize'
- | 'decreaseFontSize'
- | 'logout'
-
-type DropdownMenuProps = {
- username?: string
- triggerElement: ReactNode
- actionHandler: (action: HeaderDropdownAction) => void
-}
-
-export function DropdownMenu(props: DropdownMenuProps): JSX.Element {
- const [currentTheme, setCurrentTheme] = useState(currentThemeName())
-
- const isDark = useMemo(() => {
- return currentTheme === 'Dark' || currentTheme === 'Darker'
- }, [currentTheme])
-
- return (
-
-
- Theme
-
-
-
-
-
- props.actionHandler('navigate-to-install')}
- title="Install"
- />
- props.actionHandler('navigate-to-emails')}
- title="Emails"
- />
- props.actionHandler('navigate-to-labels')}
- title="Labels"
- />
- props.actionHandler('navigate-to-api')}
- title="API Keys"
- />
- props.actionHandler('navigate-to-integrations')}
- title="Integrations"
- />
- window.open('https://docs.omnivore.app', '_blank')}
- title="Documentation"
- />
- window.Intercom('show')}
- title="Feedback"
- />
- props.actionHandler('logout')}
- title="Logout"
- />
-
- )
-}
diff --git a/packages/web/components/patterns/SettingsHeader.tsx b/packages/web/components/patterns/SettingsHeader.tsx
index bd98428de..e359126ec 100644
--- a/packages/web/components/patterns/SettingsHeader.tsx
+++ b/packages/web/components/patterns/SettingsHeader.tsx
@@ -3,6 +3,7 @@ import { OmnivoreNameLogo } from '../elements/images/OmnivoreNameLogo'
import { UserBasicData } from '../../lib/networking/queries/useGetViewerQuery'
import { PrimaryDropdown } from '../templates/PrimaryDropdown'
import { HEADER_HEIGHT } from '../templates/homeFeed/HeaderSpacer'
+import { LogoBox } from '../elements/LogoBox'
type HeaderProps = {
user?: UserBasicData
@@ -21,25 +22,15 @@ export function SettingsHeader(props: HeaderProps): JSX.Element {
display: 'flex',
position: 'fixed',
width: '100%',
- px: '25px',
+ pr: '25px',
height: HEADER_HEIGHT,
- bg: '$thBackground3',
- borderBottom: '1px solid $thBorderColor',
'@mdDown': {
- px: '15px',
+ pr: '15px',
},
+ bg: '$thBackground',
}}
>
-
-
-
-
+
diff --git a/packages/web/components/templates/ErrorLayout.tsx b/packages/web/components/templates/ErrorLayout.tsx
index b0837c883..b3370b928 100644
--- a/packages/web/components/templates/ErrorLayout.tsx
+++ b/packages/web/components/templates/ErrorLayout.tsx
@@ -13,7 +13,6 @@ type ErrorLayoutProps = {
export function ErrorLayout(props: ErrorLayoutProps): JSX.Element {
const { viewerData } = useGetViewerQuery()
- console.log(viewerData?.me)
return (
diff --git a/packages/web/components/templates/PrimaryDropdown.tsx b/packages/web/components/templates/PrimaryDropdown.tsx
index cbd0283cd..e5679fe0f 100644
--- a/packages/web/components/templates/PrimaryDropdown.tsx
+++ b/packages/web/components/templates/PrimaryDropdown.tsx
@@ -25,11 +25,11 @@ type PrimaryDropdownProps = {
updateLayout?: (layout: LayoutType) => void
showAddLinkModal?: () => void
- startSelectMultiple?: () => void
}
export type HeaderDropdownAction =
| 'navigate-to-install'
+ | 'navigate-to-feeds'
| 'navigate-to-emails'
| 'navigate-to-labels'
| 'navigate-to-profile'
@@ -51,6 +51,9 @@ export function PrimaryDropdown(props: PrimaryDropdownProps): JSX.Element {
case 'navigate-to-install':
router.push('/settings/installation')
break
+ case 'navigate-to-feeds':
+ router.push('/settings/feeds')
+ break
case 'navigate-to-emails':
router.push('/settings/emails')
break
@@ -152,6 +155,10 @@ export function PrimaryDropdown(props: PrimaryDropdownProps): JSX.Element {
onSelect={() => headerDropdownActionHandler('navigate-to-install')}
title="Install"
/>
+ headerDropdownActionHandler('navigate-to-feeds')}
+ title="Feeds"
+ />
headerDropdownActionHandler('navigate-to-emails')}
title="Emails"
@@ -170,17 +177,6 @@ export function PrimaryDropdown(props: PrimaryDropdownProps): JSX.Element {
/>
>
)}
- {props.startSelectMultiple && (
- <>
-
- props.startSelectMultiple && props.startSelectMultiple()
- }
- title="Select Multiple"
- />
-
- >
- )}
headerDropdownActionHandler('navigate-to-api')}
title="API Keys"
@@ -320,8 +316,7 @@ function ThemeSection(props: PrimaryDropdownProps): JSX.Element {
props.updateLayout && props.updateLayout('LIST_LAYOUT')
}}
>
-
diff --git a/packages/web/components/templates/SettingsLayout.tsx b/packages/web/components/templates/SettingsLayout.tsx
index 7ec179af3..eb5c291a7 100644
--- a/packages/web/components/templates/SettingsLayout.tsx
+++ b/packages/web/components/templates/SettingsLayout.tsx
@@ -49,7 +49,6 @@ export function SettingsLayout(props: SettingsLayoutProps): JSX.Element {
{props.children}
diff --git a/packages/web/components/templates/auth/EmailSignup.tsx b/packages/web/components/templates/auth/EmailSignup.tsx
index e81531926..090c9f7ac 100644
--- a/packages/web/components/templates/auth/EmailSignup.tsx
+++ b/packages/web/components/templates/auth/EmailSignup.tsx
@@ -155,6 +155,17 @@ export function EmailSignup(): JSX.Element {
{errorMessage && {errorMessage}}
+
+ Omnivore will send you daily tips for your first week as a new user.
+ If you don't like them you can unsubscribe.
+
+
{
- switch (props.type) {
- case 'library':
- return (
- <>
- You can add a link or read more about Omnivore's{' '}
-
- advanced search
-
- .
- >
- )
- case 'feed':
- return (
- <>
- You can subscribe to RSS feeds using the{' '}
-
- feeds page
-
- . Learn more about feeds at 's{' '}
-
- docs.omnivore.app/using/feeds.html
-
- .
- >
- )
- case 'newsletter':
- return (
- <>
- Create email addresses that can be used to subscribe to newsletters on
- the{' '}
-
- emails page
-
- . Learn more about reading newsletters in Omnivore at 's{' '}
-
- docs.omnivore.app/using/inbox.html
-
- .
- >
- )
- }
- return <>>
-}
-
export const ErrorBox = (props: HelpMessageProps) => {
const errorTitle = useMemo(() => {
switch (props.type) {
+ case 'inbox':
+ return 'Your inbox is empty. The inbox will contain all your non-archived saved items.'
+ case 'continue':
+ return "No continue reading items. Continue Reading items are items you have started but haven't finished reading."
+ case 'non-feed':
+ return "No non-feed items found. Non-feed items are items you've add to the library using the mobile apps, browser extensions, or Add Link button. Not newsletter or feed items."
+ case 'highlight':
+ return 'No highlights found. Add highlights to your library by highlighting text in the reader view.'
+ case 'unlabeled':
+ return 'No unlabeled items found. Items without labels can be found here. Use this query to easily triage your library.'
+ case 'archive':
+ return 'You do not have any archived items.'
+ case 'files':
+ return 'No files found.'
case 'feed':
return 'You do not have any feed items matching this query.'
+ case 'subscription':
+ return 'You do not have any subscriptions.'
case 'newsletter':
- return 'You do not have any newsletter item matching this query.'
+ return 'You do not have any newsletter items matching this query.'
}
return 'No results found for this query.'
}, [props.type])
@@ -116,70 +80,84 @@ export const ErrorBox = (props: HelpMessageProps) => {
)
}
-export const SuggestionBox = (props: HelpMessageProps) => {
- const helpMessage = useMemo(() => {
- switch (props.type) {
- case 'feed':
- return 'Want to add an RSS or Atom Subscription?'
- case 'newsletter':
- return 'Create an Omnivore email address and subscribe to newsletters.'
- }
- return "Add a link or read more about Omnivore's Advanced Search."
- }, [props.type])
+type SuggestionMessage = {
+ message: string
+ actions: SuggestionAction[]
+}
- const helpTarget = useMemo(() => {
+export const Suggestion = (props: HelpMessageProps) => {
+ const helpMessage = useMemo(() => {
switch (props.type) {
case 'feed':
- return '/settings/feeds'
+ return {
+ message: 'Want to add an RSS or Atom Subscription?',
+ actions: [
+ { text: 'Add an RSS or Atom feed', url: '/settings/feeds' },
+ ],
+ }
+ case 'archive':
+ return {
+ message:
+ 'When you are done reading something archive it and it will be saved in Omnivore forever.',
+ actions: [
+ {
+ text: 'Read the docs',
+ url: 'https://docs.omnivore.app/using/saving',
+ },
+ ],
+ }
+ case 'files':
+ return {
+ message:
+ 'Drag PDFs into the library to add them to your Omnivore account.',
+ actions: [],
+ }
case 'newsletter':
- return '/settings/emails'
+ return {
+ message:
+ 'Create an Omnivore email address and subscribe to newsletters.',
+ actions: [
+ {
+ text: 'Create an email address for newsletters',
+ url: '/settings/emails',
+ },
+ ],
+ }
+ case 'subscription':
+ return {
+ message:
+ 'Create an Omnivore email address and subscribe to newsletters or add a feed from the Feeds page.',
+ actions: [
+ { text: 'Add an RSS or Atom feed', url: '/settings/feeds' },
+ {
+ text: 'Create an email address for newsletters',
+ url: '/settings/emails',
+ },
+ ],
+ }
+ }
+ return {
+ message: "Add a link or read more about Omnivore's Advanced Search.",
+ actions: [
+ {
+ text: 'Read the Docs',
+ url: 'https://docs.omnivore.app/using/search.html',
+ },
+ ],
}
- return 'https://docs.omnivore.app/'
}, [props.type])
return (
-
- {helpMessage}
-
-
-
- <>Click Here>
-
-
-
-
-
+ <>
+ {helpMessage ? (
+
+ ) : (
+ <>>
+ )}
+ >
)
}
@@ -187,8 +165,24 @@ export const EmptyLibrary = (props: EmptyLibraryProps) => {
const type = useMemo(() => {
if (props.searchTerm) {
switch (props.searchTerm) {
+ case 'in:inbox':
+ return 'inbox'
+ case 'in:inbox sort:read-desc is:unread':
+ return 'continue'
+ case 'in:library':
+ return 'non-feed'
+ case 'has:highlights mode:highlights':
+ return 'highlight'
+ case 'no:label':
+ return 'unlabeled'
+ case 'type:file':
+ return 'files'
+ case 'in:archive':
+ return 'archive'
case 'label:RSS':
return 'feed'
+ case 'in:subscription':
+ return 'subscription'
case 'label:Newsletter':
return 'newsletter'
}
@@ -205,9 +199,7 @@ export const EmptyLibrary = (props: EmptyLibraryProps) => {
pl: '0px',
width: '100%',
- '@media (max-width: 1300px)': {
- flexDirection: 'column',
- },
+ flexDirection: 'column',
'@media (max-width: 768px)': {
p: '15px',
@@ -232,7 +224,7 @@ export const EmptyLibrary = (props: EmptyLibraryProps) => {
}}
>
-
+
)
}
diff --git a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx
index 65c1bb689..fae67ae68 100644
--- a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx
+++ b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx
@@ -1229,7 +1229,7 @@ function LibraryItems(props: LibraryItemsProps): JSX.Element {
data-testid="linkedItemCard"
id={linkedItem.node.id}
tabIndex={0}
- key={linkedItem.node.id}
+ key={linkedItem.node.id + linkedItem.node.image}
css={{
width: '100%',
'&:focus-visible': {
diff --git a/packages/web/components/templates/homeFeed/LibraryFilterMenu.tsx b/packages/web/components/templates/homeFeed/LibraryFilterMenu.tsx
index 9fafbc785..8825ff5ad 100644
--- a/packages/web/components/templates/homeFeed/LibraryFilterMenu.tsx
+++ b/packages/web/components/templates/homeFeed/LibraryFilterMenu.tsx
@@ -172,6 +172,7 @@ function Subscriptions(props: LibraryFilterMenuProps): JSX.Element {
>
{!collapsed ? (
<>
+
void
- handleLinkSubmission: (link: string, timezone: string, locale:string) => Promise,
+ handleLinkSubmission: (
+ link: string,
+ timezone: string,
+ locale: string
+ ) => Promise
}
export function LibraryHeader(props: LibraryHeaderProps): JSX.Element {
@@ -220,15 +224,20 @@ export type SearchBoxProps = {
compact?: boolean
onClose?: () => void
- handleLinkSubmission: (link: string, timezone: string, locale:string) => Promise,
+ handleLinkSubmission: (
+ link: string,
+ timezone: string,
+ locale: string
+ ) => Promise
}
export function SearchBox(props: SearchBoxProps): JSX.Element {
const inputRef = useRef(null)
const [focused, setFocused] = useState(false)
const [searchTerm, setSearchTerm] = useState(props.searchTerm ?? '')
- const [isAddAction, setIsAddAction] = useState(false);
- const IS_URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/;
+ const [isAddAction, setIsAddAction] = useState(false)
+ const IS_URL_REGEX =
+ /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/
useEffect(() => {
setSearchTerm(props.searchTerm ?? '')
@@ -284,22 +293,23 @@ export function SearchBox(props: SearchBoxProps): JSX.Element {
e.preventDefault()
}}
>
- {
- (() => {
- if (isAddAction) {
- return {
+ if (isAddAction) {
+ return (
+
+ )
}
- return
- })()
- }
-
+ )
+ })()}