first commit
This commit is contained in:
7
utils/hashCode.ts
Normal file
7
utils/hashCode.ts
Normal 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
5
utils/isServer.tsx
Normal file
@@ -0,0 +1,5 @@
|
||||
function useIsServer() {
|
||||
return typeof window === 'undefined';
|
||||
}
|
||||
|
||||
export default useIsServer;
|
||||
3
utils/smooth.ts
Normal file
3
utils/smooth.ts
Normal 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
34
utils/useFrame.ts
Normal 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
16
utils/useLocale.tsx
Normal 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
25
utils/useMediaQuery.tsx
Normal 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
45
utils/useScroll.ts
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user