mirror of
https://github.com/kou029w/quot.git
synced 2025-01-31 14:28:06 +00:00
Compare commits
3 commits
b725b250d3
...
f29cc8e838
Author | SHA1 | Date | |
---|---|---|---|
f29cc8e838 | |||
e8883d1ef4 | |||
624566a6d0 |
9 changed files with 76 additions and 24 deletions
|
@ -1,5 +1,5 @@
|
||||||
:root {
|
:root {
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
--nc-font-sans: sans-serif;
|
--nc-font-sans: sans-serif;
|
||||||
--nc-font-mono: monospace;
|
--nc-font-mono: monospace;
|
||||||
--nc-lk-1: #1875d1;
|
--nc-lk-1: #1875d1;
|
||||||
|
@ -9,11 +9,13 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
padding-inline: 1rem;
|
padding-inline: 0.75rem;
|
||||||
max-inline-size: 80rem;
|
max-inline-size: 80rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
header {
|
header {
|
||||||
|
padding-block: 1.25rem;
|
||||||
|
margin-bottom: 0.75rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-evenly;
|
justify-content: space-evenly;
|
||||||
|
@ -21,6 +23,7 @@ header {
|
||||||
|
|
||||||
header h1 {
|
header h1 {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
font-size: 1.85rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
header h1 > :is(a, a:hover) {
|
header h1 > :is(a, a:hover) {
|
||||||
|
@ -28,7 +31,8 @@ header h1 > :is(a, a:hover) {
|
||||||
}
|
}
|
||||||
|
|
||||||
header nav > * {
|
header nav > * {
|
||||||
font-size: 1.55rem;
|
margin: 0.75rem;
|
||||||
|
font-size: 1.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
a[href^="/"] {
|
a[href^="/"] {
|
||||||
|
|
|
@ -2,11 +2,13 @@ import "./app.css";
|
||||||
import { createSignal } from "solid-js";
|
import { createSignal } from "solid-js";
|
||||||
import Index from "./pages/index";
|
import Index from "./pages/index";
|
||||||
import Page from "./pages/page";
|
import Page from "./pages/page";
|
||||||
|
import Random from "./pages/random";
|
||||||
import random from "./helpers/random";
|
import random from "./helpers/random";
|
||||||
import { decodeJwt } from "jose";
|
import { decodeJwt } from "jose";
|
||||||
|
|
||||||
const routes = {
|
const routes = {
|
||||||
"/": Index,
|
"/": Index,
|
||||||
|
"/random": Random,
|
||||||
};
|
};
|
||||||
|
|
||||||
async function updateUser(jwt: string): Promise<boolean> {
|
async function updateUser(jwt: string): Promise<boolean> {
|
||||||
|
@ -70,6 +72,7 @@ export default () => {
|
||||||
</h1>
|
</h1>
|
||||||
<nav>
|
<nav>
|
||||||
<a href={authenticated ? "/new" : "/login"}>📄</a>
|
<a href={authenticated ? "/new" : "/login"}>📄</a>
|
||||||
|
<a href="/random">🔀</a>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
{routes[pathname()] ?? (
|
{routes[pathname()] ?? (
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
.card {
|
.card {
|
||||||
margin: unset;
|
margin: unset;
|
||||||
padding: 1rem;
|
padding: 0.25rem 0.75rem;
|
||||||
|
font-size: 0.75rem;
|
||||||
aspect-ratio: 1;
|
aspect-ratio: 1;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
@ -13,6 +14,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.card h2 {
|
.card h2 {
|
||||||
|
margin: unset;
|
||||||
padding: unset;
|
padding: unset;
|
||||||
font-size: unset;
|
font-size: unset;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.cards {
|
.cards {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 1rem;
|
gap: 0.75rem;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(10.5rem, 1fr));
|
||||||
}
|
}
|
||||||
|
|
||||||
.cards > a:hover::after {
|
.cards > a:hover::after {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
.editor {
|
.editor {
|
||||||
padding: 1rem;
|
padding: 0.75rem;
|
||||||
|
font-size: 1rem;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
background-color: var(--nc-bg-2);
|
background-color: var(--nc-bg-2);
|
||||||
color: var(--nc-tx-2);
|
color: var(--nc-tx-2);
|
||||||
|
@ -11,7 +12,7 @@
|
||||||
|
|
||||||
.editor :is(h1, h2, h3, h4, h5, h6) {
|
.editor :is(h1, h2, h3, h4, h5, h6) {
|
||||||
padding: unset;
|
padding: unset;
|
||||||
font-size: unset;
|
font-size: 1.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.editor p {
|
.editor p {
|
||||||
|
|
|
@ -75,7 +75,9 @@ export default (props: {
|
||||||
return `${" ".repeat(indent)}${line.getTextContent()}`;
|
return `${" ".repeat(indent)}${line.getTextContent()}`;
|
||||||
});
|
});
|
||||||
const text = [title, ...lines].join("\n");
|
const text = [title, ...lines].join("\n");
|
||||||
|
if (props.text !== text) {
|
||||||
props.onUpdatePage({ id: props.id, title, text });
|
props.onUpdatePage({ id: props.id, title, text });
|
||||||
|
}
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
21
app/views/pages/random.tsx
Normal file
21
app/views/pages/random.tsx
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
import { createEffect, createResource } from "solid-js";
|
||||||
|
import type Pages from "../../protocol/pages";
|
||||||
|
import random from "../helpers/random";
|
||||||
|
|
||||||
|
async function randomPage(): Promise<Pages.ResponsePage> {
|
||||||
|
const jwt = window.localStorage.getItem("jwt");
|
||||||
|
const res = await fetch(
|
||||||
|
`${import.meta.env.QUOT_API_ENDPOINT}/pages?order=random&limit=1`,
|
||||||
|
{ headers: jwt ? { authorization: `Bearer ${jwt}` } : {} }
|
||||||
|
);
|
||||||
|
const data = (await res.json()) as Pages.Response;
|
||||||
|
return data[0]!;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
const [page] = createResource(random(), randomPage);
|
||||||
|
createEffect(() => {
|
||||||
|
if (!page.loading) window.location.replace(`/${page()!.id.toString(16)}`);
|
||||||
|
});
|
||||||
|
return null;
|
||||||
|
};
|
7
db/migrations/20220907130637_random_pages.sql
Normal file
7
db/migrations/20220907130637_random_pages.sql
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
-- migrate:up
|
||||||
|
CREATE FUNCTION random(pages) RETURNS DOUBLE PRECISION LANGUAGE SQL AS $$
|
||||||
|
SELECT random();
|
||||||
|
$$;
|
||||||
|
|
||||||
|
-- migrate:down
|
||||||
|
DROP FUNCTION random(pages);
|
|
@ -9,20 +9,6 @@ SET xmloption = content;
|
||||||
SET client_min_messages = warning;
|
SET client_min_messages = warning;
|
||||||
SET row_security = off;
|
SET row_security = off;
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: update_timestamp(); Type: FUNCTION; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE FUNCTION public.update_timestamp() RETURNS trigger
|
|
||||||
LANGUAGE plpgsql
|
|
||||||
AS $$
|
|
||||||
BEGIN
|
|
||||||
NEW.updated = CURRENT_TIMESTAMP;
|
|
||||||
RETURN NEW;
|
|
||||||
END
|
|
||||||
$$;
|
|
||||||
|
|
||||||
|
|
||||||
SET default_tablespace = '';
|
SET default_tablespace = '';
|
||||||
|
|
||||||
SET default_table_access_method = heap;
|
SET default_table_access_method = heap;
|
||||||
|
@ -42,6 +28,31 @@ CREATE TABLE public.pages (
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: random(public.pages); Type: FUNCTION; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE FUNCTION public.random(public.pages) RETURNS double precision
|
||||||
|
LANGUAGE sql
|
||||||
|
AS $$
|
||||||
|
SELECT random();
|
||||||
|
$$;
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: update_timestamp(); Type: FUNCTION; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE FUNCTION public.update_timestamp() RETURNS trigger
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
BEGIN
|
||||||
|
NEW.updated = CURRENT_TIMESTAMP;
|
||||||
|
RETURN NEW;
|
||||||
|
END
|
||||||
|
$$;
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: pages_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
-- Name: pages_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
@ -186,4 +197,5 @@ CREATE POLICY users_policy ON public.users USING ((id = ((current_setting('reque
|
||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO public.schema_migrations (version) VALUES
|
INSERT INTO public.schema_migrations (version) VALUES
|
||||||
('0');
|
('0'),
|
||||||
|
('20220907130637');
|
||||||
|
|
Loading…
Add table
Reference in a new issue