mirror of
https://git.srhtnin.garden/sarah/srhtnin.github.io.git
synced 2026-10-13 18:38:11 +02:00
340 lines
6.3 KiB
JavaScript
340 lines
6.3 KiB
JavaScript
let SocialCurrentUsername = null;
|
|
let GardenerSearchRequest = 0;
|
|
let GardenerSearchTimer = null;
|
|
|
|
|
|
async function StartSocial() {
|
|
try {
|
|
await LoadGameContent();
|
|
} catch (Error) {
|
|
console.error(
|
|
"Couldn't load Garden content for Social:",
|
|
Error
|
|
);
|
|
}
|
|
|
|
try {
|
|
const Profile = await GetProfile();
|
|
|
|
if (
|
|
Profile.Success &&
|
|
Profile.Username !== null
|
|
) {
|
|
SocialCurrentUsername =
|
|
Profile.Username;
|
|
}
|
|
} catch (Error) {
|
|
console.error(
|
|
"Couldn't load current profile:",
|
|
Error
|
|
);
|
|
}
|
|
|
|
BindGardenerSearch();
|
|
|
|
await RenderLeaderboard(
|
|
SocialCurrentUsername
|
|
);
|
|
}
|
|
|
|
|
|
function BindGardenerSearch() {
|
|
const Form =
|
|
document.getElementById(
|
|
"GardenerSearchForm"
|
|
);
|
|
|
|
const Input =
|
|
document.getElementById(
|
|
"GardenerSearchInput"
|
|
);
|
|
|
|
if (
|
|
Form === null ||
|
|
Input === null
|
|
) {
|
|
return;
|
|
}
|
|
|
|
Form.addEventListener(
|
|
"submit",
|
|
Event => {
|
|
Event.preventDefault();
|
|
|
|
SearchGardeners(
|
|
Input.value
|
|
);
|
|
}
|
|
);
|
|
|
|
Input.addEventListener(
|
|
"input",
|
|
() => {
|
|
if (GardenerSearchTimer !== null) {
|
|
clearTimeout(
|
|
GardenerSearchTimer
|
|
);
|
|
}
|
|
|
|
const Search =
|
|
Input.value.trim();
|
|
|
|
if (Search.length === 0) {
|
|
ClearGardenerSearch();
|
|
return;
|
|
}
|
|
|
|
GardenerSearchTimer =
|
|
setTimeout(
|
|
() => {
|
|
SearchGardeners(
|
|
Search
|
|
);
|
|
},
|
|
250
|
|
);
|
|
}
|
|
);
|
|
|
|
const Query =
|
|
new URLSearchParams(
|
|
window.location.search
|
|
);
|
|
|
|
const InitialSearch =
|
|
Query.get("Search")?.trim() ?? "";
|
|
|
|
if (InitialSearch.length > 0) {
|
|
Input.value = InitialSearch;
|
|
SearchGardeners(
|
|
InitialSearch
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
function ClearGardenerSearch() {
|
|
GardenerSearchRequest++;
|
|
|
|
const Results =
|
|
document.getElementById(
|
|
"GardenerSearchResults"
|
|
);
|
|
|
|
Results?.replaceChildren();
|
|
|
|
SetGardenerSearchMessage(
|
|
"Search for a gardener by username."
|
|
);
|
|
}
|
|
|
|
|
|
async function SearchGardeners(
|
|
SearchValue
|
|
) {
|
|
const Search =
|
|
String(SearchValue ?? "")
|
|
.trim();
|
|
|
|
if (Search.length === 0) {
|
|
ClearGardenerSearch();
|
|
return;
|
|
}
|
|
|
|
const RequestId =
|
|
++GardenerSearchRequest;
|
|
|
|
SetGardenerSearchMessage(
|
|
"Searching..."
|
|
);
|
|
|
|
try {
|
|
const Query =
|
|
new URLSearchParams({
|
|
Search: Search
|
|
});
|
|
|
|
const Response = await fetch(
|
|
ApiUrl +
|
|
"/Gardeners.php?" +
|
|
Query.toString(),
|
|
{
|
|
cache: "no-store"
|
|
}
|
|
);
|
|
|
|
const Result =
|
|
await Response.json();
|
|
|
|
if (RequestId !== GardenerSearchRequest) {
|
|
return;
|
|
}
|
|
|
|
if (!Result.Success) {
|
|
throw new Error(
|
|
Result.Error ??
|
|
"Couldn't search gardeners."
|
|
);
|
|
}
|
|
|
|
RenderGardenerSearchResults(
|
|
Array.isArray(Result.Gardeners)
|
|
? Result.Gardeners
|
|
: []
|
|
);
|
|
} catch (Error) {
|
|
if (RequestId !== GardenerSearchRequest) {
|
|
return;
|
|
}
|
|
|
|
console.error(
|
|
"Couldn't search gardeners:",
|
|
Error
|
|
);
|
|
|
|
document.getElementById(
|
|
"GardenerSearchResults"
|
|
)?.replaceChildren();
|
|
|
|
SetGardenerSearchMessage(
|
|
"Couldn't search gardeners."
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
function RenderGardenerSearchResults(
|
|
Gardeners
|
|
) {
|
|
const Results =
|
|
document.getElementById(
|
|
"GardenerSearchResults"
|
|
);
|
|
|
|
if (Results === null) {
|
|
return;
|
|
}
|
|
|
|
Results.replaceChildren();
|
|
|
|
if (Gardeners.length === 0) {
|
|
SetGardenerSearchMessage(
|
|
"No gardeners matched that search."
|
|
);
|
|
|
|
return;
|
|
}
|
|
|
|
for (const Gardener of Gardeners) {
|
|
Results.appendChild(
|
|
CreateGardenerSearchResult(
|
|
Gardener
|
|
)
|
|
);
|
|
}
|
|
|
|
SetGardenerSearchMessage(
|
|
Gardeners.length === 1
|
|
? "1 gardener found."
|
|
: Gardeners.length
|
|
.toLocaleString() +
|
|
" gardeners found."
|
|
);
|
|
}
|
|
|
|
|
|
function CreateGardenerSearchResult(
|
|
Gardener
|
|
) {
|
|
const Link =
|
|
document.createElement(
|
|
"a"
|
|
);
|
|
|
|
Link.className =
|
|
"PlantTile GardenerSearchResult";
|
|
|
|
Link.href =
|
|
GetGardenerPageUrl(
|
|
Gardener.Username
|
|
);
|
|
|
|
const Avatar =
|
|
CreateGardenerAvatar(
|
|
Gardener.ProfilePicture,
|
|
Gardener.Username,
|
|
"GardenerAvatarLarge"
|
|
);
|
|
|
|
const Details =
|
|
document.createElement(
|
|
"span"
|
|
);
|
|
|
|
Details.className =
|
|
"GardenerSearchResultDetails";
|
|
|
|
const Name =
|
|
document.createElement(
|
|
"strong"
|
|
);
|
|
|
|
Name.className =
|
|
"GardenerSearchResultName";
|
|
|
|
Name.textContent =
|
|
Gardener.Username;
|
|
|
|
ApplyPlayerColour(
|
|
Name,
|
|
Gardener.Colour
|
|
);
|
|
|
|
const Description =
|
|
document.createElement(
|
|
"span"
|
|
);
|
|
|
|
Description.className =
|
|
"GardenerSearchResultDescription";
|
|
|
|
Description.textContent =
|
|
typeof Gardener.Description ===
|
|
"string" &&
|
|
Gardener.Description.length > 0
|
|
? Gardener.Description
|
|
: "No description.";
|
|
|
|
Details.append(
|
|
Name,
|
|
Description
|
|
);
|
|
|
|
Link.append(
|
|
Avatar,
|
|
Details
|
|
);
|
|
|
|
return Link;
|
|
}
|
|
|
|
|
|
function SetGardenerSearchMessage(
|
|
Text
|
|
) {
|
|
const Message =
|
|
document.getElementById(
|
|
"GardenerSearchMessage"
|
|
);
|
|
|
|
if (Message !== null) {
|
|
Message.textContent = Text;
|
|
}
|
|
}
|
|
|
|
|
|
document.addEventListener(
|
|
"DOMContentLoaded",
|
|
StartSocial
|
|
);
|