]> Untitled Git - lemmy-ui.git/commitdiff
Adding opengraph tags. Fixes #5
authorDessalines <tyhou13@gmx.com>
Fri, 11 Sep 2020 18:09:21 +0000 (13:09 -0500)
committerDessalines <tyhou13@gmx.com>
Fri, 11 Sep 2020 18:09:21 +0000 (13:09 -0500)
21 files changed:
src/shared/components/admin-settings.tsx
src/shared/components/app.tsx
src/shared/components/communities.tsx
src/shared/components/community.tsx
src/shared/components/create-community.tsx
src/shared/components/create-post.tsx
src/shared/components/create-private-message.tsx
src/shared/components/html-tags.tsx [new file with mode: 0644]
src/shared/components/inbox.tsx
src/shared/components/instances.tsx
src/shared/components/login.tsx
src/shared/components/main.tsx
src/shared/components/modlog.tsx
src/shared/components/password_change.tsx
src/shared/components/post-listing.tsx
src/shared/components/post.tsx
src/shared/components/search.tsx
src/shared/components/sponsors.tsx
src/shared/components/user.tsx
src/shared/env.ts
src/shared/utils.ts

index a77ef6fe46969e6fe3a0d79c4fbab7ceb66d47ec..871dcf815d9f87786485083c782bc3005727981c 100644 (file)
@@ -1,5 +1,4 @@
 import { Component, linkEvent } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Subscription } from 'rxjs';
 import {
   UserOperation,
@@ -25,6 +24,7 @@ import {
 import autosize from 'autosize';
 import { SiteForm } from './site-form';
 import { UserListing } from './user-listing';
+import { HtmlTags } from './html-tags';
 import { i18n } from '../i18next';
 
 interface AdminSettingsState {
@@ -97,7 +97,10 @@ export class AdminSettings extends Component<any, AdminSettingsState> {
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle} />
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         {this.state.loading ? (
           <h5>
             <svg class="icon icon-spinner spin">
index 9a4d858b7d53bac2d8f8d93f9e7737f38e6dacbc..c49f74a9547669f77436fc7676683b5c902e8dad 100644 (file)
@@ -1,6 +1,7 @@
 import { Component } from 'inferno';
 import { Route, Switch } from 'inferno-router';
 import { Provider } from 'inferno-i18next';
+import { Helmet } from 'inferno-helmet';
 import { i18n } from '../i18next';
 import { routes } from '../../shared/routes';
 import { Navbar } from '../../shared/components/navbar';
@@ -23,6 +24,16 @@ export class App extends Component<AppProps, any> {
       <>
         <Provider i18next={i18n}>
           <div>
+            {this.props.site.site.icon && (
+              <Helmet>
+                <link
+                  id="favicon"
+                  rel="icon"
+                  type="image/x-icon"
+                  href={this.props.site.site.icon}
+                />
+              </Helmet>
+            )}
             <Navbar site={this.props.site} />
             <div class="mt-4 p-0 fl-1">
               <Switch>
index d04020d498b3fc9f6dd88d0b5501aea51d127c4e..4caf24d4d5feb1d2843d33e26f8d961b4d7d4764 100644 (file)
@@ -1,5 +1,5 @@
 import { Component, linkEvent } from 'inferno';
-import { Helmet } from 'inferno-helmet';
+import { HtmlTags } from './html-tags';
 import { Subscription } from 'rxjs';
 import {
   UserOperation,
@@ -94,7 +94,10 @@ export class Communities extends Component<any, CommunitiesState> {
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle} />
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         {this.state.loading ? (
           <h5 class="">
             <svg class="icon icon-spinner spin">
index d8c51a3d65eec6c3d10ec94415a252cb48665472..7deb62b7332792c40c2ce2203dd1f57893c26394 100644 (file)
@@ -1,5 +1,4 @@
 import { Component, linkEvent } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Subscription } from 'rxjs';
 import { DataType } from '../interfaces';
 import {
@@ -27,6 +26,7 @@ import {
 import { UserService, WebSocketService } from '../services';
 import { PostListings } from './post-listings';
 import { CommentNodes } from './comment-nodes';
+import { HtmlTags } from './html-tags';
 import { SortSelect } from './sort-select';
 import { DataTypeSelect } from './data-type-select';
 import { Sidebar } from './sidebar';
@@ -46,7 +46,6 @@ import {
   editPostFindRes,
   commentsToFlatNodes,
   setupTippy,
-  favIconUrl,
   notifyPost,
   setIsoData,
   wsSubscribe,
@@ -226,30 +225,12 @@ export class Community extends Component<any, State> {
   }
 
   get documentTitle(): string {
-    if (this.state.communityRes) {
-      return `${this.state.communityRes.community.title} - ${this.state.siteRes.site.name}`;
-    } else {
-      return 'Lemmy';
-    }
-  }
-
-  get favIcon(): string {
-    return this.state.siteRes.site.icon
-      ? this.state.siteRes.site.icon
-      : favIconUrl;
+    return `${this.state.communityRes.community.title} - ${this.state.siteRes.site.name}`;
   }
 
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle}>
-          <link
-            id="favicon"
-            rel="icon"
-            type="image/x-icon"
-            href={this.favIcon}
-          />
-        </Helmet>
         {this.state.loading ? (
           <h5>
             <svg class="icon icon-spinner spin">
@@ -259,6 +240,12 @@ export class Community extends Component<any, State> {
         ) : (
           <div class="row">
             <div class="col-12 col-md-8">
+              <HtmlTags
+                title={this.documentTitle}
+                path={this.context.router.route.match.url}
+                description={this.state.communityRes.community.title}
+                image={this.state.communityRes.community.icon}
+              />
               {this.communityInfo()}
               {this.selects()}
               {this.listings()}
index 26065373b7d777b5c95958c0af57bd8a152bf124..c1edefdf1c86a46ffd09811d1a44bd5a10d10e8d 100644 (file)
@@ -1,7 +1,7 @@
 import { Component } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Subscription } from 'rxjs';
 import { CommunityForm } from './community-form';
+import { HtmlTags } from './html-tags';
 import {
   Community,
   UserOperation,
@@ -70,7 +70,10 @@ export class CreateCommunity extends Component<any, CreateCommunityState> {
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle} />
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         {this.state.loading ? (
           <h5>
             <svg class="icon icon-spinner spin">
index a3c87c3eab90df933b6d4374b2485c1877ca4264..06043a7d36b323ba7983f415e9a717d3828f6cf6 100644 (file)
@@ -1,7 +1,7 @@
 import { Component } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Subscription } from 'rxjs';
 import { PostForm } from './post-form';
+import { HtmlTags } from './html-tags';
 import {
   isBrowser,
   lemmyHttp,
@@ -82,7 +82,10 @@ export class CreatePost extends Component<any, CreatePostState> {
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle} />
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         {this.state.loading ? (
           <h5>
             <svg class="icon icon-spinner spin">
index efdd5315cf36336c2f498bdf88adebebadc4b5aa..e96c77fc143609d96b1c7b948b8965345b5f7237 100644 (file)
@@ -1,7 +1,7 @@
 import { Component } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Subscription } from 'rxjs';
 import { PrivateMessageForm } from './private-message-form';
+import { HtmlTags } from './html-tags';
 import { UserService, WebSocketService } from '../services';
 import {
   Site,
@@ -102,7 +102,10 @@ export class CreatePrivateMessage extends Component<
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle} />
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         {this.state.loading ? (
           <h5>
             <svg class="icon icon-spinner spin">
diff --git a/src/shared/components/html-tags.tsx b/src/shared/components/html-tags.tsx
new file mode 100644 (file)
index 0000000..06fd687
--- /dev/null
@@ -0,0 +1,52 @@
+import { Component } from 'inferno';
+import { Helmet } from 'inferno-helmet';
+import { httpExternalPath } from '../env';
+
+interface HtmlTagsProps {
+  title: string;
+  path: string;
+  description?: string;
+  image?: string;
+}
+
+/// Taken from https://metatags.io/
+export class HtmlTags extends Component<HtmlTagsProps, any> {
+  render() {
+    let url = httpExternalPath(this.props.path);
+
+    return (
+      <Helmet title={this.props.title}>
+        {/* Primary Meta Tags */}
+        <meta name="title" content={this.props.title} />
+        {this.props.description && (
+          <meta name="description" content={this.props.description} />
+        )}
+
+        {/* Open Graph / Facebook */}
+        <meta property="og:type" content="website" />
+        <meta property="og:url" content={url} />
+        <meta property="og:title" content={this.props.title} />
+        {this.props.description && (
+          <meta property="og:description" content={this.props.description} />
+        )}
+        {this.props.image && (
+          <meta property="og:image" content={this.props.image} />
+        )}
+
+        {/* Twitter */}
+        <meta property="twitter:card" content="summary_large_image" />
+        <meta property="twitter:url" content={url} />
+        <meta property="twitter:title" content={this.props.title} />
+        {this.props.description && (
+          <meta
+            property="twitter:description"
+            content={this.props.description}
+          />
+        )}
+        {this.props.image && (
+          <meta property="twitter:image" content={this.props.image} />
+        )}
+      </Helmet>
+    );
+  }
+}
index e36b3b8ec1722396de3edb5e375905c0c86736e8..e141f1e7695aa23e2fab5b39449334e90f1864a0 100644 (file)
@@ -1,5 +1,4 @@
 import { Component, linkEvent } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Subscription } from 'rxjs';
 import {
   UserOperation,
@@ -37,6 +36,7 @@ import {
 } from '../utils';
 import { CommentNodes } from './comment-nodes';
 import { PrivateMessage } from './private-message';
+import { HtmlTags } from './html-tags';
 import { SortSelect } from './sort-select';
 import { i18n } from '../i18next';
 
@@ -117,7 +117,6 @@ export class Inbox extends Component<any, InboxState> {
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle} />
         {this.state.loading ? (
           <h5>
             <svg class="icon icon-spinner spin">
@@ -127,6 +126,10 @@ export class Inbox extends Component<any, InboxState> {
         ) : (
           <div class="row">
             <div class="col-12">
+              <HtmlTags
+                title={this.documentTitle}
+                path={this.context.router.route.match.url}
+              />
               <h5 class="mb-1">
                 {i18n.t('inbox')}
                 <small>
index 0929761d260383a03badf40aeec9816a6c8a6311..7be27c70b7ae4fb5fd6dac4dcf7f3fe48ef883cc 100644 (file)
@@ -1,8 +1,8 @@
 import { Component } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { GetSiteResponse } from 'lemmy-js-client';
 import { setIsoData } from '../utils';
 import { i18n } from '../i18next';
+import { HtmlTags } from './html-tags';
 
 interface InstancesState {
   siteRes: GetSiteResponse;
@@ -26,7 +26,10 @@ export class Instances extends Component<any, InstancesState> {
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle} />
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         <div>
           <h5>{i18n.t('linked_instances')}</h5>
           {this.state.siteRes &&
index b7c5355decb00a370520968570ad6dde7917a729..03176860e6c7a4d77a23d6bd54a8d8c6286f5a0e 100644 (file)
@@ -22,6 +22,7 @@ import {
   setIsoData,
 } from '../utils';
 import { i18n } from '../i18next';
+import { HtmlTags } from './html-tags';
 
 interface State {
   loginForm: LoginForm;
@@ -78,17 +79,16 @@ export class Login extends Component<any, State> {
   }
 
   get documentTitle(): string {
-    if (this.state.site.name) {
-      return `${i18n.t('login')} - ${this.state.site.name}`;
-    } else {
-      return 'Lemmy';
-    }
+    return `${i18n.t('login')} - ${this.state.site.name}`;
   }
 
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle} />
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         <div class="row">
           <div class="col-12 col-lg-6 mb-4">{this.loginForm()}</div>
           <div class="col-12 col-lg-6">{this.registerForm()}</div>
index 2cf434ff9059aac00b7e1f71b58d4f2174f740ba..62010f527053cf6d6518f509f4ecf8510dd76cd7 100644 (file)
@@ -1,5 +1,4 @@
 import { Component, linkEvent } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Link } from 'inferno-router';
 import { Subscription } from 'rxjs';
 import {
@@ -53,7 +52,6 @@ import {
   editPostFindRes,
   commentsToFlatNodes,
   setupTippy,
-  favIconUrl,
   notifyPost,
   setIsoData,
   wsSubscribe,
@@ -63,6 +61,7 @@ import {
 } from '../utils';
 import { i18n } from '../i18next';
 import { T } from 'inferno-i18next';
+import { HtmlTags } from './html-tags';
 
 interface MainState {
   subscribedCommunities: CommunityUser[];
@@ -240,23 +239,13 @@ export class Main extends Component<any, MainState> {
     return `${this.state.siteRes.site.name}`;
   }
 
-  get favIcon(): string {
-    return this.state.siteRes.site.icon
-      ? this.state.siteRes.site.icon
-      : favIconUrl;
-  }
-
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle}>
-          <link
-            id="favicon"
-            rel="icon"
-            type="image/x-icon"
-            href={this.favIcon}
-          />
-        </Helmet>
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         <div class="row">
           <main role="main" class="col-12 col-md-8">
             {this.posts()}
index ba0fe8d76f8328fed0e82406e7b60fb88b80765b..86e93be817af651f5548c8b0d275f0b151a110e9 100644 (file)
@@ -1,5 +1,4 @@
 import { Component, linkEvent } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Link } from 'inferno-router';
 import { Subscription } from 'rxjs';
 import {
@@ -30,6 +29,7 @@ import {
   lemmyHttp,
 } from '../utils';
 import { MomentTime } from './moment-time';
+import { HtmlTags } from './html-tags';
 import moment from 'moment';
 import { i18n } from '../i18next';
 
@@ -353,17 +353,16 @@ export class Modlog extends Component<any, ModlogState> {
   }
 
   get documentTitle(): string {
-    if (this.state.site) {
-      return `Modlog - ${this.state.site.name}`;
-    } else {
-      return 'Lemmy';
-    }
+    return `Modlog - ${this.state.site.name}`;
   }
 
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle} />
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         {this.state.loading ? (
           <h5 class="">
             <svg class="icon icon-spinner spin">
index def7bb5228c3034780554a528256bb3b25454a7a..172590609c224007355c22b3b47631b0fbdabb9d 100644 (file)
@@ -1,5 +1,4 @@
 import { Component, linkEvent } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Subscription } from 'rxjs';
 import {
   UserOperation,
@@ -18,6 +17,7 @@ import {
   wsSubscribe,
 } from '../utils';
 import { i18n } from '../i18next';
+import { HtmlTags } from './html-tags';
 
 interface State {
   passwordChangeForm: PasswordChangeForm;
@@ -61,7 +61,10 @@ export class PasswordChange extends Component<any, State> {
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle} />
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         <div class="row">
           <div class="col-12 col-lg-6 offset-lg-3 mb-4">
             <h5>{i18n.t('password_change')}</h5>
index b899e7555ea047b934669bf7dcee79d2cb0506fa..732d57340cc53849d58986326a744621a10767b1 100644 (file)
@@ -38,6 +38,7 @@ import {
   previewLines,
 } from '../utils';
 import { i18n } from '../i18next';
+import { externalHost } from '../env';
 
 interface PostListingState {
   showEdit: boolean;
@@ -309,7 +310,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
           )}
         </li>
         <li className="list-inline-item">•</li>
-        {post.url && !(hostname(post.url) == window.location.hostname) && (
+        {post.url && !(hostname(post.url) == externalHost) && (
           <>
             <li className="list-inline-item">
               <a
@@ -413,43 +414,37 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
               {post.name}
             </Link>
           )}
-          {(isImage(post.url) || this.props.post.thumbnail_url) && (
-            <>
-              {!this.state.imageExpanded ? (
+          {(isImage(post.url) || this.props.post.thumbnail_url) &&
+            (!this.state.imageExpanded ? (
+              <span
+                class="text-monospace unselectable pointer ml-2 text-muted small"
+                data-tippy-content={i18n.t('expand_here')}
+                onClick={linkEvent(this, this.handleImageExpandClick)}
+              >
+                <svg class="icon icon-inline">
+                  <use xlinkHref="#icon-plus-square"></use>
+                </svg>
+              </span>
+            ) : (
+              <span>
                 <span
                   class="text-monospace unselectable pointer ml-2 text-muted small"
-                  data-tippy-content={i18n.t('expand_here')}
                   onClick={linkEvent(this, this.handleImageExpandClick)}
                 >
                   <svg class="icon icon-inline">
-                    <use xlinkHref="#icon-plus-square"></use>
+                    <use xlinkHref="#icon-minus-square"></use>
                   </svg>
                 </span>
-              ) : (
-                <span>
+                <div>
                   <span
-                    class="text-monospace unselectable pointer ml-2 text-muted small"
+                    class="pointer"
                     onClick={linkEvent(this, this.handleImageExpandClick)}
                   >
-                    <svg class="icon icon-inline">
-                      <use xlinkHref="#icon-minus-square"></use>
-                    </svg>
+                    <img class="img-fluid img-expanded" src={this.getImage()} />
                   </span>
-                  <div>
-                    <span
-                      class="pointer"
-                      onClick={linkEvent(this, this.handleImageExpandClick)}
-                    >
-                      <img
-                        class="img-fluid img-expanded"
-                        src={this.getImage()}
-                      />
-                    </span>
-                  </div>
-                </span>
-              )}
-            </>
-          )}
+                </div>
+              </span>
+            ))}
           {post.removed && (
             <small className="ml-2 text-muted font-italic">
               {i18n.t('removed')}
index e3ff2649c6979f9a4ce618eff0c8e5e09e053087..6f1bf6dba787df7cacc3018e36beb9d6ad36fbfb 100644 (file)
@@ -1,5 +1,5 @@
 import { Component, linkEvent } from 'inferno';
-import { Helmet } from 'inferno-helmet';
+import { HtmlTags } from './html-tags';
 import { Subscription } from 'rxjs';
 import {
   UserOperation,
@@ -36,7 +36,6 @@ import {
   createPostLikeRes,
   commentsToFlatNodes,
   setupTippy,
-  favIconUrl,
   setIsoData,
   getIdFromProps,
   getCommentIdFromProps,
@@ -44,6 +43,8 @@ import {
   setAuth,
   lemmyHttp,
   isBrowser,
+  previewLines,
+  isImage,
 } from '../utils';
 import { PostListing } from './post-listing';
 import { Sidebar } from './sidebar';
@@ -148,7 +149,7 @@ export class Post extends Component<any, PostState> {
 
     // Necessary if you are on a post and you click another post (same route)
     if (_lastProps.location.pathname !== _lastProps.history.location.pathname) {
-      // Couldnt get a refresh working. This does for now.
+      // TODO Couldnt get a refresh working. This does for now.
       location.reload();
 
       // let currentId = this.props.match.params.id;
@@ -191,30 +192,29 @@ export class Post extends Component<any, PostState> {
   }
 
   get documentTitle(): string {
-    if (this.state.postRes) {
-      return `${this.state.postRes.post.name} - ${this.state.siteRes.site.name}`;
-    } else {
-      return 'Lemmy';
-    }
+    return `${this.state.postRes.post.name} - ${this.state.siteRes.site.name}`;
   }
 
-  get favIcon(): string {
-    return this.state.siteRes.site.icon
-      ? this.state.siteRes.site.icon
-      : favIconUrl;
+  get imageTag(): string {
+    return (
+      this.state.postRes.post.thumbnail_url ||
+      (this.state.postRes.post.url
+        ? isImage(this.state.postRes.post.url)
+          ? this.state.postRes.post.url
+          : undefined
+        : undefined)
+    );
+  }
+
+  get descriptionTag(): string {
+    return this.state.postRes.post.body
+      ? previewLines(this.state.postRes.post.body)
+      : undefined;
   }
 
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle}>
-          <link
-            id="favicon"
-            rel="icon"
-            type="image/x-icon"
-            href={this.favIcon}
-          />
-        </Helmet>
         {this.state.loading ? (
           <h5>
             <svg class="icon icon-spinner spin">
@@ -224,6 +224,12 @@ export class Post extends Component<any, PostState> {
         ) : (
           <div class="row">
             <div class="col-12 col-md-8 mb-3">
+              <HtmlTags
+                title={this.documentTitle}
+                path={this.context.router.route.match.url}
+                image={this.imageTag}
+                description={this.descriptionTag}
+              />
               <PostListing
                 post={this.state.postRes.post}
                 showBody
index b032d456c9137b762e2ccea2a1582bd4ad9790b1..0172489fcad0e49e175ce7677a7469e89736db9a 100644 (file)
@@ -1,5 +1,4 @@
 import { Component, linkEvent } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Subscription } from 'rxjs';
 import {
   UserOperation,
@@ -32,6 +31,7 @@ import {
   setAuth,
 } from '../utils';
 import { PostListing } from './post-listing';
+import { HtmlTags } from './html-tags';
 import { UserListing } from './user-listing';
 import { CommunityLink } from './community-link';
 import { SortSelect } from './sort-select';
@@ -165,23 +165,20 @@ export class Search extends Component<any, SearchState> {
   }
 
   get documentTitle(): string {
-    if (this.state.site.name) {
-      if (this.state.q) {
-        return `${i18n.t('search')} - ${this.state.q} - ${
-          this.state.site.name
-        }`;
-      } else {
-        return `${i18n.t('search')} - ${this.state.site.name}`;
-      }
+    if (this.state.q) {
+      return `${i18n.t('search')} - ${this.state.q} - ${this.state.site.name}`;
     } else {
-      return 'Lemmy';
+      return `${i18n.t('search')} - ${this.state.site.name}`;
     }
   }
 
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle} />
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         <h5>{i18n.t('search')}</h5>
         {this.selects()}
         {this.searchForm()}
index 9e3da9d2b21a9955a0d01b9f696cddac93b8620f..0e7156cb6199e041b6bf692b0f42ab7a69faf265 100644 (file)
@@ -1,10 +1,10 @@
 import { Component } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Site } from 'lemmy-js-client';
 import { i18n } from '../i18next';
 import { T } from 'inferno-i18next';
 import { repoUrl, isBrowser } from '../utils';
 import { IsoData } from 'shared/interfaces';
+import { HtmlTags } from './html-tags';
 
 interface SilverUser {
   name: string;
@@ -74,7 +74,10 @@ export class Sponsors extends Component<any, SponsorsState> {
   render() {
     return (
       <div class="container text-center">
-        <Helmet title={this.documentTitle} />
+        <HtmlTags
+          title={this.documentTitle}
+          path={this.context.router.route.match.url}
+        />
         {this.topMessage()}
         <hr />
         {this.sponsors()}
index db1586ddc2f5121c6cd3c0387555d7cfd312ed49..9febcd8aa9249c6077c9e7a3b5d39748f624c4c7 100644 (file)
@@ -1,5 +1,4 @@
 import { Component, linkEvent } from 'inferno';
-import { Helmet } from 'inferno-helmet';
 import { Link } from 'inferno-router';
 import { Subscription } from 'rxjs';
 import {
@@ -33,7 +32,6 @@ import {
   getLanguage,
   mdToHtml,
   elementUrl,
-  favIconUrl,
   setIsoData,
   getIdFromProps,
   getUsernameFromProps,
@@ -44,8 +42,10 @@ import {
   createPostLikeFindRes,
   setAuth,
   lemmyHttp,
+  previewLines,
 } from '../utils';
 import { UserListing } from './user-listing';
+import { HtmlTags } from './html-tags';
 import { SortSelect } from './sort-select';
 import { ListingTypeSelect } from './listing-type-select';
 import { MomentTime } from './moment-time';
@@ -250,30 +250,18 @@ export class User extends Component<any, UserState> {
   }
 
   get documentTitle(): string {
-    if (this.state.siteRes.site.name) {
-      return `@${this.state.userName} - ${this.state.siteRes.site.name}`;
-    } else {
-      return 'Lemmy';
-    }
+    return `@${this.state.userName} - ${this.state.siteRes.site.name}`;
   }
 
-  get favIcon(): string {
-    return this.state.siteRes.site.icon
-      ? this.state.siteRes.site.icon
-      : favIconUrl;
+  get bioTag(): string {
+    return this.state.userRes.user.bio
+      ? previewLines(this.state.userRes.user.bio)
+      : undefined;
   }
 
   render() {
     return (
       <div class="container">
-        <Helmet title={this.documentTitle}>
-          <link
-            id="favicon"
-            rel="icon"
-            type="image/x-icon"
-            href={this.favIcon}
-          />
-        </Helmet>
         {this.state.loading ? (
           <h5>
             <svg class="icon icon-spinner spin">
@@ -284,6 +272,12 @@ export class User extends Component<any, UserState> {
           <div class="row">
             <div class="col-12 col-md-8">
               <>
+                <HtmlTags
+                  title={this.documentTitle}
+                  path={this.context.router.route.match.url}
+                  description={this.bioTag}
+                  image={this.state.userRes.user.avatar}
+                />
                 {this.userInfo()}
                 <hr />
               </>
index 3d5533deee47b0ca4f24a38bfec588dd64a2c719..7347a19f0e4b4823c74b73750aafc7994179a855 100644 (file)
@@ -1,15 +1,46 @@
 import { isBrowser } from './utils';
 
-const nodeHostname = process.env.LEMMY_HOST || 'localhost'; // used for local dev
-const host = isBrowser() ? window.location.hostname : nodeHostname;
+const testHost = 'localhost:8536';
+
+const internalHost = process.env.LEMMY_INTERNAL_HOST || testHost; // used for local dev
+export const externalHost = isBrowser()
+  ? `${window.location.hostname}:${
+      window.location.port == '1234' || window.location.port == '1235'
+        ? 8536
+        : window.location.port
+    }`
+  : process.env.LEMMY_EXTERNAL_HOST || testHost;
+
+//   ? window.location.port == '1234' || window.location.port == '1235'
 const secure = isBrowser() && window.location.protocol == 'https:' ? 's' : '';
-const port = isBrowser()
-  ? window.location.port == '1234' || window.location.port == '1235'
-    ? 8536
-    : window.location.port
-  : 8536;
-const endpoint = `${host}:${port}`;
-
-export const wsUri = `ws${secure}://${endpoint}/api/v1/ws`;
-export const httpUri = `http${secure}://${endpoint}/api/v1`;
-export const pictrsUri = `http${secure}://${endpoint}/pictrs/image`;
+
+const host = isBrowser() ? externalHost : internalHost;
+
+const httpBase = `http${secure}://${host}`;
+export const wsUri = `ws${secure}://${host}/api/v1/ws`;
+export const httpUri = `${httpBase}/api/v1`;
+const httpExternalUri = `http${secure}://${externalHost}`;
+export const pictrsUri = `${httpBase}/pictrs/image`;
+
+console.log(`Internal host: ${internalHost}`);
+console.log(`External host: ${externalHost}`);
+
+export function httpExternalPath(path: string) {
+  return `${httpExternalUri}${path}`;
+}
+
+// export const httpUri = `http${secure}://${endpoint}/api/v1`;
+// export const pictrsUri = `http${secure}://${endpoint}/pictrs/image`;
+
+// const host = isBrowser() ? window.location.hostname : localHostname;
+// const secure = isBrowser() && window.location.protocol == 'https:' ? 's' : '';
+// const port = isBrowser()
+//   ? window.location.port == '1234' || window.location.port == '1235'
+//     ? 8536
+//     : window.location.port
+//   : 8536;
+// const endpoint = `${host}:${port}`;
+//
+// export const wsUri = `ws${secure}://${endpoint}/api/v1/ws`;
+// export const httpUri = `http${secure}://${endpoint}/api/v1`;
+// export const pictrsUri = `http${secure}://${endpoint}/pictrs/image`;
index 0a5d6eaefd630a253460718cde8aebbce7342469..79d52adfa0e86808eae68ae9b70ca70fd6bb1931 100644 (file)
@@ -271,7 +271,6 @@ export function isVideo(url: string) {
 
 // TODO this broke
 export function validURL(str: string) {
-  console.log(str);
   // try {
   return !!new URL(str);
   // } catch {
@@ -439,8 +438,6 @@ export function getMomentLanguage(): string {
 
 export function setTheme(theme: string, forceReload: boolean = false) {
   if (isBrowser() && (theme !== 'darkly' || forceReload)) {
-    console.log(`setting theme ${theme}`);
-
     // Unload all the other themes
     for (var i = 0; i < themes.length; i++) {
       let styleSheet = document.getElementById(themes[i]);
@@ -1078,11 +1075,7 @@ export function previewLines(
 
 export function hostname(url: string): string {
   let cUrl = new URL(url);
-  // TODO
-  return `${cUrl.hostname}:${cUrl.port}`;
-  // return window.location.port
-  //   ? `${cUrl.hostname}:${cUrl.port}`
-  //   : `${cUrl.hostname}`;
+  return cUrl.port ? `${cUrl.hostname}:${cUrl.port}` : `${cUrl.hostname}`;
 }
 
 function canUseWebP() {