Skip to content

Instantly share code, notes, and snippets.

View freddi301's full-sized avatar

Frederik Batuna freddi301

View GitHub Profile
@freddi301
freddi301 / Parser.idr
Created July 16, 2024 04:56
Idris 2 Parser based on combinators
module Parser
import Data.Nat
import Data.List
%default total
-- interface Codec input output where
-- encode : input -> output
-- decode : output -> Maybe input
@freddi301
freddi301 / validation.ts
Created May 22, 2024 00:16
typescript validation library experiment
export type Outcome<Value, Report> = { type: "valid"; value: Value } | { type: "invalid"; reports: Array<Report> };
export type ValidatorSyncBase<Value, Report> = {
validateSync(value: unknown): Outcome<Value, Report>;
};
export function makeValidatorSync<const Value, const Report>(validatorSyncBase: ValidatorSyncBase<Value, Report>) {
return {
...validatorSyncBase,
refine: refine(validatorSyncBase),
@freddi301
freddi301 / build.gradle
Last active February 15, 2024 13:49
Liferay workspace adapt react app portlet
apply plugin: 'maven-publish'
/*
* Fix NodeJS version
*/
node.nodeVersion="20.11.1"
node.npmVersion="10.2.4"
/*
* Fix for artifact deploy
@freddi301
freddi301 / web-accessibility.txt
Last active February 8, 2024 09:53
Web Accessibility checklist
- check with browser plugin "wave" and "axe" also chrome lighthouse accesibility
open chrome inspect element and see the accesibility tree
- generally copy accessibility from mui.com components
- banner role (first <header> in page) should contain title, logo, optionally nav
- contentinfo role (first <footer> in page)
- <main/> (ensure there is only one so that user can skip over heading and sides to most important content)
- <aside/>
@freddi301
freddi301 / useGeolocation.ts
Last active February 7, 2024 10:15
React hook for geolocation
import React from "react";
export function useGeolocation({
isEnabled,
positionOptions: { enableHighAccuracy, maximumAge, timeout },
startTransition,
}: {
isEnabled: boolean;
positionOptions: PositionOptions;
startTransition?(update: () => void): void;
@freddi301
freddi301 / useDomSize.tsx
Created September 15, 2023 08:53
React hook to measure an element before rendering it
/**
* React hook to measure an element before rendering it
* given some jsx it renders it in a hidden div then measures its size
* the hook returns width and height and portal
* @important the portal must be in the page to be able to render the hidden div for measurements
* @warning the jsx will be renred probably twice, once for measurement, and where you actually use it
*/
export function useDomSize(children: JSX.Element) {
const [width, setWidth] = React.useState(0);
const [height, setHeight] = React.useState(0);
@freddi301
freddi301 / configuration.json
Last active January 17, 2024 15:03
Liferay React Portlet TypeScript integration
// this files goes to feature/configuration.json
// it lets you setup configuration fields for a portlet
// it work with an adapted create-react-app for liferay https://help.liferay.com/hc/en-us/articles/360035467712-Adapting-Existing-Apps-to-Run-on-Liferay-DXP
{
"$schema": "https://raw.githubusercontent.com/liferay/liferay-js-toolkit/master/resources/schemas/configuration.schema.json",
"system": {
"category": "react-js-toolkit",
"name": "react-js-toolkit",
"fields": {
"fruit": {
@freddi301
freddi301 / setup
Last active January 24, 2024 10:49
MSW configuration for create-react-app
import { setupWorker } from 'msw/browser'
// https://mswjs.io/docs/best-practices/typescript
// also ensure there is .env or env.local file
// with PUBLIC_URL=index set to something otherwise chrome wont load the mock service worker
const worker = setupWorker(/* here goes handlers */);
if (process.env.NODE_ENV === "development") {
@freddi301
freddi301 / useValueWithTimeToLive.ts
Created May 5, 2023 08:30
useValueWithTimeToLive
function useValueWithTimeToLive<T>() {
const [state, setState] = React.useState<{ value: T | undefined; timeToLive: number | undefined }>({
value: undefined,
timeToLive: undefined,
});
const setValueWithTimeToLive = React.useCallback((value: T, timeToLive: number) => {
setState({ value, timeToLive });
}, []);
React.useEffect(() => {
if (state.timeToLive !== undefined) {
@freddi301
freddi301 / moveItem.tsx
Last active December 20, 2022 14:48
Move item in array for drag drop reordering
function moveItem<T>(fromIndex: number, toIndex: number, array: Array<T>): Array<T> {
if (fromIndex < toIndex) {
return [...array.slice(0, fromIndex), ...array.slice(fromIndex + 1, toIndex + 1), array[fromIndex], ...array.slice(toIndex + 1)];
}
if (fromIndex > toIndex) {
return [...array.slice(0, toIndex), array[fromIndex], ...array.slice(toIndex, fromIndex), ...array.slice(fromIndex + 1)];
}
return array;
}