Skip to content

Instantly share code, notes, and snippets.

View alcatraz627's full-sized avatar
:electron:

Aakarsh Chopra alcatraz627

:electron:
View GitHub Profile
@alcatraz627
alcatraz627 / error.ts
Created April 8, 2025 14:38
Utilities for error management
import { AxiosError } from "axios";
export const DefaultErrorMessage = "An error occurred. please try again.";
export const getApiError = (error: unknown, defaultMessage = DefaultErrorMessage) => {
try {
if (typeof error === "string") {
return error;
}
if (error instanceof AxiosError) {
@alcatraz627
alcatraz627 / random.ts
Created April 8, 2025 14:38
Utilities for random IDs
import cryptoLib from "crypto";
/**
* Generate a random 32-byte buffer and convert it to a hex string
* @returns A random hex string
*/
export const generateResetToken = () => {
const token = cryptoLib.randomBytes(32).toString("hex");
return token;
};
@alcatraz627
alcatraz627 / iter.ts
Last active April 8, 2025 14:38
Utilities for iteration
import { get } from "lodash-es";
/** Takes a list of strings (`["a", "b", "c"]`) and returns a map (`{ a: "a", b: "b", c: "c" }`) */
export const strListToMap = (list: string[]) =>
Object.assign({}, ...list.map((item) => ({ [item]: item }))) as Record<string, string>;
// TODO: Handle nested keys like "a.b.c"
// TODO: Override iterator
export const listToMap = <
I extends Record<string, unknown> = Record<string, unknown>,
@alcatraz627
alcatraz627 / call-info.js
Created January 20, 2025 09:09 — forked from davidrapin/call-info.js
Wrap all functions of an Object for call info statistic (number of calls, sync time, promises time)
/**
* Usage:
* var dataServiceInfo = wrapForCallInfo(require('../services/data').prototype);
* process.on('exit', function() {
* dataServiceInfo.print('DataService');
* });
*
* @param {Object} toWrap an object (or its prototype) to wrap for call statistics gathering.
* @returns {{print:function, data:Object}}
*/
## The characters treated as closing brackets when justifying
## paragraphs. They cannot contain blank characters. Only closing
## punctuation, optionally followed by closing brackets, can end
## sentences.
##
set brackets ""')>]}"
## Constantly display the cursor position in the statusbar. Note that
## this overrides "quickblank".
# set const
@alcatraz627
alcatraz627 / .zprofile
Last active April 8, 2025 14:33
.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # This loads
nvm bash_completion
export PYENV_ROOT="$HOME/.pyenv"
export PYTHONPYCACHEPREFIX="${HOME}/.cache/Python"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
@alcatraz627
alcatraz627 / use-debounce.ts
Created January 20, 2025 08:56
Use debounce hook - React
import { useEffect, useState } from "react";
export const useDebounce = <V = string>(value: V, delay = 1000) => {
const [debouncedValue, setDebouncedValue] = useState<V>(value);
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
@alcatraz627
alcatraz627 / use-loading-state.ts
Created January 20, 2025 08:56
Use Loading State - React
import { useState } from "react";
export type LoadingState = "pending" | "success" | "error";
export const useLoadingState = (initial: LoadingState = "pending") => {
const [loadingState, setLoadingState] = useState<LoadingState>(initial);
const isPending = loadingState === "pending";
const isSuccess = loadingState === "success";
const isError = loadingState === "error";
@alcatraz627
alcatraz627 / use-lock-body-scroll.ts
Created January 20, 2025 08:55
Use lock body scroll - React
"use client";
import { useLayoutEffect, useState } from "react";
export const useLockBodyScroll = ({
enableInitial = false,
element = document.body,
}: {
enableInitial?: boolean;
element?: HTMLElement;
} = {}) => {
@alcatraz627
alcatraz627 / use-query-params.ts
Created January 20, 2025 08:55
Use Query Params React
"use client";
import { usePathname, useRouter, useSearchParams } from "next/navigation";
import { useEffect, useState } from "react";
import { QueryParams } from "../url";
export function useQueryParams() {
const router = useRouter();
const pathname = usePathname();
const _searchParams = useSearchParams();