first commit

This commit is contained in:
2024-03-20 00:12:01 +03:00
commit 1e0ab27b74
148 changed files with 12934 additions and 0 deletions

7
utils/hashCode.ts Normal file
View File

@@ -0,0 +1,7 @@
export const hashCode = function(s: string) {
var h = 0, l = s.length, i = 0;
if ( l > 0 )
while (i < l)
h = (h << 5) - h + s.charCodeAt(i++) | 0;
return h;
};

5
utils/isServer.tsx Normal file
View File

@@ -0,0 +1,5 @@
function useIsServer() {
return typeof window === 'undefined';
}
export default useIsServer;

3
utils/smooth.ts Normal file
View File

@@ -0,0 +1,3 @@
export const smooth = (value: number, target: number, smoothing: number) => {
return value - (value - target) * smoothing;
};

34
utils/useFrame.ts Normal file
View File

@@ -0,0 +1,34 @@
import { useEffect } from 'react';
type callbackType = (delta: number, time: number) => void;
const subscribers = new Set<callbackType>();
let isMounted = true;
let lastScrollY = 0;
let lastTime = 0;
const frame = (time: number) => {
if (!isMounted) return;
const scrollY = lastScrollY + (window.scrollY - lastScrollY) * 0.1;
lastScrollY = scrollY;
subscribers.forEach((subscriber) => subscriber(time - lastTime, time));
lastTime = time;
requestAnimationFrame(frame);
};
if (typeof window !== 'undefined') requestAnimationFrame(frame);
export default function useFrame(callback: callbackType) {
useEffect(() => {
subscribers.add(callback);
return () => {
subscribers.delete(callback);
};
}, []);
}

16
utils/useLocale.tsx Normal file
View File

@@ -0,0 +1,16 @@
import { useRouter } from 'next/router';
export type Locales = 'ru' | 'en';
export type LocalesMap = {
[locale in Locales]: { [key: string]: string | any };
};
export default function useLocale(locales: LocalesMap) {
const router = useRouter();
const t = (key: string) =>
locales[(router.locale || 'en') as Locales][key] || key;
return t;
}

25
utils/useMediaQuery.tsx Normal file
View File

@@ -0,0 +1,25 @@
import { useState, useEffect } from "react"
export default function useMediaQuery(mediaQuery: string): boolean {
const [isMatch, setIsMatch] = useState(
typeof window !== 'undefined' ? window.matchMedia(mediaQuery).matches : false
);
useEffect(() => {
const onChange = (event: MediaQueryListEvent) => {
setIsMatch(event.matches);
};
window
.matchMedia(mediaQuery)
.addEventListener("change", onChange);
return () => {
window
.matchMedia(mediaQuery)
.removeEventListener("change", onChange);
};
}, []);
return isMatch;
}

45
utils/useScroll.ts Normal file
View File

@@ -0,0 +1,45 @@
import { useEffect } from 'react';
type callbackType = (scrollY: number, deltaTime: number, time: number) => void;
type configType = {
accelerator?: number;
};
const subscribers = new Set<callbackType>();
let isMounted = true;
let lastScrollY = 0;
let lastTime = 0;
let currentScrollY = 0;
const scrollChecker = (time: number) => {
if (!isMounted) return;
if (Math.abs(window.scrollY - lastScrollY) < 0.0001) {
currentScrollY = window.scrollY;
} else {
currentScrollY = lastScrollY + (window.scrollY - lastScrollY) * 0.1;
}
lastScrollY = currentScrollY;
subscribers.forEach((subscriber) => {
subscriber(currentScrollY, time - lastTime, time);
});
lastTime = time;
requestAnimationFrame(scrollChecker);
};
if (typeof window !== 'undefined') requestAnimationFrame(scrollChecker);
export default function useScroll(callback: callbackType, config: configType = {}, deps: any[] = []) {
useEffect(() => {
subscribers.add(callback);
return () => {
subscribers.delete(callback);
};
}, deps);
}