Skip to content

Instantly share code, notes, and snippets.

View stavros-melidoniotis's full-sized avatar
:octocat:

Stavros Melidoniotis stavros-melidoniotis

:octocat:
View GitHub Profile
@stavros-melidoniotis
stavros-melidoniotis / mac-spoofing.sh
Created November 29, 2023 15:36
Change MAC address on macOS.
#!/bin/zsh
if [[ $EUID -ne 0 ]]; then
echo "This script must be run with sudo." >&2
exit 1
fi
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
echo "Usage: sudo ./script.sh <interface> <MAC_addr>"
echo "Sets the MAC address for the specified network interface."
echo "Arguments:"
@stavros-melidoniotis
stavros-melidoniotis / SkeletonImage.tsx
Created June 20, 2023 19:17
NextJS Image component with a skeleton placeholder
import Image, { ImageProps } from "next/image";
import { ReactNode, useState } from "react";
interface ISkeletonImageProps extends ImageProps {
skeleton: ReactNode;
}
const SkeletonImage = ({ skeleton, ...props }: ISkeletonImageProps) => {
const [showSkeleton, setShowSkeleton] = useState<boolean>(true);
const { alt, width, height, src, className } = props;
@stavros-melidoniotis
stavros-melidoniotis / useDebounce.tsx
Created June 20, 2023 05:43
React useDebounce hook
import { useEffect, useState } from "react";
export function useDebounce<T>(value: T, delay?: number): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value);
useEffect(() => {
const timer = setTimeout(() => setDebouncedValue(value), delay || 500);
return () => {
clearTimeout(timer);
@stavros-melidoniotis
stavros-melidoniotis / telegram.js
Created May 17, 2023 15:53
Send notifications via Telegram
const BOT_TOKEN = process.env.BOT_TOKEN;
const CHANNEL_ID = process.env.CHANNEL_ID;
export const sendMessage = async (message) => {
const options = {
method: "POST",
headers: {
accept: "application/json",
"User-Agent":
"Telegram Bot SDK - (https://github.com/irazasyed/telegram-bot-sdk)",
@stavros-melidoniotis
stavros-melidoniotis / useClickOutside.tsx
Created February 23, 2023 10:48
React hook for detecting clicks outside of an element
import { RefObject, useEffect } from 'react'
const useClickOutside = (ref: RefObject<any>, callback: Function) => {
useEffect(() => {
const listener = (e: MouseEvent | TouchEvent) => {
if (!ref.current || ref.current.contains(e.target)) {
return
}
callback(e)
@stavros-melidoniotis
stavros-melidoniotis / useMediaQuery.tsx
Created February 22, 2023 15:56
React hook for easy retrieval of media dimensions
import { useState, useEffect } from "react";
const useMediaQuery = (query: string) => {
const [matches, setMatches] = useState(false);
useEffect(() => {
const media = window.matchMedia(query);
if (media.matches !== matches) {
setMatches(media.matches);
@stavros-melidoniotis
stavros-melidoniotis / Search.jsx
Last active January 12, 2023 07:35
React component for searching values inside an array & highlighting matching keywords
import people from "./data";
const SearchBar = () => {
const [searchValue, setSearchValue] = useState("");
const searchResults =
searchValue.trim().length > 0
? people.filter((person) => {
const name = person.name;
@stavros-melidoniotis
stavros-melidoniotis / useFetch.jsx
Last active January 12, 2023 07:33
React hook for performing fetch calls
import { useState, useEffect } from 'react'
const useFetch = (url, options = {}) => {
const [loading, setLoading] = useState(true)
const [data, setData] = useState()
const [error, setError] = useState()
useEffect(() => {
const controller = new AbortController()
setLoading(true)
@stavros-melidoniotis
stavros-melidoniotis / human-readable-filesize.php
Created April 26, 2022 07:24
Return a file's size in human readable form
<?php
/**
* Return a file's size in human readable form
*
* @param int $bytes File's size in bytes
* @param int $decimals How many decimals on the returned value
*
* @return string The file's size in human readable form
*/
@stavros-melidoniotis
stavros-melidoniotis / social-share-links.php
Created April 26, 2022 07:19
Generate social share links for a given post in Wordpress