Add implementation
This commit is contained in:
210
dist/public/assets/_id_-cxsEKuSj.js
vendored
Normal file
210
dist/public/assets/_id_-cxsEKuSj.js
vendored
Normal file
@@ -0,0 +1,210 @@
|
||||
import { r as a, j as e, __tla as __tla_0 } from "./index-I8cR0Dsm.js";
|
||||
import { i as j, __tla as __tla_1 } from "./fullfat_bundler-C8o4MXnP.js";
|
||||
import { u as v, a as N } from "./index-ChbWTil4.js";
|
||||
import { h as p, a as w, u as C, v as k } from "./poll-BI_0HvZY.js";
|
||||
let $;
|
||||
let __tla = Promise.all([
|
||||
(() => {
|
||||
try {
|
||||
return __tla_0;
|
||||
} catch {
|
||||
}
|
||||
})(),
|
||||
(() => {
|
||||
try {
|
||||
return __tla_1;
|
||||
} catch {
|
||||
}
|
||||
})()
|
||||
]).then(async () => {
|
||||
const h = "p2p-poll-peer-id";
|
||||
function g() {
|
||||
return crypto.randomUUID();
|
||||
}
|
||||
function S() {
|
||||
if (typeof globalThis.localStorage > "u") return g();
|
||||
let s = localStorage.getItem(h);
|
||||
return s || (s = g(), localStorage.setItem(h, s)), s;
|
||||
}
|
||||
function D() {
|
||||
const s = v(), [r, d] = a.useState(false), l = a.useCallback(() => {
|
||||
d(s.peers.length > 0);
|
||||
}, [
|
||||
s
|
||||
]);
|
||||
return a.useEffect(() => {
|
||||
l();
|
||||
const o = () => l();
|
||||
return s.networkSubsystem.on("peer", o), s.networkSubsystem.on("peer-disconnected", o), () => {
|
||||
s.networkSubsystem.off("peer", o), s.networkSubsystem.off("peer-disconnected", o);
|
||||
};
|
||||
}, [
|
||||
s,
|
||||
l
|
||||
]), e.jsxs("div", {
|
||||
className: "flex items-center gap-2 text-xs text-gray-500",
|
||||
children: [
|
||||
e.jsx("span", {
|
||||
className: `inline-block h-2 w-2 rounded-full ${r ? "bg-green-500" : "bg-yellow-500"}`
|
||||
}),
|
||||
r ? "Connected" : "Connecting..."
|
||||
]
|
||||
});
|
||||
}
|
||||
function I({ docUrl: s }) {
|
||||
const [r, d] = N(s), [l, o] = a.useState(""), [b, u] = a.useState(false), i = a.useMemo(() => S(), []);
|
||||
if (!r) return e.jsx("div", {
|
||||
className: "flex items-center justify-center py-12",
|
||||
children: e.jsx("div", {
|
||||
className: "text-gray-500",
|
||||
children: "Loading poll..."
|
||||
})
|
||||
});
|
||||
const c = r.options.reduce((t, n) => t + n.votes.length, 0), x = () => {
|
||||
const t = l.trim();
|
||||
t && (d((n) => w(n, t)), o(""));
|
||||
}, f = (t) => {
|
||||
p(r, t, i) ? d((n) => C(n, t, i)) : d((n) => k(n, t, i));
|
||||
}, y = () => {
|
||||
const t = window.location.href;
|
||||
navigator.clipboard.writeText(t).then(() => {
|
||||
u(true), setTimeout(() => u(false), 2e3);
|
||||
});
|
||||
};
|
||||
return e.jsxs("div", {
|
||||
className: "space-y-6",
|
||||
children: [
|
||||
e.jsxs("div", {
|
||||
className: "flex items-start justify-between",
|
||||
children: [
|
||||
e.jsxs("div", {
|
||||
children: [
|
||||
e.jsx("h2", {
|
||||
className: "text-2xl font-bold",
|
||||
children: r.title
|
||||
}),
|
||||
e.jsxs("p", {
|
||||
className: "mt-1 text-sm text-gray-500",
|
||||
children: [
|
||||
c,
|
||||
" vote",
|
||||
c !== 1 ? "s" : "",
|
||||
" total"
|
||||
]
|
||||
})
|
||||
]
|
||||
}),
|
||||
e.jsx(D, {})
|
||||
]
|
||||
}),
|
||||
e.jsxs("div", {
|
||||
className: "space-y-3",
|
||||
children: [
|
||||
r.options.map((t) => {
|
||||
const n = p(r, t.id, i), m = c > 0 ? t.votes.length / c * 100 : 0;
|
||||
return e.jsxs("div", {
|
||||
className: "relative overflow-hidden rounded-lg border border-gray-200 bg-white",
|
||||
children: [
|
||||
e.jsx("div", {
|
||||
className: "absolute inset-y-0 left-0 bg-blue-50 transition-all duration-300",
|
||||
style: {
|
||||
width: `${m}%`
|
||||
}
|
||||
}),
|
||||
e.jsxs("div", {
|
||||
className: "relative flex items-center justify-between px-4 py-3",
|
||||
children: [
|
||||
e.jsxs("button", {
|
||||
onClick: () => f(t.id),
|
||||
className: `flex items-center gap-2 text-left text-sm font-medium ${n ? "text-blue-600" : "text-gray-700 hover:text-blue-600"}`,
|
||||
children: [
|
||||
e.jsx("span", {
|
||||
className: `flex h-5 w-5 items-center justify-center rounded border text-xs ${n ? "border-blue-600 bg-blue-600 text-white" : "border-gray-300"}`,
|
||||
children: n ? "\u2713" : ""
|
||||
}),
|
||||
t.text
|
||||
]
|
||||
}),
|
||||
e.jsxs("span", {
|
||||
className: "text-sm text-gray-500",
|
||||
children: [
|
||||
t.votes.length,
|
||||
" (",
|
||||
m.toFixed(0),
|
||||
"%)"
|
||||
]
|
||||
})
|
||||
]
|
||||
})
|
||||
]
|
||||
}, t.id);
|
||||
}),
|
||||
r.options.length === 0 && e.jsx("p", {
|
||||
className: "py-4 text-center text-sm text-gray-400",
|
||||
children: "No options yet. Add one below!"
|
||||
})
|
||||
]
|
||||
}),
|
||||
e.jsxs("div", {
|
||||
className: "flex gap-2",
|
||||
children: [
|
||||
e.jsx("input", {
|
||||
type: "text",
|
||||
value: l,
|
||||
onChange: (t) => o(t.target.value),
|
||||
onKeyDown: (t) => t.key === "Enter" && x(),
|
||||
placeholder: "Add an option...",
|
||||
className: "flex-1 rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500"
|
||||
}),
|
||||
e.jsx("button", {
|
||||
onClick: x,
|
||||
className: "rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700",
|
||||
children: "Add"
|
||||
})
|
||||
]
|
||||
}),
|
||||
e.jsx("div", {
|
||||
className: "border-t border-gray-200 pt-4",
|
||||
children: e.jsx("button", {
|
||||
onClick: y,
|
||||
className: "rounded-md border border-gray-300 px-3 py-1.5 text-sm text-gray-600 hover:bg-gray-50",
|
||||
children: b ? "Copied!" : "Copy shareable link"
|
||||
})
|
||||
})
|
||||
]
|
||||
});
|
||||
}
|
||||
function U({ id: s }) {
|
||||
const r = `automerge:${s}`;
|
||||
return j(r) ? e.jsx("div", {
|
||||
className: "rounded-lg border border-gray-200 bg-white p-6 shadow-sm",
|
||||
children: e.jsx(I, {
|
||||
docUrl: r
|
||||
})
|
||||
}) : e.jsxs("div", {
|
||||
className: "rounded-lg border border-red-200 bg-red-50 p-6 text-center",
|
||||
children: [
|
||||
e.jsx("h2", {
|
||||
className: "text-lg font-semibold text-red-800",
|
||||
children: "Invalid Poll ID"
|
||||
}),
|
||||
e.jsx("p", {
|
||||
className: "mt-2 text-sm text-red-600",
|
||||
children: "The poll ID in the URL is not valid."
|
||||
}),
|
||||
e.jsx("a", {
|
||||
href: "/",
|
||||
className: "mt-4 inline-block text-sm text-blue-600 hover:underline",
|
||||
children: "Go back home"
|
||||
})
|
||||
]
|
||||
});
|
||||
}
|
||||
$ = {
|
||||
default: U
|
||||
};
|
||||
});
|
||||
export {
|
||||
__tla,
|
||||
$ as export_4af94835fa0f
|
||||
};
|
||||
Reference in New Issue
Block a user