mirror of
https://github.com/coracle-social/coracle.git
synced 2024-09-29 00:10:52 +00:00
Bring back reports via tagr. Fixes #355
This commit is contained in:
parent
2f0a5def6f
commit
dadf27d058
BIN
package-lock.json
generated
BIN
package-lock.json
generated
Binary file not shown.
@ -56,10 +56,10 @@
|
||||
"@getalby/bitcoin-connect": "^3.2.2",
|
||||
"@scure/base": "^1.1.6",
|
||||
"@welshman/content": "^0.0.5",
|
||||
"@welshman/feeds": "^0.0.10",
|
||||
"@welshman/feeds": "^0.0.11",
|
||||
"@welshman/lib": "^0.0.9",
|
||||
"@welshman/net": "^0.0.12",
|
||||
"@welshman/util": "^0.0.13",
|
||||
"@welshman/net": "^0.0.13",
|
||||
"@welshman/util": "^0.0.14",
|
||||
"classnames": "^2.5.1",
|
||||
"compressorjs": "^1.2.1",
|
||||
"date-picker-svelte": "^2.12.0",
|
||||
|
@ -221,6 +221,11 @@
|
||||
entity: asNote,
|
||||
},
|
||||
})
|
||||
router.register("/notes/:entity/report", import("src/app/views/ReportCreate.svelte"), {
|
||||
serializers: {
|
||||
entity: asNote,
|
||||
},
|
||||
})
|
||||
router.register("/notes/:entity/thread", import("src/app/views/ThreadDetail.svelte"), {
|
||||
serializers: {
|
||||
entity: asNote,
|
||||
|
@ -53,6 +53,7 @@
|
||||
export let showLoading = false
|
||||
export let showMuted = false
|
||||
export let showGroup = false
|
||||
export let showMedia = getSetting("show_media")
|
||||
export let contextAddress = null
|
||||
|
||||
let zapper, unsubZapper
|
||||
@ -63,7 +64,7 @@
|
||||
let showMutedReplies = false
|
||||
let actions = null
|
||||
let collapsed = depth === 0
|
||||
let context = repository.query([{'#e': [event.id]}]).filter(e => isChildOf(e, event))
|
||||
let context = repository.query([{"#e": [event.id]}]).filter(e => isChildOf(e, event))
|
||||
let showHiddenReplies = anchor === getIdOrAddress(event)
|
||||
|
||||
const showEntire = showHiddenReplies
|
||||
@ -296,7 +297,7 @@
|
||||
}}>Show</Anchor>
|
||||
</p>
|
||||
{:else}
|
||||
<NoteContent note={event} {showEntire} />
|
||||
<NoteContent note={event} {showEntire} {showMedia} />
|
||||
{/if}
|
||||
<div class="cy-note-click-target h-[2px]" />
|
||||
<NoteActions
|
||||
|
@ -98,6 +98,8 @@
|
||||
|
||||
const quote = () => router.at("notes/create").cx({quote: note}).open()
|
||||
|
||||
const report = () => router.at("notes").of(note.id).at("report").open()
|
||||
|
||||
const react = async content => {
|
||||
if (isSignedEvent(note)) {
|
||||
publish({event: note, relays: hints.PublishEvent(note).getUrls()})
|
||||
@ -208,6 +210,8 @@
|
||||
} else {
|
||||
actions.push({label: "Mute", icon: "microphone-slash", onClick: muteNote})
|
||||
}
|
||||
|
||||
actions.push({label: "Report", icon: "triangle-exclamation", onClick: report})
|
||||
}
|
||||
|
||||
if (!$env.FORCE_GROUP && $env.PLATFORM_RELAYS.length === 0 && isSignedEvent(note)) {
|
||||
|
@ -1,60 +1,67 @@
|
||||
<script lang="ts">
|
||||
import {identity} from "ramda"
|
||||
import {seconds} from "hurdak"
|
||||
import {now} from "@welshman/lib"
|
||||
import {fuzzy} from "src/util/misc"
|
||||
import {asSignedEvent, createEvent} from "@welshman/util"
|
||||
import type {SignedEvent} from "@welshman/util"
|
||||
import {generatePrivateKey} from "src/util/nostr"
|
||||
import {showInfo} from "src/partials/Toast.svelte"
|
||||
import Heading from "src/partials/Heading.svelte"
|
||||
import FlexColumn from "src/partials/FlexColumn.svelte"
|
||||
import Anchor from "src/partials/Anchor.svelte"
|
||||
import Field from "src/partials/Field.svelte"
|
||||
import SearchSelect from "src/partials/SearchSelect.svelte"
|
||||
import Textarea from "src/partials/Textarea.svelte"
|
||||
import PersonLink from "src/app/shared/PersonLink.svelte"
|
||||
import Note from "src/app/shared/Note.svelte"
|
||||
import {router} from "src/app/util/router"
|
||||
import {createAndPublish, hints} from "src/engine"
|
||||
import {repository, nip59, loadPubkeys, publish, hints} from "src/engine"
|
||||
|
||||
export let eid
|
||||
export let pubkey
|
||||
|
||||
const searchContentWarnings = fuzzy(["nudity", "profanity", "illegal", "spam", "impersonation"])
|
||||
const event = repository.getEvent(eid)
|
||||
|
||||
const submit = () => {
|
||||
const tags = [
|
||||
["p", pubkey],
|
||||
["expiration", String(now() + seconds(7, "day"))],
|
||||
]
|
||||
const tagr = "56d4b3d6310fadb7294b7f041aab469c5ffc8991b1b1b331981b96a246f6ae65"
|
||||
|
||||
if (flags.length > 0) {
|
||||
for (const flag of flags) {
|
||||
tags.push(["e", eid, flag])
|
||||
}
|
||||
}
|
||||
const submit = async () => {
|
||||
const content = JSON.stringify({
|
||||
reporterText: message,
|
||||
reportedEvent: asSignedEvent(event as SignedEvent),
|
||||
})
|
||||
|
||||
const template = createEvent(1, {content})
|
||||
const rumor = await $nip59.wrap(template, {
|
||||
author: generatePrivateKey(),
|
||||
wrap: {
|
||||
author: generatePrivateKey(),
|
||||
recipient: tagr,
|
||||
},
|
||||
})
|
||||
|
||||
publish({
|
||||
event: rumor.wrap,
|
||||
relays: hints
|
||||
.merge([hints.fromRelays(["wss://relay.nos.social"]), hints.PublishMessage(tagr)])
|
||||
.getUrls(),
|
||||
forcePlatform: false,
|
||||
})
|
||||
|
||||
createAndPublish({kind: 1984, tags, relays: hints.WriteRelays().getUrls()})
|
||||
showInfo("Your report has been sent!")
|
||||
router.pop()
|
||||
}
|
||||
|
||||
let flags = []
|
||||
let message = ""
|
||||
|
||||
loadPubkeys([tagr])
|
||||
</script>
|
||||
|
||||
<form on:submit|preventDefault={submit}>
|
||||
<FlexColumn>
|
||||
<Heading class="text-center">File a Report</Heading>
|
||||
<div class="flex w-full flex-col gap-8">
|
||||
<Field label="Content Warnings">
|
||||
<SearchSelect
|
||||
multiple
|
||||
autofocus
|
||||
search={searchContentWarnings}
|
||||
bind:value={flags}
|
||||
termToItem={identity}>
|
||||
<div slot="item" let:item>
|
||||
<strong>{item}</strong>
|
||||
</div>
|
||||
</SearchSelect>
|
||||
<div slot="info">Flag this content as sensitive so other people can avoid it.</div>
|
||||
</Field>
|
||||
<Anchor button tag="button" type="submit">Save</Anchor>
|
||||
</div>
|
||||
<Field label="Why are you reporting this content?">
|
||||
<Textarea bind:value={message} />
|
||||
<div slot="info">
|
||||
Reports are sent to <PersonLink pubkey={tagr} /> for review. No identifying information is included
|
||||
with the report.
|
||||
</div>
|
||||
</Field>
|
||||
<Note note={event} showMedia={false} />
|
||||
<Anchor button tag="button" type="submit">Save</Anchor>
|
||||
</FlexColumn>
|
||||
</form>
|
||||
|
@ -295,6 +295,10 @@ export const ensureMessagePlaintext = async (e: TrustedEvent) => {
|
||||
return getPlaintext(e)
|
||||
}
|
||||
|
||||
export const canUnwrap = (event: TrustedEvent) =>
|
||||
isGiftWrap(event) &&
|
||||
(getSession(Tags.fromEvent(event).get("p")?.value()) || getRecipientKey(event))
|
||||
|
||||
export const ensureUnwrapped = async (event: TrustedEvent) => {
|
||||
if (!isGiftWrap(event)) {
|
||||
return event
|
||||
@ -1588,10 +1592,12 @@ export const publish = ({forcePlatform = true, ...request}: MyPublishRequest) =>
|
||||
const pub = basePublish(request)
|
||||
|
||||
// Add the event to projections
|
||||
ensureUnwrapped(request.event).then(projections.push)
|
||||
if (canUnwrap(request.event)) {
|
||||
ensureUnwrapped(request.event).then(projections.push)
|
||||
}
|
||||
|
||||
// Listen to updates and update our publish queue
|
||||
if (isGiftWrap(request.event) || request.event.pubkey === pubkey.get()) {
|
||||
if (canUnwrap(request.event) || request.event.pubkey === pubkey.get()) {
|
||||
const pubInfo = omit(["emitter", "result"], pub)
|
||||
|
||||
pub.emitter.on("*", t => publishes.key(pubInfo.id).set(pubInfo))
|
||||
|
Loading…
Reference in New Issue
Block a user