fix: fix error store and edits

This commit is contained in:
gofnnp 2023-10-06 21:20:21 +04:00
parent 844d5d1295
commit a27b79e0eb
12 changed files with 132 additions and 96 deletions

14
package-lock.json generated
View File

@ -33,7 +33,7 @@
"@vitejs/plugin-react": "^4.0.0", "@vitejs/plugin-react": "^4.0.0",
"eslint": "^8.41.0", "eslint": "^8.41.0",
"eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.1", "eslint-plugin-react-refresh": "^0.4.3",
"typescript": "^5.0.4", "typescript": "^5.0.4",
"vite": "^4.3.8" "vite": "^4.3.8"
} }
@ -1756,9 +1756,9 @@
} }
}, },
"node_modules/eslint-plugin-react-refresh": { "node_modules/eslint-plugin-react-refresh": {
"version": "0.4.1", "version": "0.4.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.1.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz",
"integrity": "sha512-QgrvtRJkmV+m4w953LS146+6RwEe5waouubFVNLBfOjXJf6MLczjymO8fOcKj9jMS8aKkTCMJqiPu2WEeFI99A==", "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==",
"dev": true, "dev": true,
"peerDependencies": { "peerDependencies": {
"eslint": ">=7" "eslint": ">=7"
@ -4627,9 +4627,9 @@
"requires": {} "requires": {}
}, },
"eslint-plugin-react-refresh": { "eslint-plugin-react-refresh": {
"version": "0.4.1", "version": "0.4.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.1.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz",
"integrity": "sha512-QgrvtRJkmV+m4w953LS146+6RwEe5waouubFVNLBfOjXJf6MLczjymO8fOcKj9jMS8aKkTCMJqiPu2WEeFI99A==", "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==",
"dev": true, "dev": true,
"requires": {} "requires": {}
}, },

View File

@ -35,7 +35,7 @@
"@vitejs/plugin-react": "^4.0.0", "@vitejs/plugin-react": "^4.0.0",
"eslint": "^8.41.0", "eslint": "^8.41.0",
"eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.1", "eslint-plugin-react-refresh": "^0.4.3",
"typescript": "^5.0.4", "typescript": "^5.0.4",
"vite": "^4.3.8" "vite": "^4.3.8"
} }

View File

@ -225,9 +225,7 @@ function Layout({ setIsSpecialOfferOpen }: LayoutProps): JSX.Element {
{showNavbar ? ( {showNavbar ? (
<Navbar isOpen={isMenuOpen} closeMenu={() => setIsMenuOpen(false)} /> <Navbar isOpen={isMenuOpen} closeMenu={() => setIsMenuOpen(false)} />
) : null} ) : null}
{ {showNavbarFooter && hasNavbarFooter(location.pathname) ? (
// showNavbarFooter &&
hasNavbarFooter(location.pathname) ? (
<NavbarFooter items={navbarItems} /> <NavbarFooter items={navbarItems} />
) : null} ) : null}
</div> </div>

View File

@ -18,8 +18,9 @@ import {
} from "@/services/zodiac-sign"; } from "@/services/zodiac-sign";
import { Asset } from "@/api/resources/Assets"; import { Asset } from "@/api/resources/Assets";
import { getRandomArbitrary } from "@/services/random-value"; import { getRandomArbitrary } from "@/services/random-value";
import Onboarding, { EDirectionOnboarding } from "../Onboarding"; import Onboarding from "../Onboarding";
import TextWithFinger from "../TextWithFinger"; import TextWithFinger from "../TextWithFinger";
import { EDirectionOnboarding } from "@/types";
function CompatibilityPage(): JSX.Element { function CompatibilityPage(): JSX.Element {
const { t, i18n } = useTranslation(); const { t, i18n } = useTranslation();
@ -143,6 +144,12 @@ function CompatibilityPage(): JSX.Element {
setCompatCategory(parseInt(event.target.value)); setCompatCategory(parseInt(event.target.value));
}; };
const handleNameOnboarding = () => {
if (!name.length) return;
setCurrentOnboarding(1);
dateRef.current?.scrollIntoView({ behavior: "smooth" });
};
return ( return (
<section <section
className={`${styles.page} page`} className={`${styles.page} page`}
@ -166,59 +173,61 @@ function CompatibilityPage(): JSX.Element {
+ +
</Title> </Title>
<div className={styles["inputs-container"]}> <div className={styles["inputs-container"]}>
{!onboardingCompatibility.isShown && <> {!onboardingCompatibility?.isShown && (
{currentOnboarding === 0 && ( <>
<Onboarding {currentOnboarding === 0 && (
targetRef={inputRef.current as HTMLDivElement} <Onboarding
isShow={currentOnboarding === 0} targetRef={inputRef.current as HTMLDivElement}
direction={EDirectionOnboarding.BOTTOM} isShow={currentOnboarding === 0}
showBackground={true}
>
<TextWithFinger
text={t("au.web_onbording.name")}
direction={EDirectionOnboarding.BOTTOM} direction={EDirectionOnboarding.BOTTOM}
crossClickHandler={() => setCurrentOnboarding(1)} showBackground={true}
/> >
</Onboarding>
)}
{currentOnboarding === 1 && (
<Onboarding
targetRef={dateRef.current as HTMLDivElement}
isShow={currentOnboarding === 1}
direction={EDirectionOnboarding.BOTTOM}
showBackground={true}
>
<>
<button
className={styles["compatibility-onboarding__button"]}
disabled={!isChangeDate}
onClick={() => setCurrentOnboarding(2)}
>
Done
</button>
<TextWithFinger <TextWithFinger
text={t("au.web_onbording.date")} text={t("au.web_onbording.name")}
direction={EDirectionOnboarding.BOTTOM} direction={EDirectionOnboarding.BOTTOM}
crossClickHandler={handleNameOnboarding}
/>
</Onboarding>
)}
{currentOnboarding === 1 && (
<Onboarding
targetRef={dateRef.current as HTMLDivElement}
isShow={currentOnboarding === 1}
direction={EDirectionOnboarding.BOTTOM}
showBackground={true}
>
<>
<button
className={styles["compatibility-onboarding__button"]}
disabled={!isChangeDate}
onClick={() => setCurrentOnboarding(2)}
>
Done
</button>
<TextWithFinger
text={t("au.web_onbording.date")}
direction={EDirectionOnboarding.BOTTOM}
showCross={false}
/>
</>
</Onboarding>
)}
{currentOnboarding === 3 && (
<Onboarding
targetRef={mainButtonRef.current as HTMLDivElement}
isShow={currentOnboarding === 3}
direction={EDirectionOnboarding.TOP}
showBackground={true}
>
<TextWithFinger
text={""}
direction={EDirectionOnboarding.TOP}
showCross={false} showCross={false}
/> />
</> </Onboarding>
</Onboarding> )}
)} </>
{currentOnboarding === 3 && ( )}
<Onboarding
targetRef={mainButtonRef.current as HTMLDivElement}
isShow={currentOnboarding === 3}
direction={EDirectionOnboarding.TOP}
showBackground={true}
>
<TextWithFinger
text={""}
direction={EDirectionOnboarding.TOP}
showCross={false}
/>
</Onboarding>
)}
</>}
<div <div
className={styles["input-container__name-container"]} className={styles["input-container__name-container"]}
style={{ zIndex: currentOnboarding === 0 ? 99 : 1 }} style={{ zIndex: currentOnboarding === 0 ? 99 : 1 }}
@ -251,7 +260,7 @@ function CompatibilityPage(): JSX.Element {
<DatePicker onDateChange={handleValidDate} /> <DatePicker onDateChange={handleValidDate} />
</div> </div>
</div> </div>
{currentOnboarding === 2 && !onboardingCompatibility.isShown && ( {currentOnboarding === 2 && !onboardingCompatibility?.isShown && (
<Onboarding <Onboarding
targetRef={categoriesRef.current as HTMLDivElement} targetRef={categoriesRef.current as HTMLDivElement}
isShow={currentOnboarding === 2} isShow={currentOnboarding === 2}

View File

@ -46,7 +46,7 @@ function HomePage(): JSX.Element {
const onboardingConfigHome = useSelector(selectors.selectOnboardingHome); const onboardingConfigHome = useSelector(selectors.selectOnboardingHome);
const [isShowOnboardingHome, setIsShowOnboardingHome] = useState( const [isShowOnboardingHome, setIsShowOnboardingHome] = useState(
!onboardingConfigHome.isShown !onboardingConfigHome?.isShown
); );
useEffect(() => { useEffect(() => {
@ -166,7 +166,10 @@ function HomePage(): JSX.Element {
isShowNavbar ? styles["content__buttons--hidden"] : "" isShowNavbar ? styles["content__buttons--hidden"] : ""
}`} }`}
> >
<Onboarding targetRef={buttonsRef.current as HTMLDivElement} isShow={isShowOnboardingHome}> <Onboarding
targetRef={buttonsRef.current as HTMLDivElement}
isShow={isShowOnboardingHome}
>
<TextWithFinger <TextWithFinger
text={t("au.web_onbording.start")} text={t("au.web_onbording.start")}
crossClickHandler={() => setIsShowOnboardingHome(false)} crossClickHandler={() => setIsShowOnboardingHome(false)}

View File

@ -1,5 +1,5 @@
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { Link } from 'react-router-dom' import { Link, useNavigate } from 'react-router-dom'
import { useAuth } from '@/auth' import { useAuth } from '@/auth'
import { useLegal } from '@/legal' import { useLegal } from '@/legal'
import routes from '@/routes' import routes from '@/routes'
@ -15,8 +15,15 @@ const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1)
function Navbar({ isOpen, closeMenu }: NavbarProps): JSX.Element { function Navbar({ isOpen, closeMenu }: NavbarProps): JSX.Element {
const { logout } = useAuth() const { logout } = useAuth()
const { t } = useTranslation() const { t } = useTranslation()
const navigate = useNavigate()
const legal = useLegal() const legal = useLegal()
const combinedClassNames = ['navbar', isOpen && 'navbar--open'].filter(Boolean).join(' ') const combinedClassNames = ['navbar', isOpen && 'navbar--open'].filter(Boolean).join(' ')
const handleLogout = () => {
navigate(routes.client.birthday())
logout()
}
return ( return (
<aside className={combinedClassNames}> <aside className={combinedClassNames}>
<div className='navbar__overlay' onClick={closeMenu}></div> <div className='navbar__overlay' onClick={closeMenu}></div>
@ -37,7 +44,7 @@ function Navbar({ isOpen, closeMenu }: NavbarProps): JSX.Element {
{t('contact_us')} {t('contact_us')}
</a> </a>
<hr /> <hr />
<a href='#' onClick={logout}>Log Out</a> <a href='#' onClick={handleLogout}>Log Out</a>
</nav> </nav>
</div> </div>
</aside> </aside>

View File

@ -1,7 +1,7 @@
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import styles from "./styles.module.css"; import styles from "./styles.module.css";
import Onboarding from "../Onboarding"; import Onboarding from "../Onboarding";
import { useRef, useState } from "react"; import { useEffect, useRef, useState } from "react";
import TextWithFinger from "../TextWithFinger"; import TextWithFinger from "../TextWithFinger";
import { useDispatch, useSelector } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
import { actions, selectors } from "@/store"; import { actions, selectors } from "@/store";
@ -28,11 +28,18 @@ function NavbarFooter({ items }: INavbarHomeProps): JSX.Element {
); );
const [isShowOnboardingNavbarFooter, setIsShowOnboardingNavbarFooter] = const [isShowOnboardingNavbarFooter, setIsShowOnboardingNavbarFooter] =
useState(!onboardingConfigNavbarFooter.isShown); useState(!onboardingConfigNavbarFooter?.isShown);
const [selectedOnboarding, setSelectedOnboarding] = useState(3); const [selectedOnboarding, setSelectedOnboarding] = useState(3);
const [rerender, setRerender] = useState(false);
console.log(rerender);
const buttonsRef = useRef([] as HTMLDivElement[]); const buttonsRef = useRef([] as HTMLDivElement[]);
useEffect(() => {
setRerender((prev) => !prev);
}, [buttonsRef])
const setShownOnboarding = () => { const setShownOnboarding = () => {
setIsShowOnboardingNavbarFooter(false); setIsShowOnboardingNavbarFooter(false);
dispatch( dispatch(

View File

@ -1,12 +1,6 @@
import { useEffect, useRef, useState } from "react"; import { useEffect, useRef, useState } from "react";
import styles from "./styles.module.css"; import styles from "./styles.module.css";
import { EDirectionOnboarding } from "@/types";
export enum EDirectionOnboarding {
LEFT = "left",
RIGHT = "right",
TOP = "top",
BOTTOM = "bottom",
}
interface OnboardingProps { interface OnboardingProps {
targetRef: HTMLElement; targetRef: HTMLElement;
@ -34,8 +28,7 @@ const getCoordinates = (
targetRef.offsetTop + targetRef.offsetTop +
targetRef.offsetHeight / 2 - targetRef.offsetHeight / 2 -
onboardingRef.current.offsetHeight / 2, onboardingRef.current.offsetHeight / 2,
left: left: targetRef.offsetLeft - onboardingRef.current.offsetWidth,
targetRef.offsetLeft - onboardingRef.current.offsetWidth,
}; };
case EDirectionOnboarding.RIGHT: case EDirectionOnboarding.RIGHT:
return { return {
@ -84,7 +77,7 @@ function Onboarding({
isShow, isShow,
direction = EDirectionOnboarding.TOP, direction = EDirectionOnboarding.TOP,
showBackground = false, showBackground = false,
classNameContainer = '', classNameContainer = "",
children, children,
}: OnboardingProps): JSX.Element { }: OnboardingProps): JSX.Element {
const onboardingRef = useRef<HTMLDivElement>(null); const onboardingRef = useRef<HTMLDivElement>(null);
@ -93,21 +86,29 @@ function Onboarding({
left: 0, left: 0,
}); });
useEffect(() => { useEffect(() => {
if (!onboardingRef.current || !targetRef) {
return;
}
setCoordinates(getCoordinates(targetRef, direction, onboardingRef)); setCoordinates(getCoordinates(targetRef, direction, onboardingRef));
}, [direction, targetRef, children]); }, [direction, targetRef, children]);
const [top, left] = [coordinates.top, coordinates.left];
if (!isShow) { if (!isShow) {
return <></>; return <></>;
} }
return ( return (
<div className={getClassNameContainer(direction, showBackground, classNameContainer)}> <div
className={getClassNameContainer(
direction,
showBackground,
classNameContainer
)}
>
<div <div
className={`${styles["onboarding"]} ${ className={`${styles["onboarding"]} ${
!targetRef || !onboardingRef.current ? styles["hide"] : "" !targetRef || !onboardingRef.current ? styles["hide"] : ""
}`} }`}
style={{ top: `${top}px`, left: `${left}px` }} style={{ top: `${coordinates.top}px`, left: `${coordinates.left}px` }}
ref={onboardingRef} ref={onboardingRef}
> >
{children} {children}

View File

@ -1,4 +1,4 @@
import { EDirectionOnboarding } from "../Onboarding"; import { EDirectionOnboarding } from "@/types";
import styles from "./styles.module.css"; import styles from "./styles.module.css";
interface TextWithFingerProps { interface TextWithFingerProps {

View File

@ -47,19 +47,6 @@ import {
} from "./userCallbacks"; } from "./userCallbacks";
const preloadedState = loadStore(); const preloadedState = loadStore();
export const reducer = combineReducers({
token,
user,
form,
status,
subscriptionPlans,
aura,
payment,
compatibility,
userCallbacks,
siteConfig,
onboardingConfig,
});
export const actions = { export const actions = {
token: tokenActions, token: tokenActions,
user: userActions, user: userActions,
@ -94,6 +81,21 @@ export const selectors = {
selectOnboardingNavbarFooter, selectOnboardingNavbarFooter,
...formSelectors, ...formSelectors,
}; };
export const reducer = combineReducers({
token,
user,
form,
status,
subscriptionPlans,
aura,
payment,
compatibility,
userCallbacks,
siteConfig,
onboardingConfig,
});
export type RootState = ReturnType<typeof reducer>; export type RootState = ReturnType<typeof reducer>;
export const store = configureStore({ export const store = configureStore({
reducer, reducer,

View File

@ -36,7 +36,7 @@ const onboardingConfigSlice = createSlice({
initialState, initialState,
reducers: { reducers: {
update(state, action: PayloadAction<Partial<IOnboardingConfig>>) { update(state, action: PayloadAction<Partial<IOnboardingConfig>>) {
return { ...state, ...action.payload }; return { ...initialState, ...state, ...action.payload };
}, },
}, },
extraReducers: (builder) => builder.addCase("reset", () => initialState), extraReducers: (builder) => builder.addCase("reset", () => initialState),
@ -44,7 +44,9 @@ const onboardingConfigSlice = createSlice({
export const { actions } = onboardingConfigSlice; export const { actions } = onboardingConfigSlice;
export const selectOnboarding = createSelector( export const selectOnboarding = createSelector(
(state: { onboardingConfig: IOnboardingConfig }) => state.onboardingConfig, (state: { onboardingConfig: IOnboardingConfig }) => {
return state.onboardingConfig
},
(onboardingConfig) => onboardingConfig (onboardingConfig) => onboardingConfig
); );
export const selectOnboardingHome = createSelector( export const selectOnboardingHome = createSelector(

View File

@ -6,6 +6,13 @@ declare global {
} }
} }
export enum EDirectionOnboarding {
LEFT = "left",
RIGHT = "right",
TOP = "top",
BOTTOM = "bottom",
}
export interface FormField<T> { export interface FormField<T> {
name: string name: string
value: T value: T