Skip to content

Commit

Permalink
Hide create community (#787)
Browse files Browse the repository at this point in the history
* Adding post and comment language tagging. Fixes #771

* Hiding create community button. Fixes #754
  • Loading branch information
dessalines authored Sep 22, 2022
1 parent 6320357 commit c6e3a42
Show file tree
Hide file tree
Showing 30 changed files with 321 additions and 36 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@
"eslint-plugin-prettier": "^4.2.1",
"husky": "^8.0.1",
"import-sort-style-module": "^6.0.0",
"lemmy-js-client": "0.17.0-rc.43",
"lemmy-js-client": "0.17.0-rc.44",
"lint-staged": "^13.0.3",
"mini-css-extract-plugin": "^2.6.1",
"node-fetch": "^2.6.1",
Expand Down
10 changes: 2 additions & 8 deletions src/shared/components/app/navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { UserService, WebSocketService } from "../../services";
import {
amAdmin,
auth,
canCreateCommunity,
donateLemmyUrl,
isBrowser,
notifyComment,
Expand Down Expand Up @@ -274,7 +275,7 @@ export class Navbar extends Component<NavbarProps, NavbarState> {
{i18n.t("create_post")}
</NavLink>
</li>
{this.canCreateCommunity && (
{canCreateCommunity(this.props.siteRes) && (
<li className="nav-item">
<NavLink
to="/create_community"
Expand Down Expand Up @@ -528,13 +529,6 @@ export class Navbar extends Component<NavbarProps, NavbarState> {
return amAdmin(Some(this.props.siteRes.admins));
}

get canCreateCommunity(): boolean {
let adminOnly = this.props.siteRes.site_view
.map(s => s.site.community_creation_admin_only)
.unwrapOr(false);
return !adminOnly || this.amAdmin;
}

handleToggleExpandNavbar(i: Navbar) {
i.setState({ expanded: !i.state.expanded });
}
Expand Down
28 changes: 24 additions & 4 deletions src/shared/components/comment/comment-form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
CommentResponse,
CreateComment,
EditComment,
Language,
UserOperation,
wsJsonToRes,
wsUserOp,
Expand All @@ -17,6 +18,7 @@ import { UserService, WebSocketService } from "../../services";
import {
auth,
capitalizeFirstLetter,
myFirstDiscussionLanguageId,
wsClient,
wsSubscribe,
} from "../../utils";
Expand All @@ -32,6 +34,7 @@ interface CommentFormProps {
disabled?: boolean;
focus?: boolean;
onReplyCancel?(): any;
allLanguages: Language[];
}

interface CommentFormState {
Expand Down Expand Up @@ -74,11 +77,19 @@ export class CommentForm extends Component<CommentFormProps, CommentFormState> {
this.props.edit ? Some(node.comment_view.comment.content) : None,
right: () => None,
});

let selectedLang = this.props.node
.left()
.map(n => n.comment_view.comment.language_id)
.or(myFirstDiscussionLanguageId(UserService.Instance.myUserInfo));

return (
<div className="mb-3">
{UserService.Instance.myUserInfo.isSome() ? (
<MarkdownTextArea
initialContent={initialContent}
initialLanguageId={selectedLang}
showLanguage
buttonTitle={Some(this.state.buttonTitle)}
maxLength={None}
finished={this.state.finished}
Expand All @@ -88,6 +99,7 @@ export class CommentForm extends Component<CommentFormProps, CommentFormState> {
onSubmit={this.handleCommentSubmit}
onReplyCancel={this.handleReplyCancel}
placeholder={Some(i18n.t("comment_here"))}
allLanguages={this.props.allLanguages}
/>
) : (
<div className="alert alert-warning" role="alert">
Expand All @@ -104,38 +116,46 @@ export class CommentForm extends Component<CommentFormProps, CommentFormState> {
);
}

handleCommentSubmit(msg: { val: string; formId: string }) {
handleCommentSubmit(msg: {
val: Option<string>;
formId: string;
languageId: Option<number>;
}) {
let content = msg.val;
let language_id = msg.languageId;
this.setState({ formId: Some(msg.formId) });

this.props.node.match({
left: node => {
if (this.props.edit) {
let form = new EditComment({
content: Some(content),
content,
distinguished: None,
form_id: this.state.formId,
comment_id: node.comment_view.comment.id,
language_id,
auth: auth().unwrap(),
});
WebSocketService.Instance.send(wsClient.editComment(form));
} else {
let form = new CreateComment({
content,
content: content.unwrap(),
form_id: this.state.formId,
post_id: node.comment_view.post.id,
parent_id: Some(node.comment_view.comment.id),
language_id,
auth: auth().unwrap(),
});
WebSocketService.Instance.send(wsClient.createComment(form));
}
},
right: postId => {
let form = new CreateComment({
content,
content: content.unwrap(),
form_id: this.state.formId,
post_id: postId,
parent_id: None,
language_id,
auth: auth().unwrap(),
});
WebSocketService.Instance.send(wsClient.createComment(form));
Expand Down
6 changes: 6 additions & 0 deletions src/shared/components/comment/comment-node.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
DeleteComment,
EditComment,
GetComments,
Language,
ListingType,
MarkCommentReplyAsRead,
MarkPersonMentionAsRead,
Expand Down Expand Up @@ -101,6 +102,7 @@ interface CommentNodeProps {
showCommunity?: boolean;
enableDownvotes: boolean;
viewType: CommentViewType;
allLanguages: Language[];
}

export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
Expand Down Expand Up @@ -324,6 +326,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
onReplyCancel={this.handleReplyCancel}
disabled={this.props.locked}
focus
allLanguages={this.props.allLanguages}
/>
)}
{!this.state.showEdit && !this.state.collapsed && (
Expand Down Expand Up @@ -1007,6 +1010,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
onReplyCancel={this.handleReplyCancel}
disabled={this.props.locked}
focus
allLanguages={this.props.allLanguages}
/>
)}
{!this.state.collapsed && node.children.length > 0 && (
Expand All @@ -1018,6 +1022,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
maxCommentsShown={None}
enableDownvotes={this.props.enableDownvotes}
viewType={this.props.viewType}
allLanguages={this.props.allLanguages}
/>
)}
{/* A collapsed clearfix */}
Expand Down Expand Up @@ -1264,6 +1269,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
form_id: None, // TODO not sure about this
content: None,
distinguished: Some(!comment.distinguished),
language_id: Some(comment.language_id),
auth: auth().unwrap(),
});
WebSocketService.Instance.send(wsClient.editComment(form));
Expand Down
3 changes: 3 additions & 0 deletions src/shared/components/comment/comment-nodes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Component } from "inferno";
import {
CommentNode as CommentNodeI,
CommunityModeratorView,
Language,
PersonViewSafe,
} from "lemmy-js-client";
import { CommentViewType } from "../../interfaces";
Expand All @@ -22,6 +23,7 @@ interface CommentNodesProps {
showCommunity?: boolean;
enableDownvotes?: boolean;
viewType: CommentViewType;
allLanguages: Language[];
}

export class CommentNodes extends Component<CommentNodesProps, any> {
Expand Down Expand Up @@ -51,6 +53,7 @@ export class CommentNodes extends Component<CommentNodesProps, any> {
showCommunity={this.props.showCommunity}
enableDownvotes={this.props.enableDownvotes}
viewType={this.props.viewType}
allLanguages={this.props.allLanguages}
/>
))}
</div>
Expand Down
1 change: 1 addition & 0 deletions src/shared/components/comment/comment-report.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ export class CommentReport extends Component<CommentReportProps, any> {
enableDownvotes={true}
viewOnly={true}
showCommunity={true}
allLanguages={[]}
/>
<div>
{i18n.t("reporter")}: <PersonListing person={r.creator} />
Expand Down
109 changes: 109 additions & 0 deletions src/shared/components/common/language-select.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import { Option } from "@sniptt/monads";
import classNames from "classnames";
import { Component, linkEvent } from "inferno";
import { Language } from "lemmy-js-client";
import { i18n } from "../../i18next";
import { randomStr } from "../../utils";
import { Icon } from "./icon";

interface LanguageSelectProps {
allLanguages: Language[];
selectedLanguageIds: Option<number[]>;
multiple: boolean;
onChange(val: number[]): any;
}

export class LanguageSelect extends Component<LanguageSelectProps, any> {
private id = `language-select-${randomStr()}`;

constructor(props: any, context: any) {
super(props, context);
}

componentDidMount() {
this.setSelectedValues();
}

// Necessary because there is no HTML way to set selected for multiple in value=
setSelectedValues() {
this.props.selectedLanguageIds.map(toString).match({
some: ids => {
var select = (document.getElementById(this.id) as HTMLSelectElement)
.options;
for (let i = 0; i < select.length; i++) {
let o = select[i];
if (ids.includes(o.value)) {
o.selected = true;
}
}
},
none: void 0,
});
}

render() {
let selectedLangs = this.props.selectedLanguageIds;

return (
<div className="form-group row">
<label
className={classNames("col-form-label", {
"col-sm-3": this.props.multiple,
"col-sm-2": !this.props.multiple,
})}
htmlFor={this.id}
>
{i18n.t(this.props.multiple ? "language_plural" : "language")}
</label>
<div
className={classNames("input-group", {
"col-sm-9": this.props.multiple,
"col-sm-10": !this.props.multiple,
})}
>
<select
className="form-control custom-select"
id={this.id}
onChange={linkEvent(this, this.handleLanguageChange)}
aria-label="action"
multiple={this.props.multiple}
>
{this.props.allLanguages.map(l => (
<option
key={l.id}
value={l.id}
selected={selectedLangs.unwrapOr([]).includes(l.id)}
>
{l.name}
</option>
))}
</select>
{this.props.multiple && (
<div className="input-group-append">
<button
className="input-group-text"
onClick={linkEvent(this, this.handleDeselectAll)}
>
<Icon icon="x" />
</button>
</div>
)}
</div>
</div>
);
}

handleLanguageChange(i: LanguageSelect, event: any) {
let options: HTMLOptionElement[] = Array.from(event.target.options);
let selected: number[] = options
.filter(o => o.selected)
.map(o => Number(o.value));

i.props.onChange(selected);
}

handleDeselectAll(i: LanguageSelect, event: any) {
event.preventDefault();
i.props.onChange([]);
}
}
Loading

0 comments on commit c6e3a42

Please sign in to comment.