diff --git a/src/server/index.tsx b/src/server/index.tsx index 3eace286..05531921 100644 --- a/src/server/index.tsx +++ b/src/server/index.tsx @@ -84,6 +84,12 @@ server.get('/*', async (req, res) => { + +
${renderToString(wrapper)}
diff --git a/src/shared/components/comment-form.tsx b/src/shared/components/comment-form.tsx index 79115116..b032a065 100644 --- a/src/shared/components/comment-form.tsx +++ b/src/shared/components/comment-form.tsx @@ -99,7 +99,7 @@ export class CommentForm extends Component { # - + # diff --git a/src/shared/components/create-community.tsx b/src/shared/components/create-community.tsx index 07680b5d..26065373 100644 --- a/src/shared/components/create-community.tsx +++ b/src/shared/components/create-community.tsx @@ -43,8 +43,7 @@ export class CreateCommunity extends Component { this.parseMessage = this.parseMessage.bind(this); this.subscription = wsSubscribe(this.parseMessage); - // TODO not sure if this works - if (!UserService.Instance.user) { + if (!UserService.Instance.user && isBrowser()) { toast(i18n.t('not_logged_in'), 'danger'); this.context.router.history.push(`/login`); } diff --git a/src/shared/components/create-post.tsx b/src/shared/components/create-post.tsx index 25d4f593..a3c87c3e 100644 --- a/src/shared/components/create-post.tsx +++ b/src/shared/components/create-post.tsx @@ -44,7 +44,7 @@ export class CreatePost extends Component { this.handlePostCreate = this.handlePostCreate.bind(this); this.state = this.emptyState; - if (!UserService.Instance.user) { + if (!UserService.Instance.user && isBrowser()) { toast(i18n.t('not_logged_in'), 'danger'); this.context.router.history.push(`/login`); } diff --git a/src/shared/components/navbar.tsx b/src/shared/components/navbar.tsx index 5c7c4387..1cf89c03 100644 --- a/src/shared/components/navbar.tsx +++ b/src/shared/components/navbar.tsx @@ -1,7 +1,6 @@ import { Component, linkEvent, createRef, RefObject } from 'inferno'; import { Link } from 'inferno-router'; import { Subscription } from 'rxjs'; -import { retryWhen, delay, take } from 'rxjs/operators'; import { WebSocketService, UserService } from '../services'; import { UserOperation, @@ -30,6 +29,7 @@ import { notifyComment, notifyPrivateMessage, isBrowser, + wsSubscribe, } from '../utils'; import { i18n } from '../i18next'; @@ -64,56 +64,56 @@ export class Navbar extends Component { searchParam: '', toggleSearch: false, }; + subscription: any; constructor(props: any, context: any) { super(props, context); this.state = this.emptyState; - if (isBrowser()) { - this.wsSub = WebSocketService.Instance.subject - .pipe(retryWhen(errors => errors.pipe(delay(3000), take(10)))) - .subscribe( - msg => this.parseMessage(msg), - err => console.error(err), - () => console.log('complete') - ); - - this.searchTextField = createRef(); - } + this.parseMessage = this.parseMessage.bind(this); + this.subscription = wsSubscribe(this.parseMessage); // The login // TODO this needs some work - if (this.props.site.my_user) { - UserService.Instance.user = this.props.site.my_user; - // i18n.changeLanguage(getLanguage()); - - if (isBrowser()) { - WebSocketService.Instance.userJoin(); - // On the first load, check the unreads - if (this.state.isLoggedIn == false) { - this.requestNotificationPermission(); - this.fetchUnreads(); - // setTheme(data.my_user.theme, true); - // i18n.changeLanguage(getLanguage()); - // i18n.changeLanguage('de'); - } - } + UserService.Instance.user = this.props.site.my_user; + i18n.changeLanguage(getLanguage()); + setTheme(); + if (UserService.Instance.user) { } + + // if (!!this.props.site.my_user) { + // UserService.Instance.this.props.site.my_user); + // // UserService.Instance.user = this.props.site.my_user; + // } else { + // UserService.Instance.setUser(undefined); + // } } componentDidMount() { // Subscribe to jwt changes if (isBrowser()) { + this.searchTextField = createRef(); + console.log(`isLoggedIn = ${this.state.isLoggedIn}`); + + // On the first load, check the unreads + if (this.state.isLoggedIn == false) { + // setTheme(data.my_user.theme, true); + // i18n.changeLanguage(getLanguage()); + // i18n.changeLanguage('de'); + } else { + this.requestNotificationPermission(); + WebSocketService.Instance.userJoin(); + this.fetchUnreads(); + } + this.userSub = UserService.Instance.jwtSub.subscribe(res => { // A login if (res !== undefined) { this.requestNotificationPermission(); + WebSocketService.Instance.getSite(); } else { - this.state.isLoggedIn = false; + this.setState({ isLoggedIn: false }); } - console.log('a new login'); - // WebSocketService.Instance.getSite(); - this.setState(this.state); }); // Subscribe to unread count changes @@ -415,6 +415,12 @@ export class Navbar extends Component { this.state.unreadCount = this.calculateUnreadCount(); this.setState(this.state); this.sendUnreadCount(); + } else if (res.op == UserOperation.GetSite) { + // This is only called on a successful login + let data = res.data as GetSiteResponse; + UserService.Instance.user = data.my_user; + this.state.isLoggedIn = true; + this.setState(this.state); } else if (res.op == UserOperation.CreateComment) { let data = res.data as CommentResponse; diff --git a/src/shared/components/post-listing.tsx b/src/shared/components/post-listing.tsx index 23eed736..b899e755 100644 --- a/src/shared/components/post-listing.tsx +++ b/src/shared/components/post-listing.tsx @@ -143,18 +143,16 @@ export class PostListing extends Component { this.props.post.embed_title && ( )} - {this.props.showBody && this.props.post.body && ( - <> - {this.state.viewSource ? ( -
{this.props.post.body}
- ) : ( -
- )} - - )} + {this.props.showBody && + this.props.post.body && + (this.state.viewSource ? ( +
{this.props.post.body}
+ ) : ( +
+ ))}
); diff --git a/src/shared/services/UserService.ts b/src/shared/services/UserService.ts index 785ce3ff..760fb4e4 100644 --- a/src/shared/services/UserService.ts +++ b/src/shared/services/UserService.ts @@ -20,9 +20,8 @@ export class UserService { ); private constructor() { - let jwt = IsomorphicCookie.load('jwt'); - if (jwt) { - this.setClaims(jwt); + if (this.auth) { + this.setClaims(this.auth); } else { // setTheme(); console.log('No JWT cookie found.'); @@ -30,17 +29,17 @@ export class UserService { } public login(res: LoginResponse) { - this.setClaims(res.jwt); let expires = new Date(); expires.setDate(expires.getDate() + 365); - IsomorphicCookie.save('jwt', res.jwt, { expires }); + IsomorphicCookie.save('jwt', res.jwt, { expires, secure: false }); console.log('jwt cookie set'); + this.setClaims(res.jwt); } public logout() { + IsomorphicCookie.remove('jwt', { secure: false }); this.claims = undefined; this.user = undefined; - IsomorphicCookie.remove('jwt'); // setTheme(); this.jwtSub.next(); console.log('Logged out.'); diff --git a/src/shared/utils.ts b/src/shared/utils.ts index c8c8d935..5214f07d 100644 --- a/src/shared/utils.ts +++ b/src/shared/utils.ts @@ -358,15 +358,14 @@ export function debounce( // TODO export function getLanguage(override?: string): string { - return 'en'; - // let user = UserService.Instance.user; - // let lang = override || (user && user.lang ? user.lang : 'browser'); + let user = UserService.Instance.user; + let lang = override || (user && user.lang ? user.lang : 'browser'); - // if (lang == 'browser') { - // return getBrowserLanguage(); - // } else { - // return lang; - // } + if (lang == 'browser' && isBrowser()) { + return getBrowserLanguage(); + } else { + return lang; + } } // TODO @@ -440,6 +439,11 @@ export function getMomentLanguage(): string { // TODO export function setTheme(theme: string = 'darkly', loggedIn: boolean = false) { + // require('../assets/css/themes/_variables.darkly.scss'); + // require('../../node_modules/bootstrap/scss/bootstrap.scss'); + // require('../assets/css/themes/_variables.darkly.scss'); + // require('../assets/css/themes/_variables.darkly.scss'); + // require('../assets/css/themes/_variables.darkly.scss'); // unload all the other themes // for (var i = 0; i < themes.length; i++) { // let styleSheet = document.getElementById(themes[i]); @@ -1138,11 +1142,10 @@ export function setAuth(obj: any, auth: string) { } export function setIsoData(context: any): IsoData { - if (isBrowser()) { - return window.isoData; - } else { - return context.router.staticContext; - } + let isoData: IsoData = isBrowser() + ? window.isoData + : context.router.staticContext; + return isoData; } export function wsSubscribe(parseMessage: any): Subscription {