From 0e4a1fcefde48b1283abdb5d33301a849ce623fe Mon Sep 17 00:00:00 2001 From: gitstart-omnivore Date: Thu, 24 Mar 2022 23:10:31 +0000 Subject: [PATCH 001/298] effected review corrections --- packages/web/components/patterns/LinkedItemCard.tsx | 13 ++++++------- .../templates/homeFeed/HomeFeedContainer.tsx | 7 +++---- packages/web/components/tokens/stitches.config.ts | 6 ++++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/web/components/patterns/LinkedItemCard.tsx b/packages/web/components/patterns/LinkedItemCard.tsx index 4dbac4b77..6e951e308 100644 --- a/packages/web/components/patterns/LinkedItemCard.tsx +++ b/packages/web/components/patterns/LinkedItemCard.tsx @@ -88,7 +88,6 @@ export function GridLinkedItemCard(props: LinkedItemCardProps): JSX.Element { onClick={() => { props.handleAction('showDetail') }} - className="grid-item-card" > {props.item.description} - {/* {props.item.image && ( */} + {props.item.image && ( { - // (e.target as HTMLElement).style.display = 'none' + (e.target as HTMLElement).style.display = 'none' }} /> - {/* )} */} + )} { - Labels.map(({text, color}, index) => diff --git a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx index c8ac93657..de901747f 100644 --- a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx +++ b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx @@ -1,7 +1,6 @@ import { Box, HStack, VStack } from './../../elements/LayoutPrimitives' import { useGetLibraryItemsQuery } from '../../../lib/networking/queries/useGetLibraryItemsQuery' import { useGetViewerQuery } from '../../../lib/networking/queries/useGetViewerQuery' -import { isDarkTheme } from '../../../lib/themeUpdater' import type { LibraryItem, LibraryItemsQueryInput, @@ -572,12 +571,12 @@ function HomeFeedGrid(props: HomeFeedContentProps): JSX.Element { }, '&:focus': { '> div': { - boxShadow: isDarkTheme() ? '$cardItemDarkShadow' : '$cardItemLightShadow', + boxShadow: layout === 'LIST_LAYOUT' ? 'none' : '$cardItemShadow', } }, '&:hover': { - '> div.grid-item-card': { - boxShadow: isDarkTheme() ? '$cardItemDarkShadow' : '$cardItemLightShadow', + '> div': { + boxShadow: layout === 'LIST_LAYOUT' ? 'none' : '$cardItemShadow', } }, }} diff --git a/packages/web/components/tokens/stitches.config.ts b/packages/web/components/tokens/stitches.config.ts index 69650c19b..2546910a7 100644 --- a/packages/web/components/tokens/stitches.config.ts +++ b/packages/web/components/tokens/stitches.config.ts @@ -111,8 +111,7 @@ export const { styled, css, theme, getCssText, globalCss, keyframes, config } = borderStyles: {}, shadows: { panelShadow: '0px 4px 18px rgba(120, 123, 134, 0.12)', - cardItemLightShadow: '0px 8px 32px rgba(32, 31, 29, 0.33)', - cardItemDarkShadow: '0px 8px 32px rgba(255, 255, 255, 0.33)', + cardItemShadow: '0px 8px 32px rgba(32, 31, 29, 0.33)', }, zIndices: {}, transitions: {}, @@ -213,6 +212,9 @@ const darkThemeSpec = { avatarBg: '#000000', avatarFont: 'rgba(255, 255, 255, 0.8)', }, + shadows: { + cardItemShadow: '0px 8px 32px rgba(255, 255, 255, 0.33)', + }, } // Dark and Darker theme now match each other. From fe22fb2093795972926d26e0b312b4acd48f1635 Mon Sep 17 00:00:00 2001 From: gitstart-omnivore Date: Mon, 28 Mar 2022 13:54:27 +0000 Subject: [PATCH 002/298] fix card width issues --- .../components/patterns/LinkedItemCard.tsx | 457 +++++++++--------- .../templates/homeFeed/HomeFeedContainer.tsx | 14 +- 2 files changed, 241 insertions(+), 230 deletions(-) diff --git a/packages/web/components/patterns/LinkedItemCard.tsx b/packages/web/components/patterns/LinkedItemCard.tsx index 6e951e308..ad061e3a0 100644 --- a/packages/web/components/patterns/LinkedItemCard.tsx +++ b/packages/web/components/patterns/LinkedItemCard.tsx @@ -8,7 +8,7 @@ import { theme } from './../tokens/stitches.config' import { CardMenu } from './../patterns/CardMenu' import { LayoutType } from '../templates/homeFeed/HomeFeedContainer' import { UserBasicData } from '../../lib/networking/queries/useGetViewerQuery' -import { Label } from './../elements/Label' +import { LabelChip } from './../elements/LabelChip' export type LinkedItemCardAction = | 'showDetail' @@ -28,13 +28,13 @@ type LinkedItemCardProps = { handleAction: (action: LinkedItemCardAction) => void } -const siteName = (originalArticleUrl: string, itemUrl: string): string => { +const siteName = (originalArticleUrl: string, itemUrl: string): string => { try { return new URL(originalArticleUrl).hostname - } catch { } + } catch {} try { return new URL(itemUrl).hostname - } catch { } + } catch {} return '' } @@ -46,253 +46,91 @@ export function LinkedItemCard(props: LinkedItemCardProps): JSX.Element { } } -// Dummy Data -const Labels = [ - { - text: 'Tag 1', - color: "#B20042" - }, - { - text: 'Tag 2', - color: "#01A800" - }, - { - text: 'Tag 3', - color: "#007E9E" - }, -] - - export function GridLinkedItemCard(props: LinkedItemCardProps): JSX.Element { const originText = siteName(props.item.originalArticleUrl, props.item.url) return ( // - { + props.handleAction('showDetail') + }} + > + { - props.handleAction('showDetail') - }} - > - div': { borderRadius: '100vmax 100vmax 0 0', + }, + }} + > + - - - - - - {props.item.title} - - { - // This is here to prevent menu click events from bubbling - // up and causing us to "click" on the link item. - e.stopPropagation() - }} - > - - } - actionHandler={props.handleAction} - /> - - - - - {props.item.author && ( - - {authoredByText(props.item.author)} - - ) - } - - {originText} - - - - - - + + - - {props.item.description} - - {props.item.image && ( - { - (e.target as HTMLElement).style.display = 'none' - }} - /> - )} - - - { - props.item.labels?.map(({description, color}, index) => - - // - ) -} - -export function ListLinkedItemCard(props: LinkedItemCardProps): JSX.Element { - const originText = siteName(props.item.originalArticleUrl, props.item.url) - - return ( - // + pl: '$1', + }} + > { - props.handleAction('showDetail') + p: '0px', + mr: '-12px', + mt: '15px', + display: 'grid', + gridTemplateColumns: '1fr 24px', + gridTemplateRows: '1fr', }} > - - - {props.item.title} - - {props.item.author && ( - - {authoredByText(props.item.author)} - - )} - - {originText} - - + {props.item.title} + - - - { // This is here to prevent menu click events from bubbling // up and causing us to "click" on the link item. @@ -313,6 +151,169 @@ export function ListLinkedItemCard(props: LinkedItemCardProps): JSX.Element { /> + + + {props.item.author && ( + + {authoredByText(props.item.author)} + + )} + + {originText} + + + + + + + {props.item.description} + + {props.item.image && ( + { + ;(e.target as HTMLElement).style.display = 'none' + }} + /> + )} + + + {props.item.labels?.map(({ description, color }, index) => ( + + ))} + + + // + ) +} + +export function ListLinkedItemCard(props: LinkedItemCardProps): JSX.Element { + const originText = siteName(props.item.originalArticleUrl, props.item.url) + + return ( + // + { + props.handleAction('showDetail') + }} + > + + + {props.item.title} + + {props.item.author && ( + + {authoredByText(props.item.author)} + + )} + + {originText} + + + + + + { + // This is here to prevent menu click events from bubbling + // up and causing us to "click" on the link item. + e.stopPropagation() + }} + > + + } + actionHandler={props.handleAction} + /> + + // ) } diff --git a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx index d7a60e271..cd16cf89d 100644 --- a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx +++ b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx @@ -431,7 +431,17 @@ type HomeFeedContentProps = { } function HomeFeedGrid(props: HomeFeedContentProps): JSX.Element { - const { viewerData } = useGetViewerQuery() + const viewerData = { + me: { + id: '1', + name: 'youssouf', + isFullUser: true, + profile: { + id: '1', + username: 'marzouk' + } + } + } const { preferencesData, isValidating: isValidatingPreferences } = useGetUserPreferences() const [layout, setLayout] = useState( @@ -591,7 +601,7 @@ function HomeFeedGrid(props: HomeFeedContentProps): JSX.Element { props.actionHandler(action, linkedItem) }} /> - )} + )} ))} From 20038d1d0c2986c575ab1878930691766279d7ce Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 28 Mar 2022 09:21:03 -0700 Subject: [PATCH 003/298] remove placeholder data --- .../templates/homeFeed/HomeFeedContainer.tsx | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx index cd16cf89d..48df274e4 100644 --- a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx +++ b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx @@ -431,17 +431,8 @@ type HomeFeedContentProps = { } function HomeFeedGrid(props: HomeFeedContentProps): JSX.Element { - const viewerData = { - me: { - id: '1', - name: 'youssouf', - isFullUser: true, - profile: { - id: '1', - username: 'marzouk' - } - } - } + const { viewerData } = useGetViewerQuery() + const { preferencesData, isValidating: isValidatingPreferences } = useGetUserPreferences() const [layout, setLayout] = useState( From f356ebd7817df8afe5128429622e6ebc661d68f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Mar 2022 21:27:06 +0000 Subject: [PATCH 004/298] Bump chrome-aws-lambda from 7.0.0 to 10.1.0 Bumps [chrome-aws-lambda](https://github.com/alixaxel/chrome-aws-lambda) from 7.0.0 to 10.1.0. - [Release notes](https://github.com/alixaxel/chrome-aws-lambda/releases) - [Commits](https://github.com/alixaxel/chrome-aws-lambda/compare/v7.0.0...v10.1.0) --- updated-dependencies: - dependency-name: chrome-aws-lambda dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- packages/puppeteer-parse/package.json | 2 +- yarn.lock | 40 +++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/puppeteer-parse/package.json b/packages/puppeteer-parse/package.json index 83f3e09e0..43619f24e 100644 --- a/packages/puppeteer-parse/package.json +++ b/packages/puppeteer-parse/package.json @@ -8,7 +8,7 @@ "@google-cloud/storage": "^5.18.1", "@sentry/serverless": "^6.13.3", "axios": "^0.26.0", - "chrome-aws-lambda": "^7.0.0", + "chrome-aws-lambda": "^10.1.0", "dotenv": "^8.2.0", "jsdom": "^19.0.0", "jsonwebtoken": "^8.5.1", diff --git a/yarn.lock b/yarn.lock index 463c49eea..9d41aa15d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8468,12 +8468,12 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -chrome-aws-lambda@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/chrome-aws-lambda/-/chrome-aws-lambda-7.0.0.tgz#efb73c8d254d433413cf6866c5eadc752d64b417" - integrity sha512-GbYXRPYtaA0DLfmxQpuZw1SKTP7rOA4UXiATwiFRJ4Ea6PBYSzqK0YjS7B2WimUBe//ybPfNpPIs8A3WpF0xvA== +chrome-aws-lambda@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/chrome-aws-lambda/-/chrome-aws-lambda-10.1.0.tgz#ac43b4cdfc1fbb2275c62effada560858099501e" + integrity sha512-NZQVf+J4kqG4sVhRm3WNmOfzY0OtTSm+S8rg77pwePa9RCYHzhnzRs8YvNI6L9tALIW6RpmefWiPURt3vURXcw== dependencies: - lambdafs "^2.0.2" + lambdafs "^2.0.3" chrome-trace-event@^1.0.2: version "1.0.3" @@ -13619,12 +13619,12 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== -lambdafs@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/lambdafs/-/lambdafs-2.0.3.tgz#f2acc53cf4862d29f1df654c327864b4faeb1d4a" - integrity sha512-5YWwZA/QKk09GdfcJ/ABVO+bpFoGlnTBa5jmyM8Kt9yIzl2lDDVBPLK+Aenq2UEcuDpqxXIYI5zLB7VZNepTrg== +lambdafs@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/lambdafs/-/lambdafs-2.1.1.tgz#4bf8d3037b6c61bbb4a22ab05c73ee47964c25ed" + integrity sha512-x5k8JcoJWkWLvCVBzrl4pzvkEHSgSBqFjg3Dpsc4AcTMq7oUMym4cL/gRTZ6VM4mUMY+M0dIbQ+V1c1tsqqanQ== dependencies: - tar-fs "^2.1.1" + tar-fs "*" language-subtag-registry@~0.3.2: version "0.3.21" @@ -18269,6 +18269,16 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@*, tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + tar-fs@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.0.tgz#677700fc0c8b337a78bee3623fdc235f21d7afad" @@ -18279,16 +18289,6 @@ tar-fs@2.0.0: pump "^3.0.0" tar-stream "^2.0.0" -tar-fs@^2.0.0, tar-fs@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - tar-stream@^2.0.0, tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" From d0af8b21866c10bf488d62107d930a11bd1ac50d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Mar 2022 21:28:57 +0000 Subject: [PATCH 005/298] Bump @opentelemetry/semantic-conventions from 0.24.0 to 1.0.1 Bumps [@opentelemetry/semantic-conventions](https://github.com/open-telemetry/opentelemetry-js) from 0.24.0 to 1.0.1. - [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-js/compare/v0.24.0...stable/v1.0.1) --- updated-dependencies: - dependency-name: "@opentelemetry/semantic-conventions" dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- packages/api/package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 3fdc6ded2..101dbafb6 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -30,7 +30,7 @@ "@opentelemetry/instrumentation-pg": "^0.24.0", "@opentelemetry/node": "^0.24.0", "@opentelemetry/resources": "^0.24.0", - "@opentelemetry/semantic-conventions": "^0.24.0", + "@opentelemetry/semantic-conventions": "^1.0.1", "@opentelemetry/tracing": "^0.24.0", "@sendgrid/mail": "^7.6.0", "@sentry/integrations": "^6.19.1", diff --git a/yarn.lock b/yarn.lock index 463c49eea..1da893fc6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4021,7 +4021,7 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-0.24.0.tgz#1028ef0e0923b24916158d80d2ddfd67ea8b6740" integrity sha512-a/szuMQV0Quy0/M7kKdglcbRSoorleyyOwbTNNJ32O+RBN766wbQlMTvdimImTmwYWGr+NJOni1EcC242WlRcA== -"@opentelemetry/semantic-conventions@1.0.1", "@opentelemetry/semantic-conventions@^1.0.0": +"@opentelemetry/semantic-conventions@1.0.1", "@opentelemetry/semantic-conventions@^1.0.0", "@opentelemetry/semantic-conventions@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz#9349c3860a53468fa2108b5df09aa843f22dbf94" integrity sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg== From 159791c017990bce30aaa941b9ec0a85f4e2129d Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 28 Mar 2022 21:59:10 -0700 Subject: [PATCH 006/298] break linkedItemCard file into multiple files --- .../web/components/elements/ProgressBar.tsx | 30 ++ .../patterns/LibraryCards/CardTypes.tsx | 22 ++ .../LibraryCards/GridLinkedItemCard.tsx | 188 ++++++++++ .../patterns/LibraryCards/LinkedItemCard.tsx | 23 ++ .../LibraryCards/ListLinkedItemCard.tsx | 104 ++++++ .../components/patterns/LinkedItemCard.tsx | 348 ------------------ .../templates/homeFeed/HomeFeedContainer.tsx | 18 +- 7 files changed, 376 insertions(+), 357 deletions(-) create mode 100644 packages/web/components/elements/ProgressBar.tsx create mode 100644 packages/web/components/patterns/LibraryCards/CardTypes.tsx create mode 100644 packages/web/components/patterns/LibraryCards/GridLinkedItemCard.tsx create mode 100644 packages/web/components/patterns/LibraryCards/LinkedItemCard.tsx create mode 100644 packages/web/components/patterns/LibraryCards/ListLinkedItemCard.tsx delete mode 100644 packages/web/components/patterns/LinkedItemCard.tsx diff --git a/packages/web/components/elements/ProgressBar.tsx b/packages/web/components/elements/ProgressBar.tsx new file mode 100644 index 000000000..c8d15b868 --- /dev/null +++ b/packages/web/components/elements/ProgressBar.tsx @@ -0,0 +1,30 @@ +import { Box } from './../elements/LayoutPrimitives' + +type ProgressBarProps = { + fillPercentage: number + fillColor: string + backgroundColor: string + borderRadius: string +} + +export function ProgressBar(props: ProgressBarProps): JSX.Element { + return ( + + + + ) +} diff --git a/packages/web/components/patterns/LibraryCards/CardTypes.tsx b/packages/web/components/patterns/LibraryCards/CardTypes.tsx new file mode 100644 index 000000000..6fd207761 --- /dev/null +++ b/packages/web/components/patterns/LibraryCards/CardTypes.tsx @@ -0,0 +1,22 @@ +import { LayoutType } from '../../templates/homeFeed/HomeFeedContainer' +import { UserBasicData } from '../../../lib/networking/queries/useGetViewerQuery' +import type { LibraryItemNode } from '../../../lib/networking/queries/useGetLibraryItemsQuery' + +export type LinkedItemCardAction = + | 'showDetail' + | 'showOriginal' + | 'archive' + | 'unarchive' + | 'delete' + | 'mark-read' + | 'mark-unread' + | 'share' + | 'snooze' + +export type LinkedItemCardProps = { + item: LibraryItemNode + layout: LayoutType + viewer: UserBasicData + originText?: string + handleAction: (action: LinkedItemCardAction) => void +} diff --git a/packages/web/components/patterns/LibraryCards/GridLinkedItemCard.tsx b/packages/web/components/patterns/LibraryCards/GridLinkedItemCard.tsx new file mode 100644 index 000000000..bb60b4c37 --- /dev/null +++ b/packages/web/components/patterns/LibraryCards/GridLinkedItemCard.tsx @@ -0,0 +1,188 @@ +import { Box, VStack, HStack, SpanBox } from '../../elements/LayoutPrimitives' +import { CoverImage } from '../../elements/CoverImage' +import { StyledText } from '../../elements/StyledText' +import { authoredByText } from '../ArticleSubtitle' +import { MoreOptionsIcon } from '../../elements/images/MoreOptionsIcon' +import { theme } from '../../tokens/stitches.config' +import { CardMenu } from '../CardMenu' +import { LabelChip } from '../../elements/LabelChip' +import { ProgressBar } from '../../elements/ProgressBar' +import type { LinkedItemCardProps } from './CardTypes' + +export function GridLinkedItemCard(props: LinkedItemCardProps): JSX.Element { + return ( + { + props.handleAction('showDetail') + }} + > + div': { + borderRadius: '100vmax 100vmax 0 0', + }, + }} + > + + + + + + { + // This is here to prevent menu click events from bubbling + // up and causing us to "click" on the link item. + e.stopPropagation() + }} + > + + } + actionHandler={props.handleAction} + /> + + + + + {props.item.author && ( + + {authoredByText(props.item.author)} + + )} + + {props.originText} + + + + + + + {props.item.description} + + {props.item.image && ( + { + ;(e.target as HTMLElement).style.display = 'none' + }} + /> + )} + + + {props.item.labels?.map(({ description, color }, index) => ( + + ))} + + + ) +} + +type CardTitleProps = { + title: string +} + +function CardTitle(props: CardTitleProps): JSX.Element { + return ( + + {props.title} + + ) +} diff --git a/packages/web/components/patterns/LibraryCards/LinkedItemCard.tsx b/packages/web/components/patterns/LibraryCards/LinkedItemCard.tsx new file mode 100644 index 000000000..12a4a4be7 --- /dev/null +++ b/packages/web/components/patterns/LibraryCards/LinkedItemCard.tsx @@ -0,0 +1,23 @@ +import { GridLinkedItemCard } from './GridLinkedItemCard' +import { ListLinkedItemCard } from './ListLinkedItemCard' +import type { LinkedItemCardProps } from './CardTypes' + +const siteName = (originalArticleUrl: string, itemUrl: string): string => { + try { + return new URL(originalArticleUrl).hostname + } catch {} + try { + return new URL(itemUrl).hostname + } catch {} + return '' +} + +export function LinkedItemCard(props: LinkedItemCardProps): JSX.Element { + const originText = siteName(props.item.originalArticleUrl, props.item.url) + + if (props.layout == 'LIST_LAYOUT') { + return + } else { + return + } +} diff --git a/packages/web/components/patterns/LibraryCards/ListLinkedItemCard.tsx b/packages/web/components/patterns/LibraryCards/ListLinkedItemCard.tsx new file mode 100644 index 000000000..f842129b6 --- /dev/null +++ b/packages/web/components/patterns/LibraryCards/ListLinkedItemCard.tsx @@ -0,0 +1,104 @@ +import { Box, HStack } from '../../elements/LayoutPrimitives' +import { StyledText } from '../../elements/StyledText' +import { authoredByText } from '../ArticleSubtitle' +import { MoreOptionsIcon } from '../../elements/images/MoreOptionsIcon' +import { theme } from '../../tokens/stitches.config' +import { CardMenu } from '../CardMenu' +import type { LinkedItemCardProps } from './CardTypes' +import { ProgressBar } from '../../elements/ProgressBar' + +export function ListLinkedItemCard(props: LinkedItemCardProps): JSX.Element { + return ( + { + props.handleAction('showDetail') + }} + > + + + {props.item.title} + + {props.item.author && ( + + {authoredByText(props.item.author)} + + )} + + {props.originText} + + + + + + { + // This is here to prevent menu click events from bubbling + // up and causing us to "click" on the link item. + e.stopPropagation() + }} + > + + } + actionHandler={props.handleAction} + /> + + + ) +} diff --git a/packages/web/components/patterns/LinkedItemCard.tsx b/packages/web/components/patterns/LinkedItemCard.tsx deleted file mode 100644 index ad061e3a0..000000000 --- a/packages/web/components/patterns/LinkedItemCard.tsx +++ /dev/null @@ -1,348 +0,0 @@ -import { Box, VStack, HStack, SpanBox } from './../elements/LayoutPrimitives' -import type { LibraryItemNode } from '../../lib/networking/queries/useGetLibraryItemsQuery' -import { CoverImage } from './../elements/CoverImage' -import { StyledText } from './../elements/StyledText' -import { authoredByText } from './../patterns/ArticleSubtitle' -import { MoreOptionsIcon } from './../elements/images/MoreOptionsIcon' -import { theme } from './../tokens/stitches.config' -import { CardMenu } from './../patterns/CardMenu' -import { LayoutType } from '../templates/homeFeed/HomeFeedContainer' -import { UserBasicData } from '../../lib/networking/queries/useGetViewerQuery' -import { LabelChip } from './../elements/LabelChip' - -export type LinkedItemCardAction = - | 'showDetail' - | 'showOriginal' - | 'archive' - | 'unarchive' - | 'delete' - | 'mark-read' - | 'mark-unread' - | 'share' - | 'snooze' - -type LinkedItemCardProps = { - item: LibraryItemNode - layout: LayoutType - viewer: UserBasicData - handleAction: (action: LinkedItemCardAction) => void -} - -const siteName = (originalArticleUrl: string, itemUrl: string): string => { - try { - return new URL(originalArticleUrl).hostname - } catch {} - try { - return new URL(itemUrl).hostname - } catch {} - return '' -} - -export function LinkedItemCard(props: LinkedItemCardProps): JSX.Element { - if (props.layout == 'LIST_LAYOUT') { - return - } else { - return - } -} - -export function GridLinkedItemCard(props: LinkedItemCardProps): JSX.Element { - const originText = siteName(props.item.originalArticleUrl, props.item.url) - - return ( - // - { - props.handleAction('showDetail') - }} - > - div': { - borderRadius: '100vmax 100vmax 0 0', - }, - }} - > - - - - - - {props.item.title} - - { - // This is here to prevent menu click events from bubbling - // up and causing us to "click" on the link item. - e.stopPropagation() - }} - > - - } - actionHandler={props.handleAction} - /> - - - - - {props.item.author && ( - - {authoredByText(props.item.author)} - - )} - - {originText} - - - - - - - {props.item.description} - - {props.item.image && ( - { - ;(e.target as HTMLElement).style.display = 'none' - }} - /> - )} - - - {props.item.labels?.map(({ description, color }, index) => ( - - ))} - - - // - ) -} - -export function ListLinkedItemCard(props: LinkedItemCardProps): JSX.Element { - const originText = siteName(props.item.originalArticleUrl, props.item.url) - - return ( - // - { - props.handleAction('showDetail') - }} - > - - - {props.item.title} - - {props.item.author && ( - - {authoredByText(props.item.author)} - - )} - - {originText} - - - - - - { - // This is here to prevent menu click events from bubbling - // up and causing us to "click" on the link item. - e.stopPropagation() - }} - > - - } - actionHandler={props.handleAction} - /> - - - // - ) -} - -type ProgressBarProps = { - fillPercentage: number - fillColor: string - backgroundColor: string - borderRadius: string -} - -function ProgressBar(props: ProgressBarProps): JSX.Element { - return ( - - - - ) -} diff --git a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx index 48df274e4..56a53f5c1 100644 --- a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx +++ b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx @@ -5,10 +5,8 @@ import type { LibraryItem, LibraryItemsQueryInput, } from '../../../lib/networking/queries/useGetLibraryItemsQuery' -import { - LinkedItemCard, - LinkedItemCardAction, -} from '../../patterns/LinkedItemCard' +import { LinkedItemCardAction } from '../../patterns/LibraryCards/CardTypes' +import { LinkedItemCard } from '../../patterns/LibraryCards/LinkedItemCard' import { useRouter } from 'next/router' import { Button } from '../../elements/Button' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' @@ -573,13 +571,15 @@ function HomeFeedGrid(props: HomeFeedContentProps): JSX.Element { }, '&:focus': { '> div': { - boxShadow: layout === 'LIST_LAYOUT' ? 'none' : '$cardItemShadow', - } + boxShadow: + layout === 'LIST_LAYOUT' ? 'none' : '$cardItemShadow', + }, }, '&:hover': { '> div': { - boxShadow: layout === 'LIST_LAYOUT' ? 'none' : '$cardItemShadow', - } + boxShadow: + layout === 'LIST_LAYOUT' ? 'none' : '$cardItemShadow', + }, }, }} > @@ -592,7 +592,7 @@ function HomeFeedGrid(props: HomeFeedContentProps): JSX.Element { props.actionHandler(action, linkedItem) }} /> - )} + )} ))} From 6df107fc4024f24cd84f4120fd4cc86eaae9dd7b Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 28 Mar 2022 22:28:08 -0700 Subject: [PATCH 007/298] use a vstack for library list card on narrow widths --- .../LibraryCards/ListLinkedItemCard.tsx | 109 +++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/packages/web/components/patterns/LibraryCards/ListLinkedItemCard.tsx b/packages/web/components/patterns/LibraryCards/ListLinkedItemCard.tsx index f842129b6..3a8af1b1c 100644 --- a/packages/web/components/patterns/LibraryCards/ListLinkedItemCard.tsx +++ b/packages/web/components/patterns/LibraryCards/ListLinkedItemCard.tsx @@ -1,4 +1,9 @@ -import { Box, HStack } from '../../elements/LayoutPrimitives' +import { + Box, + HStack, + VStack, + MediumBreakpointBox, +} from '../../elements/LayoutPrimitives' import { StyledText } from '../../elements/StyledText' import { authoredByText } from '../ArticleSubtitle' import { MoreOptionsIcon } from '../../elements/images/MoreOptionsIcon' @@ -8,6 +13,108 @@ import type { LinkedItemCardProps } from './CardTypes' import { ProgressBar } from '../../elements/ProgressBar' export function ListLinkedItemCard(props: LinkedItemCardProps): JSX.Element { + return ( + } + largerLayoutNode={} + /> + ) +} + +export function ListLinkedItemCardNarrow( + props: LinkedItemCardProps +): JSX.Element { + return ( + { + props.handleAction('showDetail') + }} + > + + + + {props.item.title} + + + {props.item.author && ( + + {authoredByText(props.item.author)} + + )} + + {props.originText} + + + + + { + // This is here to prevent menu click events from bubbling + // up and causing us to "click" on the link item. + e.stopPropagation() + }} + > + + } + actionHandler={props.handleAction} + /> + + + ) +} + +export function ListLinkedItemCardWide( + props: LinkedItemCardProps +): JSX.Element { return ( Date: Wed, 30 Mar 2022 09:45:07 -0700 Subject: [PATCH 008/298] Update the font and background colour on label chips --- packages/web/components/elements/LabelChip.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/web/components/elements/LabelChip.tsx b/packages/web/components/elements/LabelChip.tsx index ee39b1497..c24b54e55 100644 --- a/packages/web/components/elements/LabelChip.tsx +++ b/packages/web/components/elements/LabelChip.tsx @@ -21,9 +21,11 @@ export function LabelChip(props: LabelChipProps): JSX.Element { margin: '4px', borderRadius: '32px', color: props.color, + fontSize: '12px', + fontWeight: 'bold', padding: '4px 8px 4px 8px', border: `1px solid rgba(${color[0]}, ${color[1]}, ${color[2]}, 0.40)`, - backgroundColor: `rgba(${color[0]}, ${color[1]}, ${color[2]}, 0.20)`, + backgroundColor: `rgba(${color[0]}, ${color[1]}, ${color[2]}, 0.08)`, }} > {props.text} From e478b01a1795e5964fe7d3e15cbefd038c03fbd8 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Wed, 30 Mar 2022 09:45:59 -0700 Subject: [PATCH 009/298] Update label import, use LabelChip instead of styled text to display labels --- packages/web/pages/settings/labels.tsx | 31 +++++--------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/packages/web/pages/settings/labels.tsx b/packages/web/pages/settings/labels.tsx index bdcdd7f78..4d161f65b 100644 --- a/packages/web/pages/settings/labels.tsx +++ b/packages/web/pages/settings/labels.tsx @@ -1,3 +1,4 @@ +import { useEffect, useState } from 'react' import { PrimaryLayout } from '../../components/templates/PrimaryLayout' import { Button } from '../../components/elements/Button' import { PlusIcon } from '../../components/elements/images/PlusIcon' @@ -13,11 +14,9 @@ import { useGetLabelsQuery } from '../../lib/networking/queries/useGetLabelsQuer import { createLabelMutation } from '../../lib/networking/mutations/createLabelMutation' import { updateLabelMutation } from '../../lib/networking/mutations/updateLabelMutation' import { deleteLabelMutation } from '../../lib/networking/mutations/deleteLabelMutation' -import { Label } from '../../lib/networking/queries/useGetLabelsQuery' import { isDarkTheme } from '../../lib/themeUpdater' import { showErrorToast, showSuccessToast } from '../../lib/toastHelpers' - -import { useEffect, useState } from 'react' +import { Label } from '../../lib/networking/fragments/labelFragment' import { StyledText } from '../../components/elements/StyledText' import { ArrowClockwise, @@ -41,16 +40,17 @@ import { Dropdown, DropdownOption, } from '../../components/elements/DropdownElements' +import { LabelChip } from '../../components/elements/LabelChip' const HeaderWrapper = styled(Box, { width: '100%', }) const TableCard = styled(Box, { + padding: '0px', backgroundColor: '$grayBg', display: 'flex', alignItems: 'center', - padding: '8px 12px', border: '0.3px solid $grayBgActive', width: '100%', @@ -549,7 +549,6 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean '@mdDown': { borderTopLeftRadius: isFirstChild ? '5px' : '', borderTopRightRadius: isFirstChild ? '5px' : '', - }, borderBottomLeftRadius: isLastChild ? '5px' : '', borderBottomRightRadius: isLastChild ? '5px' : '', @@ -589,27 +588,7 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean - - - {labelName} - - + )} {(showInput && !label) ? ( From f4a037677f27dcd7bf847b177f0f3337b33e2662 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Wed, 30 Mar 2022 10:26:47 -0700 Subject: [PATCH 010/298] Consistent font sizes for headlines --- packages/web/components/elements/StyledText.tsx | 2 +- packages/web/pages/settings/emails.tsx | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/web/components/elements/StyledText.tsx b/packages/web/components/elements/StyledText.tsx index af008f21c..0df5f3b3b 100644 --- a/packages/web/components/elements/StyledText.tsx +++ b/packages/web/components/elements/StyledText.tsx @@ -29,7 +29,7 @@ const textVariants = { }, }, fixedHeadline: { - fontSize: '$6', + fontSize: '24px', fontWeight: '500', }, subHeadline: { diff --git a/packages/web/pages/settings/emails.tsx b/packages/web/pages/settings/emails.tsx index 7b26da7b7..2e804b1a4 100644 --- a/packages/web/pages/settings/emails.tsx +++ b/packages/web/pages/settings/emails.tsx @@ -224,10 +224,6 @@ export default function EmailsPage(): JSX.Element { Email Addresses{' '} From 2c15516d9648001e2ab307e4b1021d63be75de4f Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Wed, 30 Mar 2022 13:28:37 -0700 Subject: [PATCH 011/298] Order labels by createdAt so they maintain a consistent order --- packages/api/src/resolvers/labels/index.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/api/src/resolvers/labels/index.ts b/packages/api/src/resolvers/labels/index.ts index fd779086e..249105f78 100644 --- a/packages/api/src/resolvers/labels/index.ts +++ b/packages/api/src/resolvers/labels/index.ts @@ -42,9 +42,16 @@ export const labelsResolver = authorized( }) try { - const user = await User.findOne(uid, { - relations: ['labels'], - }) + const user = await getRepository(User) + .createQueryBuilder("user") + .innerJoinAndSelect( + "user.labels", + "labels", + ) + .where("user.id = :uid", { uid }) + .orderBy("labels.createdAt", "DESC") + .getOne() + if (!user) { return { errorCodes: [LabelsErrorCode.Unauthorized], @@ -52,7 +59,7 @@ export const labelsResolver = authorized( } return { - labels: user.labels || [], + labels: user.labels?.sort((a,b) => a.createdAt.getTime() - b.createdAt.getTime()) || [], } } catch (error) { log.error(error) From edc5d6ad97d5749def0816c4373cd84a6a592bc5 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Wed, 30 Mar 2022 13:55:04 -0700 Subject: [PATCH 012/298] Fix label import for old location, apply the theme on the page --- packages/web/pages/settings/labels.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/web/pages/settings/labels.tsx b/packages/web/pages/settings/labels.tsx index 4d161f65b..a72532f6d 100644 --- a/packages/web/pages/settings/labels.tsx +++ b/packages/web/pages/settings/labels.tsx @@ -14,9 +14,9 @@ import { useGetLabelsQuery } from '../../lib/networking/queries/useGetLabelsQuer import { createLabelMutation } from '../../lib/networking/mutations/createLabelMutation' import { updateLabelMutation } from '../../lib/networking/mutations/updateLabelMutation' import { deleteLabelMutation } from '../../lib/networking/mutations/deleteLabelMutation' -import { isDarkTheme } from '../../lib/themeUpdater' +import { applyStoredTheme, isDarkTheme } from '../../lib/themeUpdater' import { showErrorToast, showSuccessToast } from '../../lib/toastHelpers' -import { Label } from '../../lib/networking/fragments/labelFragment' +import { Label } from '../../lib/networking/queries/useGetLabelsQuery' import { StyledText } from '../../components/elements/StyledText' import { ArrowClockwise, @@ -162,6 +162,8 @@ export default function LabelsPage(): JSX.Element { const [windowWidth, setWindowWidth] = useState(0) const breakpoint = 768 + applyStoredTheme(false) + useEffect(() => { const handleResizeWindow = () => setWindowWidth(window.innerWidth) if (windowWidth === 0) { From a8faaf835cfbddd95a11311f1b2b07225afe8794 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Wed, 30 Mar 2022 14:13:26 -0700 Subject: [PATCH 013/298] Remove debug sort on labels --- packages/api/src/resolvers/labels/index.ts | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/api/src/resolvers/labels/index.ts b/packages/api/src/resolvers/labels/index.ts index 249105f78..d0b86b189 100644 --- a/packages/api/src/resolvers/labels/index.ts +++ b/packages/api/src/resolvers/labels/index.ts @@ -43,14 +43,11 @@ export const labelsResolver = authorized( try { const user = await getRepository(User) - .createQueryBuilder("user") - .innerJoinAndSelect( - "user.labels", - "labels", - ) - .where("user.id = :uid", { uid }) - .orderBy("labels.createdAt", "DESC") - .getOne() + .createQueryBuilder('user') + .innerJoinAndSelect('user.labels', 'labels') + .where('user.id = :uid', { uid }) + .orderBy('labels.createdAt', 'DESC') + .getOne() if (!user) { return { @@ -59,7 +56,7 @@ export const labelsResolver = authorized( } return { - labels: user.labels?.sort((a,b) => a.createdAt.getTime() - b.createdAt.getTime()) || [], + labels: user.labels || [], } } catch (error) { log.error(error) From 88c96c824f5058ea56116ac9349bff801de38478 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Wed, 30 Mar 2022 14:23:09 -0700 Subject: [PATCH 014/298] Remove the DotsSix since we dont support re-ordering these items --- packages/web/pages/settings/labels.tsx | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/web/pages/settings/labels.tsx b/packages/web/pages/settings/labels.tsx index a72532f6d..5b88c860e 100644 --- a/packages/web/pages/settings/labels.tsx +++ b/packages/web/pages/settings/labels.tsx @@ -585,12 +585,9 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean padding: '0 5px', }} > - {(showInput && !label) ? null : ( - - - + {(showInput || !label) ? null : ( + + )} {(showInput && !label) ? ( From a1feffaf036944ba1021340f1293861e3a4c612c Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Wed, 30 Mar 2022 16:39:51 -0700 Subject: [PATCH 015/298] Prefetch page content on iOS --- .../App/Views/Home/HomeFeedViewModel.swift | 3 ++ .../Views/WebReader/WebReaderViewModel.swift | 10 ++++++ .../Sources/Models/ArticleContent.swift | 8 +++++ .../Services/DataService/DataService.swift | 32 +++++++++++++++++++ 4 files changed, 53 insertions(+) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift index e0ebabb8d..6a917f435 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift @@ -76,6 +76,9 @@ final class HomeFeedViewModel: ObservableObject { if thisSearchIdx > 0, thisSearchIdx <= self?.receivedIdx ?? 0 { return } + + dataService.prefetchPages(items: result.items) + self?.items = isRefresh ? result.items : (self?.items ?? []) + result.items self?.isLoading = false self?.receivedIdx = thisSearchIdx diff --git a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderViewModel.swift index 1dd5aa8dd..f111608c9 100644 --- a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderViewModel.swift @@ -28,6 +28,15 @@ final class WebReaderViewModel: ObservableObject { guard let viewer = dataService.currentViewer else { return } + if let content = dataService.pageCache.object(forKey: NSString(string: slug)) { + print("RETRIEVED FORM CACHE", slug) + isLoading = false + articleContent = content.value + return + } else { + print("MISSED CACHE", slug) + } + dataService.articleContentPublisher(username: viewer.username, slug: slug).sink( receiveCompletion: { [weak self] completion in guard case .failure = completion else { return } @@ -35,6 +44,7 @@ final class WebReaderViewModel: ObservableObject { }, receiveValue: { [weak self] articleContent in self?.articleContent = articleContent + dataService.pageCache.setObject(CachedPageContent(articleContent), forKey: NSString(string: slug)) } ) .store(in: &subscriptions) diff --git a/apple/OmnivoreKit/Sources/Models/ArticleContent.swift b/apple/OmnivoreKit/Sources/Models/ArticleContent.swift index bc55cf570..7a3d5b0e7 100644 --- a/apple/OmnivoreKit/Sources/Models/ArticleContent.swift +++ b/apple/OmnivoreKit/Sources/Models/ArticleContent.swift @@ -1,5 +1,13 @@ import Foundation +public class CachedPageContent: NSObject { + public let value: ArticleContent + + public init(_ content: ArticleContent) { + self.value = content + } +} + public struct ArticleContent { public let htmlContent: String public let highlights: [Highlight] diff --git a/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift b/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift index 12deb1da3..aca49bdfa 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift @@ -1,6 +1,13 @@ +import Combine import Foundation import Models +public class CacheManager: NSObject, NSCacheDelegate { + public func cache(_: NSCache, willEvictObject obj: Any) { + print("evicting object", obj) + } +} + public final class DataService: ObservableObject { public static var registerIntercomUser: ((String) -> Void)? public static var showIntercomMessenger: (() -> Void)? @@ -9,12 +16,37 @@ public final class DataService: ObservableObject { public internal(set) var currentViewer: Viewer? let networker: Networker + public let pageCache = NSCache() + let pageCacheQueue = DispatchQueue.global(qos: .background) + let highlightsCache = NSCache() let highlightsCacheQueue = DispatchQueue(label: "app.omnivore.highlights.cache.queue", attributes: .concurrent) + let cacheManager: CacheManager + var subscriptions = Set() + public init(appEnvironment: AppEnvironment, networker: Networker) { self.appEnvironment = appEnvironment self.networker = networker + self.cacheManager = CacheManager() + pageCache.delegate = cacheManager + } + + public func prefetchPages(items: [FeedItem]) { + print("prefetching items", items, "cost limit", pageCache.countLimit) + + guard let viewer = currentViewer else { return } + + for item in items { + let slug = item.slug + articleContentPublisher(username: viewer.username, slug: slug).sink( + receiveCompletion: { _ in }, + receiveValue: { [weak self] articleContent in + self?.pageCache.setObject(CachedPageContent(articleContent), forKey: NSString(string: slug)) + } + ) + .store(in: &subscriptions) + } } public func clearHighlights() { From 183776c7912963bae72d5f8276498c65c05c06f6 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Wed, 30 Mar 2022 17:09:37 -0700 Subject: [PATCH 016/298] Reduce the reader overly length now that items are precached --- .../Sources/App/Views/WebReader/WebReaderContainer.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift index 503f67417..7cc5bf938 100644 --- a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift +++ b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift @@ -204,7 +204,7 @@ struct WebReaderContainerView: View { Color.systemBackground .transition(.opacity) .onAppear { - DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(250)) { + DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) { withAnimation(.linear(duration: 0.2)) { showOverlay = false } From 5ee137d00736d406ebd5b6eb41e65ed03582f518 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Mar 2022 02:48:02 +0000 Subject: [PATCH 017/298] Bump @sentry/serverless from 6.16.1 to 6.19.3 Bumps [@sentry/serverless](https://github.com/getsentry/sentry-javascript) from 6.16.1 to 6.19.3. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/6.16.1...6.19.3) --- updated-dependencies: - dependency-name: "@sentry/serverless" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- yarn.lock | 245 ++++++++++++++++++------------------------------------ 1 file changed, 81 insertions(+), 164 deletions(-) diff --git a/yarn.lock b/yarn.lock index 463c49eea..3708b72c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4564,9 +4564,9 @@ any-observable "^0.3.0" "@segment/analytics-next@^1.33.5": - version "1.33.5" - resolved "https://registry.yarnpkg.com/@segment/analytics-next/-/analytics-next-1.33.5.tgz#798e20229ec524deeb4f6311c008543c0fa3c175" - integrity sha512-HgyBB0vqWnVCrZ3gJY3tPq11J8RWR2Vs3OuRFg5Exf1+oVtjcQwcR09okKursx0UsvVXYG7mHKQM9yiRVYxqJA== + version "1.34.0" + resolved "https://registry.yarnpkg.com/@segment/analytics-next/-/analytics-next-1.34.0.tgz#dfc0ec53a39f3131adf7181d6f6cc74a84f7e8c5" + integrity sha512-3hbpLhMqgBrdv8WWB+qZY34F0SE4qx+zbx28D5YHpI5U1u0dEd34IjNSoBigkEHVNOV2Z1Rkyr1UBbQtZVb6Xw== dependencies: "@lukeed/uuid" "^2.0.0" "@segment/analytics.js-video-plugins" "^0.2.1" @@ -4682,28 +4682,6 @@ "@sentry/utils" "5.30.0" tslib "^1.9.3" -"@sentry/core@6.13.3": - version "6.13.3" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.13.3.tgz#5cbbb995128e793ebebcbf1d3b7514e0e5e8b221" - integrity sha512-obm3SjgCk8A7nB37b2AU1eq1q7gMoJRrGMv9VRIyfcG0Wlz/5lJ9O3ohUk+YZaaVfZMxXn6hFtsBiOWmlv7IIA== - dependencies: - "@sentry/hub" "6.13.3" - "@sentry/minimal" "6.13.3" - "@sentry/types" "6.13.3" - "@sentry/utils" "6.13.3" - tslib "^1.9.3" - -"@sentry/core@6.16.1": - version "6.16.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.16.1.tgz#d9f7a75f641acaddf21b6aafa7a32e142f68f17c" - integrity sha512-UFI0264CPUc5cR1zJH+S2UPOANpm6dLJOnsvnIGTjsrwzR0h8Hdl6rC2R/GPq+WNbnipo9hkiIwDlqbqvIU5vw== - dependencies: - "@sentry/hub" "6.16.1" - "@sentry/minimal" "6.16.1" - "@sentry/types" "6.16.1" - "@sentry/utils" "6.16.1" - tslib "^1.9.3" - "@sentry/core@6.17.7": version "6.17.7" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.17.7.tgz#f591235c06b1a4e75d748b15c539e071bd3f5cf5" @@ -4715,6 +4693,17 @@ "@sentry/utils" "6.17.7" tslib "^1.9.3" +"@sentry/core@6.19.3": + version "6.19.3" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.19.3.tgz#88268afc8c42716c455ad77bb4bed2bbf96abd83" + integrity sha512-RcGmYdkrE3VYBMl9Hgv4GKsC8FEVUdWYsfGIcT/btwP2YpBeUaTZl+1vV9r3Ncdl125LqzP5CKSj5otVxiEg6g== + dependencies: + "@sentry/hub" "6.19.3" + "@sentry/minimal" "6.19.3" + "@sentry/types" "6.19.3" + "@sentry/utils" "6.19.3" + tslib "^1.9.3" + "@sentry/hub@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" @@ -4724,24 +4713,6 @@ "@sentry/utils" "5.30.0" tslib "^1.9.3" -"@sentry/hub@6.13.3": - version "6.13.3" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.13.3.tgz#cc09623a69b5343315fdb61c7fdd0be74b72299f" - integrity sha512-eYppBVqvhs5cvm33snW2sxfcw6G20/74RbBn+E4WDo15hozis89kU7ZCJDOPkXuag3v1h9igns/kM6PNBb41dw== - dependencies: - "@sentry/types" "6.13.3" - "@sentry/utils" "6.13.3" - tslib "^1.9.3" - -"@sentry/hub@6.16.1": - version "6.16.1" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.16.1.tgz#526e19db51f4412da8634734044c605b936a7b80" - integrity sha512-4PGtg6AfpqMkreTpL7ymDeQ/U1uXv03bKUuFdtsSTn/FRf9TLS4JB0KuTZCxfp1IRgAA+iFg6B784dDkT8R9eg== - dependencies: - "@sentry/types" "6.16.1" - "@sentry/utils" "6.16.1" - tslib "^1.9.3" - "@sentry/hub@6.17.7": version "6.17.7" resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.17.7.tgz#5c90d661e263dad7da0e0106f1cb90cf797d93a7" @@ -4751,6 +4722,15 @@ "@sentry/utils" "6.17.7" tslib "^1.9.3" +"@sentry/hub@6.19.3": + version "6.19.3" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.19.3.tgz#d555c83404f19ac9b68f336b051b8e7a9d75feb0" + integrity sha512-iYbkrxEZt6CrHP3U3r54MARVZSs3YHjAMUMOTlC16s/Amz1McwV95XtI3NJaqMhwzl7R5vbGrs3xOtLg1V1Uyw== + dependencies: + "@sentry/types" "6.19.3" + "@sentry/utils" "6.19.3" + tslib "^1.9.3" + "@sentry/integrations@6.17.7": version "6.17.7" resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-6.17.7.tgz#c14f409fec91743db4a21232413de235946cb6d3" @@ -4780,24 +4760,6 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" -"@sentry/minimal@6.13.3": - version "6.13.3" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.13.3.tgz#a675a79bcc830142e4f95e6198a2efde2cd3901e" - integrity sha512-63MlYYRni3fs5Bh8XBAfVZ+ctDdWg0fapSTP1ydIC37fKvbE+5zhyUqwrEKBIiclEApg1VKX7bkKxVdu/vsFdw== - dependencies: - "@sentry/hub" "6.13.3" - "@sentry/types" "6.13.3" - tslib "^1.9.3" - -"@sentry/minimal@6.16.1": - version "6.16.1" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.16.1.tgz#6a9506a92623d2ff1fc17d60989688323326772e" - integrity sha512-dq+mI1EQIvUM+zJtGCVgH3/B3Sbx4hKlGf2Usovm9KoqWYA+QpfVBholYDe/H2RXgO7LFEefDLvOdHDkqeJoyA== - dependencies: - "@sentry/hub" "6.16.1" - "@sentry/types" "6.16.1" - tslib "^1.9.3" - "@sentry/minimal@6.17.7": version "6.17.7" resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.17.7.tgz#f19182047f19b563f40a30d45d2ce9ad7df1ec4e" @@ -4807,6 +4769,15 @@ "@sentry/types" "6.17.7" tslib "^1.9.3" +"@sentry/minimal@6.19.3": + version "6.19.3" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.19.3.tgz#b9b7f0d7f0cd2341b243318668ac01458f9d7889" + integrity sha512-xy/6ThHK8B2NJT98nWrx6V9eVgUbzq2N/8lv5/QqrKsICjxx22TRC8Q6zPg/o7BYcrY5vpugSEbIeErTnyxHDA== + dependencies: + "@sentry/hub" "6.19.3" + "@sentry/types" "6.19.3" + tslib "^1.9.3" + "@sentry/nextjs@^6.16.1": version "6.17.7" resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-6.17.7.tgz#00e0380ba2b709674e495b3c00b24ee82405575d" @@ -4822,36 +4793,6 @@ "@sentry/webpack-plugin" "1.18.5" tslib "^1.9.3" -"@sentry/node@6.13.3": - version "6.13.3" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.13.3.tgz#94c646c31fd240ab68ee8b85aa663e65eb499d06" - integrity sha512-ZeZSw+TcPcf4e0j7iEqNMtoVmz+WFW/TEoGokXIwysZqSgchKdAXDHqn+CqUqFan7d76JcJmzztAUK2JruQ2Kg== - dependencies: - "@sentry/core" "6.13.3" - "@sentry/hub" "6.13.3" - "@sentry/tracing" "6.13.3" - "@sentry/types" "6.13.3" - "@sentry/utils" "6.13.3" - cookie "^0.4.1" - https-proxy-agent "^5.0.0" - lru_map "^0.3.3" - tslib "^1.9.3" - -"@sentry/node@6.16.1": - version "6.16.1" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.16.1.tgz#d92916da3e95d23e1ada274e97d6bf369e74ac51" - integrity sha512-SeDDoug2kUxeF1D7JGPa3h5EXxKtmA01mITBPYx5xbJ0sMksnv5I5bC1SJ8arRRzq6+W1C4IEeDBQtrVCk6ixA== - dependencies: - "@sentry/core" "6.16.1" - "@sentry/hub" "6.16.1" - "@sentry/tracing" "6.16.1" - "@sentry/types" "6.16.1" - "@sentry/utils" "6.16.1" - cookie "^0.4.1" - https-proxy-agent "^5.0.0" - lru_map "^0.3.3" - tslib "^1.9.3" - "@sentry/node@6.17.7": version "6.17.7" resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.17.7.tgz#c142d93328b29312098276e0cb66ec3b9e805a93" @@ -4867,6 +4808,20 @@ lru_map "^0.3.3" tslib "^1.9.3" +"@sentry/node@6.19.3": + version "6.19.3" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.19.3.tgz#afcf106bf72acc0e4bbacbc54744de8a938cbd1c" + integrity sha512-eHreMMbaK4mMAQ45Ki2xJ6in02l66hL6xhltppy/h4m297JIvjaQAFpbQf5XLtO7W4KjdbSV5qnB45D1aOAzFA== + dependencies: + "@sentry/core" "6.19.3" + "@sentry/hub" "6.19.3" + "@sentry/types" "6.19.3" + "@sentry/utils" "6.19.3" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + "@sentry/node@^5.26.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" @@ -4894,30 +4849,16 @@ hoist-non-react-statics "^3.3.2" tslib "^1.9.3" -"@sentry/serverless@^6.13.3": - version "6.13.3" - resolved "https://registry.yarnpkg.com/@sentry/serverless/-/serverless-6.13.3.tgz#3fd3c7b196918c9be949b8187dc62d88e1205ef6" - integrity sha512-4isAEvofOFqbA4CE4Ls1W/95KmKzYv95aDsoAhBxHl8KgYjRPcOVsaNsssi8HZyLiw3euTiE/C0jX4I7Zl7uRw== +"@sentry/serverless@^6.13.3", "@sentry/serverless@^6.16.1": + version "6.19.3" + resolved "https://registry.yarnpkg.com/@sentry/serverless/-/serverless-6.19.3.tgz#b61474d0612a9885d6426b92f8ded90a0ef44887" + integrity sha512-HhD0RjgaaNfUQwhvg2e7STzshhbRXs2r4AI4AJ9jHDhQBLrG2/PKDJgul3KbMbfsc5791oqIWoT4MSz3iuwbJw== dependencies: - "@sentry/minimal" "6.13.3" - "@sentry/node" "6.13.3" - "@sentry/tracing" "6.13.3" - "@sentry/types" "6.13.3" - "@sentry/utils" "6.13.3" - "@types/aws-lambda" "^8.10.62" - "@types/express" "^4.17.2" - tslib "^1.9.3" - -"@sentry/serverless@^6.16.1": - version "6.16.1" - resolved "https://registry.yarnpkg.com/@sentry/serverless/-/serverless-6.16.1.tgz#21bab60569ab89d739de9fb49bf958e2fee4bb97" - integrity sha512-WLBF9QclIoYRsqRbYo/AjElPN7e7J9Xz7LLQ3fsB35Hsr5YjcDj2rw7Q2pDKnCkRIZpj6N+TvAeOHaVv3Z0Qmg== - dependencies: - "@sentry/minimal" "6.16.1" - "@sentry/node" "6.16.1" - "@sentry/tracing" "6.16.1" - "@sentry/types" "6.16.1" - "@sentry/utils" "6.16.1" + "@sentry/minimal" "6.19.3" + "@sentry/node" "6.19.3" + "@sentry/tracing" "6.19.3" + "@sentry/types" "6.19.3" + "@sentry/utils" "6.19.3" "@types/aws-lambda" "^8.10.62" "@types/express" "^4.17.2" tslib "^1.9.3" @@ -4933,28 +4874,6 @@ "@sentry/utils" "5.30.0" tslib "^1.9.3" -"@sentry/tracing@6.13.3": - version "6.13.3" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.13.3.tgz#ca657d4afa99c50f15e638fe38405bac33e780ee" - integrity sha512-yyOFIhqlprPM0g4f35Icear3eZk2mwyYcGEzljJfY2iU6pJwj1lzia5PfSwiCW7jFGMmlBJNhOAIpfhlliZi8Q== - dependencies: - "@sentry/hub" "6.13.3" - "@sentry/minimal" "6.13.3" - "@sentry/types" "6.13.3" - "@sentry/utils" "6.13.3" - tslib "^1.9.3" - -"@sentry/tracing@6.16.1": - version "6.16.1" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.16.1.tgz#32fba3e07748e9a955055afd559a65996acb7d71" - integrity sha512-MPSbqXX59P+OEeST+U2V/8Hu/8QjpTUxTNeNyTHWIbbchdcMMjDbXTS3etCgajZR6Ro+DHElOz5cdSxH6IBGlA== - dependencies: - "@sentry/hub" "6.16.1" - "@sentry/minimal" "6.16.1" - "@sentry/types" "6.16.1" - "@sentry/utils" "6.16.1" - tslib "^1.9.3" - "@sentry/tracing@6.17.7": version "6.17.7" resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.17.7.tgz#f4536683b29bb3ac7ddda5ca49494731cec6b619" @@ -4966,21 +4885,22 @@ "@sentry/utils" "6.17.7" tslib "^1.9.3" +"@sentry/tracing@6.19.3": + version "6.19.3" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.19.3.tgz#dfdbd5019486c899bdf352b1152d5d253544ef70" + integrity sha512-3lyb4yCFH/ltEQSyKM96g2c74vvKIwByx8fLDS4FHYQQDXY+xPcs+zyK8L1Fs5PRFAUciEOK5TS9qwELom5K4w== + dependencies: + "@sentry/hub" "6.19.3" + "@sentry/minimal" "6.19.3" + "@sentry/types" "6.19.3" + "@sentry/utils" "6.19.3" + tslib "^1.9.3" + "@sentry/types@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== -"@sentry/types@6.13.3": - version "6.13.3" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.13.3.tgz#63ad5b6735b0dfd90b3a256a9f8e77b93f0f66b2" - integrity sha512-Vrz5CdhaTRSvCQjSyIFIaV9PodjAVFkzJkTRxyY7P77RcegMsRSsG1yzlvCtA99zG9+e6MfoJOgbOCwuZids5A== - -"@sentry/types@6.16.1": - version "6.16.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.16.1.tgz#4917607115b30315757c2cf84f80bac5100b8ac0" - integrity sha512-Wh354g30UsJ5kYJbercektGX4ZMc9MHU++1NjeN2bTMnbofEcpUDWIiKeulZEY65IC1iU+1zRQQgtYO+/hgCUQ== - "@sentry/types@6.17.7": version "6.17.7" resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.17.7.tgz#61946a3f6532b8f21251b264f173b02f9ea2458e" @@ -4991,6 +4911,11 @@ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.19.1.tgz#684a231f8fe10c9cf14f9552f5da0a4492e6fdbc" integrity sha512-ovmNYdqD2MKLmru4calxetX1xjJdYim+HEI/GzwvVUYshsaXRq4EiQ17h3DAy90MV7JH279PmMoPGDTOpufq+Q== +"@sentry/types@6.19.3": + version "6.19.3" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.19.3.tgz#94b19da68d4d23561efb1014f72968bcea85cd0c" + integrity sha512-jHhqxp8MIWSfOc3krorirTGKTEaSFO6XrAvi+2AZhr6gvOChwOgzgrN2ZqesJcZmgCsqWV21u3usSwYeRrjOJA== + "@sentry/utils@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" @@ -4999,22 +4924,6 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" -"@sentry/utils@6.13.3": - version "6.13.3" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.13.3.tgz#188754d40afe693c3fcae410f9322531588a9926" - integrity sha512-zYFuFH3MaYtBZTeJ4Yajg7pDf0pM3MWs3+9k5my9Fd+eqNcl7dYQYJbT9gyC0HXK1QI4CAMNNlHNl4YXhF91ag== - dependencies: - "@sentry/types" "6.13.3" - tslib "^1.9.3" - -"@sentry/utils@6.16.1": - version "6.16.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.16.1.tgz#1b9e14c2831b6e8b816f7021b9876133bf2be008" - integrity sha512-7ngq/i4R8JZitJo9Sl8PDnjSbDehOxgr1vsoMmerIsyRZ651C/8B+jVkMhaAPgSdyJ0AlE3O7DKKTP1FXFw9qw== - dependencies: - "@sentry/types" "6.16.1" - tslib "^1.9.3" - "@sentry/utils@6.17.7": version "6.17.7" resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.17.7.tgz#0574bf914cc129b5e47041b75bb34dfbe0decbba" @@ -5031,6 +4940,14 @@ "@sentry/types" "6.19.1" tslib "^1.9.3" +"@sentry/utils@6.19.3": + version "6.19.3" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.19.3.tgz#0c3a3f0b86c12e3b079e56e37a44e62a1226043d" + integrity sha512-GdC9B/FK7qd0zItY43135bYbhuVSawE18bIrQDNuno8gTpDJ5OgShpTN9zR53AmMh16/lwKNnV3ZZjlpKcxuNw== + dependencies: + "@sentry/types" "6.19.3" + tslib "^1.9.3" + "@sentry/webpack-plugin@1.18.5": version "1.18.5" resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.18.5.tgz#aaff79d8e05b8d803654490324252406c976b1cd" @@ -14914,12 +14831,12 @@ node-domexception@1.0.0: resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== -node-fetch@2.6.1, node-fetch@^2.3.0, node-fetch@^2.6.1: +node-fetch@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@2.6.7, node-fetch@^2.6.7: +node-fetch@2.6.7, node-fetch@^2.3.0, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== From a0ef2fd40a1a5826b15f0319ae88ac634070cfd4 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Wed, 30 Mar 2022 20:31:50 -0700 Subject: [PATCH 018/298] Dont use isDarkMode, use themed color for setting icon colors --- packages/web/components/elements/Avatar.tsx | 2 +- .../components/elements/LabelColorDropdown.tsx | 7 +++---- .../web/components/tokens/stitches.config.ts | 4 ++-- packages/web/pages/settings/labels.tsx | 18 +++++++----------- 4 files changed, 13 insertions(+), 18 deletions(-) diff --git a/packages/web/components/elements/Avatar.tsx b/packages/web/components/elements/Avatar.tsx index bce69524c..30718498e 100644 --- a/packages/web/components/elements/Avatar.tsx +++ b/packages/web/components/elements/Avatar.tsx @@ -52,5 +52,5 @@ const StyledFallback = styled(Fallback, { fontSize: '$2', fontWeight: 700, backgroundColor: '$avatarBg', - color: '$avatarFont', + color: '$toolColor', }) diff --git a/packages/web/components/elements/LabelColorDropdown.tsx b/packages/web/components/elements/LabelColorDropdown.tsx index ece04e6ee..0468fba42 100644 --- a/packages/web/components/elements/LabelColorDropdown.tsx +++ b/packages/web/components/elements/LabelColorDropdown.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import { styled } from '../tokens/stitches.config' +import { styled, theme } from '../tokens/stitches.config' import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' import { HexColorPicker } from 'react-colorful' import { Button } from './Button' @@ -17,6 +17,7 @@ import { import { labelColorObjects } from '../../utils/settings-page/labels/labelColorObjects' import { DropdownOption } from './DropdownElements' import { isDarkTheme } from '../../lib/themeUpdater' +import { useDarkModeListener } from '../../lib/hooks/useDarkModeListener' const DropdownMenuContent = styled(DropdownMenuPrimitive.Content, { maxWidth: 190, @@ -77,8 +78,6 @@ export const LabelColorDropdown = (props: LabelColorDropdownProps) => { setLabelColorHex, } = props - const isDarkMode = isDarkTheme() - const iconColor = isDarkMode ? '#FFFFFF': '#0A0806' const [open, setOpen] = useState(false); const handleCustomColorChange = (color: string) => { @@ -147,7 +146,7 @@ export const LabelColorDropdown = (props: LabelColorDropdownProps) => { )} - + diff --git a/packages/web/components/tokens/stitches.config.ts b/packages/web/components/tokens/stitches.config.ts index 3a09eff08..99b852118 100644 --- a/packages/web/components/tokens/stitches.config.ts +++ b/packages/web/components/tokens/stitches.config.ts @@ -160,7 +160,7 @@ export const { styled, css, theme, getCssText, globalCss, keyframes, config } = // Avatar Fallback color avatarBg: '#FFFFFF', - avatarFont: '#0A0806', + toolColor: '#0A0806', labelButtonsBg: '#F5F5F4', tooltipIcons: '#FDFAEC' @@ -212,7 +212,7 @@ const darkThemeSpec = { readerTableHeader: '#FFFFFF', tooltipIcons: '#5F5E58', avatarBg: '#000000', - avatarFont: 'rgba(255, 255, 255, 0.8)', + toolColor: 'rgba(255, 255, 255, 0.8)', labelButtonsBg: '#5F5E58', }, diff --git a/packages/web/pages/settings/labels.tsx b/packages/web/pages/settings/labels.tsx index 5b88c860e..64b797857 100644 --- a/packages/web/pages/settings/labels.tsx +++ b/packages/web/pages/settings/labels.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react' import { PrimaryLayout } from '../../components/templates/PrimaryLayout' import { Button } from '../../components/elements/Button' import { PlusIcon } from '../../components/elements/images/PlusIcon' -import { styled } from '../../components/tokens/stitches.config' +import { styled, theme } from '../../components/tokens/stitches.config' import { Box, SpanBox, @@ -14,7 +14,7 @@ import { useGetLabelsQuery } from '../../lib/networking/queries/useGetLabelsQuer import { createLabelMutation } from '../../lib/networking/mutations/createLabelMutation' import { updateLabelMutation } from '../../lib/networking/mutations/updateLabelMutation' import { deleteLabelMutation } from '../../lib/networking/mutations/deleteLabelMutation' -import { applyStoredTheme, isDarkTheme } from '../../lib/themeUpdater' +import { applyStoredTheme } from '../../lib/themeUpdater' import { showErrorToast, showSuccessToast } from '../../lib/toastHelpers' import { Label } from '../../lib/networking/queries/useGetLabelsQuery' import { StyledText } from '../../components/elements/StyledText' @@ -24,7 +24,6 @@ import { PencilSimple, Trash, Plus, - DotsSixVertical, } from 'phosphor-react' import { LabelColor, @@ -470,9 +469,6 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean editingLabelId === label?.id || (isCreateMode && !label) const labelName = label?.name || nameInputText - const isDarkMode = isDarkTheme() - const iconColor = isDarkMode ? '#D8D7D5': '#5F5E58' - const handleEdit = () => { editingLabelId && updateLabel(editingLabelId) setEditingLabelId(null) @@ -492,7 +488,7 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean disabled={isCreateMode} > } + triggerElement={} > null}> + + @@ -173,14 +199,14 @@ export const LabelColorDropdown = (props: LabelColorDropdownProps) => { ))} - null}> + null}> - + = ({ active, tooltipContent, tooltipSide, + arrowStyles, ...props }) => { return ( @@ -74,7 +75,7 @@ export const TooltipWrapped: FC = ({ {children} {tooltipContent} - + ) diff --git a/packages/web/components/tokens/stitches.config.ts b/packages/web/components/tokens/stitches.config.ts index 99b852118..3a09eff08 100644 --- a/packages/web/components/tokens/stitches.config.ts +++ b/packages/web/components/tokens/stitches.config.ts @@ -160,7 +160,7 @@ export const { styled, css, theme, getCssText, globalCss, keyframes, config } = // Avatar Fallback color avatarBg: '#FFFFFF', - toolColor: '#0A0806', + avatarFont: '#0A0806', labelButtonsBg: '#F5F5F4', tooltipIcons: '#FDFAEC' @@ -212,7 +212,7 @@ const darkThemeSpec = { readerTableHeader: '#FFFFFF', tooltipIcons: '#5F5E58', avatarBg: '#000000', - toolColor: 'rgba(255, 255, 255, 0.8)', + avatarFont: 'rgba(255, 255, 255, 0.8)', labelButtonsBg: '#5F5E58', }, diff --git a/packages/web/pages/settings/labels.tsx b/packages/web/pages/settings/labels.tsx index 64b797857..c6610aeb2 100644 --- a/packages/web/pages/settings/labels.tsx +++ b/packages/web/pages/settings/labels.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react' import { PrimaryLayout } from '../../components/templates/PrimaryLayout' import { Button } from '../../components/elements/Button' import { PlusIcon } from '../../components/elements/images/PlusIcon' -import { styled, theme } from '../../components/tokens/stitches.config' +import { styled } from '../../components/tokens/stitches.config' import { Box, SpanBox, @@ -14,9 +14,10 @@ import { useGetLabelsQuery } from '../../lib/networking/queries/useGetLabelsQuer import { createLabelMutation } from '../../lib/networking/mutations/createLabelMutation' import { updateLabelMutation } from '../../lib/networking/mutations/updateLabelMutation' import { deleteLabelMutation } from '../../lib/networking/mutations/deleteLabelMutation' -import { applyStoredTheme } from '../../lib/themeUpdater' +import { applyStoredTheme, isDarkTheme } from '../../lib/themeUpdater' import { showErrorToast, showSuccessToast } from '../../lib/toastHelpers' import { Label } from '../../lib/networking/queries/useGetLabelsQuery' + import { StyledText } from '../../components/elements/StyledText' import { ArrowClockwise, @@ -24,6 +25,7 @@ import { PencilSimple, Trash, Plus, + DotsSixVertical, } from 'phosphor-react' import { LabelColor, @@ -126,18 +128,37 @@ const inputStyles = { }, } +const ActionsWrapper = styled(Box, { + mr: '$1', + display: 'flex', + width: 40, + height: 40, + alignItems: 'center', + bg: 'transparent', + cursor: 'pointer', + fontFamily: 'inter', + fontSize: '$2', + lineHeight: '1.25', + color: '$grayText', + '&:hover': { + opacity: 0.8, + }, +}) + const IconButton = styled(Button, { variants: { style: { ctaWhite: { color: 'red', - padding: '14px', + padding: '10px', display: 'flex', justifyContent: 'center', alignItems: 'center', border: '1px solid $grayBorder', boxSizing: 'border-box', borderRadius: 6, + width: 40, + height: 40, }, }, }, @@ -270,13 +291,16 @@ export default function LabelsPage(): JSX.Element { }} style="ctaDarkYellow" css={{ + alignItems: 'center', display: 'none', '@md': { display: 'flex', }, }} > - + + + Create New Label Name - + Description - {/* + - Uses - - */} - - Color @@ -354,7 +366,7 @@ export default function LabelsPage(): JSX.Element { css={{ color: '$grayTextContrast', display: 'flex', - justifyContent: 'center', + ml: 5, }} > Actions @@ -469,6 +481,9 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean editingLabelId === label?.id || (isCreateMode && !label) const labelName = label?.name || nameInputText + const isDarkMode = isDarkTheme() + const iconColor = isDarkMode ? '#D8D7D5': '#5F5E58' + const handleEdit = () => { editingLabelId && updateLabel(editingLabelId) setEditingLabelId(null) @@ -476,19 +491,10 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean const moreActionsButton = () => { return ( - + ) } @@ -570,7 +576,7 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean }, '@md': { // gridTemplateColumns: '20% 15% 1fr 1fr 1fr', - gridTemplateColumns: '20% 30% 1fr 1fr', + gridTemplateColumns: '20% 28% 1fr 1fr', }, }} > @@ -581,9 +587,9 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean padding: '0 5px', }} > - {(showInput || !label) ? null : ( + {(showInput && !label) ? null : ( - + )} {(showInput && !label) ? ( @@ -628,22 +634,6 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean )} - {/* - - {isCreateMode && !label ? '-' : 536} - - */} - handleGenerateRandomColor(label?.id)} disabled={!(isCreateMode && !label) && !(editingLabelId === label?.id)} > - + @@ -693,9 +683,6 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean alignment="center" css={{ padding: '4px 8px', - '@md': { - justifyContent: 'center', - }, }} > {editingLabelId === label?.id || !label ? ( @@ -721,8 +708,8 @@ function GenericTableCard(props: GenericTableCardProps & { isLastChild?: boolean ) : ( onEditPress(label)} disabled={isCreateMode} > - + deleteLabel(label.id)} disabled={isCreateMode} > - + {moreActionsButton()} )} - {/* - - {label?.description} - - - {536} Uses - - */} ) From 0eab87b001cb6c8916401f0c2b12c5b2fa7aa840 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Thu, 31 Mar 2022 11:21:41 -0700 Subject: [PATCH 022/298] Pull ul list out of newsletter blurb next/react doesnt want child elements of the paragraphs --- packages/web/pages/help/newsletters.tsx | 35 +++++++++++-------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/packages/web/pages/help/newsletters.tsx b/packages/web/pages/help/newsletters.tsx index d41b395e3..337fd7d5e 100644 --- a/packages/web/pages/help/newsletters.tsx +++ b/packages/web/pages/help/newsletters.tsx @@ -37,16 +37,14 @@ export default function Newsletters(): JSX.Element { >

Read Newsletters in Omnivore


-

- Currently Omnivore supports newsletters from the following providers. -

- If there is a newsletter you would like to read in Omnivore, please let us know. -

- +

Currently Omnivore supports newsletters from the following providers.

+ +

If there is a newsletter you would like to read in Omnivore, please let us know.

+

Omnivore Email Addresses

Omnivore allows you to create unique email addresses for subscribing to newsletters. @@ -60,12 +58,16 @@ export default function Newsletters(): JSX.Element {

There are multiple ways to have newsletters added directly to your Omnivore library:

- {/*

Notifications

-

If you are a registered iOS user and have granted push notification permission to Omnivore, you will be sent a notification when a newsletter is added to your library. Otherwise, you will be notified via your registered email address.

*/} +

Updating your account email

+

+ If you want all your substack newsletters sent to Omnivore, you can login and change the + address on your account page in Substack. +

Subscribing Directly

Create your first email address by clicking the Create New Email button on @@ -80,11 +82,6 @@ export default function Newsletters(): JSX.Element { /> -

- If you want all your substack newsletters sent to Omnivore, you can login and change the - address on your account page in Substack. -

-

Create a Forwarding Rule

If you are a Gmail user you can create a forwarding rule to send email from your regular account to your Omnivore email address. This is useful if you have an existing paid newsletter subscription. For free newsletters we recommend subscribing directly to the newsletter with your Omnivore email address.

From e3c0c6e11af680e47b3220379b90f9eeab77f11d Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Thu, 31 Mar 2022 11:32:09 -0700 Subject: [PATCH 023/298] Improve formatting --- packages/web/pages/help/newsletters.tsx | 31 ++++++++++++++----------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/packages/web/pages/help/newsletters.tsx b/packages/web/pages/help/newsletters.tsx index 337fd7d5e..d1abf4954 100644 --- a/packages/web/pages/help/newsletters.tsx +++ b/packages/web/pages/help/newsletters.tsx @@ -37,24 +37,27 @@ export default function Newsletters(): JSX.Element { >

Read Newsletters in Omnivore


-

Currently Omnivore supports newsletters from the following providers.

+

Omnivore supports newsletters from the following providers:

If there is a newsletter you would like to read in Omnivore, please let us know.

Omnivore Email Addresses

- Omnivore allows you to create unique email addresses for subscribing to newsletters. - You can reuse one address for all your newsletters, or you can create a unique address - for each. + Omnivore allows you to create unique email addresses for subscribing to newsletters. + You can reuse one address for all your newsletters, or you can create a unique address + for each.

- An Omnivore email address will receive email, detect whether the email is a newsletter, - and add the newsletter content to your library. If the email does not appear to be a newsletter, - it will be forwarded to the email address you used when you registered for Omnivore.

+ An Omnivore email address will receive email, detect whether the email is a newsletter, + and add the newsletter content to your library. If the email does not appear to be a newsletter, + it will be forwarded to the email address you used when you registered for Omnivore. +

There are multiple ways to have newsletters added directly to your Omnivore library: