From 9d46dbfce673468e0ace357dc1abffd2c857ac6c Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Wed, 2 Jul 2025 12:37:12 -0400 Subject: [PATCH 1/3] Invite to Studio from Comments --- features/studio-invite-comments/data.json | 17 ++++++++ features/studio-invite-comments/invite.svg | 4 ++ features/studio-invite-comments/script.js | 48 ++++++++++++++++++++++ features/studio-invite-comments/style.css | 21 ++++++++++ 4 files changed, 90 insertions(+) create mode 100644 features/studio-invite-comments/data.json create mode 100644 features/studio-invite-comments/invite.svg create mode 100644 features/studio-invite-comments/script.js create mode 100644 features/studio-invite-comments/style.css diff --git a/features/studio-invite-comments/data.json b/features/studio-invite-comments/data.json new file mode 100644 index 00000000..a9fc3f68 --- /dev/null +++ b/features/studio-invite-comments/data.json @@ -0,0 +1,17 @@ +{ + "title": "Invite to Studio from Comments", + "description": "Adds an invite option next to report on studio comments.", + "credits": [ + { + "username": "Masaabu-YT", + "url": "https://scratch.mit.edu/users/Masaabu-YT/" + }, + { "username": "MaterArc", "url": "https://scratch.mit.edu/users/MaterArc/" } + ], + "type": ["Website"], + "tags": ["Studio", "Invite", "Curators"], + "dynamic": true, + "styles": [{ "file": "style.css", "runOn": "/studios/*" }], + "scripts": [{ "file": "script.js", "runOn": "/studios/*" }], + "resources": [{ "name": "invite", "path": "/invite.svg" }] +} diff --git a/features/studio-invite-comments/invite.svg b/features/studio-invite-comments/invite.svg new file mode 100644 index 00000000..f1be48d6 --- /dev/null +++ b/features/studio-invite-comments/invite.svg @@ -0,0 +1,4 @@ + + + + diff --git a/features/studio-invite-comments/script.js b/features/studio-invite-comments/script.js new file mode 100644 index 00000000..cb778931 --- /dev/null +++ b/features/studio-invite-comments/script.js @@ -0,0 +1,48 @@ +export default async function ({ feature }) { + const parts = window.location.pathname.split("/"); + const studioId = parts[parts.length - 2]; + if (!studioId) return; + + const session = await ScratchTools.Session(); + if (!session?.user?.username) return; + + const csrfToken = document.cookie.match(/scratchcsrftoken=([^;]+)/)?.[1]; + if (!csrfToken) return; + + ScratchTools.waitForElements( + ".comment-body", + (comment) => { + const topRow = comment.querySelector(".comment-top-row"); + const actionList = topRow?.querySelector(".action-list"); + if (!topRow || !actionList) return; + if (actionList.querySelector(".ste-comment-invite")) return; + + const inviteBtn = document.createElement("span"); + inviteBtn.classList.add("ste-comment-invite"); + + const innerSpan = document.createElement("span"); + innerSpan.textContent = "Invite"; + inviteBtn.appendChild(innerSpan); + + inviteBtn.onclick = async () => { + const username = topRow.querySelector(".username")?.textContent.trim(); + if (!username) return; + const url = `https://scratch.mit.edu/site-api/users/curators-in/${studioId}/invite_curator/?usernames=${encodeURIComponent( + username + )}`; + await fetch(url, { + method: "PUT", + headers: { + "x-csrftoken": csrfToken, + "Content-Type": "application/json", + }, + credentials: "include", + }); + }; + + actionList.appendChild(inviteBtn); + }, + "ste-invite-buttons", + false + ); +} diff --git a/features/studio-invite-comments/style.css b/features/studio-invite-comments/style.css new file mode 100644 index 00000000..870f7ef8 --- /dev/null +++ b/features/studio-invite-comments/style.css @@ -0,0 +1,21 @@ +.ste-comment-invite { + cursor: pointer; + margin-left: 10px; + font-size: 0.75rem; + font-weight: 500; + opacity:0.5; +} + +.ste-comment-invite::before { + content: ""; + display: inline-block; + width: 1.1rem; + height: 1.1rem; + margin-right: 0.25rem; + vertical-align: -0.27rem; + background-image: var(--scratchtoolsresource-invite); + background-repeat: no-repeat; + background-size: contain; + background-position: center; + filter: brightness(0) saturate(100%) invert(38%) sepia(7%) saturate(582%) hue-rotate(185deg) brightness(94%) contrast(86%); +} \ No newline at end of file From 90117c510d71830e9b6bdea5a978c86ffc2bd243 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Wed, 2 Jul 2025 12:37:44 -0400 Subject: [PATCH 2/3] Update features.json --- features/features.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features/features.json b/features/features.json index a344f61e..00dec257 100644 --- a/features/features.json +++ b/features/features.json @@ -1,4 +1,9 @@ [ + { + "version": 2, + "id": "studio-invite-comments", + "versionAdded": "v4.2.0" + }, { "version": 2, "id": "copy-paste-lists", From a0cc57d5bfbaa3f7da92f925faded66725090a74 Mon Sep 17 00:00:00 2001 From: MaterArc <105017592+MaterArc@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:33:47 -0400 Subject: [PATCH 3/3] Update data.json --- features/studio-invite-comments/data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/studio-invite-comments/data.json b/features/studio-invite-comments/data.json index a9fc3f68..9e5ce642 100644 --- a/features/studio-invite-comments/data.json +++ b/features/studio-invite-comments/data.json @@ -9,7 +9,7 @@ { "username": "MaterArc", "url": "https://scratch.mit.edu/users/MaterArc/" } ], "type": ["Website"], - "tags": ["Studio", "Invite", "Curators"], + "tags": ["New", "Featured"], "dynamic": true, "styles": [{ "file": "style.css", "runOn": "/studios/*" }], "scripts": [{ "file": "script.js", "runOn": "/studios/*" }],