X-Git-Url: http://these/git/?a=blobdiff_plain;f=src%2Fshared%2Futils.ts;h=19b48c1945700410520f2e15e1fc9e21eb2833df;hb=c2f628312f76c726f002d3bafbe8eb9f78109947;hp=ab3f87929c45ba4092134b3e06fa00eaf5fc8cf6;hpb=dbb5c10da9b17c5530ce19357d5f286d3a8adb56;p=lemmy-ui.git diff --git a/src/shared/utils.ts b/src/shared/utils.ts index ab3f879..19b48c1 100644 --- a/src/shared/utils.ts +++ b/src/shared/utils.ts @@ -4,7 +4,10 @@ import emojiShortName from "emoji-short-name"; import { BlockCommunityResponse, BlockPersonResponse, + Comment as CommentI, + CommentNode as CommentNodeI, CommentReportView, + CommentSortType, CommentView, CommunityBlockView, CommunityModeratorView, @@ -39,12 +42,7 @@ import tippy from "tippy.js"; import Toastify from "toastify-js"; import { httpBase } from "./env"; import { i18n, languages } from "./i18next"; -import { - CommentNode as CommentNodeI, - CommentSortType, - DataType, - IsoData, -} from "./interfaces"; +import { DataType, IsoData } from "./interfaces"; import { UserService, WebSocketService } from "./services"; var Tribute: any; @@ -74,6 +72,7 @@ export const postRefetchSeconds: number = 60 * 1000; export const fetchLimit = 20; export const trendingFetchLimit = 6; export const mentionDropdownFetchLimit = 10; +export const commentTreeMaxDepth = 8; export const relTags = "noopener nofollow"; @@ -211,9 +210,10 @@ export function canMod( export function canAdmin( admins: Option, creator_id: number, - myUserInfo = UserService.Instance.myUserInfo + myUserInfo = UserService.Instance.myUserInfo, + onSelf = false ): boolean { - return canMod(None, admins, creator_id, myUserInfo); + return canMod(None, admins, creator_id, myUserInfo, onSelf); } export function isMod( @@ -611,7 +611,7 @@ export function notifyComment(comment_view: CommentView, router: any) { let info: NotifyInfo = { name: comment_view.creator.name, icon: comment_view.creator.avatar, - link: `/post/${comment_view.post.id}/comment/${comment_view.comment.id}`, + link: `/comment/${comment_view.comment.id}`, body: comment_view.comment.content, }; notify(info, router); @@ -813,12 +813,14 @@ export function getRecipientIdFromProps(props: any): number { : 1; } -export function getIdFromProps(props: any): number { - return Number(props.match.params.id); +export function getIdFromProps(props: any): Option { + let id: string = props.match.params.post_id; + return id ? Some(Number(id)) : None; } -export function getCommentIdFromProps(props: any): number { - return Number(props.match.params.comment_id); +export function getCommentIdFromProps(props: any): Option { + let id: string = props.match.params.comment_id; + return id ? Some(Number(id)) : None; } export function getUsernameFromProps(props: any): string { @@ -829,6 +831,7 @@ export function editCommentRes(data: CommentView, comments: CommentView[]) { let found = comments.find(c => c.comment.id == data.comment.id); if (found) { found.comment.content = data.comment.content; + found.comment.distinguished = data.comment.distinguished; found.comment.updated = data.comment.updated; found.comment.removed = data.comment.removed; found.comment.deleted = data.comment.deleted; @@ -985,61 +988,12 @@ export function updateRegistrationApplicationRes( export function commentsToFlatNodes(comments: CommentView[]): CommentNodeI[] { let nodes: CommentNodeI[] = []; for (let comment of comments) { - nodes.push({ comment_view: comment }); + nodes.push({ comment_view: comment, children: [], depth: 0 }); } return nodes; } -function commentSort(tree: CommentNodeI[], sort: CommentSortType) { - // First, put removed and deleted comments at the bottom, then do your other sorts - if (sort == CommentSortType.Top) { - tree.sort( - (a, b) => - +a.comment_view.comment.removed - +b.comment_view.comment.removed || - +a.comment_view.comment.deleted - +b.comment_view.comment.deleted || - b.comment_view.counts.score - a.comment_view.counts.score - ); - } else if (sort == CommentSortType.New) { - tree.sort( - (a, b) => - +a.comment_view.comment.removed - +b.comment_view.comment.removed || - +a.comment_view.comment.deleted - +b.comment_view.comment.deleted || - b.comment_view.comment.published.localeCompare( - a.comment_view.comment.published - ) - ); - } else if (sort == CommentSortType.Old) { - tree.sort( - (a, b) => - +a.comment_view.comment.removed - +b.comment_view.comment.removed || - +a.comment_view.comment.deleted - +b.comment_view.comment.deleted || - a.comment_view.comment.published.localeCompare( - b.comment_view.comment.published - ) - ); - } else if (sort == CommentSortType.Hot) { - tree.sort( - (a, b) => - +a.comment_view.comment.removed - +b.comment_view.comment.removed || - +a.comment_view.comment.deleted - +b.comment_view.comment.deleted || - hotRankComment(b.comment_view as CommentView) - - hotRankComment(a.comment_view as CommentView) - ); - } - - // Go through the children recursively - for (let node of tree) { - if (node.children) { - commentSort(node.children, sort); - } - } -} - -export function commentSortSortType(tree: CommentNodeI[], sort: SortType) { - commentSort(tree, convertCommentSortType(sort)); -} - -function convertCommentSortType(sort: SortType): CommentSortType { +export function convertCommentSortType(sort: SortType): CommentSortType { if ( sort == SortType.TopAll || sort == SortType.TopDay || @@ -1059,21 +1013,32 @@ function convertCommentSortType(sort: SortType): CommentSortType { export function buildCommentsTree( comments: CommentView[], - commentSortType: CommentSortType + parentComment: boolean ): CommentNodeI[] { let map = new Map(); + let depthOffset = !parentComment + ? 0 + : getDepthFromComment(comments[0].comment); + for (let comment_view of comments) { let node: CommentNodeI = { comment_view: comment_view, children: [], - depth: 0, + depth: getDepthFromComment(comment_view.comment) - depthOffset, }; map.set(comment_view.comment.id, { ...node }); } + let tree: CommentNodeI[] = []; + + // if its a parent comment fetch, then push the first comment to the top node. + if (parentComment) { + tree.push(map.get(comments[0].comment.id)); + } + for (let comment_view of comments) { let child = map.get(comment_view.comment.id); - let parent_id = comment_view.comment.parent_id; + let parent_id = getCommentParentId(comment_view.comment); parent_id.match({ some: parentId => { let parent = map.get(parentId); @@ -1083,26 +1048,37 @@ export function buildCommentsTree( } }, none: () => { - tree.push(child); + if (!parentComment) { + tree.push(child); + } }, }); - - setDepth(child); } - commentSort(tree, commentSortType); - return tree; } -function setDepth(node: CommentNodeI, i = 0) { - for (let child of node.children) { - child.depth = i; - setDepth(child, i + 1); +export function getCommentParentId(comment: CommentI): Option { + let split = comment.path.split("."); + // remove the 0 + split.shift(); + + if (split.length > 1) { + return Some(Number(split[split.length - 2])); + } else { + return None; } } -export function insertCommentIntoTree(tree: CommentNodeI[], cv: CommentView) { +export function getDepthFromComment(comment: CommentI): number { + return comment.path.split(".").length - 2; +} + +export function insertCommentIntoTree( + tree: CommentNodeI[], + cv: CommentView, + parentComment: boolean +) { // Building a fake node to be used for later let node: CommentNodeI = { comment_view: cv, @@ -1110,7 +1086,7 @@ export function insertCommentIntoTree(tree: CommentNodeI[], cv: CommentView) { depth: 0, }; - cv.comment.parent_id.match({ + getCommentParentId(cv.comment).match({ some: parentId => { let parentComment = searchCommentTree(tree, parentId); parentComment.match({ @@ -1122,7 +1098,9 @@ export function insertCommentIntoTree(tree: CommentNodeI[], cv: CommentView) { }); }, none: () => { - tree.unshift(node); + if (!parentComment) { + tree.unshift(node); + } }, }); } @@ -1149,6 +1127,7 @@ export function searchCommentTree( export const colorList: string[] = [ hsl(0), + hsl(50), hsl(100), hsl(150), hsl(200), @@ -1385,7 +1364,8 @@ export const choicesModLogConfig = { searchResultLimit: fetchLimit, classNames: { containerOuter: "choices mb-2 custom-select col-4 px-0", - containerInner: "choices__inner bg-secondary border-0 py-0 modlog-choices-font-size", + containerInner: + "choices__inner bg-secondary border-0 py-0 modlog-choices-font-size", input: "form-control", inputCloned: "choices__input--cloned w-100", list: "choices__list", @@ -1472,3 +1452,15 @@ export function enableDownvotes(siteRes: GetSiteResponse): boolean { export function enableNsfw(siteRes: GetSiteResponse): boolean { return siteRes.site_view.map(s => s.site.enable_nsfw).unwrapOr(false); } + +export function postToCommentSortType(sort: SortType): CommentSortType { + if ([SortType.Active, SortType.Hot].includes(sort)) { + return CommentSortType.Hot; + } else if ([SortType.New, SortType.NewComments].includes(sort)) { + return CommentSortType.New; + } else if (sort == SortType.Old) { + return CommentSortType.Old; + } else { + return CommentSortType.Top; + } +}