diff --git a/packages/web/components/templates/article/ArticleContainer.tsx b/packages/web/components/templates/article/ArticleContainer.tsx index b851901ae2..6f3a48c51d 100644 --- a/packages/web/components/templates/article/ArticleContainer.tsx +++ b/packages/web/components/templates/article/ArticleContainer.tsx @@ -1,4 +1,7 @@ -import { ArticleAttributes } from '../../../lib/networking/queries/useGetArticleQuery' +import { + ArticleAttributes, + TextDirection, +} from '../../../lib/networking/queries/useGetArticleQuery' import { Article } from './../../../components/templates/article/Article' import { Box, HStack, SpanBox, VStack } from './../../elements/LayoutPrimitives' import { StyledText } from './../../elements/StyledText' @@ -38,6 +41,7 @@ type ArticleContainerProps = { showHighlightsModal: boolean highlightOnRelease?: boolean justifyText?: boolean + textDirection?: TextDirection setShowHighlightsModal: React.Dispatch> } @@ -138,6 +142,9 @@ export function ArticleContainer(props: ArticleContainerProps): JSX.Element { const highlightHref = useRef( window.location.hash ? window.location.hash.split('#')[1] : null ) + const [textDirection, setTextDirection] = useState( + props.textDirection ?? 'LTR' + ) const updateFontSize = useCallback( (newFontSize: number) => { @@ -173,6 +180,14 @@ export function ArticleContainer(props: ArticleContainerProps): JSX.Element { setHighlightOnRelease(isEnabled) } + interface UpdateTextDirectionEvent extends Event { + textDirection: TextDirection + } + + const handleUpdateTextDirection = (event: UpdateTextDirectionEvent) => { + setTextDirection(event.textDirection) + } + interface UpdateMaxWidthPercentageEvent extends Event { maxWidthPercentage?: number } @@ -367,6 +382,7 @@ export function ArticleContainer(props: ArticleContainerProps): JSX.Element { return ( <> + + + { + readerSettings.setTextDirection(checked ? 'RTL' : 'LTR') + }} + > + + + + void + + textDirection: TextDirection | undefined + setTextDirection: (textDirection: TextDirection) => void } export const useReaderSettings = (): ReaderSettings => { @@ -73,6 +77,12 @@ export const useReaderSettings = (): ReaderSettings => { key: `--display-justify-text`, initialValue: false, }) + const [textDirection, setTextDirection] = usePersistedState< + TextDirection | undefined + >({ + key: `--display-text-direction`, + initialValue: 'LTR', + }) const [showSetLabelsModal, setShowSetLabelsModal] = useState(false) const [showEditDisplaySettingsModal, setShowEditDisplaySettingsModal] = useState(false) @@ -226,5 +236,7 @@ export const useReaderSettings = (): ReaderSettings => { setHighContrastText, highlightOnRelease, setHighlightOnRelease, + textDirection, + setTextDirection, } } diff --git a/packages/web/lib/networking/queries/useGetArticleQuery.tsx b/packages/web/lib/networking/queries/useGetArticleQuery.tsx index aa24efb270..f62cc35304 100644 --- a/packages/web/lib/networking/queries/useGetArticleQuery.tsx +++ b/packages/web/lib/networking/queries/useGetArticleQuery.tsx @@ -39,6 +39,8 @@ type NestedArticleData = { errorCodes?: string[] } +export type TextDirection = 'RTL' | 'LTR' + export type ArticleAttributes = { id: string title: string @@ -64,6 +66,7 @@ export type ArticleAttributes = { linkId: string labels?: Label[] state?: State + directionality?: TextDirection recommendations?: Recommendation[] } diff --git a/packages/web/pages/[username]/[slug]/index.tsx b/packages/web/pages/[username]/[slug]/index.tsx index 530a89a58c..f5905ab5f3 100644 --- a/packages/web/pages/[username]/[slug]/index.tsx +++ b/packages/web/pages/[username]/[slug]/index.tsx @@ -566,6 +566,7 @@ export default function Home(): JSX.Element { highlightOnRelease={ readerSettings.highlightOnRelease ?? undefined } + textDirection={readerSettings.textDirection} articleMutations={{ createHighlightMutation, deleteHighlightMutation, diff --git a/packages/web/pages/_document.tsx b/packages/web/pages/_document.tsx index f63ebc2242..e3de9ee673 100644 --- a/packages/web/pages/_document.tsx +++ b/packages/web/pages/_document.tsx @@ -8,7 +8,7 @@ export default class Document extends NextDocument { globalStyles() return ( - +