Skip to content

Instantly share code, notes, and snippets.

View arleighdickerson's full-sized avatar
🦊
Returning to Westinghouse in the fall. Go Bulldogs! 🐶🤓🤠

Arleigh Dickerson arleighdickerson

🦊
Returning to Westinghouse in the fall. Go Bulldogs! 🐶🤓🤠
View GitHub Profile
import { Channel, NotUndefined } from '@redux-saga/types';
import { Buffer, channel, EventChannel, Saga } from 'redux-saga';
import * as effects from 'redux-saga/effects';
import _ from 'lodash';
import { cast, isInteger } from 'src/util/invariant';
export type THandleRequest<T extends NotUndefined> = Saga<[Channel<T>]>;
export type TCreatePipe<T extends NotUndefined> = Saga<[EventChannel<T>, Saga<[Channel<T>]>]>;
export interface CreatePipeOptions {
@arleighdickerson
arleighdickerson / uuid-util.ts
Created March 11, 2024 19:48
Utilities for uuids on the client side.
import _ from 'lodash';
export namespace uuidUtil {
const regexExp = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/gi;
export function isValidUuid(s: string) {
if (!_.isString(s)) {
return false;
}
if (_.isEmpty(s)) {
@arleighdickerson
arleighdickerson / url-util.ts
Created March 11, 2024 19:46
Utilities for working with preact-router
const { exec, getCurrentUrl } = require('preact-router');
export namespace urlUtil {
export const getUrlParameter = (name: string, location: Pick<Location, 'pathname' | 'search'>): string | null => {
if (typeof window === 'undefined') {
return null; // shim
}
const a = 'http://localhost' /* <-- dummy string for parsing */ + location.pathname + location.search;
const url = new URL(a);
return url.searchParams.has(name) ? url.searchParams.get(name) : null;
@arleighdickerson
arleighdickerson / AttributeChangeEmitter.java
Created February 28, 2024 18:28
A WebSocketSessionDecorator to listen for attribute changes
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.WebSocketSessionDecorator;
import java.util.Map;
import java.util.Objects;
@arleighdickerson
arleighdickerson / preact-layout.tsx
Created January 21, 2024 00:52
Preact Layout -- Patched for V10
// @ts-nocheck
// ¯\_(ツ)_/¯
import { ComponentChildren, ComponentType, Context, h, toChildArray } from 'preact';
function getChildren(node) {
return ((node || {}).props || {}).children;
}
function getComponentType(node) {
return (node || {}).type;
import { Component, ReactNode } from 'react';
interface Props {
loading: ReactNode;
ready: PromiseLike<any>;
beforeMount?: () => any;
afterLift?: () => any;
}
interface State {
import { CSSProperties, PropsWithChildren } from 'react';
import * as colors from 'tailwindcss/colors';
export interface ContentProps {
header?: string;
message?: string;
}
export enum Variant {
SPINNING,
import { validate } from 'validate.js';
import _ from 'lodash';
interface AnyObject {
[key: string]: any;
}
type ValidationErrors = AnyObject | undefined;
export interface ApiError {
export namespace idUtil {
export function create() {
let str = '';
for (let i = 0; i < 16; i += 1) {
const base = 'abcdefghijklmnopqrstuvwxyz234567'; //a-z, 2-7
const array = new Int32Array(1);
window.crypto.getRandomValues(array);
const j = array[0];
str +=
base[(j >>> 27) & 0x1f] +
@arleighdickerson
arleighdickerson / safe-invoke.ts
Created July 9, 2023 16:33
safeInvoke(obj, path[], ...args[])
import _ from 'lodash';
const invoke = new Proxy(_.invoke, {
apply(target, thisArg, argArray: any[]): any {
try {
return Reflect.apply(target, thisArg, argArray);
} catch (e) {
if (process.env.NODE_ENV === 'development') {
console.debug('[safe-invoke] discarding exception', e, ...argArray);
}