Skip to content

Instantly share code, notes, and snippets.

View samuelkarani's full-sized avatar

Samuel Karani samuelkarani

View GitHub Profile
//Original Reference: https://guseyn.com/posts/simple-jwt
function payloadWithExpirationTime (payload, minutesFromNow) {
let date = new Date()
date.setMinutes(date.getMinutes() + minutesFromNow)
payload.exp = date.getTime()
return payload
}
export function validURL(string) {
const pattern = new RegExp(
"^(https?:\\/\\/)?" + // protocol
"((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name
"((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address
"(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path
"(\\?[;&a-z\\d%_.~+=-]*)?" + // query string
"(\\#[-a-z\\d_]*)?$",
"i"
); // fragment locator
export const getThumbnail = (id, size = 300) =>
`https://drive.google.com/thumbnail?id=${id}&sz=${size}`;
export const getIcon = (mimeType) =>
`https://drive-thirdparty.googleusercontent.com/256/type/${mimeType}`;
export const getFile = (id) => `https://drive.google.com/uc?id=${id}`;
const downloadFile = (id) =>
@samuelkarani
samuelkarani / react-cache.ts
Last active May 25, 2023 10:15
Simple React "cache" api function. No clearing strategies e.g. LRU etc. Just simple interval clearing. Official version is currently available ONLY in react canaries and RSC environment i.e. “react-server” exports condition. Depends on object-hash package to create hash key from arguments and optional additional key.
import objectHash from "object-hash";
const cacheTimeout = 60 * 60 * 1000
let store: Record<string, unknown> = {};
export function cache<A extends unknown[], B = unknown>(
fn: (...args: A) => Promise<B>,
key?: string // optional key for guaranteed uniqueness
) {
export function useBoundingClientRect<T extends HTMLElement>() {
const [rect, setRect] = useState<DOMRect | null>(null);
const ref = useRef<T>(null);
const update = useCallback(() => {
if (ref.current) setRect(ref.current.getBoundingClientRect());
else setRect(null);
}, []);
useEffectOnce(() => {
[
"Adult",
"Arts & Entertainment",
"Autos & Vehicles",
"Beauty & Fitness",
"Books & Literature",
"Business & Industrial",
"Computers & Electronics",
"Finance",
"Food & Drink",
[
"/Adult",
"/Arts & Entertainment/Celebrities & Entertainment News",
"/Arts & Entertainment/Other",
"/Arts & Entertainment/Comics & Animation/Anime & Manga",
"/Arts & Entertainment/Comics & Animation/Cartoons",
"/Arts & Entertainment/Comics & Animation/Comics",
"/Arts & Entertainment/Comics & Animation/Other",
"/Arts & Entertainment/Entertainment Industry/Film & TV Industry",
"/Arts & Entertainment/Entertainment Industry/Recording Industry",
import { openai } from "@ai-sdk/openai";
import { streamText } from "ai";
export function OPTIONS() {
return new Response("OK", {
status: 200,
headers: {
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET,OPTIONS,PATCH,DELETE,POST,PUT",