Skip to content

Commit f2363d4

Browse files
authored
Merge pull request #663 from rgantzos/main
2 parents a37fdd6 + dccc999 commit f2363d4

4 files changed

Lines changed: 130 additions & 0 deletions

File tree

features/features.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
[
2+
{
3+
"version": 2,
4+
"id": "more-studios",
5+
"versionAdded": "v3.2.0"
6+
},
27
{
38
"version": 2,
49
"id": "localized-explore",

features/more-studios/data.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"title": "More Studios",
3+
"description": "Allows you to add projects to more studios instead of just 20.",
4+
"credits": [
5+
{ "username": "Oldcoinmania", "url": "https://scratch.mit.edu/users/Oldcoinmania/" },
6+
{ "username": "rgantzos", "url": "https://scratch.mit.edu/users/rgantzos/" }
7+
],
8+
"type": ["Website"],
9+
"tags": ["New", "Featured"],
10+
"dynamic": true,
11+
"scripts": [{ "file": "script.js", "runOn": "/projects/*" }],
12+
"styles": [{ "file": "style.css", "runOn": "/projects/*" }]
13+
}

features/more-studios/script.js

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
export default async function ({ feature, console }) {
2+
window.feature = feature;
3+
ScratchTools.waitForElements(
4+
".mod-addToStudio .studio-list-container",
5+
async function (modal) {
6+
let offset = 0;
7+
8+
let loadMore = document.createElement("button");
9+
loadMore.textContent = "Load More";
10+
loadMore.className = "button ste-load-more-studios"
11+
loadMore.addEventListener("click", getStudios);
12+
13+
feature.self.hideOnDisable(loadMore)
14+
15+
modal.parentNode.appendChild(loadMore);
16+
17+
async function getStudios() {
18+
let studioOptions = feature.redux.getState().preview.curatedStudios;
19+
20+
offset += 20;
21+
22+
let myStudios = await (
23+
await fetch(
24+
`https://api.scratch.mit.edu/users/${
25+
feature.redux.getState().session.session.user.username
26+
}/studios/curate?offset=${offset.toString()}`
27+
)
28+
).json();
29+
30+
myStudios = myStudios.filter(
31+
(studio) => !studioOptions.find((el) => el.id === studio.id)
32+
);
33+
34+
let addedStudios = feature.redux.getState().preview.currentStudioIds;
35+
36+
myStudios.forEach(function (studio) {
37+
let div = document.createElement("div");
38+
div.className =
39+
"studio-selector-button studio-selector-button-enabled";
40+
41+
let title = document.createElement("div");
42+
title.className = "studio-selector-button-text";
43+
title.title = studio.title;
44+
title.textContent = studio.title;
45+
div.appendChild(title);
46+
47+
let button = document.createElement("div");
48+
button.className = "studio-status-icon";
49+
50+
let img = document.createElement("img");
51+
button.appendChild(img);
52+
div.appendChild(button);
53+
54+
let added = false;
55+
56+
div.addEventListener("click", async function () {
57+
if (added) return;
58+
59+
let token = feature.redux.getState().session.session.user.token;
60+
let projectId = feature.redux.getState().preview.projectInfo.id;
61+
62+
let response = await fetch(
63+
"https://api.scratch.mit.edu/studios/" +
64+
studio.id +
65+
"/project/" +
66+
projectId,
67+
{
68+
headers: {
69+
accept: "*/*",
70+
"x-token": token,
71+
},
72+
body: null,
73+
method: "POST",
74+
}
75+
);
76+
77+
if (!response.ok) return;
78+
79+
title.classList.remove("studio-selector-button-text-unselected");
80+
button.classList.remove("studio-status-icon-unselected");
81+
82+
div.classList.add("studio-selector-button-selected");
83+
title.classList.add("studio-selector-button-text-selected");
84+
85+
img.className = "studio-status-icon-checkmark-img";
86+
img.alt = "checkmark-icon";
87+
img.src = "/svgs/modal/confirm.svg";
88+
});
89+
90+
if (!addedStudios.includes(studio.id)) {
91+
title.classList.add("studio-selector-button-text-unselected");
92+
button.classList.add("studio-status-icon-unselected");
93+
94+
img.className = "studio-status-icon-plus-img";
95+
img.alt = "plus-icon";
96+
img.src = "/svgs/modal/add.svg";
97+
98+
modal.appendChild(div);
99+
100+
feature.self.hideOnDisable(div)
101+
}
102+
});
103+
}
104+
}
105+
);
106+
}

features/more-studios/style.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
.ste-load-more-studios {
2+
width: calc(100% - 1.46875rem);
3+
margin-left: 1.46875rem;
4+
position: relative;
5+
top: -1rem;
6+
}

0 commit comments

Comments
 (0)