feat(SW-187): added immer and refactor dropdown a bit

This commit is contained in:
Pontus Dreij
2024-09-11 14:17:44 +02:00
parent 2734af5f3f
commit b01fca97ba
6 changed files with 94 additions and 42 deletions

View File

@@ -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

View File

@@ -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
View File

@@ -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",

View File

@@ -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",

View File

@@ -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

View File

@@ -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 {