toot-script-condivisione-su.../src/components/instance-select.astro

170 lines
3.6 KiB
Plaintext
Raw Normal View History

---
2023-03-18 02:11:18 +01:00
/*!
2023-09-02 16:17:15 +02:00
* This file is part of Share₂Fedi
* https://github.com/kytta/share2fedi
*
* SPDX-FileCopyrightText: © 2023 Nikita Karamov <me@kytta.dev>
* SPDX-License-Identifier: AGPL-3.0-only
2023-03-18 02:11:18 +01:00
*/
2023-09-02 19:02:17 +02:00
const { instance, errors } = Astro.props;
---
2023-08-26 16:45:29 +02:00
<datalist id="popular-instances"></datalist>
2024-02-12 19:24:08 +01:00
<label class="mt1r">
<span data-translate="instance">Fediverse instance</span>
<div
class="instance-input"
dir="ltr"
>
<span id="https-label">https://</span>
<input
type="text"
name="instance"
id="instance"
2023-08-26 16:45:29 +02:00
list="popular-instances"
required
2023-09-02 19:02:17 +02:00
aria-invalid={Boolean(errors)}
aria-errormessage={errors ? "instance-error" : undefined}
aria-describedby="https-label"
2023-09-02 19:02:17 +02:00
value={instance}
/>
</div>
2023-09-02 19:02:17 +02:00
{
errors && (
<p
class="error"
id="instance-error"
aria-live="assertive"
>
{errors}
</p>
)
}
</label>
<div
id="saved-instances"
class="mt1r"
>
2024-02-12 19:24:08 +01:00
<span data-translate="previouslyUsed">Previously used:</span>&#x0020;
<span class="list"></span>
</div>
<label
class="mt1r"
for="remember"
>
<input
type="checkbox"
id="remember"
name="remember"
2024-02-12 19:24:08 +01:00
/>&#x0020;
<span data-translate="rememberInstance">Remember instance on this device</span
><noscript>.</noscript>
<noscript style="color:darkred;font-size:smaller">
This will not work when JavaScript is disabled.</noscript
>
</label>
<style lang="scss">
.instance-input {
position: relative;
display: flex;
flex-wrap: wrap;
align-items: stretch;
width: 100%;
span {
display: flex;
align-items: center;
padding: 0.5rem;
font-size: 1rem;
}
input[type="text"] {
position: relative;
flex: 1 1 auto;
width: 1%;
}
}
2023-08-26 16:45:29 +02:00
#saved-instances {
margin-block-end: 1rem;
2023-08-26 16:45:29 +02:00
> div {
display: inline-block;
}
:global(span.link) {
2023-08-26 16:45:29 +02:00
color: var(--s2f-accent-color-contrast);
cursor: pointer;
text-decoration: 1px solid underline currentColor;
}
}
</style>
2023-03-17 23:08:15 +01:00
<script>
2023-09-02 17:53:16 +02:00
import { getUrlDomain, normalizeURL } from "@lib/url";
2023-08-26 16:24:14 +02:00
import { $popularInstances } from "@stores/popular-instances";
2023-08-26 16:45:29 +02:00
import { $savedInstances, save } from "@stores/saved-instances";
2023-03-17 23:08:15 +01:00
2023-08-26 16:45:29 +02:00
const instanceElement = document.querySelector(
"#instance",
) as HTMLInputElement;
const savedInstancesElement = document.querySelector(
"#saved-instances",
) as HTMLDivElement;
2023-08-26 16:45:29 +02:00
$savedInstances.subscribe((instances) => {
if (instances.size === 0) {
savedInstancesElement.style.display = "none";
2023-08-26 16:45:29 +02:00
return;
}
2023-03-17 23:08:15 +01:00
2023-08-26 16:45:29 +02:00
const savedInstances = [...instances];
if (!instanceElement.value) {
instanceElement.value = getUrlDomain(savedInstances[0] as string);
}
2023-03-17 23:08:15 +01:00
savedInstancesElement.style.display = "block";
document.querySelector("#saved-instances>.list")!.replaceChildren(
2023-08-26 16:45:29 +02:00
...savedInstances
.flatMap((instance: string) => {
if (!instance) {
return [];
}
2023-03-27 21:23:49 +02:00
const host = getUrlDomain(instance);
const element = document.createElement("span");
element.classList.add("link");
element.textContent = host;
2024-02-12 19:26:34 +01:00
element.dir = "ltr";
element.addEventListener("click", () => {
2023-08-26 16:45:29 +02:00
instanceElement.value = host;
});
return [element, ", "];
})
.slice(0, -1),
);
2023-08-26 16:45:29 +02:00
});
2023-08-26 16:45:29 +02:00
document.querySelector("#form")!.addEventListener("submit", (event) => {
const formData = new FormData(event.target as HTMLFormElement);
if (formData.get("remember")) {
2023-08-26 16:45:29 +02:00
save(normalizeURL(formData.get("instance") as string));
}
return true;
});
2023-08-26 16:24:14 +02:00
2023-08-26 16:45:29 +02:00
$popularInstances.subscribe((instances) => {
document.querySelector("#popular-instances")!.replaceChildren(
...instances.map((domain) => {
const option = document.createElement("option");
option.value = domain;
return option;
}),
);
});
2023-03-17 23:08:15 +01:00
</script>