1
0
Fork 0
mirror of https://github.com/kou029w/quot.git synced 2025-01-19 00:18:09 +00:00

use refetch

This commit is contained in:
Nebel 2022-08-24 12:49:02 +09:00
parent 851b942276
commit 86afc69f56
4 changed files with 68 additions and 48 deletions

View file

@ -1,29 +1,10 @@
import type Pages from "../protocol/pages";
import "./editor.css";
import beforeunload from "../helpers/beforeunload";
import throttle from "../helpers/throttle";
const intervalMs = 333;
const { block, unblock } = beforeunload();
const updatePage = throttle(async function (params: {
export default (props: {
id: number;
title: string;
text: string;
}) {
const res = await fetch(
new URL(`/pages?id=eq.${params.id}`, import.meta.env.QUOT_API_URL),
{
method: "PUT",
headers: { "content-type": "application/json" },
body: JSON.stringify(params),
}
);
if (res.ok) unblock();
},
intervalMs);
export default (props: { id: number }) => {
onUpdatePage: (content: Pages.RequestContentPage) => void;
}) => {
return (
<textarea
id={String(props.id)}
@ -32,8 +13,7 @@ export default (props: { id: number }) => {
onInput={(e) => {
const text = e.currentTarget.value;
const lines = text.split("\n");
block();
updatePage({ id: props.id, title: lines[0] ?? "", text });
props.onUpdatePage({ id: props.id, title: lines[0] ?? "", text });
e.currentTarget.setAttribute("rows", String(Math.max(2, lines.length)));
}}
></textarea>

View file

@ -1,19 +1,12 @@
import { createResource } from "solid-js";
import type Pages from "../protocol/pages";
type PagesResponse = Array<{
id: number;
title: string;
text: string;
created: string;
updated: string;
}>;
async function fetchPages(): Promise<PagesResponse> {
async function fetchPages(): Promise<Pages.Response> {
const res = await fetch(
new URL("/pages?order=updated.desc", import.meta.env.QUOT_API_URL)
);
const data = await res.json();
return data as PagesResponse;
const data = (await res.json()) as Pages.Response;
return data;
}
export default () => {

View file

@ -1,28 +1,55 @@
import { createResource } from "solid-js";
import type Pages from "../protocol/pages";
import Editor from "../components/editor";
import beforeunload from "../helpers/beforeunload";
import throttle from "../helpers/throttle";
type PageResponse = {
id: number;
title: string;
text: string;
created: string;
updated: string;
};
const intervalMs = 333;
const { block, unblock } = beforeunload();
async function fetchPage(id: number): Promise<PageResponse> {
async function updatePage(
id: number,
content: Pages.RequestContentPage
): Promise<boolean> {
const res = await fetch(
new URL(`/pages?id=eq.${id}`, import.meta.env.QUOT_API_URL),
{
method: "PUT",
headers: { "content-type": "application/json" },
body: JSON.stringify(content),
}
);
return res.ok;
}
async function fetchPage(id: number): Promise<Pages.RequestContentPage> {
const res = await fetch(
new URL(`/pages?id=eq.${id}`, import.meta.env.QUOT_API_URL)
);
const [data] = await res.json();
return data as PageResponse;
const data = (await res.json()) as Pages.Response;
return data[0]!;
}
export default (props: { id: number }) => {
const [page] = createResource(props.id, fetchPage);
const [page, { refetch }] = createResource(props.id, fetchPage);
const throttledUpdate = throttle(
async (id: number, content: Pages.RequestContentPage) => {
if (await updatePage(id, content)) {
unblock();
refetch();
}
},
intervalMs
);
function onUpdatePage(content: Pages.RequestContentPage) {
block();
throttledUpdate(props.id, content);
}
return (
<main>
<Editor id={props.id} />
<Editor id={props.id} onUpdatePage={onUpdatePage} />
<pre>{() => JSON.stringify(page(), null, " ")}</pre>
</main>
);

20
app/src/protocol/pages.ts Normal file
View file

@ -0,0 +1,20 @@
namespace Pages {
export type RequestContentPage = {
id?: number;
title: string;
text: string;
};
export type ResponsePage = {
id: number;
title: string;
text: string;
created: string;
updated: string;
};
export type RequestContent = Array<RequestContentPage>;
export type Response = Array<ResponsePage>;
}
export default Pages;