MapComplete/src/UI/Popup/Notes/NoteCommentElement.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

141 lines
5.1 KiB
TypeScript
Raw Normal View History

2023-12-26 22:30:27 +01:00
import Combine from "../../Base/Combine"
import BaseUIElement from "../../BaseUIElement"
import Svg from "../../../Svg"
import Link from "../../Base/Link"
import { FixedUiElement } from "../../Base/FixedUiElement"
import Translations from "../../i18n/Translations"
import { Utils } from "../../../Utils"
import Img from "../../Base/Img"
import { SlideShow } from "../../Image/SlideShow"
import { Stores, UIEventSource } from "../../../Logic/UIEventSource"
import { OsmConnection } from "../../../Logic/Osm/OsmConnection"
import { VariableUiElement } from "../../Base/VariableUIElement"
import { SpecialVisualizationState } from "../../SpecialVisualization"
2022-01-08 14:08:04 +01:00
export default class NoteCommentElement extends Combine {
2023-12-26 22:30:27 +01:00
constructor(
comment: {
date: string
uid: number
user: string
user_url: string
action: "closed" | "opened" | "reopened" | "commented"
text: string
html: string
highlighted: boolean
},
state?: SpecialVisualizationState,
index?: number,
totalNumberOfComments?: number
) {
2022-01-08 14:08:04 +01:00
const t = Translations.t.notes
let actionIcon: BaseUIElement
2022-01-08 14:08:04 +01:00
if (comment.action === "opened" || comment.action === "reopened") {
actionIcon = Svg.note_svg()
} else if (comment.action === "closed") {
actionIcon = Svg.resolved_svg()
} else {
2022-02-10 23:16:14 +01:00
actionIcon = Svg.speech_bubble_svg()
2022-01-08 14:08:04 +01:00
}
let user: BaseUIElement
if (comment.user === undefined) {
user = t.anonymous
} else {
user = new Link(comment.user, comment.user_url ?? "", true)
}
let userinfo = Stores.FromPromise(
Utils.downloadJsonCached(
"https://api.openstreetmap.org/api/0.6/user/" + comment.uid,
24 * 60 * 60 * 1000
)
2022-09-08 21:40:48 +02:00
)
let userImg = new VariableUiElement(
userinfo.map((userinfo) => {
const href = userinfo?.user?.img?.href
if (href !== undefined) {
return new Img(href).SetClass("rounded-full w-8 h-8 mr-4")
}
return undefined
})
2022-09-08 21:40:48 +02:00
)
2022-01-08 14:08:04 +01:00
const htmlElement = document.createElement("div")
htmlElement.innerHTML = Utils.purify(comment.html)
2022-01-08 14:08:04 +01:00
const images = Array.from(htmlElement.getElementsByTagName("a"))
.map((link) => link.href)
.filter((link) => {
link = link.toLowerCase()
const lastDotIndex = link.lastIndexOf(".")
const extension = link.substring(lastDotIndex + 1, link.length)
return Utils.imageExtensions.has(extension)
})
let imagesEl: BaseUIElement = undefined
if (images.length > 0) {
const imageEls = images.map((i) =>
2023-12-26 22:30:27 +01:00
new Img(i)
.SetClass("w-full block cursor-pointer")
.onClick(() =>
state?.previewedImage?.setData(<any>{
url_hd: i,
url: i,
})
)
.SetStyle("min-width: 50px; background: grey;")
2022-09-08 21:40:48 +02:00
)
imagesEl = new SlideShow(new UIEventSource<BaseUIElement[]>(imageEls)).SetClass("mb-1")
2022-01-08 14:08:04 +01:00
}
super([
new Combine([
actionIcon.SetClass("mr-4 w-6").SetStyle("flex-shrink: 0"),
new FixedUiElement(comment.html).SetClass("flex flex-col").SetStyle("margin: 0"),
]).SetClass("flex"),
imagesEl,
new Combine([userImg, user.SetClass("mr-2"), comment.date]).SetClass(
"flex justify-end items-center subtle"
2022-09-08 21:40:48 +02:00
),
2022-01-08 14:08:04 +01:00
])
this.SetClass("flex flex-col pb-2 mb-2 border-gray-500 border-b")
2023-12-26 22:30:27 +01:00
if (comment.highlighted) {
this.SetClass("glowing-shadow")
console.log(">>>", index, totalNumberOfComments)
if (index + 2 === totalNumberOfComments) {
console.log("Scrolling into view")
requestAnimationFrame(() => {
this.ScrollIntoView()
})
}
}
2022-01-08 14:08:04 +01:00
}
2022-01-26 21:40:38 +01:00
public static addCommentTo(
txt: string,
tags: UIEventSource<any>,
state: { osmConnection: OsmConnection }
) {
2022-01-08 14:08:04 +01:00
const comments: any[] = JSON.parse(tags.data["comments"])
const username = state.osmConnection.userDetails.data.name
var urlRegex = /(https?:\/\/[^\s]+)/g
2022-01-26 21:40:38 +01:00
const html = txt.replace(urlRegex, function (url) {
2022-01-08 14:08:04 +01:00
return '<a href="' + url + '">' + url + "</a>"
})
2022-01-26 21:40:38 +01:00
2022-01-08 14:08:04 +01:00
comments.push({
date: new Date().toISOString(),
uid: state.osmConnection.userDetails.data.uid,
user: username,
user_url: "https://www.openstreetmap.org/user/" + username,
action: "commented",
text: txt,
html: html,
2023-12-26 22:30:27 +01:00
highlighted: true,
2022-01-08 14:08:04 +01:00
})
tags.data["comments"] = JSON.stringify(comments)
tags.ping()
}
}