From 440fda9d51385c1eef38f6c1e0e6ed931b12b915 Mon Sep 17 00:00:00 2001 From: Dessalines <tyhou13@gmx.com> Date: Mon, 15 Mar 2021 14:09:31 -0400 Subject: [PATCH] user_ -> person table migration. --- package.json | 2 +- src/server/index.tsx | 2 +- src/shared/components/admin-settings.tsx | 6 +- src/shared/components/app.tsx | 2 +- src/shared/components/comment-form.tsx | 4 +- src/shared/components/comment-node.tsx | 84 +++--- src/shared/components/comment-nodes.tsx | 4 +- src/shared/components/community.tsx | 8 +- src/shared/components/create-community.tsx | 2 +- src/shared/components/create-post.tsx | 2 +- .../components/create-private-message.tsx | 36 +-- src/shared/components/image-upload-form.tsx | 2 +- src/shared/components/inbox.tsx | 99 ++++--- src/shared/components/listing-type-select.tsx | 8 +- src/shared/components/main.tsx | 46 +-- src/shared/components/markdown-textarea.tsx | 6 +- src/shared/components/modlog.tsx | 14 +- src/shared/components/navbar.tsx | 48 +-- .../{user-details.tsx => person-details.tsx} | 42 +-- .../{user-listing.tsx => person-listing.tsx} | 32 +- .../components/{user.tsx => person.tsx} | 277 +++++++++--------- src/shared/components/post-form.tsx | 14 +- src/shared/components/post-listing.tsx | 67 +++-- src/shared/components/post.tsx | 24 +- .../components/private-message-form.tsx | 8 +- src/shared/components/private-message.tsx | 21 +- src/shared/components/search.tsx | 20 +- src/shared/components/sidebar.tsx | 25 +- src/shared/components/theme.tsx | 12 +- src/shared/initialize.ts | 2 +- src/shared/interfaces.ts | 6 +- src/shared/routes.ts | 18 +- src/shared/services/UserService.ts | 8 +- src/shared/services/WebSocketService.ts | 6 +- src/shared/utils.ts | 72 +++-- yarn.lock | 8 +- 36 files changed, 556 insertions(+), 481 deletions(-) rename src/shared/components/{user-details.tsx => person-details.tsx} (80%) rename src/shared/components/{user-listing.tsx => person-listing.tsx} (52%) rename src/shared/components/{user.tsx => person.tsx} (80%) diff --git a/package.json b/package.json index 96fd0c2..ef7b088 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "eslint": "^7.20.0", "eslint-plugin-prettier": "^3.3.1", "husky": "^5.1.0", - "lemmy-js-client": "0.10.0-rc.1", + "lemmy-js-client": "0.10.0-rc.5", "lint-staged": "^10.5.4", "mini-css-extract-plugin": "^1.3.8", "node-fetch": "^2.6.1", diff --git a/src/server/index.tsx b/src/server/index.tsx index bb0ac3a..748494c 100644 --- a/src/server/index.tsx +++ b/src/server/index.tsx @@ -67,7 +67,7 @@ server.get("/*", async (req, res) => { ? req.headers["accept-language"].split(",")[0] : "en"; let lang = site.my_user - ? site.my_user.lang == "browser" + ? site.my_user.local_user.lang == "browser" ? acceptLang : "en" : acceptLang; diff --git a/src/shared/components/admin-settings.tsx b/src/shared/components/admin-settings.tsx index accefe1..0836a16 100644 --- a/src/shared/components/admin-settings.tsx +++ b/src/shared/components/admin-settings.tsx @@ -23,7 +23,7 @@ import { } from "../utils"; import autosize from "autosize"; import { SiteForm } from "./site-form"; -import { UserListing } from "./user-listing"; +import { PersonListing } from "./person-listing"; import { HtmlTags } from "./html-tags"; import { Spinner } from "./icon"; import { i18n } from "../i18next"; @@ -135,7 +135,7 @@ export class AdminSettings extends Component<any, AdminSettingsState> { <ul class="list-unstyled"> {this.state.siteRes.admins.map(admin => ( <li class="list-inline-item"> - <UserListing user={admin.user} /> + <PersonListing person={admin.person} /> </li> ))} </ul> @@ -150,7 +150,7 @@ export class AdminSettings extends Component<any, AdminSettingsState> { <ul class="list-unstyled"> {this.state.siteRes.banned.map(banned => ( <li class="list-inline-item"> - <UserListing user={banned.user} /> + <PersonListing person={banned.person} /> </li> ))} </ul> diff --git a/src/shared/components/app.tsx b/src/shared/components/app.tsx index 6f49e2c..262e4b5 100644 --- a/src/shared/components/app.tsx +++ b/src/shared/components/app.tsx @@ -26,7 +26,7 @@ export class App extends Component<AppProps, any> { <> <Provider i18next={i18n}> <div> - <Theme user={siteRes.my_user} /> + <Theme localUserView={siteRes.my_user} /> {siteRes && siteRes.site_view && this.props.siteRes.site_view.site.icon && ( diff --git a/src/shared/components/comment-form.tsx b/src/shared/components/comment-form.tsx index 5c21b2d..2677594 100644 --- a/src/shared/components/comment-form.tsx +++ b/src/shared/components/comment-form.tsx @@ -68,7 +68,7 @@ export class CommentForm extends Component<CommentFormProps, CommentFormState> { render() { return ( <div class="mb-3"> - {UserService.Instance.user ? ( + {UserService.Instance.localUserView ? ( <MarkdownTextArea initialContent={ this.props.edit @@ -133,7 +133,7 @@ export class CommentForm extends Component<CommentFormProps, CommentFormState> { let op = wsUserOp(msg); // Only do the showing and hiding if logged in - if (UserService.Instance.user) { + if (UserService.Instance.localUserView) { if ( op == UserOperation.CreateComment || op == UserOperation.EditComment diff --git a/src/shared/components/comment-node.tsx b/src/shared/components/comment-node.tsx index 6b5fc0e..c6ba1a5 100644 --- a/src/shared/components/comment-node.tsx +++ b/src/shared/components/comment-node.tsx @@ -5,18 +5,18 @@ import { DeleteComment, RemoveComment, MarkCommentAsRead, - MarkUserMentionAsRead, + MarkPersonMentionAsRead, SaveComment, BanFromCommunity, - BanUser, + BanPerson, CommunityModeratorView, - UserViewSafe, + PersonViewSafe, AddModToCommunity, AddAdmin, TransferCommunity, TransferSite, CommentView, - UserMentionView, + PersonMentionView, } from "lemmy-js-client"; import { CommentNode as CommentNodeI, BanType } from "../interfaces"; import { WebSocketService, UserService } from "../services"; @@ -34,7 +34,7 @@ import moment from "moment"; import { MomentTime } from "./moment-time"; import { CommentForm } from "./comment-form"; import { CommentNodes } from "./comment-nodes"; -import { UserListing } from "./user-listing"; +import { PersonListing } from "./person-listing"; import { CommunityLink } from "./community-link"; import { Icon, Spinner } from "./icon"; import { i18n } from "../i18next"; @@ -74,7 +74,7 @@ interface CommentNodeProps { markable?: boolean; showContext?: boolean; moderators: CommunityModeratorView[]; - admins: UserViewSafe[]; + admins: PersonViewSafe[]; // TODO is this necessary, can't I get it from the node itself? postCreatorId?: number; showCommunity?: boolean; @@ -156,7 +156,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { > <div class="d-flex flex-wrap align-items-center text-muted small"> <span class="mr-2"> - <UserListing user={cv.creator} /> + <PersonListing person={cv.creator} /> </span> {this.isMod && ( @@ -270,7 +270,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { )} </button> )} - {UserService.Instance.user && !this.props.viewOnly && ( + {UserService.Instance.localUserView && !this.props.viewOnly && ( <> <button className={`btn btn-link btn-animate ${ @@ -791,7 +791,9 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { get commentOrMentionRead() { let cv = this.props.node.comment_view; - return this.isUserMentionType(cv) ? cv.user_mention.read : cv.comment.read; + return this.isPersonMentionType(cv) + ? cv.person_mention.read + : cv.comment.read; } get linkBtn() { @@ -813,8 +815,8 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { get myComment(): boolean { return ( - UserService.Instance.user && - this.props.node.comment_view.creator.id == UserService.Instance.user.id + this.props.node.comment_view.creator.id == + UserService.Instance.localUserView?.person.id ); } @@ -832,7 +834,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { return ( this.props.admins && isMod( - this.props.admins.map(a => a.user.id), + this.props.admins.map(a => a.person.id), this.props.node.comment_view.creator.id ) ); @@ -845,11 +847,11 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { get canMod(): boolean { if (this.props.admins && this.props.moderators) { let adminsThenMods = this.props.admins - .map(a => a.user.id) + .map(a => a.person.id) .concat(this.props.moderators.map(m => m.moderator.id)); return canMod( - UserService.Instance.user, + UserService.Instance.localUserView, adminsThenMods, this.props.node.comment_view.creator.id ); @@ -862,8 +864,8 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { return ( this.props.admins && canMod( - UserService.Instance.user, - this.props.admins.map(a => a.user.id), + UserService.Instance.localUserView, + this.props.admins.map(a => a.person.id), this.props.node.comment_view.creator.id ) ); @@ -872,18 +874,22 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { get amCommunityCreator(): boolean { return ( this.props.moderators && - UserService.Instance.user && - this.props.node.comment_view.creator.id != UserService.Instance.user.id && - UserService.Instance.user.id == this.props.moderators[0].moderator.id + UserService.Instance.localUserView && + this.props.node.comment_view.creator.id != + UserService.Instance.localUserView.person.id && + UserService.Instance.localUserView.person.id == + this.props.moderators[0].moderator.id ); } get amSiteCreator(): boolean { return ( this.props.admins && - UserService.Instance.user && - this.props.node.comment_view.creator.id != UserService.Instance.user.id && - UserService.Instance.user.id == this.props.admins[0].user.id + UserService.Instance.localUserView && + this.props.node.comment_view.creator.id != + UserService.Instance.localUserView.person.id && + UserService.Instance.localUserView.person.id == + this.props.admins[0].person.id ); } @@ -1024,20 +1030,20 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { i.setState(i.state); } - isUserMentionType( - item: CommentView | UserMentionView - ): item is UserMentionView { - return (item as UserMentionView).user_mention?.id !== undefined; + isPersonMentionType( + item: CommentView | PersonMentionView + ): item is PersonMentionView { + return (item as PersonMentionView).person_mention?.id !== undefined; } handleMarkRead(i: CommentNode) { - if (i.isUserMentionType(i.props.node.comment_view)) { - let form: MarkUserMentionAsRead = { - user_mention_id: i.props.node.comment_view.user_mention.id, - read: !i.props.node.comment_view.user_mention.read, + if (i.isPersonMentionType(i.props.node.comment_view)) { + let form: MarkPersonMentionAsRead = { + person_mention_id: i.props.node.comment_view.person_mention.id, + read: !i.props.node.comment_view.person_mention.read, auth: authField(), }; - WebSocketService.Instance.send(wsClient.markUserMentionAsRead(form)); + WebSocketService.Instance.send(wsClient.markPersonMentionAsRead(form)); } else { let form: MarkCommentAsRead = { comment_id: i.props.node.comment_view.comment.id, @@ -1095,7 +1101,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { i.state.removeData = false; } let form: BanFromCommunity = { - user_id: cv.creator.id, + person_id: cv.creator.id, community_id: cv.community.id, ban, remove_data: i.state.removeData, @@ -1110,15 +1116,15 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { if (ban == false) { i.state.removeData = false; } - let form: BanUser = { - user_id: cv.creator.id, + let form: BanPerson = { + person_id: cv.creator.id, ban, remove_data: i.state.removeData, reason: i.state.banReason, expires: getUnixTime(i.state.banExpires), auth: authField(), }; - WebSocketService.Instance.send(wsClient.banUser(form)); + WebSocketService.Instance.send(wsClient.banPerson(form)); } i.state.showBanDialog = false; @@ -1138,7 +1144,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { handleAddModToCommunity(i: CommentNode) { let cv = i.props.node.comment_view; let form: AddModToCommunity = { - user_id: cv.creator.id, + person_id: cv.creator.id, community_id: cv.community.id, added: !i.isMod, auth: authField(), @@ -1160,7 +1166,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { handleAddAdmin(i: CommentNode) { let form: AddAdmin = { - user_id: i.props.node.comment_view.creator.id, + person_id: i.props.node.comment_view.creator.id, added: !i.isAdmin, auth: authField(), }; @@ -1183,7 +1189,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { let cv = i.props.node.comment_view; let form: TransferCommunity = { community_id: cv.community.id, - user_id: cv.creator.id, + person_id: cv.creator.id, auth: authField(), }; WebSocketService.Instance.send(wsClient.transferCommunity(form)); @@ -1203,7 +1209,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { handleTransferSite(i: CommentNode) { let form: TransferSite = { - user_id: i.props.node.comment_view.creator.id, + person_id: i.props.node.comment_view.creator.id, auth: authField(), }; WebSocketService.Instance.send(wsClient.transferSite(form)); diff --git a/src/shared/components/comment-nodes.tsx b/src/shared/components/comment-nodes.tsx index fd5994a..0ce2bb9 100644 --- a/src/shared/components/comment-nodes.tsx +++ b/src/shared/components/comment-nodes.tsx @@ -1,12 +1,12 @@ import { Component } from "inferno"; import { CommentNode as CommentNodeI } from "../interfaces"; -import { CommunityModeratorView, UserViewSafe } from "lemmy-js-client"; +import { CommunityModeratorView, PersonViewSafe } from "lemmy-js-client"; import { CommentNode } from "./comment-node"; interface CommentNodesProps { nodes: CommentNodeI[]; moderators?: CommunityModeratorView[]; - admins?: UserViewSafe[]; + admins?: PersonViewSafe[]; postCreatorId?: number; noBorder?: boolean; noIndent?: boolean; diff --git a/src/shared/components/community.tsx b/src/shared/components/community.tsx index 9f492cd..c9a70f4 100644 --- a/src/shared/components/community.tsx +++ b/src/shared/components/community.tsx @@ -177,8 +177,10 @@ export class Community extends Component<any, State> { let sort: SortType = pathSplit[6] ? SortType[pathSplit[6]] - : UserService.Instance.user - ? Object.values(SortType)[UserService.Instance.user.default_sort_type] + : UserService.Instance.localUserView + ? Object.values(SortType)[ + UserService.Instance.localUserView.local_user.default_sort_type + ] : SortType.Active; let page = pathSplit[8] ? Number(pathSplit[8]) : 1; @@ -499,7 +501,7 @@ export class Community extends Component<any, State> { // TODO this might be incorrect this.state.posts - .filter(p => p.creator.id == data.user_view.user.id) + .filter(p => p.creator.id == data.person_view.person.id) .forEach(p => (p.creator_banned_from_community = data.banned)); this.setState(this.state); diff --git a/src/shared/components/create-community.tsx b/src/shared/components/create-community.tsx index 4817f40..52c2833 100644 --- a/src/shared/components/create-community.tsx +++ b/src/shared/components/create-community.tsx @@ -28,7 +28,7 @@ export class CreateCommunity extends Component<any, CreateCommunityState> { this.parseMessage = this.parseMessage.bind(this); this.subscription = wsSubscribe(this.parseMessage); - if (!UserService.Instance.user && isBrowser()) { + if (!UserService.Instance.localUserView && 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 05295c6..00221d6 100644 --- a/src/shared/components/create-post.tsx +++ b/src/shared/components/create-post.tsx @@ -48,7 +48,7 @@ export class CreatePost extends Component<any, CreatePostState> { this.handlePostCreate = this.handlePostCreate.bind(this); this.state = this.emptyState; - if (!UserService.Instance.user && isBrowser()) { + if (!UserService.Instance.localUserView && isBrowser()) { toast(i18n.t("not_logged_in"), "danger"); this.context.router.history.push(`/login`); } diff --git a/src/shared/components/create-private-message.tsx b/src/shared/components/create-private-message.tsx index adbfdf7..3771da6 100644 --- a/src/shared/components/create-private-message.tsx +++ b/src/shared/components/create-private-message.tsx @@ -7,10 +7,10 @@ import { UserService, WebSocketService } from "../services"; import { SiteView, UserOperation, - GetUserDetailsResponse, - UserViewSafe, + GetPersonDetailsResponse, + PersonViewSafe, SortType, - GetUserDetails, + GetPersonDetails, } from "lemmy-js-client"; import { authField, @@ -28,7 +28,7 @@ import { InitialFetchRequest } from "shared/interfaces"; interface CreatePrivateMessageState { site_view: SiteView; - recipient: UserViewSafe; + recipient: PersonViewSafe; recipient_id: number; loading: boolean; } @@ -55,7 +55,7 @@ export class CreatePrivateMessage extends Component< this.parseMessage = this.parseMessage.bind(this); this.subscription = wsSubscribe(this.parseMessage); - if (!UserService.Instance.user) { + if (!UserService.Instance.localUserView) { toast(i18n.t("not_logged_in"), "danger"); this.context.router.history.push(`/login`); } @@ -65,29 +65,29 @@ export class CreatePrivateMessage extends Component< this.state.recipient = this.isoData.routeData[0].user; this.state.loading = false; } else { - this.fetchUserDetails(); + this.fetchPersonDetails(); } } - fetchUserDetails() { - let form: GetUserDetails = { - user_id: this.state.recipient_id, + fetchPersonDetails() { + let form: GetPersonDetails = { + person_id: this.state.recipient_id, sort: SortType.New, saved_only: false, auth: authField(false), }; - WebSocketService.Instance.send(wsClient.getUserDetails(form)); + WebSocketService.Instance.send(wsClient.getPersonDetails(form)); } static fetchInitialData(req: InitialFetchRequest): Promise<any>[] { - let user_id = Number(req.path.split("/").pop()); - let form: GetUserDetails = { - user_id, + let person_id = Number(req.path.split("/").pop()); + let form: GetPersonDetails = { + person_id, sort: SortType.New, saved_only: false, auth: req.auth, }; - return [req.client.getUserDetails(form)]; + return [req.client.getPersonDetails(form)]; } get documentTitle(): string { @@ -119,7 +119,7 @@ export class CreatePrivateMessage extends Component< <h5>{i18n.t("create_private_message")}</h5> <PrivateMessageForm onCreate={this.handlePrivateMessageCreate} - recipient={this.state.recipient.user} + recipient={this.state.recipient.person} /> </div> </div> @@ -142,9 +142,9 @@ export class CreatePrivateMessage extends Component< this.state.loading = false; this.setState(this.state); return; - } else if (op == UserOperation.GetUserDetails) { - let data = wsJsonToRes<GetUserDetailsResponse>(msg).data; - this.state.recipient = data.user_view; + } else if (op == UserOperation.GetPersonDetails) { + let data = wsJsonToRes<GetPersonDetailsResponse>(msg).data; + this.state.recipient = data.person_view; this.state.loading = false; this.setState(this.state); } diff --git a/src/shared/components/image-upload-form.tsx b/src/shared/components/image-upload-form.tsx index fb9c9ca..b8b94c2 100644 --- a/src/shared/components/image-upload-form.tsx +++ b/src/shared/components/image-upload-form.tsx @@ -65,7 +65,7 @@ export class ImageUploadForm extends Component< accept="image/*,video/*" name={this.id} class="d-none" - disabled={!UserService.Instance.user} + disabled={!UserService.Instance.localUserView} onChange={linkEvent(this, this.handleImageUpload)} /> </form> diff --git a/src/shared/components/inbox.tsx b/src/shared/components/inbox.tsx index 5c7f798..677d905 100644 --- a/src/shared/components/inbox.tsx +++ b/src/shared/components/inbox.tsx @@ -6,16 +6,16 @@ import { SortType, GetReplies, GetRepliesResponse, - GetUserMentions, - GetUserMentionsResponse, - UserMentionResponse, + GetPersonMentions, + GetPersonMentionsResponse, + PersonMentionResponse, CommentResponse, PrivateMessageView, GetPrivateMessages, PrivateMessagesResponse, PrivateMessageResponse, SiteView, - UserMentionView, + PersonMentionView, } from "lemmy-js-client"; import { WebSocketService, UserService } from "../services"; import { @@ -62,7 +62,7 @@ enum ReplyEnum { type ReplyType = { id: number; type_: ReplyEnum; - view: CommentView | PrivateMessageView | UserMentionView; + view: CommentView | PrivateMessageView | PersonMentionView; published: string; }; @@ -70,7 +70,7 @@ interface InboxState { unreadOrAll: UnreadOrAll; messageType: MessageType; replies: CommentView[]; - mentions: UserMentionView[]; + mentions: PersonMentionView[]; messages: PrivateMessageView[]; combined: ReplyType[]; sort: SortType; @@ -101,7 +101,7 @@ export class Inbox extends Component<any, InboxState> { this.state = this.emptyState; this.handleSortChange = this.handleSortChange.bind(this); - if (!UserService.Instance.user && isBrowser()) { + if (!UserService.Instance.localUserView && isBrowser()) { toast(i18n.t("not_logged_in"), "danger"); this.context.router.history.push(`/login`); } @@ -128,9 +128,9 @@ export class Inbox extends Component<any, InboxState> { } get documentTitle(): string { - return `@${UserService.Instance.user.name} ${i18n.t("inbox")} - ${ - this.state.site_view.site.name - }`; + return `@${UserService.Instance.localUserView.person.name} ${i18n.t( + "inbox" + )} - ${this.state.site_view.site.name}`; } render() { @@ -307,9 +307,9 @@ export class Inbox extends Component<any, InboxState> { }; } - mentionToReplyType(r: UserMentionView): ReplyType { + mentionToReplyType(r: PersonMentionView): ReplyType { return { - id: r.user_mention.id, + id: r.person_mention.id, type_: ReplyEnum.Mention, view: r, published: r.comment.published, @@ -359,7 +359,7 @@ export class Inbox extends Component<any, InboxState> { return ( <CommentNodes key={i.id} - nodes={[{ comment_view: i.view as UserMentionView }]} + nodes={[{ comment_view: i.view as PersonMentionView }]} noIndent markable showCommunity @@ -403,7 +403,7 @@ export class Inbox extends Component<any, InboxState> { <div> {this.state.mentions.map(umv => ( <CommentNodes - key={umv.user_mention.id} + key={umv.person_mention.id} nodes={[{ comment_view: umv }]} noIndent markable @@ -491,14 +491,14 @@ export class Inbox extends Component<any, InboxState> { }; promises.push(req.client.getReplies(repliesForm)); - let userMentionsForm: GetUserMentions = { + let personMentionsForm: GetPersonMentions = { sort: SortType.New, unread_only: true, page: 1, limit: fetchLimit, auth: req.auth, }; - promises.push(req.client.getUserMentions(userMentionsForm)); + promises.push(req.client.getPersonMentions(personMentionsForm)); let privateMessagesForm: GetPrivateMessages = { unread_only: true, @@ -521,14 +521,16 @@ export class Inbox extends Component<any, InboxState> { }; WebSocketService.Instance.send(wsClient.getReplies(repliesForm)); - let userMentionsForm: GetUserMentions = { + let personMentionsForm: GetPersonMentions = { sort: this.state.sort, unread_only: this.state.unreadOrAll == UnreadOrAll.Unread, page: this.state.page, limit: fetchLimit, auth: authField(), }; - WebSocketService.Instance.send(wsClient.getUserMentions(userMentionsForm)); + WebSocketService.Instance.send( + wsClient.getPersonMentions(personMentionsForm) + ); let privateMessagesForm: GetPrivateMessages = { unread_only: this.state.unreadOrAll == UnreadOrAll.Unread, @@ -579,8 +581,8 @@ export class Inbox extends Component<any, InboxState> { window.scrollTo(0, 0); this.setState(this.state); setupTippy(); - } else if (op == UserOperation.GetUserMentions) { - let data = wsJsonToRes<GetUserMentionsResponse>(msg).data; + } else if (op == UserOperation.GetPersonMentions) { + let data = wsJsonToRes<GetPersonMentionsResponse>(msg).data; this.state.mentions = data.mentions; this.state.combined = this.buildCombined(); this.sendUnreadCount(); @@ -698,48 +700,49 @@ export class Inbox extends Component<any, InboxState> { this.sendUnreadCount(); this.setState(this.state); setupTippy(); - } else if (op == UserOperation.MarkUserMentionAsRead) { - let data = wsJsonToRes<UserMentionResponse>(msg).data; + } else if (op == UserOperation.MarkPersonMentionAsRead) { + let data = wsJsonToRes<PersonMentionResponse>(msg).data; // TODO this might not be correct, it might need to use the comment id let found = this.state.mentions.find( - c => c.user_mention.id == data.user_mention_view.user_mention.id + c => c.person_mention.id == data.person_mention_view.person_mention.id ); if (found) { let combinedView = this.state.combined.find( - i => i.id == data.user_mention_view.user_mention.id - ).view as UserMentionView; + i => i.id == data.person_mention_view.person_mention.id + ).view as PersonMentionView; found.comment.content = combinedView.comment.content = - data.user_mention_view.comment.content; + data.person_mention_view.comment.content; found.comment.updated = combinedView.comment.updated = - data.user_mention_view.comment.updated; + data.person_mention_view.comment.updated; found.comment.removed = combinedView.comment.removed = - data.user_mention_view.comment.removed; + data.person_mention_view.comment.removed; found.comment.deleted = combinedView.comment.deleted = - data.user_mention_view.comment.deleted; + data.person_mention_view.comment.deleted; found.counts.upvotes = combinedView.counts.upvotes = - data.user_mention_view.counts.upvotes; + data.person_mention_view.counts.upvotes; found.counts.downvotes = combinedView.counts.downvotes = - data.user_mention_view.counts.downvotes; + data.person_mention_view.counts.downvotes; found.counts.score = combinedView.counts.score = - data.user_mention_view.counts.score; + data.person_mention_view.counts.score; // If youre in the unread view, just remove it from the list if ( this.state.unreadOrAll == UnreadOrAll.Unread && - data.user_mention_view.user_mention.read + data.person_mention_view.person_mention.read ) { this.state.mentions = this.state.mentions.filter( - r => r.user_mention.id !== data.user_mention_view.user_mention.id + r => + r.person_mention.id !== data.person_mention_view.person_mention.id ); this.state.combined = this.state.combined.filter( - r => r.id !== data.user_mention_view.user_mention.id + r => r.id !== data.person_mention_view.person_mention.id ); } else { // TODO test to make sure these mentions are getting marked as read - found.user_mention.read = combinedView.user_mention.read = - data.user_mention_view.user_mention.read; + found.person_mention.read = combinedView.person_mention.read = + data.person_mention_view.person_mention.read; } } this.sendUnreadCount(); @@ -747,18 +750,26 @@ export class Inbox extends Component<any, InboxState> { } else if (op == UserOperation.CreateComment) { let data = wsJsonToRes<CommentResponse>(msg).data; - if (data.recipient_ids.includes(UserService.Instance.user.id)) { + if ( + data.recipient_ids.includes( + UserService.Instance.localUserView.local_user.id + ) + ) { this.state.replies.unshift(data.comment_view); this.state.combined.unshift(this.replyToReplyType(data.comment_view)); this.setState(this.state); - } else if (data.comment_view.creator.id == UserService.Instance.user.id) { + } else if ( + data.comment_view.creator.id == + UserService.Instance.localUserView.person.id + ) { // TODO this seems wrong, you should be using form_id toast(i18n.t("reply_sent")); } } else if (op == UserOperation.CreatePrivateMessage) { let data = wsJsonToRes<PrivateMessageResponse>(msg).data; if ( - data.private_message_view.recipient.id == UserService.Instance.user.id + data.private_message_view.recipient.id == + UserService.Instance.localUserView.person.id ) { this.state.messages.unshift(data.private_message_view); this.state.combined.unshift( @@ -785,13 +796,13 @@ export class Inbox extends Component<any, InboxState> { unreadCount(): number { return ( this.state.replies.filter(r => !r.comment.read).length + - this.state.mentions.filter(r => !r.user_mention.read).length + + this.state.mentions.filter(r => !r.person_mention.read).length + this.state.messages.filter( r => - UserService.Instance.user && + UserService.Instance.localUserView && !r.private_message.read && - // TODO also seems very strang and wrong - r.creator.id !== UserService.Instance.user.id + // TODO also seems very strange and wrong + r.creator.id !== UserService.Instance.localUserView.person.id ).length ); } diff --git a/src/shared/components/listing-type-select.tsx b/src/shared/components/listing-type-select.tsx index c576e9b..695211e 100644 --- a/src/shared/components/listing-type-select.tsx +++ b/src/shared/components/listing-type-select.tsx @@ -42,7 +42,11 @@ export class ListingTypeSelect extends Component< <label className={`btn btn-outline-secondary ${this.state.type_ == ListingType.Subscribed && "active"} - ${UserService.Instance.user == undefined ? "disabled" : "pointer"} + ${ + UserService.Instance.localUserView == undefined + ? "disabled" + : "pointer" + } `} > <input @@ -51,7 +55,7 @@ export class ListingTypeSelect extends Component< value={ListingType.Subscribed} checked={this.state.type_ == ListingType.Subscribed} onChange={linkEvent(this, this.handleTypeChange)} - disabled={UserService.Instance.user == undefined} + disabled={UserService.Instance.localUserView == undefined} /> {i18n.t("subscribed")} </label> diff --git a/src/shared/components/main.tsx b/src/shared/components/main.tsx index c6b2052..ba34ed4 100644 --- a/src/shared/components/main.tsx +++ b/src/shared/components/main.tsx @@ -21,7 +21,7 @@ import { GetCommentsResponse, CommentResponse, AddAdminResponse, - BanUserResponse, + BanPersonResponse, } from "lemmy-js-client"; import { DataType, InitialFetchRequest } from "../interfaces"; import { WebSocketService, UserService } from "../services"; @@ -31,7 +31,7 @@ import { SortSelect } from "./sort-select"; import { ListingTypeSelect } from "./listing-type-select"; import { DataTypeSelect } from "./data-type-select"; import { SiteForm } from "./site-form"; -import { UserListing } from "./user-listing"; +import { PersonListing } from "./person-listing"; import { CommunityLink } from "./community-link"; import { BannerIconHeader } from "./banner-icon-header"; import { Icon, Spinner } from "./icon"; @@ -130,14 +130,14 @@ export class Main extends Component<any, MainState> { this.state.comments = this.isoData.routeData[0].comments; } this.state.trendingCommunities = this.isoData.routeData[1].communities; - if (UserService.Instance.user) { + if (UserService.Instance.localUserView) { this.state.subscribedCommunities = this.isoData.routeData[2].communities; } this.state.loading = false; } else { this.fetchTrendingCommunities(); this.fetchData(); - if (UserService.Instance.user) { + if (UserService.Instance.localUserView) { WebSocketService.Instance.send( wsClient.getFollowedCommunities({ auth: authField(), @@ -194,15 +194,17 @@ export class Main extends Component<any, MainState> { // TODO figure out auth default_listingType, default_sort_type let type_: ListingType = pathSplit[5] ? ListingType[pathSplit[5]] - : UserService.Instance.user + : UserService.Instance.localUserView ? Object.values(ListingType)[ - UserService.Instance.user.default_listing_type + UserService.Instance.localUserView.local_user.default_listing_type ] : ListingType.Local; let sort: SortType = pathSplit[7] ? SortType[pathSplit[7]] - : UserService.Instance.user - ? Object.values(SortType)[UserService.Instance.user.default_sort_type] + : UserService.Instance.localUserView + ? Object.values(SortType)[ + UserService.Instance.localUserView.local_user.default_sort_type + ] : SortType.Active; let page = pathSplit[9] ? Number(pathSplit[9]) : 1; @@ -294,7 +296,7 @@ export class Main extends Component<any, MainState> { </div> </div> - {UserService.Instance.user && + {UserService.Instance.localUserView && this.state.subscribedCommunities.length > 0 && ( <div class="card border-secondary mb-3"> <div class="card-body">{this.subscribedCommunities()}</div> @@ -413,7 +415,7 @@ export class Main extends Component<any, MainState> { <li class="list-inline-item">{i18n.t("admins")}:</li> {this.state.siteRes.admins.map(av => ( <li class="list-inline-item"> - <UserListing user={av.user} /> + <PersonListing person={av.person} /> </li> ))} </ul> @@ -609,7 +611,7 @@ export class Main extends Component<any, MainState> { <Icon icon="rss" classes="text-muted small" /> </a> )} - {UserService.Instance.user && + {UserService.Instance.localUserView && this.state.listingType == ListingType.Subscribed && ( <a href={`/feeds/front/${UserService.Instance.auth}.xml?sort=${this.state.sort}`} @@ -652,10 +654,10 @@ export class Main extends Component<any, MainState> { get canAdmin(): boolean { return ( - UserService.Instance.user && + UserService.Instance.localUserView && this.state.siteRes.admins - .map(a => a.user.id) - .includes(UserService.Instance.user.id) + .map(a => a.person.id) + .includes(UserService.Instance.localUserView.person.id) ); } @@ -755,8 +757,8 @@ export class Main extends Component<any, MainState> { let nsfwCheck = !nsfw || (nsfw && - UserService.Instance.user && - UserService.Instance.user.show_nsfw); + UserService.Instance.localUserView && + UserService.Instance.localUserView.local_user.show_nsfw); // Only push these if you're on the first page, and you pass the nsfw check if (this.state.page == 1 && nsfwCheck) { @@ -801,23 +803,23 @@ export class Main extends Component<any, MainState> { let data = wsJsonToRes<AddAdminResponse>(msg).data; this.state.siteRes.admins = data.admins; this.setState(this.state); - } else if (op == UserOperation.BanUser) { - let data = wsJsonToRes<BanUserResponse>(msg).data; + } else if (op == UserOperation.BanPerson) { + let data = wsJsonToRes<BanPersonResponse>(msg).data; let found = this.state.siteRes.banned.find( - u => (u.user.id = data.user_view.user.id) + p => (p.person.id = data.person_view.person.id) ); // Remove the banned if its found in the list, and the action is an unban if (found && !data.banned) { this.state.siteRes.banned = this.state.siteRes.banned.filter( - i => i.user.id !== data.user_view.user.id + i => i.person.id !== data.person_view.person.id ); } else { - this.state.siteRes.banned.push(data.user_view); + this.state.siteRes.banned.push(data.person_view); } this.state.posts - .filter(p => p.creator.id == data.user_view.user.id) + .filter(p => p.creator.id == data.person_view.person.id) .forEach(p => (p.creator.banned = data.banned)); this.setState(this.state); diff --git a/src/shared/components/markdown-textarea.tsx b/src/shared/components/markdown-textarea.tsx index 1aaf4db..0acfc4c 100644 --- a/src/shared/components/markdown-textarea.tsx +++ b/src/shared/components/markdown-textarea.tsx @@ -206,7 +206,9 @@ export class MarkdownTextArea extends Component< <form class="btn btn-sm text-muted font-weight-bold"> <label htmlFor={`file-upload-${this.id}`} - className={`mb-0 ${UserService.Instance.user && "pointer"}`} + className={`mb-0 ${ + UserService.Instance.localUserView && "pointer" + }`} data-tippy-content={i18n.t("upload_image")} > {this.state.imageLoading ? ( @@ -221,7 +223,7 @@ export class MarkdownTextArea extends Component< accept="image/*,video/*" name="file" class="d-none" - disabled={!UserService.Instance.user} + disabled={!UserService.Instance.localUserView} onChange={linkEvent(this, this.handleImageUpload)} /> </form> diff --git a/src/shared/components/modlog.tsx b/src/shared/components/modlog.tsx index b34aaac..1fc3b0b 100644 --- a/src/shared/components/modlog.tsx +++ b/src/shared/components/modlog.tsx @@ -32,7 +32,7 @@ import { HtmlTags } from "./html-tags"; import moment from "moment"; import { i18n } from "../i18next"; import { InitialFetchRequest } from "shared/interfaces"; -import { UserListing } from "./user-listing"; +import { PersonListing } from "./person-listing"; import { CommunityLink } from "./community-link"; import { Spinner } from "./icon"; @@ -252,7 +252,7 @@ export class Modlog extends Component<any, ModlogState> { </span>, <span> {" "} - by <UserListing user={mrc.commenter} /> + by <PersonListing person={mrc.commenter} /> </span>, mrc.mod_remove_comment.reason && ` reason: ${mrc.mod_remove_comment.reason}`, @@ -280,7 +280,7 @@ export class Modlog extends Component<any, ModlogState> { {mbfc.mod_ban_from_community.banned ? "Banned " : "Unbanned "}{" "} </span>, <span> - <UserListing user={mbfc.banned_user} /> + <PersonListing person={mbfc.banned_person} /> </span>, <span> from the community </span>, <span> @@ -305,7 +305,7 @@ export class Modlog extends Component<any, ModlogState> { {mac.mod_add_community.removed ? "Removed " : "Appointed "}{" "} </span>, <span> - <UserListing user={mac.modded_user} /> + <PersonListing person={mac.modded_person} /> </span>, <span> as a mod to the community </span>, <span> @@ -318,7 +318,7 @@ export class Modlog extends Component<any, ModlogState> { return [ <span>{mb.mod_ban.banned ? "Banned " : "Unbanned "} </span>, <span> - <UserListing user={mb.banned_user} /> + <PersonListing person={mb.banned_person} /> </span>, <div>{mb.mod_ban.reason && ` reason: ${mb.mod_ban.reason}`}</div>, <div> @@ -332,7 +332,7 @@ export class Modlog extends Component<any, ModlogState> { return [ <span>{ma.mod_add.removed ? "Removed " : "Appointed "} </span>, <span> - <UserListing user={ma.modded_user} /> + <PersonListing person={ma.modded_person} /> </span>, <span> as an admin </span>, ]; @@ -353,7 +353,7 @@ export class Modlog extends Component<any, ModlogState> { <MomentTime data={i} /> </td> <td> - <UserListing user={i.view.moderator} /> + <PersonListing person={i.view.moderator} /> </td> <td>{this.renderModlogType(i)}</td> </tr> diff --git a/src/shared/components/navbar.tsx b/src/shared/components/navbar.tsx index 9577a63..cedccb4 100644 --- a/src/shared/components/navbar.tsx +++ b/src/shared/components/navbar.tsx @@ -6,8 +6,8 @@ import { UserOperation, GetReplies, GetRepliesResponse, - GetUserMentions, - GetUserMentionsResponse, + GetPersonMentions, + GetPersonMentionsResponse, GetPrivateMessages, PrivateMessagesResponse, SortType, @@ -174,7 +174,8 @@ export class Navbar extends Component<NavbarProps, NavbarState> { // TODO class active corresponding to current page navbar() { - let user = UserService.Instance.user || this.props.site_res.my_user; + let localUserView = + UserService.Instance.localUserView || this.props.site_res.my_user; return ( <nav class="navbar navbar-expand-lg navbar-light shadow-sm p-0 px-3"> <div class="container"> @@ -338,16 +339,16 @@ export class Navbar extends Component<NavbarProps, NavbarState> { <li className="nav-item"> <Link className="nav-link" - to={`/u/${user.name}`} + to={`/u/${localUserView.person.name}`} title={i18n.t("settings")} > <span> - {user.avatar && showAvatars() && ( - <PictrsImage src={user.avatar} icon /> + {localUserView.person.avatar && showAvatars() && ( + <PictrsImage src={localUserView.person.avatar} icon /> )} - {user.preferred_username - ? user.preferred_username - : user.name} + {localUserView.person.preferred_username + ? localUserView.person.preferred_username + : localUserView.person.name} </span> </Link> </li> @@ -400,8 +401,8 @@ export class Navbar extends Component<NavbarProps, NavbarState> { this.state.unreadCount = this.calculateUnreadCount(); this.setState(this.state); this.sendUnreadCount(); - } else if (op == UserOperation.GetUserMentions) { - let data = wsJsonToRes<GetUserMentionsResponse>(msg).data; + } else if (op == UserOperation.GetPersonMentions) { + let data = wsJsonToRes<GetPersonMentionsResponse>(msg).data; let unreadMentions = data.mentions.filter(r => !r.comment.read); this.state.mentions = unreadMentions; @@ -422,8 +423,8 @@ export class Navbar extends Component<NavbarProps, NavbarState> { // This is only called on a successful login let data = wsJsonToRes<GetSiteResponse>(msg).data; console.log(data.my_user); - UserService.Instance.user = data.my_user; - setTheme(UserService.Instance.user.theme); + UserService.Instance.localUserView = data.my_user; + setTheme(UserService.Instance.localUserView.local_user.theme); i18n.changeLanguage(getLanguage()); this.state.isLoggedIn = true; this.setState(this.state); @@ -431,7 +432,11 @@ export class Navbar extends Component<NavbarProps, NavbarState> { let data = wsJsonToRes<CommentResponse>(msg).data; if (this.state.isLoggedIn) { - if (data.recipient_ids.includes(UserService.Instance.user.id)) { + if ( + data.recipient_ids.includes( + UserService.Instance.localUserView.local_user.id + ) + ) { this.state.replies.push(data.comment_view); this.state.unreadCount++; this.setState(this.state); @@ -444,7 +449,8 @@ export class Navbar extends Component<NavbarProps, NavbarState> { if (this.state.isLoggedIn) { if ( - data.private_message_view.recipient.id == UserService.Instance.user.id + data.private_message_view.recipient.id == + UserService.Instance.localUserView.person.id ) { this.state.messages.push(data.private_message_view); this.state.unreadCount++; @@ -466,7 +472,7 @@ export class Navbar extends Component<NavbarProps, NavbarState> { auth: authField(), }; - let userMentionsForm: GetUserMentions = { + let personMentionsForm: GetPersonMentions = { sort: SortType.New, unread_only: true, page: 1, @@ -484,7 +490,7 @@ export class Navbar extends Component<NavbarProps, NavbarState> { if (this.currentLocation !== "/inbox") { WebSocketService.Instance.send(wsClient.getReplies(repliesForm)); WebSocketService.Instance.send( - wsClient.getUserMentions(userMentionsForm) + wsClient.getPersonMentions(personMentionsForm) ); WebSocketService.Instance.send( wsClient.getPrivateMessages(privateMessagesForm) @@ -510,15 +516,15 @@ export class Navbar extends Component<NavbarProps, NavbarState> { get canAdmin(): boolean { return ( - UserService.Instance.user && + UserService.Instance.localUserView && this.props.site_res.admins - .map(a => a.user.id) - .includes(UserService.Instance.user.id) + .map(a => a.person.id) + .includes(UserService.Instance.localUserView.person.id) ); } requestNotificationPermission() { - if (UserService.Instance.user) { + if (UserService.Instance.localUserView) { document.addEventListener("DOMContentLoaded", function () { if (!Notification) { toast(i18n.t("notifications_error"), "danger"); diff --git a/src/shared/components/user-details.tsx b/src/shared/components/person-details.tsx similarity index 80% rename from src/shared/components/user-details.tsx rename to src/shared/components/person-details.tsx index 53c9852..c1d18bf 100644 --- a/src/shared/components/user-details.tsx +++ b/src/shared/components/person-details.tsx @@ -4,23 +4,23 @@ import { PostView, CommentView, SortType, - GetUserDetailsResponse, - UserViewSafe, + GetPersonDetailsResponse, + PersonViewSafe, } from "lemmy-js-client"; -import { UserDetailsView } from "../interfaces"; +import { PersonDetailsView } from "../interfaces"; import { commentsToFlatNodes, setupTippy } from "../utils"; import { PostListing } from "./post-listing"; import { CommentNodes } from "./comment-nodes"; -interface UserDetailsProps { - userRes: GetUserDetailsResponse; - admins: UserViewSafe[]; +interface PersonDetailsProps { + personRes: GetPersonDetailsResponse; + admins: PersonViewSafe[]; page: number; limit: number; sort: SortType; enableDownvotes: boolean; enableNsfw: boolean; - view: UserDetailsView; + view: PersonDetailsView; onPageChange(page: number): number | any; } @@ -36,7 +36,7 @@ type ItemType = { score: number; }; -export class UserDetails extends Component<UserDetailsProps, any> { +export class PersonDetails extends Component<PersonDetailsProps, any> { constructor(props: any, context: any) { super(props, context); } @@ -65,12 +65,15 @@ export class UserDetails extends Component<UserDetailsProps, any> { ); } - viewSelector(view: UserDetailsView) { - if (view === UserDetailsView.Overview || view === UserDetailsView.Saved) { + viewSelector(view: PersonDetailsView) { + if ( + view === PersonDetailsView.Overview || + view === PersonDetailsView.Saved + ) { return this.overview(); - } else if (view === UserDetailsView.Comments) { + } else if (view === PersonDetailsView.Comments) { return this.comments(); - } else if (view === UserDetailsView.Posts) { + } else if (view === PersonDetailsView.Posts) { return this.posts(); } else { return null; @@ -114,14 +117,14 @@ export class UserDetails extends Component<UserDetailsProps, any> { overview() { let id = 0; - let comments: ItemType[] = this.props.userRes.comments.map(r => ({ + let comments: ItemType[] = this.props.personRes.comments.map(r => ({ id: id++, type_: ItemEnum.Comment, view: r, published: r.comment.published, score: r.counts.score, })); - let posts: ItemType[] = this.props.userRes.posts.map(r => ({ + let posts: ItemType[] = this.props.personRes.posts.map(r => ({ id: id++, type_: ItemEnum.Post, view: r, @@ -149,7 +152,7 @@ export class UserDetails extends Component<UserDetailsProps, any> { return ( <div> <CommentNodes - nodes={commentsToFlatNodes(this.props.userRes.comments)} + nodes={commentsToFlatNodes(this.props.personRes.comments)} admins={this.props.admins} noIndent showCommunity @@ -163,7 +166,7 @@ export class UserDetails extends Component<UserDetailsProps, any> { posts() { return ( <div> - {this.props.userRes.posts.map(post => ( + {this.props.personRes.posts.map(post => ( <> <PostListing post_view={post} @@ -190,7 +193,8 @@ export class UserDetails extends Component<UserDetailsProps, any> { {i18n.t("prev")} </button> )} - {this.props.userRes.comments.length + this.props.userRes.posts.length > + {this.props.personRes.comments.length + + this.props.personRes.posts.length > 0 && ( <button class="btn btn-secondary" @@ -203,11 +207,11 @@ export class UserDetails extends Component<UserDetailsProps, any> { ); } - nextPage(i: UserDetails) { + nextPage(i: PersonDetails) { i.props.onPageChange(i.props.page + 1); } - prevPage(i: UserDetails) { + prevPage(i: PersonDetails) { i.props.onPageChange(i.props.page - 1); } } diff --git a/src/shared/components/user-listing.tsx b/src/shared/components/person-listing.tsx similarity index 52% rename from src/shared/components/user-listing.tsx rename to src/shared/components/person-listing.tsx index 75d8d81..493147a 100644 --- a/src/shared/components/user-listing.tsx +++ b/src/shared/components/person-listing.tsx @@ -1,12 +1,12 @@ import { Component } from "inferno"; import { Link } from "inferno-router"; -import { UserSafe } from "lemmy-js-client"; +import { PersonSafe } from "lemmy-js-client"; import { showAvatars, hostname, isCakeDay } from "../utils"; import { CakeDay } from "./cake-day"; import { PictrsImage } from "./pictrs-image"; -interface UserListingProps { - user: UserSafe; +interface PersonListingProps { + person: PersonSafe; realLink?: boolean; useApubName?: boolean; muted?: boolean; @@ -14,31 +14,31 @@ interface UserListingProps { showApubName?: boolean; } -export class UserListing extends Component<UserListingProps, any> { +export class PersonListing extends Component<PersonListingProps, any> { constructor(props: any, context: any) { super(props, context); } render() { - let user = this.props.user; - let local = user.local == null ? true : user.local; + let person = this.props.person; + let local = person.local == null ? true : person.local; let apubName: string, link: string; if (local) { - apubName = `@${user.name}`; - link = `/u/${user.name}`; + apubName = `@${person.name}`; + link = `/u/${person.name}`; } else { - apubName = `@${user.name}@${hostname(user.actor_id)}`; - link = !this.props.realLink ? `/user/${user.id}` : user.actor_id; + apubName = `@${person.name}@${hostname(person.actor_id)}`; + link = !this.props.realLink ? `/user/${person.id}` : person.actor_id; } let displayName = this.props.useApubName ? apubName - : user.preferred_username - ? user.preferred_username + : person.preferred_username + ? person.preferred_username : apubName; - if (this.props.showApubName && !local && user.preferred_username) { + if (this.props.showApubName && !local && person.preferred_username) { displayName = `${displayName} (${apubName})`; } @@ -49,13 +49,13 @@ export class UserListing extends Component<UserListingProps, any> { className={this.props.muted ? "text-muted" : "text-info"} to={link} > - {!this.props.hideAvatar && user.avatar && showAvatars() && ( - <PictrsImage src={user.avatar} icon /> + {!this.props.hideAvatar && person.avatar && showAvatars() && ( + <PictrsImage src={person.avatar} icon /> )} <span>{displayName}</span> </Link> - {isCakeDay(user.published) && <CakeDay creatorName={apubName} />} + {isCakeDay(person.published) && <CakeDay creatorName={apubName} />} </> ); } diff --git a/src/shared/components/user.tsx b/src/shared/components/person.tsx similarity index 80% rename from src/shared/components/user.tsx rename to src/shared/components/person.tsx index b028c60..fc0962a 100644 --- a/src/shared/components/user.tsx +++ b/src/shared/components/person.tsx @@ -9,14 +9,14 @@ import { LoginResponse, DeleteAccount, GetSiteResponse, - GetUserDetailsResponse, + GetPersonDetailsResponse, AddAdminResponse, - GetUserDetails, + GetPersonDetails, CommentResponse, PostResponse, - BanUserResponse, + BanPersonResponse, } from "lemmy-js-client"; -import { InitialFetchRequest, UserDetailsView } from "../interfaces"; +import { InitialFetchRequest, PersonDetailsView } from "../interfaces"; import { WebSocketService, UserService } from "../services"; import { wsJsonToRes, @@ -48,25 +48,25 @@ import { saveScrollPosition, restoreScrollPosition, } from "../utils"; -import { UserListing } from "./user-listing"; +import { PersonListing } from "./person-listing"; import { HtmlTags } from "./html-tags"; import { SortSelect } from "./sort-select"; import { ListingTypeSelect } from "./listing-type-select"; import { MomentTime } from "./moment-time"; import { i18n } from "../i18next"; import moment from "moment"; -import { UserDetails } from "./user-details"; +import { PersonDetails } from "./person-details"; import { MarkdownTextArea } from "./markdown-textarea"; import { Icon, Spinner } from "./icon"; import { ImageUploadForm } from "./image-upload-form"; import { BannerIconHeader } from "./banner-icon-header"; import { CommunityLink } from "./community-link"; -interface UserState { - userRes: GetUserDetailsResponse; - userId: number; +interface PersonState { + personRes: GetPersonDetailsResponse; + personId: number; userName: string; - view: UserDetailsView; + view: PersonDetailsView; sort: SortType; page: number; loading: boolean; @@ -78,11 +78,11 @@ interface UserState { siteRes: GetSiteResponse; } -interface UserProps { - view: UserDetailsView; +interface PersonProps { + view: PersonDetailsView; sort: SortType; page: number; - user_id: number | null; + person_id: number | null; username: string; } @@ -92,17 +92,17 @@ interface UrlParams { page?: number; } -export class User extends Component<any, UserState> { +export class Person extends Component<any, PersonState> { private isoData = setIsoData(this.context); private subscription: Subscription; - private emptyState: UserState = { - userRes: undefined, - userId: getIdFromProps(this.props), + private emptyState: PersonState = { + personRes: undefined, + personId: getIdFromProps(this.props), userName: getUsernameFromProps(this.props), loading: true, - view: User.getViewFromProps(this.props.match.view), - sort: User.getSortTypeFromProps(this.props.match.sort), - page: User.getPageFromProps(this.props.match.page), + view: Person.getViewFromProps(this.props.match.view), + sort: Person.getSortTypeFromProps(this.props.match.sort), + page: Person.getPageFromProps(this.props.match.page), userSettingsForm: { show_nsfw: null, theme: null, @@ -152,7 +152,7 @@ export class User extends Component<any, UserState> { // Only fetch the data if coming from another route if (this.isoData.path == this.context.router.route.match.url) { - this.state.userRes = this.isoData.routeData[0]; + this.state.personRes = this.isoData.routeData[0]; this.setUserInfo(); this.state.loading = false; } else { @@ -163,27 +163,27 @@ export class User extends Component<any, UserState> { } fetchUserData() { - let form: GetUserDetails = { - user_id: this.state.userId, + let form: GetPersonDetails = { + person_id: this.state.personId, username: this.state.userName, sort: this.state.sort, - saved_only: this.state.view === UserDetailsView.Saved, + saved_only: this.state.view === PersonDetailsView.Saved, page: this.state.page, limit: fetchLimit, auth: authField(false), }; - WebSocketService.Instance.send(wsClient.getUserDetails(form)); + WebSocketService.Instance.send(wsClient.getPersonDetails(form)); } get isCurrentUser() { return ( - UserService.Instance.user && - UserService.Instance.user.id == this.state.userRes.user_view.user.id + UserService.Instance.localUserView?.person.id == + this.state.personRes.person_view.person.id ); } - static getViewFromProps(view: string): UserDetailsView { - return view ? UserDetailsView[view] : UserDetailsView.Overview; + static getViewFromProps(view: string): PersonDetailsView { + return view ? PersonDetailsView[view] : PersonDetailsView.Overview; } static getSortTypeFromProps(sort: string): SortType { @@ -200,33 +200,33 @@ export class User extends Component<any, UserState> { // It can be /u/me, or /username/1 let idOrName = pathSplit[2]; - let user_id: number; + let person_id: number; let username: string; if (isNaN(Number(idOrName))) { username = idOrName; } else { - user_id = Number(idOrName); + person_id = Number(idOrName); } let view = this.getViewFromProps(pathSplit[4]); let sort = this.getSortTypeFromProps(pathSplit[6]); let page = this.getPageFromProps(Number(pathSplit[8])); - let form: GetUserDetails = { + let form: GetPersonDetails = { sort, - saved_only: view === UserDetailsView.Saved, + saved_only: view === PersonDetailsView.Saved, page, limit: fetchLimit, }; setOptionalAuth(form, req.auth); - this.setIdOrName(form, user_id, username); - promises.push(req.client.getUserDetails(form)); + this.setIdOrName(form, person_id, username); + promises.push(req.client.getPersonDetails(form)); return promises; } static setIdOrName(obj: any, id: number, name_: string) { if (id) { - obj.user_id = id; + obj.person_id = id; } else { obj.username = name_; } @@ -237,12 +237,12 @@ export class User extends Component<any, UserState> { saveScrollPosition(this.context); } - static getDerivedStateFromProps(props: any): UserProps { + static getDerivedStateFromProps(props: any): PersonProps { return { view: this.getViewFromProps(props.match.params.view), sort: this.getSortTypeFromProps(props.match.params.sort), page: this.getPageFromProps(props.match.params.page), - user_id: Number(props.match.params.id) || null, + person_id: Number(props.match.params.id) || null, username: props.match.params.username, }; } @@ -259,12 +259,12 @@ export class User extends Component<any, UserState> { } get documentTitle(): string { - return `@${this.state.userRes.user_view.user.name} - ${this.state.siteRes.site_view.site.name}`; + return `@${this.state.personRes.person_view.person.name} - ${this.state.siteRes.site_view.site.name}`; } get bioTag(): string { - return this.state.userRes.user_view.user.bio - ? previewLines(this.state.userRes.user_view.user.bio) + return this.state.personRes.person_view.person.bio + ? previewLines(this.state.personRes.person_view.person.bio) : undefined; } @@ -283,14 +283,14 @@ export class User extends Component<any, UserState> { title={this.documentTitle} path={this.context.router.route.match.url} description={this.bioTag} - image={this.state.userRes.user_view.user.avatar} + image={this.state.personRes.person_view.person.avatar} /> {this.userInfo()} <hr /> </> {!this.state.loading && this.selects()} - <UserDetails - userRes={this.state.userRes} + <PersonDetails + personRes={this.state.personRes} admins={this.state.siteRes.admins} sort={this.state.sort} page={this.state.page} @@ -322,52 +322,52 @@ export class User extends Component<any, UserState> { <div class="btn-group btn-group-toggle flex-wrap mb-2"> <label className={`btn btn-outline-secondary pointer - ${this.state.view == UserDetailsView.Overview && "active"} + ${this.state.view == PersonDetailsView.Overview && "active"} `} > <input type="radio" - value={UserDetailsView.Overview} - checked={this.state.view === UserDetailsView.Overview} + value={PersonDetailsView.Overview} + checked={this.state.view === PersonDetailsView.Overview} onChange={linkEvent(this, this.handleViewChange)} /> {i18n.t("overview")} </label> <label className={`btn btn-outline-secondary pointer - ${this.state.view == UserDetailsView.Comments && "active"} + ${this.state.view == PersonDetailsView.Comments && "active"} `} > <input type="radio" - value={UserDetailsView.Comments} - checked={this.state.view == UserDetailsView.Comments} + value={PersonDetailsView.Comments} + checked={this.state.view == PersonDetailsView.Comments} onChange={linkEvent(this, this.handleViewChange)} /> {i18n.t("comments")} </label> <label className={`btn btn-outline-secondary pointer - ${this.state.view == UserDetailsView.Posts && "active"} + ${this.state.view == PersonDetailsView.Posts && "active"} `} > <input type="radio" - value={UserDetailsView.Posts} - checked={this.state.view == UserDetailsView.Posts} + value={PersonDetailsView.Posts} + checked={this.state.view == PersonDetailsView.Posts} onChange={linkEvent(this, this.handleViewChange)} /> {i18n.t("posts")} </label> <label className={`btn btn-outline-secondary pointer - ${this.state.view == UserDetailsView.Saved && "active"} + ${this.state.view == PersonDetailsView.Saved && "active"} `} > <input type="radio" - value={UserDetailsView.Saved} - checked={this.state.view == UserDetailsView.Saved} + value={PersonDetailsView.Saved} + checked={this.state.view == PersonDetailsView.Saved} onChange={linkEvent(this, this.handleViewChange)} /> {i18n.t("saved")} @@ -398,29 +398,29 @@ export class User extends Component<any, UserState> { } userInfo() { - let uv = this.state.userRes?.user_view; + let pv = this.state.personRes?.person_view; return ( <div> - <BannerIconHeader banner={uv.user.banner} icon={uv.user.avatar} /> + <BannerIconHeader banner={pv.person.banner} icon={pv.person.avatar} /> <div class="mb-3"> <div class=""> <div class="mb-0 d-flex flex-wrap"> <div> - {uv.user.preferred_username && ( - <h5 class="mb-0">{uv.user.preferred_username}</h5> + {pv.person.preferred_username && ( + <h5 class="mb-0">{pv.person.preferred_username}</h5> )} <ul class="list-inline mb-2"> <li className="list-inline-item"> - <UserListing - user={uv.user} + <PersonListing + person={pv.person} realLink useApubName muted hideAvatar /> </li> - {uv.user.banned && ( + {pv.person.banned && ( <li className="list-inline-item badge badge-danger"> {i18n.t("banned")} </li> @@ -437,53 +437,56 @@ export class User extends Component<any, UserState> { </button> ) : ( <> + {/* TODO matrix ids aren't currently federated, so don't come back with GetPersonDetails <a className={`d-flex align-self-start btn btn-secondary mr-2 ${ - !uv.user.matrix_user_id && "invisible" + !pv.local_user.matrix_user_id && "invisible" }`} rel="noopener" - href={`https://matrix.to/#/${uv.user.matrix_user_id}`} + href={`https://matrix.to/#/${pv.local_user.matrix_user_id}`} > {i18n.t("send_secure_message")} </a> + */} + <Link className={"d-flex align-self-start btn btn-secondary"} - to={`/create_private_message/recipient/${uv.user.id}`} + to={`/create_private_message/recipient/${pv.person.id}`} > {i18n.t("send_message")} </Link> </> )} </div> - {uv.user.bio && ( + {pv.person.bio && ( <div className="d-flex align-items-center mb-2"> <div className="md-div" - dangerouslySetInnerHTML={mdToHtml(uv.user.bio)} + dangerouslySetInnerHTML={mdToHtml(pv.person.bio)} /> </div> )} <div> <ul class="list-inline mb-2"> <li className="list-inline-item badge badge-light"> - {i18n.t("number_of_posts", { count: uv.counts.post_count })} + {i18n.t("number_of_posts", { count: pv.counts.post_count })} </li> <li className="list-inline-item badge badge-light"> {i18n.t("number_of_comments", { - count: uv.counts.comment_count, + count: pv.counts.comment_count, })} </li> </ul> </div> <div class="text-muted"> {i18n.t("joined")}{" "} - <MomentTime data={uv.user} showAgo ignoreUpdated /> + <MomentTime data={pv.person} showAgo ignoreUpdated /> </div> <div className="d-flex align-items-center text-muted mb-2"> <Icon icon="cake" /> <span className="ml-2"> {i18n.t("cake_day_title")}{" "} - {moment.utc(uv.user.published).local().format("MMM DD, YYYY")} + {moment.utc(pv.person.published).local().format("MMM DD, YYYY")} </span> </div> </div> @@ -845,12 +848,12 @@ export class User extends Component<any, UserState> { moderates() { return ( <div> - {this.state.userRes.moderates.length > 0 && ( + {this.state.personRes.moderates.length > 0 && ( <div class="card border-secondary mb-3"> <div class="card-body"> <h5>{i18n.t("moderates")}</h5> <ul class="list-unstyled mb-0"> - {this.state.userRes.moderates.map(cmv => ( + {this.state.personRes.moderates.map(cmv => ( <li> <CommunityLink community={cmv.community} /> </li> @@ -866,12 +869,12 @@ export class User extends Component<any, UserState> { follows() { return ( <div> - {this.state.userRes.follows.length > 0 && ( + {this.state.personRes.follows.length > 0 && ( <div class="card border-secondary mb-3"> <div class="card-body"> <h5>{i18n.t("subscribed")}</h5> <ul class="list-unstyled mb-0"> - {this.state.userRes.follows.map(cfv => ( + {this.state.personRes.follows.map(cfv => ( <li> <CommunityLink community={cfv.community} /> </li> @@ -886,12 +889,12 @@ export class User extends Component<any, UserState> { updateUrl(paramUpdates: UrlParams) { const page = paramUpdates.page || this.state.page; - const viewStr = paramUpdates.view || UserDetailsView[this.state.view]; + const viewStr = paramUpdates.view || PersonDetailsView[this.state.view]; const sortStr = paramUpdates.sort || this.state.sort; let typeView = this.state.userName ? `/u/${this.state.userName}` - : `/user/${this.state.userId}`; + : `/user/${this.state.personId}`; this.props.history.push( `${typeView}/view/${viewStr}/sort/${sortStr}/page/${page}` @@ -909,36 +912,37 @@ export class User extends Component<any, UserState> { this.updateUrl({ sort: val, page: 1 }); } - handleViewChange(i: User, event: any) { + handleViewChange(i: Person, event: any) { i.updateUrl({ - view: UserDetailsView[Number(event.target.value)], + view: PersonDetailsView[Number(event.target.value)], page: 1, }); } - handleUserSettingsShowNsfwChange(i: User, event: any) { + handleUserSettingsShowNsfwChange(i: Person, event: any) { i.state.userSettingsForm.show_nsfw = event.target.checked; i.setState(i.state); } - handleUserSettingsShowAvatarsChange(i: User, event: any) { + handleUserSettingsShowAvatarsChange(i: Person, event: any) { i.state.userSettingsForm.show_avatars = event.target.checked; - UserService.Instance.user.show_avatars = event.target.checked; // Just for instant updates + UserService.Instance.localUserView.local_user.show_avatars = + event.target.checked; // Just for instant updates i.setState(i.state); } - handleUserSettingsSendNotificationsToEmailChange(i: User, event: any) { + handleUserSettingsSendNotificationsToEmailChange(i: Person, event: any) { i.state.userSettingsForm.send_notifications_to_email = event.target.checked; i.setState(i.state); } - handleUserSettingsThemeChange(i: User, event: any) { + handleUserSettingsThemeChange(i: Person, event: any) { i.state.userSettingsForm.theme = event.target.value; setTheme(event.target.value, true); i.setState(i.state); } - handleUserSettingsLangChange(i: User, event: any) { + handleUserSettingsLangChange(i: Person, event: any) { i.state.userSettingsForm.lang = event.target.value; i18n.changeLanguage(getLanguage(i.state.userSettingsForm.lang)); i.setState(i.state); @@ -958,7 +962,7 @@ export class User extends Component<any, UserState> { this.setState(this.state); } - handleUserSettingsEmailChange(i: User, event: any) { + handleUserSettingsEmailChange(i: Person, event: any) { i.state.userSettingsForm.email = event.target.value; i.setState(i.state); } @@ -988,23 +992,23 @@ export class User extends Component<any, UserState> { this.setState(this.state); } - handleUserSettingsPreferredUsernameChange(i: User, event: any) { + handleUserSettingsPreferredUsernameChange(i: Person, event: any) { i.state.userSettingsForm.preferred_username = event.target.value; i.setState(i.state); } - handleUserSettingsMatrixUserIdChange(i: User, event: any) { + handleUserSettingsMatrixUserIdChange(i: Person, event: any) { i.state.userSettingsForm.matrix_user_id = event.target.value; if ( i.state.userSettingsForm.matrix_user_id == "" && - !i.state.userRes.user_view.user.matrix_user_id + !UserService.Instance.localUserView.local_user.matrix_user_id ) { i.state.userSettingsForm.matrix_user_id = undefined; } i.setState(i.state); } - handleUserSettingsNewPasswordChange(i: User, event: any) { + handleUserSettingsNewPasswordChange(i: Person, event: any) { i.state.userSettingsForm.new_password = event.target.value; if (i.state.userSettingsForm.new_password == "") { i.state.userSettingsForm.new_password = undefined; @@ -1012,7 +1016,7 @@ export class User extends Component<any, UserState> { i.setState(i.state); } - handleUserSettingsNewPasswordVerifyChange(i: User, event: any) { + handleUserSettingsNewPasswordVerifyChange(i: Person, event: any) { i.state.userSettingsForm.new_password_verify = event.target.value; if (i.state.userSettingsForm.new_password_verify == "") { i.state.userSettingsForm.new_password_verify = undefined; @@ -1020,7 +1024,7 @@ export class User extends Component<any, UserState> { i.setState(i.state); } - handleUserSettingsOldPasswordChange(i: User, event: any) { + handleUserSettingsOldPasswordChange(i: Person, event: any) { i.state.userSettingsForm.old_password = event.target.value; if (i.state.userSettingsForm.old_password == "") { i.state.userSettingsForm.old_password = undefined; @@ -1028,7 +1032,7 @@ export class User extends Component<any, UserState> { i.setState(i.state); } - handleUserSettingsSubmit(i: User, event: any) { + handleUserSettingsSubmit(i: Person, event: any) { event.preventDefault(); i.state.userSettingsLoading = true; i.setState(i.state); @@ -1038,23 +1042,23 @@ export class User extends Component<any, UserState> { ); } - handleDeleteAccountShowConfirmToggle(i: User, event: any) { + handleDeleteAccountShowConfirmToggle(i: Person, event: any) { event.preventDefault(); i.state.deleteAccountShowConfirm = !i.state.deleteAccountShowConfirm; i.setState(i.state); } - handleDeleteAccountPasswordChange(i: User, event: any) { + handleDeleteAccountPasswordChange(i: Person, event: any) { i.state.deleteAccountForm.password = event.target.value; i.setState(i.state); } - handleLogoutClick(i: User) { + handleLogoutClick(i: Person) { UserService.Instance.logout(); i.context.router.history.push("/"); } - handleDeleteAccount(i: User, event: any) { + handleDeleteAccount(i: Person, event: any) { event.preventDefault(); i.state.deleteAccountLoading = true; i.setState(i.state); @@ -1068,27 +1072,33 @@ export class User extends Component<any, UserState> { setUserInfo() { if (this.isCurrentUser) { this.state.userSettingsForm.show_nsfw = - UserService.Instance.user.show_nsfw; - this.state.userSettingsForm.theme = UserService.Instance.user.theme - ? UserService.Instance.user.theme + UserService.Instance.localUserView.local_user.show_nsfw; + this.state.userSettingsForm.theme = UserService.Instance.localUserView + .local_user.theme + ? UserService.Instance.localUserView.local_user.theme : "browser"; this.state.userSettingsForm.default_sort_type = - UserService.Instance.user.default_sort_type; + UserService.Instance.localUserView.local_user.default_sort_type; this.state.userSettingsForm.default_listing_type = - UserService.Instance.user.default_listing_type; - this.state.userSettingsForm.lang = UserService.Instance.user.lang; - this.state.userSettingsForm.avatar = UserService.Instance.user.avatar; - this.state.userSettingsForm.banner = UserService.Instance.user.banner; + UserService.Instance.localUserView.local_user.default_listing_type; + this.state.userSettingsForm.lang = + UserService.Instance.localUserView.local_user.lang; + this.state.userSettingsForm.avatar = + UserService.Instance.localUserView.person.avatar; + this.state.userSettingsForm.banner = + UserService.Instance.localUserView.person.banner; this.state.userSettingsForm.preferred_username = - UserService.Instance.user.preferred_username; + UserService.Instance.localUserView.person.preferred_username; this.state.userSettingsForm.show_avatars = - UserService.Instance.user.show_avatars; - this.state.userSettingsForm.email = UserService.Instance.user.email; - this.state.userSettingsForm.bio = UserService.Instance.user.bio; + UserService.Instance.localUserView.local_user.show_avatars; + this.state.userSettingsForm.email = + UserService.Instance.localUserView.local_user.email; + this.state.userSettingsForm.bio = + UserService.Instance.localUserView.person.bio; this.state.userSettingsForm.send_notifications_to_email = - UserService.Instance.user.send_notifications_to_email; + UserService.Instance.localUserView.local_user.send_notifications_to_email; this.state.userSettingsForm.matrix_user_id = - UserService.Instance.user.matrix_user_id; + UserService.Instance.localUserView.local_user.matrix_user_id; } } @@ -1106,12 +1116,12 @@ export class User extends Component<any, UserState> { return; } else if (msg.reconnect) { this.fetchUserData(); - } else if (op == UserOperation.GetUserDetails) { - // Since the UserDetails contains posts/comments as well as some general user info we listen here as well + } else if (op == UserOperation.GetPersonDetails) { + // Since the PersonDetails contains posts/comments as well as some general user info we listen here as well // and set the parent state if it is not set or differs // TODO this might need to get abstracted - let data = wsJsonToRes<GetUserDetailsResponse>(msg).data; - this.state.userRes = data; + let data = wsJsonToRes<GetPersonDetailsResponse>(msg).data; + this.state.personRes = data; this.setUserInfo(); this.state.loading = false; this.setState(this.state); @@ -1119,10 +1129,10 @@ export class User extends Component<any, UserState> { } else if (op == UserOperation.SaveUserSettings) { let data = wsJsonToRes<LoginResponse>(msg).data; UserService.Instance.login(data); - this.state.userRes.user_view.user.bio = this.state.userSettingsForm.bio; - this.state.userRes.user_view.user.preferred_username = this.state.userSettingsForm.preferred_username; - this.state.userRes.user_view.user.banner = this.state.userSettingsForm.banner; - this.state.userRes.user_view.user.avatar = this.state.userSettingsForm.avatar; + this.state.personRes.person_view.person.bio = this.state.userSettingsForm.bio; + this.state.personRes.person_view.person.preferred_username = this.state.userSettingsForm.preferred_username; + this.state.personRes.person_view.person.banner = this.state.userSettingsForm.banner; + this.state.personRes.person_view.person.avatar = this.state.userSettingsForm.avatar; this.state.userSettingsLoading = false; this.setState(this.state); @@ -1139,7 +1149,7 @@ export class User extends Component<any, UserState> { this.setState(this.state); } else if (op == UserOperation.CreateCommentLike) { let data = wsJsonToRes<CommentResponse>(msg).data; - createCommentLikeRes(data.comment_view, this.state.userRes.comments); + createCommentLikeRes(data.comment_view, this.state.personRes.comments); this.setState(this.state); } else if ( op == UserOperation.EditComment || @@ -1147,19 +1157,20 @@ export class User extends Component<any, UserState> { op == UserOperation.RemoveComment ) { let data = wsJsonToRes<CommentResponse>(msg).data; - editCommentRes(data.comment_view, this.state.userRes.comments); + editCommentRes(data.comment_view, this.state.personRes.comments); this.setState(this.state); } else if (op == UserOperation.CreateComment) { let data = wsJsonToRes<CommentResponse>(msg).data; if ( - UserService.Instance.user && - data.comment_view.creator.id == UserService.Instance.user.id + UserService.Instance.localUserView && + data.comment_view.creator.id == + UserService.Instance.localUserView.person.id ) { toast(i18n.t("reply_sent")); } } else if (op == UserOperation.SaveComment) { let data = wsJsonToRes<CommentResponse>(msg).data; - saveCommentRes(data.comment_view, this.state.userRes.comments); + saveCommentRes(data.comment_view, this.state.personRes.comments); this.setState(this.state); } else if ( op == UserOperation.EditPost || @@ -1170,19 +1181,19 @@ export class User extends Component<any, UserState> { op == UserOperation.SavePost ) { let data = wsJsonToRes<PostResponse>(msg).data; - editPostFindRes(data.post_view, this.state.userRes.posts); + editPostFindRes(data.post_view, this.state.personRes.posts); this.setState(this.state); } else if (op == UserOperation.CreatePostLike) { let data = wsJsonToRes<PostResponse>(msg).data; - createPostLikeFindRes(data.post_view, this.state.userRes.posts); + createPostLikeFindRes(data.post_view, this.state.personRes.posts); this.setState(this.state); - } else if (op == UserOperation.BanUser) { - let data = wsJsonToRes<BanUserResponse>(msg).data; - this.state.userRes.comments - .filter(c => c.creator.id == data.user_view.user.id) + } else if (op == UserOperation.BanPerson) { + let data = wsJsonToRes<BanPersonResponse>(msg).data; + this.state.personRes.comments + .filter(c => c.creator.id == data.person_view.person.id) .forEach(c => (c.creator.banned = data.banned)); - this.state.userRes.posts - .filter(c => c.creator.id == data.user_view.user.id) + this.state.personRes.posts + .filter(c => c.creator.id == data.person_view.person.id) .forEach(c => (c.creator.banned = data.banned)); this.setState(this.state); } diff --git a/src/shared/components/post-form.tsx b/src/shared/components/post-form.tsx index 439becc..219ca24 100644 --- a/src/shared/components/post-form.tsx +++ b/src/shared/components/post-form.tsx @@ -191,7 +191,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> { <label htmlFor="file-upload" className={`${ - UserService.Instance.user && "pointer" + UserService.Instance.localUserView && "pointer" } d-inline-block float-right text-muted font-weight-bold`} data-tippy-content={i18n.t("upload_image")} > @@ -203,7 +203,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> { accept="image/*,video/*" name="file" class="d-none" - disabled={!UserService.Instance.user} + disabled={!UserService.Instance.localUserView} onChange={linkEvent(this, this.handleImageUpload)} /> </form> @@ -613,13 +613,19 @@ export class PostForm extends Component<PostFormProps, PostFormState> { return; } else if (op == UserOperation.CreatePost) { let data = wsJsonToRes<PostResponse>(msg).data; - if (data.post_view.creator.id == UserService.Instance.user.id) { + if ( + data.post_view.creator.id == + UserService.Instance.localUserView.person.id + ) { this.state.loading = false; this.props.onCreate(data.post_view); } } else if (op == UserOperation.EditPost) { let data = wsJsonToRes<PostResponse>(msg).data; - if (data.post_view.creator.id == UserService.Instance.user.id) { + if ( + data.post_view.creator.id == + UserService.Instance.localUserView.person.id + ) { this.state.loading = false; this.props.onEdit(data.post_view); } diff --git a/src/shared/components/post-listing.tsx b/src/shared/components/post-listing.tsx index fa0df94..1e96961 100644 --- a/src/shared/components/post-listing.tsx +++ b/src/shared/components/post-listing.tsx @@ -9,9 +9,9 @@ import { LockPost, StickyPost, SavePost, - UserViewSafe, + PersonViewSafe, BanFromCommunity, - BanUser, + BanPerson, AddModToCommunity, AddAdmin, TransferSite, @@ -22,7 +22,7 @@ import { BanType } from "../interfaces"; import { MomentTime } from "./moment-time"; import { PostForm } from "./post-form"; import { IFramelyCard } from "./iframely-card"; -import { UserListing } from "./user-listing"; +import { PersonListing } from "./person-listing"; import { CommunityLink } from "./community-link"; import { PictrsImage } from "./pictrs-image"; import { Icon } from "./icon"; @@ -70,7 +70,7 @@ interface PostListingProps { showCommunity?: boolean; showBody?: boolean; moderators?: CommunityModeratorView[]; - admins?: UserViewSafe[]; + admins?: PersonViewSafe[]; enableDownvotes: boolean; enableNsfw: boolean; } @@ -270,7 +270,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { return ( <ul class="list-inline mb-1 text-muted small"> <li className="list-inline-item"> - <UserListing user={post_view.creator} /> + <PersonListing person={post_view.creator} /> {this.isMod && ( <span className="mx-1 badge badge-light">{i18n.t("mod")}</span> @@ -599,7 +599,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { postActions(mobile = false) { let post_view = this.props.post_view; return ( - UserService.Instance.user && ( + UserService.Instance.localUserView && ( <> {this.props.showBody && ( <> @@ -1083,8 +1083,9 @@ export class PostListing extends Component<PostListingProps, PostListingState> { private get myPost(): boolean { return ( - UserService.Instance.user && - this.props.post_view.creator.id == UserService.Instance.user.id + UserService.Instance.localUserView && + this.props.post_view.creator.id == + UserService.Instance.localUserView.person.id ); } @@ -1102,7 +1103,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { return ( this.props.admins && isMod( - this.props.admins.map(a => a.user.id), + this.props.admins.map(a => a.person.id), this.props.post_view.creator.id ) ); @@ -1111,11 +1112,11 @@ export class PostListing extends Component<PostListingProps, PostListingState> { get canMod(): boolean { if (this.props.admins && this.props.moderators) { let adminsThenMods = this.props.admins - .map(a => a.user.id) + .map(a => a.person.id) .concat(this.props.moderators.map(m => m.moderator.id)); return canMod( - UserService.Instance.user, + UserService.Instance.localUserView, adminsThenMods, this.props.post_view.creator.id ); @@ -1127,11 +1128,11 @@ export class PostListing extends Component<PostListingProps, PostListingState> { get canModOnSelf(): boolean { if (this.props.admins && this.props.moderators) { let adminsThenMods = this.props.admins - .map(a => a.user.id) + .map(a => a.person.id) .concat(this.props.moderators.map(m => m.moderator.id)); return canMod( - UserService.Instance.user, + UserService.Instance.localUserView, adminsThenMods, this.props.post_view.creator.id, true @@ -1145,8 +1146,8 @@ export class PostListing extends Component<PostListingProps, PostListingState> { return ( this.props.admins && canMod( - UserService.Instance.user, - this.props.admins.map(a => a.user.id), + UserService.Instance.localUserView, + this.props.admins.map(a => a.person.id), this.props.post_view.creator.id ) ); @@ -1155,24 +1156,28 @@ export class PostListing extends Component<PostListingProps, PostListingState> { get amCommunityCreator(): boolean { return ( this.props.moderators && - UserService.Instance.user && - this.props.post_view.creator.id != UserService.Instance.user.id && - UserService.Instance.user.id == this.props.moderators[0].moderator.id + UserService.Instance.localUserView && + this.props.post_view.creator.id != + UserService.Instance.localUserView.person.id && + UserService.Instance.localUserView.person.id == + this.props.moderators[0].moderator.id ); } get amSiteCreator(): boolean { return ( this.props.admins && - UserService.Instance.user && - this.props.post_view.creator.id != UserService.Instance.user.id && - UserService.Instance.user.id == this.props.admins[0].user.id + UserService.Instance.localUserView && + this.props.post_view.creator.id != + UserService.Instance.localUserView.person.id && + UserService.Instance.localUserView.person.id == + this.props.admins[0].person.id ); } handlePostLike(i: PostListing, event: any) { event.preventDefault(); - if (!UserService.Instance.user) { + if (!UserService.Instance.localUserView) { this.context.router.history.push(`/login`); } @@ -1205,7 +1210,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { handlePostDisLike(i: PostListing, event: any) { event.preventDefault(); - if (!UserService.Instance.user) { + if (!UserService.Instance.localUserView) { this.context.router.history.push(`/login`); } @@ -1377,7 +1382,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { i.state.removeData = false; } let form: BanFromCommunity = { - user_id: i.props.post_view.creator.id, + person_id: i.props.post_view.creator.id, community_id: i.props.post_view.community.id, ban, remove_data: i.state.removeData, @@ -1392,15 +1397,15 @@ export class PostListing extends Component<PostListingProps, PostListingState> { if (ban == false) { i.state.removeData = false; } - let form: BanUser = { - user_id: i.props.post_view.creator.id, + let form: BanPerson = { + person_id: i.props.post_view.creator.id, ban, remove_data: i.state.removeData, reason: i.state.banReason, expires: getUnixTime(i.state.banExpires), auth: authField(), }; - WebSocketService.Instance.send(wsClient.banUser(form)); + WebSocketService.Instance.send(wsClient.banPerson(form)); } i.state.showBanDialog = false; @@ -1409,7 +1414,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { handleAddModToCommunity(i: PostListing) { let form: AddModToCommunity = { - user_id: i.props.post_view.creator.id, + person_id: i.props.post_view.creator.id, community_id: i.props.post_view.community.id, added: !i.isMod, auth: authField(), @@ -1420,7 +1425,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { handleAddAdmin(i: PostListing) { let form: AddAdmin = { - user_id: i.props.post_view.creator.id, + person_id: i.props.post_view.creator.id, added: !i.isAdmin, auth: authField(), }; @@ -1441,7 +1446,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { handleTransferCommunity(i: PostListing) { let form: TransferCommunity = { community_id: i.props.post_view.community.id, - user_id: i.props.post_view.creator.id, + person_id: i.props.post_view.creator.id, auth: authField(), }; WebSocketService.Instance.send(wsClient.transferCommunity(form)); @@ -1461,7 +1466,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { handleTransferSite(i: PostListing) { let form: TransferSite = { - user_id: i.props.post_view.creator.id, + person_id: i.props.post_view.creator.id, auth: authField(), }; WebSocketService.Instance.send(wsClient.transferSite(form)); diff --git a/src/shared/components/post.tsx b/src/shared/components/post.tsx index b1bd9aa..c2ef814 100644 --- a/src/shared/components/post.tsx +++ b/src/shared/components/post.tsx @@ -11,7 +11,7 @@ import { CommentResponse, CommunityResponse, BanFromCommunityResponse, - BanUserResponse, + BanPersonResponse, AddModToCommunityResponse, AddAdminResponse, SearchType, @@ -207,13 +207,13 @@ export class Post extends Component<any, PostState> { let parent = this.state.postRes.comments.find( c => found.comment.parent_id == c.comment.id ); - let parent_user_id = parent + let parent_person_id = parent ? parent.creator.id : this.state.postRes.post_view.creator.id; if ( - UserService.Instance.user && - UserService.Instance.user.id == parent_user_id + UserService.Instance.localUserView && + UserService.Instance.localUserView.person.id == parent_person_id ) { let form: MarkCommentAsRead = { comment_id: found.comment.id, @@ -522,9 +522,11 @@ export class Post extends Component<any, PostState> { } else if (op == UserOperation.BanFromCommunity) { let data = wsJsonToRes<BanFromCommunityResponse>(msg).data; this.state.postRes.comments - .filter(c => c.creator.id == data.user_view.user.id) + .filter(c => c.creator.id == data.person_view.person.id) .forEach(c => (c.creator_banned_from_community = data.banned)); - if (this.state.postRes.post_view.creator.id == data.user_view.user.id) { + if ( + this.state.postRes.post_view.creator.id == data.person_view.person.id + ) { this.state.postRes.post_view.creator_banned_from_community = data.banned; } @@ -533,12 +535,14 @@ export class Post extends Component<any, PostState> { let data = wsJsonToRes<AddModToCommunityResponse>(msg).data; this.state.postRes.moderators = data.moderators; this.setState(this.state); - } else if (op == UserOperation.BanUser) { - let data = wsJsonToRes<BanUserResponse>(msg).data; + } else if (op == UserOperation.BanPerson) { + let data = wsJsonToRes<BanPersonResponse>(msg).data; this.state.postRes.comments - .filter(c => c.creator.id == data.user_view.user.id) + .filter(c => c.creator.id == data.person_view.person.id) .forEach(c => (c.creator.banned = data.banned)); - if (this.state.postRes.post_view.creator.id == data.user_view.user.id) { + if ( + this.state.postRes.post_view.creator.id == data.person_view.person.id + ) { this.state.postRes.post_view.creator.banned = data.banned; } this.setState(this.state); diff --git a/src/shared/components/private-message-form.tsx b/src/shared/components/private-message-form.tsx index e98c893..89d6113 100644 --- a/src/shared/components/private-message-form.tsx +++ b/src/shared/components/private-message-form.tsx @@ -6,7 +6,7 @@ import { EditPrivateMessage, PrivateMessageView, PrivateMessageResponse, - UserSafe, + PersonSafe, UserOperation, } from "lemmy-js-client"; import { WebSocketService } from "../services"; @@ -21,14 +21,14 @@ import { wsClient, authField, } from "../utils"; -import { UserListing } from "./user-listing"; +import { PersonListing } from "./person-listing"; import { MarkdownTextArea } from "./markdown-textarea"; import { Icon, Spinner } from "./icon"; import { i18n } from "../i18next"; import { T } from "inferno-i18next"; interface PrivateMessageFormProps { - recipient: UserSafe; + recipient: PersonSafe; privateMessage?: PrivateMessageView; // If a pm is given, that means this is an edit onCancel?(): any; onCreate?(message: PrivateMessageView): any; @@ -108,7 +108,7 @@ export class PrivateMessageForm extends Component< </label> <div class="col-sm-10 form-control-plaintext"> - <UserListing user={this.props.recipient} /> + <PersonListing person={this.props.recipient} /> </div> </div> )} diff --git a/src/shared/components/private-message.tsx b/src/shared/components/private-message.tsx index 769ae50..664fe89 100644 --- a/src/shared/components/private-message.tsx +++ b/src/shared/components/private-message.tsx @@ -3,13 +3,13 @@ import { PrivateMessageView, DeletePrivateMessage, MarkPrivateMessageAsRead, - UserSafe, + PersonSafe, } from "lemmy-js-client"; import { WebSocketService, UserService } from "../services"; import { authField, mdToHtml, toast, wsClient } from "../utils"; import { MomentTime } from "./moment-time"; import { PrivateMessageForm } from "./private-message-form"; -import { UserListing } from "./user-listing"; +import { PersonListing } from "./person-listing"; import { Icon } from "./icon"; import { i18n } from "../i18next"; @@ -48,15 +48,16 @@ export class PrivateMessage extends Component< get mine(): boolean { return ( - UserService.Instance.user && - UserService.Instance.user.id == this.props.private_message_view.creator.id + UserService.Instance.localUserView && + UserService.Instance.localUserView.person.id == + this.props.private_message_view.creator.id ); } render() { let message_view = this.props.private_message_view; // TODO check this again - let userOther: UserSafe = this.mine + let otherPerson: PersonSafe = this.mine ? message_view.recipient : message_view.creator; @@ -69,7 +70,7 @@ export class PrivateMessage extends Component< {this.mine ? i18n.t("to") : i18n.t("from")} </li> <li className="list-inline-item"> - <UserListing user={userOther} /> + <PersonListing person={otherPerson} /> </li> <li className="list-inline-item"> <span> @@ -92,7 +93,7 @@ export class PrivateMessage extends Component< </ul> {this.state.showEdit && ( <PrivateMessageForm - recipient={userOther} + recipient={otherPerson} privateMessage={message_view} onEdit={this.handlePrivateMessageEdit} onCreate={this.handlePrivateMessageCreate} @@ -206,7 +207,7 @@ export class PrivateMessage extends Component< </div> {this.state.showReply && ( <PrivateMessageForm - recipient={userOther} + recipient={otherPerson} onCreate={this.handlePrivateMessageCreate} /> )} @@ -272,8 +273,8 @@ export class PrivateMessage extends Component< handlePrivateMessageCreate(message: PrivateMessageView) { if ( - UserService.Instance.user && - message.creator.id == UserService.Instance.user.id + UserService.Instance.localUserView && + message.creator.id == UserService.Instance.localUserView.person.id ) { this.state.showReply = false; this.setState(this.state); diff --git a/src/shared/components/search.tsx b/src/shared/components/search.tsx index 3ae2592..a4fd964 100644 --- a/src/shared/components/search.tsx +++ b/src/shared/components/search.tsx @@ -5,7 +5,7 @@ import { PostView, CommentView, CommunityView, - UserViewSafe, + PersonViewSafe, SortType, Search as SearchForm, SearchResponse, @@ -36,7 +36,7 @@ import { import { PostListing } from "./post-listing"; import { HtmlTags } from "./html-tags"; import { Spinner } from "./icon"; -import { UserListing } from "./user-listing"; +import { PersonListing } from "./person-listing"; import { CommunityLink } from "./community-link"; import { SortSelect } from "./sort-select"; import { CommentNodes } from "./comment-nodes"; @@ -257,7 +257,7 @@ export class Search extends Component<any, SearchState> { all() { let combined: { type_: string; - data: CommentView | PostView | CommunityView | UserViewSafe; + data: CommentView | PostView | CommunityView | PersonViewSafe; published: string; }[] = []; let comments = this.state.searchResponse.comments.map(e => { @@ -274,7 +274,7 @@ export class Search extends Component<any, SearchState> { }; }); let users = this.state.searchResponse.users.map(e => { - return { type_: "users", data: e, published: e.user.published }; + return { type_: "users", data: e, published: e.person.published }; }); combined.push(...comments); @@ -290,10 +290,10 @@ export class Search extends Component<any, SearchState> { (a, b) => ((b.data as CommentView | PostView).counts.score | (b.data as CommunityView).counts.subscribers | - (b.data as UserViewSafe).counts.comment_score) - + (b.data as PersonViewSafe).counts.comment_score) - ((a.data as CommentView | PostView).counts.score | (a.data as CommunityView).counts.subscribers | - (a.data as UserViewSafe).counts.comment_score) + (a.data as PersonViewSafe).counts.comment_score) ); } @@ -324,7 +324,7 @@ export class Search extends Component<any, SearchState> { <div>{this.communityListing(i.data as CommunityView)}</div> )} {i.type_ == "users" && ( - <div>{this.userListing(i.data as UserViewSafe)}</div> + <div>{this.userListing(i.data as PersonViewSafe)}</div> )} </div> </div> @@ -390,13 +390,13 @@ export class Search extends Component<any, SearchState> { ); } - userListing(user_view: UserViewSafe) { + userListing(person_view: PersonViewSafe) { return [ <span> - <UserListing user={user_view.user} showApubName /> + <PersonListing person={person_view.person} showApubName /> </span>, <span>{` - ${i18n.t("number_of_comments", { - count: user_view.counts.comment_count, + count: person_view.counts.comment_count, })}`}</span>, ]; } diff --git a/src/shared/components/sidebar.tsx b/src/shared/components/sidebar.tsx index 47de96d..3eeb92f 100644 --- a/src/shared/components/sidebar.tsx +++ b/src/shared/components/sidebar.tsx @@ -6,13 +6,13 @@ import { FollowCommunity, DeleteCommunity, RemoveCommunity, - UserViewSafe, + PersonViewSafe, AddModToCommunity, } from "lemmy-js-client"; import { WebSocketService, UserService } from "../services"; import { mdToHtml, getUnixTime, wsClient, authField } from "../utils"; import { CommunityForm } from "./community-form"; -import { UserListing } from "./user-listing"; +import { PersonListing } from "./person-listing"; import { CommunityLink } from "./community-link"; import { BannerIconHeader } from "./banner-icon-header"; import { Icon } from "./icon"; @@ -21,7 +21,7 @@ import { i18n } from "../i18next"; interface SidebarProps { community_view: CommunityView; moderators: CommunityModeratorView[]; - admins: UserViewSafe[]; + admins: PersonViewSafe[]; online: number; enableNsfw: boolean; showIcon?: boolean; @@ -224,7 +224,7 @@ export class Sidebar extends Component<SidebarProps, SidebarState> { <li class="list-inline-item">{i18n.t("mods")}: </li> {this.props.moderators.map(mod => ( <li class="list-inline-item"> - <UserListing user={mod.moderator} /> + <PersonListing person={mod.moderator} /> </li> ))} </ul> @@ -453,7 +453,7 @@ export class Sidebar extends Component<SidebarProps, SidebarState> { handleLeaveModTeamClick(i: Sidebar) { let form: AddModToCommunity = { - user_id: UserService.Instance.user.id, + person_id: UserService.Instance.localUserView.person.id, community_id: i.props.community_view.community.id, added: false, auth: authField(), @@ -489,24 +489,27 @@ export class Sidebar extends Component<SidebarProps, SidebarState> { } private get amCreator(): boolean { - return this.props.community_view.creator.id == UserService.Instance.user.id; + return ( + this.props.community_view.creator.id == + UserService.Instance.localUserView.person.id + ); } get canMod(): boolean { return ( - UserService.Instance.user && + UserService.Instance.localUserView && this.props.moderators .map(m => m.moderator.id) - .includes(UserService.Instance.user.id) + .includes(UserService.Instance.localUserView.person.id) ); } get canAdmin(): boolean { return ( - UserService.Instance.user && + UserService.Instance.localUserView && this.props.admins - .map(a => a.user.id) - .includes(UserService.Instance.user.id) + .map(a => a.person.id) + .includes(UserService.Instance.localUserView.person.id) ); } diff --git a/src/shared/components/theme.tsx b/src/shared/components/theme.tsx index 69ad507..6ae1c4b 100644 --- a/src/shared/components/theme.tsx +++ b/src/shared/components/theme.tsx @@ -1,23 +1,23 @@ -import { UserSafeSettings } from "lemmy-js-client"; +import { LocalUserSettingsView } from "lemmy-js-client"; import { Helmet } from "inferno-helmet"; import { Component } from "inferno"; interface Props { - user: UserSafeSettings | undefined; + localUserView: LocalUserSettingsView | undefined; } export class Theme extends Component<Props> { render() { - const { user } = this.props; - const hasUserTheme = user && user.theme !== "browser"; + let user = this.props.localUserView; + let hasTheme = user && user.local_user.theme !== "browser"; return ( <Helmet> - {hasUserTheme ? ( + {hasTheme ? ( <link rel="stylesheet" type="text/css" - href={`/static/assets/css/themes/${user.theme}.min.css`} + href={`/static/assets/css/themes/${user.local_user.theme}.min.css`} /> ) : ( [ diff --git a/src/shared/initialize.ts b/src/shared/initialize.ts index bc21867..3b8bab9 100644 --- a/src/shared/initialize.ts +++ b/src/shared/initialize.ts @@ -4,6 +4,6 @@ import { i18n } from "./i18next"; import { getLanguage } from "./utils"; export function initializeSite(site: GetSiteResponse) { - UserService.Instance.user = site.my_user; + UserService.Instance.localUserView = site.my_user; i18n.changeLanguage(getLanguage()); } diff --git a/src/shared/interfaces.ts b/src/shared/interfaces.ts index 6872db3..d4477b7 100644 --- a/src/shared/interfaces.ts +++ b/src/shared/interfaces.ts @@ -2,7 +2,7 @@ import { CommentView, GetSiteResponse, LemmyHttp, - UserMentionView, + PersonMentionView, } from "lemmy-js-client"; export interface IsoData { @@ -32,7 +32,7 @@ export interface InitialFetchRequest { } export interface CommentNode { - comment_view: CommentView | UserMentionView; + comment_view: CommentView | PersonMentionView; children?: CommentNode[]; depth?: number; } @@ -67,7 +67,7 @@ export enum BanType { Site, } -export enum UserDetailsView { +export enum PersonDetailsView { Overview, Comments, Posts, diff --git a/src/shared/routes.ts b/src/shared/routes.ts index e26416e..b33057d 100644 --- a/src/shared/routes.ts +++ b/src/shared/routes.ts @@ -8,7 +8,7 @@ import { PasswordChange } from "./components/password_change"; import { Post } from "./components/post"; import { Community } from "./components/community"; import { Communities } from "./components/communities"; -import { User } from "./components/user"; +import { Person } from "./components/person"; import { Modlog } from "./components/modlog"; import { Setup } from "./components/setup"; import { AdminSettings } from "./components/admin-settings"; @@ -93,23 +93,23 @@ export const routes: IRoutePropsWithFetch[] = [ }, { path: `/u/:username/view/:view/sort/:sort/page/:page`, - component: User, - fetchInitialData: req => User.fetchInitialData(req), + component: Person, + fetchInitialData: req => Person.fetchInitialData(req), }, { path: `/user/:id/view/:view/sort/:sort/page/:page`, - component: User, - fetchInitialData: req => User.fetchInitialData(req), + component: Person, + fetchInitialData: req => Person.fetchInitialData(req), }, { path: `/user/:id`, - component: User, - fetchInitialData: req => User.fetchInitialData(req), + component: Person, + fetchInitialData: req => Person.fetchInitialData(req), }, { path: `/u/:username`, - component: User, - fetchInitialData: req => User.fetchInitialData(req), + component: Person, + fetchInitialData: req => Person.fetchInitialData(req), }, { path: `/inbox`, diff --git a/src/shared/services/UserService.ts b/src/shared/services/UserService.ts index 4fd5b74..acef361 100644 --- a/src/shared/services/UserService.ts +++ b/src/shared/services/UserService.ts @@ -1,17 +1,17 @@ // import Cookies from 'js-cookie'; import IsomorphicCookie from "isomorphic-cookie"; -import { UserSafeSettings, LoginResponse } from "lemmy-js-client"; +import { LocalUserSettingsView, LoginResponse } from "lemmy-js-client"; import jwt_decode from "jwt-decode"; import { Subject, BehaviorSubject } from "rxjs"; interface Claims { - id: number; + local_user_id: number; iss: string; } export class UserService { private static _instance: UserService; - public user: UserSafeSettings; + public localUserView: LocalUserSettingsView; public claims: Claims; public jwtSub: Subject<string> = new Subject<string>(); public unreadCountSub: BehaviorSubject<number> = new BehaviorSubject<number>( @@ -38,7 +38,7 @@ export class UserService { public logout() { IsomorphicCookie.remove("jwt", { secure: false }); this.claims = undefined; - this.user = undefined; + this.localUserView = undefined; // setTheme(); this.jwtSub.next(); console.log("Logged out."); diff --git a/src/shared/services/WebSocketService.ts b/src/shared/services/WebSocketService.ts index 9bfaa93..1bf12fd 100644 --- a/src/shared/services/WebSocketService.ts +++ b/src/shared/services/WebSocketService.ts @@ -1,5 +1,5 @@ import { wsUri } from "../env"; -import { UserViewSafe, WebSocketJsonResponse } from "lemmy-js-client"; +import { PersonViewSafe, WebSocketJsonResponse } from "lemmy-js-client"; import { isBrowser } from "../utils"; import { Observable } from "rxjs"; import { share } from "rxjs/operators"; @@ -17,8 +17,8 @@ export class WebSocketService { }; public subject: Observable<any>; - public admins: UserViewSafe[]; - public banned: UserViewSafe[]; + public admins: PersonViewSafe[]; + public banned: PersonViewSafe[]; private constructor() { this.ws = new ReconnectingWebSocket(wsUri, [], this.wsOptions); diff --git a/src/shared/utils.ts b/src/shared/utils.ts index 887030f..594cf40 100644 --- a/src/shared/utils.ts +++ b/src/shared/utils.ts @@ -32,7 +32,7 @@ import "moment/locale/hr"; import { UserOperation, CommentView, - UserSafeSettings, + LocalUserSettingsView, SortType, ListingType, SearchType, @@ -43,7 +43,7 @@ import { PostView, PrivateMessageView, LemmyWebsocket, - UserViewSafe, + PersonViewSafe, CommunityView, } from "lemmy-js-client"; @@ -239,14 +239,14 @@ export function getUnixTime(text: string): number { } export function canMod( - user: UserSafeSettings, + localUserView: LocalUserSettingsView, modIds: number[], creator_id: number, onSelf = false ): boolean { // You can do moderator actions only on the mods added after you. - if (user) { - let yourIndex = modIds.findIndex(id => id == user.id); + if (localUserView) { + let yourIndex = modIds.findIndex(id => id == localUserView.person.id); if (yourIndex == -1) { return false; } else { @@ -367,8 +367,12 @@ export function debounce(func: any, wait = 1000, immediate = false) { // TODO export function getLanguage(override?: string): string { - let user = UserService.Instance.user; - let lang = override || (user && user.lang ? user.lang : "browser"); + let localUserView = UserService.Instance.localUserView; + let lang = + override || + (localUserView?.local_user.lang + ? localUserView.local_user.lang + : "browser"); if (lang == "browser" && isBrowser()) { return getBrowserLanguage(); @@ -508,21 +512,21 @@ export function objectFlip(obj: any) { export function showAvatars(): boolean { return ( - (UserService.Instance.user && UserService.Instance.user.show_avatars) || - !UserService.Instance.user + UserService.Instance.localUserView?.local_user.show_avatars || + !UserService.Instance.localUserView ); } export function isCakeDay(published: string): boolean { // moment(undefined) or moment.utc(undefined) returns the current date/time // moment(null) or moment.utc(null) returns null - const userCreationDate = moment.utc(published || null).local(); + const createDate = moment.utc(published || null).local(); const currentDate = moment(new Date()); return ( - userCreationDate.date() === currentDate.date() && - userCreationDate.month() === currentDate.month() && - userCreationDate.year() !== currentDate.year() + createDate.date() === currentDate.date() && + createDate.month() === currentDate.month() && + createDate.year() !== currentDate.year() ); } @@ -666,15 +670,15 @@ export function setupTribute() { // menuItemLimit: mentionDropdownFetchLimit, menuShowMinLength: 2, }, - // Users + // Persons { trigger: "@", selectTemplate: (item: any) => { - let it: UserTribute = item.original; - return `[${it.key}](${it.view.user.actor_id})`; + let it: PersonTribute = item.original; + return `[${it.key}](${it.view.person.actor_id})`; }, - values: (text: string, cb: (users: UserTribute[]) => any) => { - userSearch(text, (users: UserTribute[]) => cb(users)); + values: (text: string, cb: (persons: PersonTribute[]) => any) => { + personSearch(text, (persons: PersonTribute[]) => cb(persons)); }, allowSpaces: false, autocompleteMode: true, @@ -721,12 +725,12 @@ export function setupTippy() { } } -interface UserTribute { +interface PersonTribute { key: string; - view: UserViewSafe; + view: PersonViewSafe; } -function userSearch(text: string, cb: (users: UserTribute[]) => any) { +function personSearch(text: string, cb: (persons: PersonTribute[]) => any) { if (text) { let form: Search = { q: text, @@ -739,20 +743,20 @@ function userSearch(text: string, cb: (users: UserTribute[]) => any) { WebSocketService.Instance.send(wsClient.search(form)); - let userSub = WebSocketService.Instance.subject.subscribe( + let personSub = WebSocketService.Instance.subject.subscribe( msg => { let res = wsJsonToRes(msg); if (res.op == UserOperation.Search) { let data = res.data as SearchResponse; - let users: UserTribute[] = data.users.map(uv => { - let tribute: UserTribute = { - key: `@${uv.user.name}@${hostname(uv.user.actor_id)}`, - view: uv, + let persons: PersonTribute[] = data.users.map(pv => { + let tribute: PersonTribute = { + key: `@${pv.person.name}@${hostname(pv.person.actor_id)}`, + view: pv, }; return tribute; }); - cb(users); - userSub.unsubscribe(); + cb(persons); + personSub.unsubscribe(); } }, err => console.error(err), @@ -811,8 +815,10 @@ function communitySearch( export function getListingTypeFromProps(props: any): ListingType { return props.match.params.listing_type ? routeListingTypeToEnum(props.match.params.listing_type) - : UserService.Instance.user - ? Object.values(ListingType)[UserService.Instance.user.default_listing_type] + : UserService.Instance.localUserView + ? Object.values(ListingType)[ + UserService.Instance.localUserView.local_user.default_listing_type + ] : ListingType.Local; } @@ -826,8 +832,10 @@ export function getDataTypeFromProps(props: any): DataType { export function getSortTypeFromProps(props: any): SortType { return props.match.params.sort ? routeSortTypeToEnum(props.match.params.sort) - : UserService.Instance.user - ? Object.values(SortType)[UserService.Instance.user.default_sort_type] + : UserService.Instance.localUserView + ? Object.values(SortType)[ + UserService.Instance.localUserView.local_user.default_sort_type + ] : SortType.Active; } diff --git a/yarn.lock b/yarn.lock index 349810e..bbc8762 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5022,10 +5022,10 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -lemmy-js-client@0.10.0-rc.1: - version "0.10.0-rc.1" - resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.10.0-rc.1.tgz#4a9b9db8fcc8229d634920d7e66f63ab5db8b28e" - integrity sha512-18TQO+EpE+mgCWSwynfFvDCASUjzTkr73/CbneMMHcqexq2R4donE+pNDFFSDHOeYIbdna0f4GZEJhyeh6826g== +lemmy-js-client@0.10.0-rc.5: + version "0.10.0-rc.5" + resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.10.0-rc.5.tgz#96b7b34575c7eda6c99a291f4f679bda4c6af6a9" + integrity sha512-mLvQgzGTrOFe7KIO8o2oZBPp/8gJ309VO58EaP+7/BgbHD0GPemzqFdeNOMyIe2WyQsXhGrtHOjiTfBXyZDOoQ== levn@^0.4.1: version "0.4.1" -- 2.44.1