Skip to content

Instantly share code, notes, and snippets.

View l-portet's full-sized avatar
🤙

Lucas Portet l-portet

🤙
View GitHub Profile
import { DependencyList, EffectCallback, useEffect, useRef } from 'react';
export const useEffectWhen = (callback: EffectCallback, whatDeps: DependencyList, whenDeps: DependencyList) => {
const prevWhenValuesRef = useRef<DependencyList>([]);
useEffect(() => {
const prevWhenDeps = prevWhenValuesRef.current;
prevWhenValuesRef.current = whenDeps;
for (let i = 0; i < whenDeps.length; i++) {
@l-portet
l-portet / slack_old_layout.md
Last active December 15, 2023 15:08
Restore old Slack layout in the Electron app

Open the Slack app on dev mode

export SLACK_DEVELOPER_MENU=true && open /Applications/Slack.app/

Inject this in the localStorage

localStorage.setItem("localConfig_v2", localStorage.getItem("localConfig_v2").replace(/\"is_unified_user_client_enabled\":true/g, '\"is_unified_user_client_enabled\":false'))
@l-portet
l-portet / useEventBus.ts
Last active April 4, 2024 17:55
utility hook for event communication in React components
import { useEffect, useState } from 'react';
type Callback = (data?: any) => void;
class EventBus<E extends string = string> {
events: Partial<Record<E, Callback[]>>;
constructor() {
this.events = {};
}
@l-portet
l-portet / useTraceUpdate.ts
Created September 12, 2023 15:39
Trace what triggers a React component re-render
// extracted from https://github.com/damiangreen/use-trace-update
import { useEffect, useRef } from 'react';
export default function useTraceUpdate(props) {
const prev = useRef(props);
useEffect(() => {
const changedProps = Object.entries(props).reduce((ps, [k, v]) => {
if (prev.current[k] !== v) {
ps[k] = [prev.current[k], v];
// in tailwind.config.ts
// import flexPlugin from 'path/to/plugin.ts'
// export default {
// plugins: [flexPlugin]
// }
// usage: flex-<justify> or flex-<justify>-<align>
// ex: flex-between or flex-around-stretch
import plugin from 'tailwindcss/plugin';
@l-portet
l-portet / export-files-chatgpt.sh
Created June 20, 2023 06:42
Export files for ChatGPT
#!/bin/bash
# this script recursively exports all files in a directory
# the output will be copied your clipboard using a format
# that's easy to be interpreted by LLMs like chatgpt
function print_files {
for entry in "$1"/*
do
if [ -d "$entry" ]; then
@l-portet
l-portet / bypass-shopify-store-password.html
Created May 15, 2023 15:42
Automatically bypass a Shopify store public password page
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Redirecting...</title>
</head>
<body>
<form
method="post"
@l-portet
l-portet / fly-deploy-last-commit.sh
Last active August 28, 2023 08:59
fly deploy last commit instead of all files
#!/usr/bin/env bash
last_commit=$(git log --format="%h %s" -n 1)
echo "this will deploy your last local commit"
echo $last_commit
while true; do
read -p "Do you want to continue? (y/n) " yn
case $yn in
@l-portet
l-portet / dump-collection.mjs
Created March 27, 2023 10:04
Dump a mongo collection
import 'dotenv/config';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import { MongoClient } from 'mongodb';
const DB_NAME = '';
const COLLECTION_NAME = '';
@l-portet
l-portet / find-all-props.js
Created August 26, 2022 07:22
Find all properties & methods of an object, up to the root prototype
// Find all properties & methods of an object, up to the root prototype
function findAllProps(obj, props = []) {
if (!obj) {
return props;
}
return findAllProps(Object.getPrototypeOf(obj), [
...props,
Object.getOwnPropertyNames(obj),
]);
}