Skip to content

Instantly share code, notes, and snippets.

@deviationist
deviationist / TextFit.tsx
Last active April 7, 2024 12:49
A function-based React-component that will scale font size up/down to use all available space inside a container. Uses Tailwind CSS.
import React, { useEffect, useState, useRef, useCallback } from 'react';
type Props = {
text: string
maxSize?: number
minSize?: number
maxHeight?: number
fontStepSize?: number
containerWidthMargin?: number
initialHidden?: boolean
@deviationist
deviationist / heic2jpeg.ts
Last active March 12, 2024 17:27
A simple HEIC to JPEG-implementation for Node using libheif-js (https://www.npmjs.com/package/libheif-js) and canvas (https://www.npmjs.com/package/canvas). Not type safe, should be refined. Based of catdad-experiments/heic-convert.
import libheif from 'libheif-js';
import { ImageData, Canvas, createCanvas } from 'canvas'
type Props = {
buffer: Buffer;
quality: number;
};
const processSingleImage = (image: any): Promise<any> => {
return new Promise((resolve, reject) => {
@deviationist
deviationist / useDebounce.ts
Created March 7, 2024 18:35
A simple debouce use-hook for React and TypeScript
import { useEffect, useRef } from 'react';
export const useDebounce = (callback: Function, delay: number) => {
const timeoutRef = useRef<null|NodeJS.Timeout>(null);
useEffect(() => {
return () => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
};
}, []);
@deviationist
deviationist / unique-email-field.ts
Last active February 9, 2024 23:16
Sanity unique e-mail field
defineField({
name: 'email',
title: 'Email',
type: 'string',
readOnly: ({document}) => document?.origin === 'Checkin',
description: 'Can only be changed in Checkin if the origin is "Checkin".',
validation: Rule => Rule.required().email().custom(async (email: any, context: any) => {
const response = await client.fetch(`*[_type == "user" && email == $email && !(_id in [$draftId, $id])]`, {email, draftId: context.document._id, id: context.document._id.replace('drafts.', '')});
if (response?.length > 0) {
return 'Email already in use';
@deviationist
deviationist / macos-bootable-usb.txt
Created January 12, 2024 18:13
Create macOS bootable USB on a M1 Macbook (High Sierra in this example)
You might need to format the USB-stick with Mac Extended (Journaled) before starting this process.
This guide is primarily based on Apple's own guide (https://support.apple.com/en-us/101578), but it solves other issues which is not adressed by Apple.
1. Download Mist: https://github.com/ninxsoft/Mist
Go the the release-page and download the latest "dmg"-file.
https://github.com/ninxsoft/Mist/releases
2. Extract the app-file and place it in your Applications-folder
3. Open the app-file (you might need to right click it and click "Open"), then click "Open" again to proceed.
@deviationist
deviationist / gist:51cf2caf8d8e7db117d87cb2a1a5d23a
Created November 12, 2023 12:16
Downsample an AIFF-file using FFMPEG.
ffmpeg -y -nostdin -i a.aiff -ar 44100 -write_id3v2 1 -c:v copy b.aiff
@deviationist
deviationist / shallow-router.tsx
Created June 30, 2023 10:09
A bare simple class made for Next.js with static methods to use as a shallow router (triggering changes in the URL without Next acting on them).
export class ShallowRouter {
static push(url: string): void {
window.history.pushState({ ...window.history.state, as: url, url }, '', url);
}
static replace(url: string): void {
window.history.replaceState({ ...window.history.state, as: url, url }, '', url);
}
}
@deviationist
deviationist / useEffectNonInit.ts
Last active March 11, 2024 15:45
React's useEffect, but it does not run on initial render. Now with TypeScript-support.
/* eslint-disable react-hooks/exhaustive-deps */
import { useEffect, useRef, DependencyList } from 'react';
export const useEffectNonInit = (effect: Function, deps: DependencyList = []) => {
const isInitial = useRef<boolean>(true);
useEffect(() => {
if (isInitial.current) {
isInitial.current = false;
return;
}
effect();
@deviationist
deviationist / audio-file-extension-check.sh
Created June 2, 2023 22:10
File counter grouped by file extension, tailored for audio files.
#!/usr/bin/env bash
echo "File type count:"
fileExtensions=( aiff mp3 wav m4a flac alac )
totalFileCount=$(find . -name "*.aiff" -o -name "*.mp3" -o -name "*.wav" -o -name "*.m4a" -o -name "*.flac" -o -name "*.alac" | wc -l)
for fileExtension in "${fileExtensions[@]}"
do
fileCount=$(find . -name "*.${fileExtension}" | wc -l)
@deviationist
deviationist / remove-all-sharing.js
Last active May 9, 2023 09:28
This is a script that will traverse all your Google Drive files and remove all sharing (owner access only).
// Ensure you've installed gdrive first: https://github.com/glotlabs/gdrive
import { spawnSync } from 'child_process';
const delimiter = ';;;';
let files = [];
function getRawFiles(parent) {
const args = ['files', 'list', `--field-separator=${delimiter}`];
if (parent) {
args.push(`--parent=${parent}`);