Main page done.

This commit is contained in:
Dessalines 2020-09-07 23:09:11 -05:00
parent a5aeba3ad0
commit 8f44607956
9 changed files with 188 additions and 113 deletions

View file

@ -74,7 +74,7 @@
"eslint-plugin-jane": "^8.0.4", "eslint-plugin-jane": "^8.0.4",
"husky": "^4.2.5", "husky": "^4.2.5",
"jest": "^26.4.2", "jest": "^26.4.2",
"lemmy-js-client": "^1.0.8", "lemmy-js-client": "^1.0.9",
"lint-staged": "^10.1.3", "lint-staged": "^10.1.3",
"mini-css-extract-plugin": "^0.11.0", "mini-css-extract-plugin": "^0.11.0",
"node-sass": "^4.12.0", "node-sass": "^4.12.0",

View file

@ -23,7 +23,6 @@ export class DataTypeSelect extends Component<
constructor(props: any, context: any) { constructor(props: any, context: any) {
super(props, context); super(props, context);
this.state = this.emptyState; this.state = this.emptyState;
console.log(this.state);
} }
static getDerivedStateFromProps(props: any): DataTypeSelectProps { static getDerivedStateFromProps(props: any): DataTypeSelectProps {

View file

@ -6,6 +6,7 @@ import { i18n } from '../i18next';
interface ListingTypeSelectProps { interface ListingTypeSelectProps {
type_: ListingType; type_: ListingType;
showLocal?: boolean;
onChange?(val: ListingType): any; onChange?(val: ListingType): any;
} }
@ -31,6 +32,7 @@ export class ListingTypeSelect extends Component<
static getDerivedStateFromProps(props: any): ListingTypeSelectProps { static getDerivedStateFromProps(props: any): ListingTypeSelectProps {
return { return {
type_: props.type_, type_: props.type_,
showLocal: props.showLocal,
}; };
} }
@ -53,6 +55,22 @@ export class ListingTypeSelect extends Component<
/> />
{i18n.t('subscribed')} {i18n.t('subscribed')}
</label> </label>
{this.props.showLocal && (
<label
className={`pointer btn btn-outline-secondary ${
this.state.type_ == ListingType.Local && 'active'
}`}
>
<input
id={`${this.id}-local`}
type="radio"
value={ListingType.Local}
checked={this.state.type_ == ListingType.Local}
onChange={linkEvent(this, this.handleTypeChange)}
/>
{i18n.t('local')}
</label>
)}
<label <label
className={`pointer btn btn-outline-secondary ${ className={`pointer btn btn-outline-secondary ${
this.state.type_ == ListingType.All && 'active' this.state.type_ == ListingType.All && 'active'

View file

@ -2,7 +2,6 @@ import { Component, linkEvent } from 'inferno';
import { Helmet } from 'inferno-helmet'; import { Helmet } from 'inferno-helmet';
import { Link } from 'inferno-router'; import { Link } from 'inferno-router';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
import { retryWhen, delay, take } from 'rxjs/operators';
import { import {
UserOperation, UserOperation,
CommunityUser, CommunityUser,
@ -56,7 +55,11 @@ import {
setupTippy, setupTippy,
favIconUrl, favIconUrl,
notifyPost, notifyPost,
setIsoData,
wsSubscribe,
isBrowser, isBrowser,
setAuth,
lemmyHttp,
} from '../utils'; } from '../utils';
import { i18n } from '../i18next'; import { i18n } from '../i18next';
import { T } from 'inferno-i18next'; import { T } from 'inferno-i18next';
@ -90,34 +93,12 @@ interface UrlParams {
} }
export class Main extends Component<any, MainState> { export class Main extends Component<any, MainState> {
private isoData = setIsoData(this.context);
private subscription: Subscription; private subscription: Subscription;
private emptyState: MainState = { private emptyState: MainState = {
subscribedCommunities: [], subscribedCommunities: [],
trendingCommunities: [], trendingCommunities: [],
siteRes: { siteRes: this.isoData.site,
site: {
id: null,
name: null,
creator_id: null,
creator_name: null,
published: null,
number_of_users: null,
number_of_posts: null,
number_of_comments: null,
number_of_communities: null,
enable_downvotes: null,
open_registration: null,
enable_nsfw: null,
icon: null,
banner: null,
creator_preferred_username: null,
},
admins: [],
banned: [],
online: null,
version: null,
federated_instances: null,
},
showEditSite: false, showEditSite: false,
loading: true, loading: true,
posts: [], posts: [],
@ -137,59 +118,126 @@ export class Main extends Component<any, MainState> {
this.handleListingTypeChange = this.handleListingTypeChange.bind(this); this.handleListingTypeChange = this.handleListingTypeChange.bind(this);
this.handleDataTypeChange = this.handleDataTypeChange.bind(this); this.handleDataTypeChange = this.handleDataTypeChange.bind(this);
if (isBrowser()) { this.parseMessage = this.parseMessage.bind(this);
// TODO this.subscription = wsSubscribe(this.parseMessage);
/* this.subscription = WebSocketService.Instance.subject */
/* .pipe(retryWhen(errors => errors.pipe(delay(3000), take(10)))) */ // Only fetch the data if coming from another route
/* .subscribe( */ if (this.isoData.path == this.context.router.route.match.url) {
/* msg => this.parseMessage(msg), */ if (this.state.dataType == DataType.Post) {
/* err => console.error(err), */ this.state.posts = this.isoData.routeData[0].posts;
/* () => console.log('complete') */ } else {
/* ); */ this.state.comments = this.isoData.routeData[0].comments;
/* WebSocketService.Instance.getSite(); */
/* if (UserService.Instance.user) { */
/* WebSocketService.Instance.getFollowedCommunities(); */
/* } */
/* let listCommunitiesForm: ListCommunitiesForm = { */
/* sort: SortType.Hot, */
/* limit: 6, */
/* }; */
/* WebSocketService.Instance.listCommunities(listCommunitiesForm); */
/* this.fetchData(); */
} }
this.state.trendingCommunities = this.isoData.routeData[1].communities;
if (UserService.Instance.user) {
this.state.subscribedCommunities = this.isoData.routeData[2].communities;
}
this.state.loading = false;
} else {
this.fetchTrendingCommunities();
this.fetchData();
if (UserService.Instance.user) {
WebSocketService.Instance.getFollowedCommunities();
}
}
setupTippy();
}
fetchTrendingCommunities() {
let listCommunitiesForm: ListCommunitiesForm = {
sort: SortType.Hot,
limit: 6,
};
WebSocketService.Instance.listCommunities(listCommunitiesForm);
} }
componentWillUnmount() { componentWillUnmount() {
if (isBrowser()) {
this.subscription.unsubscribe(); this.subscription.unsubscribe();
} }
}
/* static getDerivedStateFromProps(props: any): MainProps { */ static getDerivedStateFromProps(props: any): MainProps {
/* return { */ return {
/* listingType: getListingTypeFromProps(props), */ listingType: getListingTypeFromProps(props),
/* dataType: getDataTypeFromProps(props), */ dataType: getDataTypeFromProps(props),
/* sort: getSortTypeFromProps(props), */ sort: getSortTypeFromProps(props),
/* page: getPageFromProps(props), */ page: getPageFromProps(props),
/* }; */ };
/* } */ }
/* componentDidUpdate(_: any, lastState: MainState) { */ static fetchInitialData(auth: string, path: string): Promise<any>[] {
/* if ( */ let pathSplit = path.split('/');
/* lastState.listingType !== this.state.listingType || */ let dataType: DataType = pathSplit[3]
/* lastState.dataType !== this.state.dataType || */ ? DataType[pathSplit[3]]
/* lastState.sort !== this.state.sort || */ : DataType.Post;
/* lastState.page !== this.state.page */
/* ) { */ // TODO figure out auth default_listingType, default_sort_type
/* this.setState({ loading: true }); */ let type_: ListingType = pathSplit[5]
/* this.fetchData(); */ ? ListingType[pathSplit[5]]
/* } */ : UserService.Instance.user
/* } */ ? Object.values(ListingType)[
UserService.Instance.user.default_listing_type
]
: ListingType.All;
let sort: SortType = pathSplit[7]
? SortType[pathSplit[7]]
: UserService.Instance.user
? Object.values(SortType)[UserService.Instance.user.default_sort_type]
: SortType.Active;
let page = pathSplit[9] ? Number(pathSplit[9]) : 1;
let promises: Promise<any>[] = [];
if (dataType == DataType.Post) {
let getPostsForm: GetPostsForm = {
page,
limit: fetchLimit,
sort,
type_,
};
setAuth(getPostsForm, auth);
promises.push(lemmyHttp.getPosts(getPostsForm));
} else {
let getCommentsForm: GetCommentsForm = {
page,
limit: fetchLimit,
sort,
type_,
};
setAuth(getCommentsForm, auth);
promises.push(lemmyHttp.getComments(getCommentsForm));
}
let trendingCommunitiesForm: ListCommunitiesForm = {
sort: SortType.Hot,
limit: 6,
};
promises.push(lemmyHttp.listCommunities(trendingCommunitiesForm));
if (auth) {
promises.push(lemmyHttp.getFollowedCommunities({ auth }));
}
return promises;
}
componentDidUpdate(_: any, lastState: MainState) {
if (
lastState.listingType !== this.state.listingType ||
lastState.dataType !== this.state.dataType ||
lastState.sort !== this.state.sort ||
lastState.page !== this.state.page
) {
this.setState({ loading: true });
this.fetchData();
}
}
get documentTitle(): string { get documentTitle(): string {
if (this.state.siteRes.site.name) {
return `${this.state.siteRes.site.name}`; return `${this.state.siteRes.site.name}`;
} else {
return 'Lemmy';
}
} }
get favIcon(): string { get favIcon(): string {
@ -201,7 +249,6 @@ export class Main extends Component<any, MainState> {
render() { render() {
return ( return (
<div class="container"> <div class="container">
<h1 className={`text-warning`}>u stink main</h1>
<Helmet title={this.documentTitle}> <Helmet title={this.documentTitle}>
<link <link
id="favicon" id="favicon"
@ -236,7 +283,7 @@ export class Main extends Component<any, MainState> {
<div class="card-body"> <div class="card-body">
{this.trendingCommunities()} {this.trendingCommunities()}
{this.createCommunityButton()} {this.createCommunityButton()}
{/* {/* TODO
{this.subscribedCommunities()} {this.subscribedCommunities()}
*/} */}
</div> </div>
@ -257,7 +304,7 @@ export class Main extends Component<any, MainState> {
createCommunityButton() { createCommunityButton() {
return ( return (
<Link class="btn btn-secondary btn-block" to="/create_community"> <Link className="btn btn-secondary btn-block" to="/create_community">
{i18n.t('create_a_community')} {i18n.t('create_a_community')}
</Link> </Link>
); );
@ -269,7 +316,7 @@ export class Main extends Component<any, MainState> {
<h5> <h5>
<T i18nKey="trending_communities"> <T i18nKey="trending_communities">
# #
<Link class="text-body" to="/communities"> <Link className="text-body" to="/communities">
# #
</Link> </Link>
</T> </T>
@ -293,7 +340,7 @@ export class Main extends Component<any, MainState> {
<h5> <h5>
<T i18nKey="subscribed_to_communities"> <T i18nKey="subscribed_to_communities">
# #
<Link class="text-body" to="/communities"> <Link className="text-body" to="/communities">
# #
</Link> </Link>
</T> </T>
@ -537,6 +584,10 @@ export class Main extends Component<any, MainState> {
<span class="mr-3"> <span class="mr-3">
<ListingTypeSelect <ListingTypeSelect
type_={this.state.listingType} type_={this.state.listingType}
showLocal={
this.state.siteRes.federated_instances &&
this.state.siteRes.federated_instances.length > 0
}
onChange={this.handleListingTypeChange} onChange={this.handleListingTypeChange}
/> />
</span> </span>

View file

@ -84,7 +84,6 @@ export class Navbar extends Component<NavbarProps, NavbarState> {
// The login // The login
// TODO this needs some work // TODO this needs some work
if (this.props.site.my_user) { if (this.props.site.my_user) {
console.log(this.props.site.my_user);
UserService.Instance.user = this.props.site.my_user; UserService.Instance.user = this.props.site.my_user;
// i18n.changeLanguage(getLanguage()); // i18n.changeLanguage(getLanguage());

View file

@ -42,10 +42,10 @@ export class SortSelect extends Component<SortSelectProps, SortSelectState> {
> >
<option disabled>{i18n.t('sort_type')}</option> <option disabled>{i18n.t('sort_type')}</option>
{!this.props.hideHot && ( {!this.props.hideHot && (
<>
<option value={SortType.Active}>{i18n.t('active')}</option>
<option value={SortType.Hot}>{i18n.t('hot')}</option> <option value={SortType.Hot}>{i18n.t('hot')}</option>
</> )}
{!this.props.hideHot && (
<option value={SortType.Active}>{i18n.t('active')}</option>
)} )}
<option value={SortType.New}>{i18n.t('new')}</option> <option value={SortType.New}>{i18n.t('new')}</option>
<option disabled></option> <option disabled></option>

View file

@ -22,10 +22,16 @@ interface IRoutePropsWithFetch extends IRouteProps {
} }
export const routes: IRoutePropsWithFetch[] = [ export const routes: IRoutePropsWithFetch[] = [
{ exact: true, path: `/`, component: Main }, {
exact: true,
path: `/`,
component: Main,
fetchInitialData: (auth, path) => Main.fetchInitialData(auth, path),
},
{ {
path: `/home/data_type/:data_type/listing_type/:listing_type/sort/:sort/page/:page`, path: `/home/data_type/:data_type/listing_type/:listing_type/sort/:sort/page/:page`,
component: Main, component: Main,
fetchInitialData: (auth, path) => Main.fetchInitialData(auth, path),
}, },
{ path: `/login`, component: Login }, { path: `/login`, component: Login },
{ {

View file

@ -25,6 +25,7 @@ import 'moment/locale/sq';
import 'moment/locale/km'; import 'moment/locale/km';
import 'moment/locale/ga'; import 'moment/locale/ga';
import 'moment/locale/sr'; import 'moment/locale/sr';
import 'moment/locale/ko';
import { import {
UserOperation, UserOperation,
@ -96,6 +97,7 @@ export const languages = [
{ code: 'gl', name: 'Galego' }, { code: 'gl', name: 'Galego' },
{ code: 'hu', name: 'Magyar Nyelv' }, { code: 'hu', name: 'Magyar Nyelv' },
{ code: 'ka', name: 'ქართული ენა' }, { code: 'ka', name: 'ქართული ენა' },
{ code: 'ko', name: '한국어' },
{ code: 'km', name: 'ភាសាខ្មែរ' }, { code: 'km', name: 'ភាសាខ្មែរ' },
{ code: 'hi', name: 'मानक हिन्दी' }, { code: 'hi', name: 'मानक हिन्दी' },
{ code: 'fa', name: 'فارسی' }, { code: 'fa', name: 'فارسی' },
@ -428,6 +430,8 @@ export function getMomentLanguage(): string {
lang = 'ga'; lang = 'ga';
} else if (lang.startsWith('sr')) { } else if (lang.startsWith('sr')) {
lang = 'sr'; lang = 'sr';
} else if (lang.startsWith('ko')) {
lang = 'ko';
} else { } else {
lang = 'en'; lang = 'en';
} }
@ -718,16 +722,20 @@ export function setupTribute() {
}); });
} }
// TODO var tippyInstance;
// let tippyInstance = tippy('[data-tippy-content]'); if (isBrowser()) {
tippyInstance = tippy('[data-tippy-content]');
}
export function setupTippy() { export function setupTippy() {
// tippyInstance.forEach(e => e.destroy()); if (isBrowser()) {
// tippyInstance = tippy('[data-tippy-content]', { tippyInstance.forEach(e => e.destroy());
// delay: [500, 0], tippyInstance = tippy('[data-tippy-content]', {
// // Display on "long press" delay: [500, 0],
// touch: ['hold', 500], // Display on "long press"
// }); touch: ['hold', 500],
});
}
} }
function userSearch(text: string, cb: any) { function userSearch(text: string, cb: any) {
@ -805,32 +813,26 @@ function communitySearch(text: string, cb: any) {
} }
export function getListingTypeFromProps(props: any): ListingType { export function getListingTypeFromProps(props: any): ListingType {
// TODO return props.match.params.listing_type
return ListingType.All; ? routeListingTypeToEnum(props.match.params.listing_type)
// return props.match.params.listing_type : UserService.Instance.user
// ? routeListingTypeToEnum(props.match.params.listing_type) ? Object.values(ListingType)[UserService.Instance.user.default_listing_type]
// : UserService.Instance.user : ListingType.All;
// ? Object.values(ListingType)[UserService.Instance.user.default_listing_type]
// : ListingType.All;
} }
// TODO might need to add a user setting for this too // TODO might need to add a user setting for this too
export function getDataTypeFromProps(props: any): DataType { export function getDataTypeFromProps(props: any): DataType {
// TODO return props.match.params.data_type
return DataType.Post; ? routeDataTypeToEnum(props.match.params.data_type)
// return props.match.params.data_type : DataType.Post;
// ? routeDataTypeToEnum(props.match.params.data_type)
// : DataType.Post;
} }
export function getSortTypeFromProps(props: any): SortType { export function getSortTypeFromProps(props: any): SortType {
// TODO return props.match.params.sort
return SortType.Active; ? routeSortTypeToEnum(props.match.params.sort)
// return props.match.params.sort : UserService.Instance.user
// ? routeSortTypeToEnum(props.match.params.sort) ? Object.values(SortType)[UserService.Instance.user.default_sort_type]
// : UserService.Instance.user : SortType.Active;
// ? Object.values(SortType)[UserService.Instance.user.default_sort_type]
// : SortType.Active;
} }
export function getPageFromProps(props: any): number { export function getPageFromProps(props: any): number {

View file

@ -7043,10 +7043,10 @@ lcid@^1.0.0:
dependencies: dependencies:
invert-kv "^1.0.0" invert-kv "^1.0.0"
lemmy-js-client@^1.0.8: lemmy-js-client@^1.0.9:
version "1.0.8" version "1.0.9"
resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-1.0.8.tgz#98e34c8e3cd07427f883f60fad376dc4d6f46e7f" resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-1.0.9.tgz#23cab713613612a524085d6bb3fc1d4042d262a8"
integrity sha512-YZxD3+8RGz7cRKdI8EIe5iQqQIMm5WzdNz6zZ7/CdkMtXUv6YuMOEv8HLTvBoGuaWIJwlMJ+23NIarxlT26IEw== integrity sha512-QJc4d1HkSxjv555yH3MAOYbTfgbhmmvvuC1uhFvPwBlL5B5MTry/fWPRbtLfkYTxdZWftE+PYvLVKPr3/dFmxw==
leven@^3.1.0: leven@^3.1.0:
version "3.1.0" version "3.1.0"