astro-integration-pocketbase
Version:
An Astro integration to support developers working with astro-loader-pocketbase.
156 lines (142 loc) • 4.51 kB
text/typescript
import type { ToolbarServerHelpers } from "astro";
import type { DevToolbarButton } from "astro/runtime/client/dev-toolbar/ui-library/button.js";
import type { DevToolbarWindow } from "astro/runtime/client/dev-toolbar/ui-library/window.js";
import { default as packageJson } from "../../../package.json";
import type { ToolbarOptions } from "../types/options";
/**
* Creates the header for the PocketBase toolbar.
*/
export function createHeader(
windowElement: DevToolbarWindow,
server: ToolbarServerHelpers,
{ hasContentLoader, realtime }: ToolbarOptions
): void {
const header = windowElement.querySelector("header");
if (!header) {
throw new Error("The header element is missing");
}
header.innerHTML = /* HTML */ `
<style>
header {
display: grid;
grid-template-columns: auto auto 1fr;
gap: 0.5rem;
}
h1 {
display: flex;
align-items: center;
gap: 8px;
font-weight: 600;
color: #fff;
margin: 0;
font-size: 22px;
}
.actions {
display: flex;
align-items: start;
justify-content: flex-end;
gap: 0.25rem;
.toggle-container {
display: flex;
align-items: center;
label {
font-size: 0.8rem;
}
}
}
</style>
<h1>PocketBase</h1>
<astro-dev-toolbar-badge badge-style="yellow">
${packageJson.version}
</astro-dev-toolbar-badge>
<div class="actions">
${realtime
? /* HTML */ `
<div class="toggle-container">
<label
for="real-time"
title="Enable or disable real-time updates temporarily"
>
Real-time updates
</label>
<!-- real-time-toggle -->
</div>
`
: ""}
${hasContentLoader
? /* HTML */ `
<astro-dev-toolbar-button
id="refresh-content"
size="small"
button-style="green"
title="Right click to force refresh every collection"
>
Refresh content
</astro-dev-toolbar-button>
`
: ""}
</div>
`;
if (realtime) {
// Create the toggle for real-time updates
const realTimeToggle = document.createElement("astro-dev-toolbar-toggle");
realTimeToggle.input.id = "real-time-toggle";
realTimeToggle.input.title =
"Enable or disable real-time updates temporarily";
// Set the toggle state based on the local storage, default to true
realTimeToggle.input.checked = !(
localStorage.getItem("astro-integration-pocketbase:real-time") === "false"
);
realTimeToggle.input.addEventListener("change", () => {
// Store the toggle state in the local storage
localStorage.setItem(
"astro-integration-pocketbase:real-time",
realTimeToggle.input.checked.toString()
);
// Send the toggle state to the server
server.send(
"astro-integration-pocketbase:real-time",
realTimeToggle.input.checked
);
});
// Send the initial toggle state to the server
server.send(
"astro-integration-pocketbase:real-time",
realTimeToggle.input.checked
);
windowElement
.querySelector(".toggle-container")
?.appendChild(realTimeToggle);
}
if (hasContentLoader) {
// Add click listeners to the refresh button
const refresh = windowElement.querySelector(
"#refresh-content"
) as DevToolbarButton | null;
if (!refresh) {
throw new Error("The refresh button is missing");
}
refresh.addEventListener("click", () => {
server.send("astro-integration-pocketbase:refresh", { force: false });
});
refresh.addEventListener("contextmenu", (event) => {
event.preventDefault();
server.send("astro-integration-pocketbase:refresh", { force: true });
});
server.on(
"astro-integration-pocketbase:refresh",
({ loading }: { loading?: boolean }) => {
// Show loading state while refreshing content
if (loading) {
refresh.textContent = "Refreshing content...";
refresh.buttonStyle = "gray";
refresh.style.pointerEvents = "none";
} else {
refresh.textContent = "Refresh content";
refresh.buttonStyle = "green";
refresh.style.pointerEvents = "unset";
}
}
);
}
}