import * as React from "react" import { renderToString } from "react-dom/server" import { RSSItem } from "../scripts/models/item" import { openExternal } from "../scripts/utils" import { Stack, CommandBarButton, IContextualMenuProps } from "@fluentui/react" import { RSSSource } from "../scripts/models/source" const FONT_SIZE_STORE_KEY = "fontSize" const FONT_SIZE_OPTIONS = [12, 13, 14, 15, 16, 17, 18, 19, 20] type ArticleProps = { item: RSSItem source: RSSSource dismiss: () => void toggleHasRead: (item: RSSItem) => void } type ArticleState = { fontSize: number } class Article extends React.Component { webview: HTMLWebViewElement constructor(props) { super(props) this.state = { fontSize: this.getFontSize() } } getFontSize = () => { let size = window.localStorage.getItem(FONT_SIZE_STORE_KEY) return size ? parseInt(size) : 16 } setFontSize = (size: number) => { window.localStorage.setItem(FONT_SIZE_STORE_KEY, String(size)) this.setState({fontSize: size}) } fontMenuProps = (): IContextualMenuProps => ({ items: FONT_SIZE_OPTIONS.map(size => ({ key: String(size), text: String(size), canCheck: true, checked: size === this.state.fontSize, onClick: () => this.setFontSize(size) })) }) ipcHandler = event => { if (event.channel === "request-navigation") { openExternal(event.args[0]) } } popUpHandler = event => { openExternal(event.url) } componentDidMount = () => { this.webview = document.getElementById("article") this.webview.addEventListener("ipc-message", this.ipcHandler) this.webview.addEventListener("new-window", this.popUpHandler) this.webview.addEventListener("will-navigate", this.props.dismiss) } componentWillUnmount = () => { this.webview.removeEventListener("ipc-message", this.ipcHandler) this.webview.removeEventListener("new-window", this.popUpHandler) this.webview.removeEventListener("will-navigate", this.props.dismiss) } openInBrowser = () => { openExternal(this.props.item.link) } articleView = () => "article/article.html?h=" + window.btoa(encodeURIComponent(renderToString(<>

{this.props.item.title}

))) + "&s=" + this.state.fontSize render = () => (
{this.props.source.iconurl && } {this.props.source.name} this.props.toggleHasRead(this.props.item)} />
) } export default Article