Skip to content

Instantly share code, notes, and snippets.

View rpggio's full-sized avatar

Ryan P Smith rpggio

View GitHub Profile
@rpggio
rpggio / README.md
Last active January 25, 2023 01:22
GraphQL Code Generator setup for AppSync

Codegen

Configure AWS console

aws configure sso

# Role: PowerUser
# Profile name: Enter 'default' to make this the default profile used for all AWS commands 
@rpggio
rpggio / parseOrNull.ts
Last active September 26, 2024 20:28
React hook to persist MUI DataGrid column settings
/**
* If argument is a string, try to parse as JSON.
* Otherwise return null.
*/
export function parseOrNull(raw: unknown) {
if (!raw) return null
if (typeof raw === 'string') {
try {
return JSON.parse(raw)
@rpggio
rpggio / store.ts
Last active November 5, 2020 22:14
Basic reactive store
import type { Reactive, Subscriber, Store } from './types'
export function Store<S>(initial: S): Store<S> {
let current = initial
const subscribers = new Set<Subscriber<S>>()
function subscribe(subscriber: Subscriber<S>) {
subscribers.add(subscriber)
return () => unsubscribe(subscriber as VoidFunction)
}
@rpggio
rpggio / ReactiveMap.ts
Created October 27, 2020 02:56
Reactive Map that can be subscribed, such as by React hooks
export function ReactiveMap<K, V>(map: Map<K, V>): ReactiveMap<K, V> {
const subscribers = new Set<Subscriber<MapState<K, V>>>()
function notify() {
const state: MapState<K, V> = [Array.from(map.entries()), map]
subscribers.forEach(subscriber => subscriber(state))
}
function unsubscribe(subscriber: Subscriber<MapState<K, V>>) {
@rpggio
rpggio / ComplexKeyedMap.ts
Created October 27, 2020 02:39
Generic Map with complex key, in TypeScript
export function ComplexKeyedMap<K, V>(
formatter: StringFormatter<K>,
entries?: readonly (readonly [K, V])[] | null
): Map<K, V> {
const map = new Map<string, V>(
entries?.map(([k, v]) => [formatter.asString(k), v])
)
function* getEntries() {
@rpggio
rpggio / GoogleDocFrame.tsx
Last active October 22, 2024 03:33
Automatic retry for iframe loading (workaround for Google Doc Viewer 204 issue)
function GoogleDocFrame({ url }: { url: string }) {
const frameRef = useRef<HTMLIFrameElement>(null)
const viewerUrl = `https://docs.google.com/viewer?embedded=true&url=${url}`
let cancel: () => void | undefined
useEffect(() => {
cancel = setFrameSrcWithRetry(frameRef.current!, viewerUrl, true)
// unmount
return () => {
if (cancel) {
Verifying my Blockstack ID is secured with the address 1EbxrkJezeMR8LqeKVVBGoSfzA6MbrwfRh https://explorer.blockstack.org/address/1EbxrkJezeMR8LqeKVVBGoSfzA6MbrwfRh
Verifying my Blockstack ID is secured with the address 1EbxrkJezeMR8LqeKVVBGoSfzA6MbrwfRh https://explorer.blockstack.org/address/1EbxrkJezeMR8LqeKVVBGoSfzA6MbrwfRh
Verifying my Blockstack ID is secured with the address 1EbxrkJezeMR8LqeKVVBGoSfzA6MbrwfRh https://explorer.blockstack.org/address/1EbxrkJezeMR8LqeKVVBGoSfzA6MbrwfRh
Verifying my Blockstack ID is secured with the address 1EbxrkJezeMR8LqeKVVBGoSfzA6MbrwfRh https://explorer.blockstack.org/address/1EbxrkJezeMR8LqeKVVBGoSfzA6MbrwfRh