feat(SW-187): added immer and refactor dropdown a bit
This commit is contained in:
@@ -24,6 +24,7 @@ export default function MobileMenu({
|
|||||||
}: MobileMenuProps) {
|
}: MobileMenuProps) {
|
||||||
const intl = useIntl()
|
const intl = useIntl()
|
||||||
const {
|
const {
|
||||||
|
handleHamburgerClick,
|
||||||
toggleDropdown,
|
toggleDropdown,
|
||||||
isHamburgerMenuOpen,
|
isHamburgerMenuOpen,
|
||||||
isMyPagesMobileMenuOpen,
|
isMyPagesMobileMenuOpen,
|
||||||
@@ -37,21 +38,6 @@ export default function MobileMenu({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
function handleHamburgerClick() {
|
|
||||||
if (isMyPagesMobileMenuOpen) {
|
|
||||||
toggleDropdown(DropdownTypeEnum.MyPagesMobileMenu)
|
|
||||||
} else {
|
|
||||||
if (isHeaderLanguageSwitcherMobileOpen) {
|
|
||||||
toggleDropdown(DropdownTypeEnum.HeaderLanguageSwitcherMobile)
|
|
||||||
}
|
|
||||||
if (!isFooterLanguageSwitcherOpen) {
|
|
||||||
toggleDropdown(DropdownTypeEnum.HamburgerMenu)
|
|
||||||
} else {
|
|
||||||
toggleDropdown(DropdownTypeEnum.FooterLanguageSwitcher)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ export default function LanguageSwitcher({
|
|||||||
toggleDropdown,
|
toggleDropdown,
|
||||||
isFooterLanguageSwitcherOpen,
|
isFooterLanguageSwitcherOpen,
|
||||||
isHeaderLanguageSwitcherOpen,
|
isHeaderLanguageSwitcherOpen,
|
||||||
|
isHeaderLanguageSwitcherMobileOpen,
|
||||||
} = useDropdownStore()
|
} = useDropdownStore()
|
||||||
|
|
||||||
const position = type === "footer" ? "footer" : "header"
|
const position = type === "footer" ? "footer" : "header"
|
||||||
@@ -40,7 +41,8 @@ export default function LanguageSwitcher({
|
|||||||
|
|
||||||
const isLanguageSwitcherOpen =
|
const isLanguageSwitcherOpen =
|
||||||
(type === "footer" && isFooterLanguageSwitcherOpen) ||
|
(type === "footer" && isFooterLanguageSwitcherOpen) ||
|
||||||
(type !== "footer" && isHeaderLanguageSwitcherOpen)
|
(type !== "footer" &&
|
||||||
|
(isHeaderLanguageSwitcherOpen || isHeaderLanguageSwitcherMobileOpen))
|
||||||
|
|
||||||
useHandleKeyUp((event: KeyboardEvent) => {
|
useHandleKeyUp((event: KeyboardEvent) => {
|
||||||
if (event.key === "Escape" && isLanguageSwitcherOpen) {
|
if (event.key === "Escape" && isLanguageSwitcherOpen) {
|
||||||
|
|||||||
10
package-lock.json
generated
10
package-lock.json
generated
@@ -35,6 +35,7 @@
|
|||||||
"graphql": "^16.8.1",
|
"graphql": "^16.8.1",
|
||||||
"graphql-request": "^6.1.0",
|
"graphql-request": "^6.1.0",
|
||||||
"graphql-tag": "^2.12.6",
|
"graphql-tag": "^2.12.6",
|
||||||
|
"immer": "10.1.1",
|
||||||
"libphonenumber-js": "^1.10.60",
|
"libphonenumber-js": "^1.10.60",
|
||||||
"next": "^14.2.3",
|
"next": "^14.2.3",
|
||||||
"next-auth": "^5.0.0-beta.19",
|
"next-auth": "^5.0.0-beta.19",
|
||||||
@@ -10951,6 +10952,15 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/immer": {
|
||||||
|
"version": "10.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz",
|
||||||
|
"integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/immer"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/immutable": {
|
"node_modules/immutable": {
|
||||||
"version": "4.3.6",
|
"version": "4.3.6",
|
||||||
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz",
|
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz",
|
||||||
|
|||||||
@@ -51,6 +51,7 @@
|
|||||||
"graphql": "^16.8.1",
|
"graphql": "^16.8.1",
|
||||||
"graphql-request": "^6.1.0",
|
"graphql-request": "^6.1.0",
|
||||||
"graphql-tag": "^2.12.6",
|
"graphql-tag": "^2.12.6",
|
||||||
|
"immer": "10.1.1",
|
||||||
"libphonenumber-js": "^1.10.60",
|
"libphonenumber-js": "^1.10.60",
|
||||||
"next": "^14.2.3",
|
"next": "^14.2.3",
|
||||||
"next-auth": "^5.0.0-beta.19",
|
"next-auth": "^5.0.0-beta.19",
|
||||||
|
|||||||
@@ -1,43 +1,94 @@
|
|||||||
|
import { produce } from "immer"
|
||||||
import { create } from "zustand"
|
import { create } from "zustand"
|
||||||
|
|
||||||
import type {
|
import {
|
||||||
DropdownState,
|
type DropdownState,
|
||||||
DropdownType,
|
DropdownTypeEnum,
|
||||||
} from "@/types/components/dropdown/dropdown"
|
} from "@/types/components/dropdown/dropdown"
|
||||||
|
|
||||||
// TODO: When MyPagesMobileMenu is removed, also remove the
|
// TODO: When MyPagesMobileMenu is removed, also remove the
|
||||||
// isMyPagesMobileMenuOpen state
|
// isMyPagesMobileMenuOpen state
|
||||||
|
|
||||||
const useDropdownStore = create<
|
const useDropdownStore = create<DropdownState>((set, get) => ({
|
||||||
DropdownState & { toggleDropdown: (dropdown: DropdownType) => void }
|
|
||||||
>((set) => ({
|
|
||||||
isHamburgerMenuOpen: false,
|
isHamburgerMenuOpen: false,
|
||||||
isMyPagesMobileMenuOpen: false,
|
isMyPagesMobileMenuOpen: false,
|
||||||
isMyPagesMenuOpen: false,
|
isMyPagesMenuOpen: false,
|
||||||
isHeaderLanguageSwitcherOpen: false,
|
isHeaderLanguageSwitcherOpen: false,
|
||||||
isHeaderLanguageSwitcherMobileOpen: false,
|
isHeaderLanguageSwitcherMobileOpen: false,
|
||||||
isFooterLanguageSwitcherOpen: false,
|
isFooterLanguageSwitcherOpen: false,
|
||||||
toggleDropdown: (dropdown) =>
|
handleHamburgerClick: () => {
|
||||||
set((state) => {
|
const state = get()
|
||||||
const newState = {
|
if (state.isMyPagesMobileMenuOpen) {
|
||||||
isHamburgerMenuOpen: false,
|
set({ isMyPagesMobileMenuOpen: false })
|
||||||
isMyPagesMobileMenuOpen: false,
|
} else {
|
||||||
isMyPagesMenuOpen: false,
|
if (state.isHeaderLanguageSwitcherMobileOpen) {
|
||||||
isHeaderLanguageSwitcherOpen: false,
|
set({ isHeaderLanguageSwitcherMobileOpen: false })
|
||||||
isHeaderLanguageSwitcherMobileOpen: false,
|
|
||||||
isFooterLanguageSwitcherOpen: false,
|
|
||||||
}
|
}
|
||||||
|
if (!state.isFooterLanguageSwitcherOpen) {
|
||||||
const currentState =
|
set({ isHamburgerMenuOpen: !state.isHamburgerMenuOpen })
|
||||||
state[
|
} else {
|
||||||
`is${dropdown.charAt(0).toUpperCase() + dropdown.slice(1)}Open` as keyof DropdownState
|
set({ isFooterLanguageSwitcherOpen: false })
|
||||||
]
|
}
|
||||||
newState[
|
}
|
||||||
`is${dropdown.charAt(0).toUpperCase() + dropdown.slice(1)}Open` as keyof DropdownState
|
},
|
||||||
] = !currentState
|
toggleDropdown: (dropdown: DropdownTypeEnum) =>
|
||||||
|
set(
|
||||||
return newState
|
produce((state: DropdownState) => {
|
||||||
}),
|
switch (dropdown) {
|
||||||
|
case DropdownTypeEnum.HamburgerMenu:
|
||||||
|
state.isHamburgerMenuOpen = !state.isHamburgerMenuOpen
|
||||||
|
state.isMyPagesMobileMenuOpen = false
|
||||||
|
state.isMyPagesMenuOpen = false
|
||||||
|
state.isHeaderLanguageSwitcherOpen = false
|
||||||
|
state.isHeaderLanguageSwitcherMobileOpen = false
|
||||||
|
state.isFooterLanguageSwitcherOpen = false
|
||||||
|
break
|
||||||
|
case DropdownTypeEnum.MyPagesMobileMenu:
|
||||||
|
state.isMyPagesMobileMenuOpen = !state.isMyPagesMobileMenuOpen
|
||||||
|
state.isHamburgerMenuOpen = false
|
||||||
|
state.isMyPagesMenuOpen = false
|
||||||
|
state.isHeaderLanguageSwitcherOpen = false
|
||||||
|
state.isHeaderLanguageSwitcherMobileOpen = false
|
||||||
|
state.isFooterLanguageSwitcherOpen = false
|
||||||
|
break
|
||||||
|
case DropdownTypeEnum.MyPagesMenu:
|
||||||
|
state.isMyPagesMenuOpen = !state.isMyPagesMenuOpen
|
||||||
|
state.isHamburgerMenuOpen = false
|
||||||
|
state.isMyPagesMobileMenuOpen = false
|
||||||
|
state.isHeaderLanguageSwitcherOpen = false
|
||||||
|
state.isHeaderLanguageSwitcherMobileOpen = false
|
||||||
|
state.isFooterLanguageSwitcherOpen = false
|
||||||
|
break
|
||||||
|
case DropdownTypeEnum.HeaderLanguageSwitcher:
|
||||||
|
state.isHeaderLanguageSwitcherOpen =
|
||||||
|
!state.isHeaderLanguageSwitcherOpen
|
||||||
|
state.isHamburgerMenuOpen = false
|
||||||
|
state.isMyPagesMobileMenuOpen = false
|
||||||
|
state.isMyPagesMenuOpen = false
|
||||||
|
state.isHeaderLanguageSwitcherMobileOpen = false
|
||||||
|
state.isFooterLanguageSwitcherOpen = false
|
||||||
|
break
|
||||||
|
case DropdownTypeEnum.HeaderLanguageSwitcherMobile:
|
||||||
|
state.isHeaderLanguageSwitcherMobileOpen =
|
||||||
|
!state.isHeaderLanguageSwitcherMobileOpen
|
||||||
|
state.isHamburgerMenuOpen = false
|
||||||
|
state.isMyPagesMobileMenuOpen = false
|
||||||
|
state.isMyPagesMenuOpen = false
|
||||||
|
state.isHeaderLanguageSwitcherOpen = false
|
||||||
|
state.isFooterLanguageSwitcherOpen = false
|
||||||
|
break
|
||||||
|
case DropdownTypeEnum.FooterLanguageSwitcher:
|
||||||
|
state.isFooterLanguageSwitcherOpen =
|
||||||
|
!state.isFooterLanguageSwitcherOpen
|
||||||
|
state.isHamburgerMenuOpen = false
|
||||||
|
state.isMyPagesMobileMenuOpen = false
|
||||||
|
state.isMyPagesMenuOpen = false
|
||||||
|
state.isHeaderLanguageSwitcherOpen = false
|
||||||
|
state.isHeaderLanguageSwitcherMobileOpen = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
})
|
||||||
|
),
|
||||||
}))
|
}))
|
||||||
|
|
||||||
export default useDropdownStore
|
export default useDropdownStore
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ export interface DropdownState {
|
|||||||
isHeaderLanguageSwitcherOpen: boolean
|
isHeaderLanguageSwitcherOpen: boolean
|
||||||
isHeaderLanguageSwitcherMobileOpen: boolean
|
isHeaderLanguageSwitcherMobileOpen: boolean
|
||||||
isFooterLanguageSwitcherOpen: boolean
|
isFooterLanguageSwitcherOpen: boolean
|
||||||
|
toggleDropdown: (dropdown: DropdownTypeEnum) => void
|
||||||
|
handleHamburgerClick: () => void
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum DropdownTypeEnum {
|
export enum DropdownTypeEnum {
|
||||||
|
|||||||
Reference in New Issue
Block a user