Skip to content

Commit

Permalink
feat: add use locale hook & update locale switcher
Browse files Browse the repository at this point in the history
  • Loading branch information
hta218 committed Aug 14, 2023
1 parent 711902e commit 7d711c3
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 33 deletions.
41 changes: 13 additions & 28 deletions components/LanguageSwitcher.tsx
Original file line number Diff line number Diff line change
@@ -1,60 +1,45 @@
import { clsx } from 'clsx'
import { useRouter } from 'next/router'
import { useEffect, useState } from 'react'
import { LOCALES } from '~/constant'
import { useLocale } from '~/hooks/useLocale'
import { getLocale } from '~/utils/locale'
import { Image } from './Image'
import { Popover, PopoverContent, PopoverTrigger, PopoverClose } from './ui/Popover'

function getLocale(code: string) {
return LOCALES.find((locale) => locale.code === code)
}
import { Popover, PopoverClose, PopoverContent, PopoverTrigger } from './ui/Popover'

export function LanguageSwitcher() {
let router = useRouter()
let [localeCode, setLocaleCode] = useState(router.locale)
let currentLocale = getLocale(localeCode)

useEffect(() => {
setLocaleCode(router.locale)
}, [router.locale])

function handleChange(newLocale: string) {
router.push(router.pathname, router.asPath, { locale: newLocale })
}
let [locale, localeCodes, updateLocale] = useLocale()

return (
<Popover>
<PopoverTrigger className="p-1.5 hover:bg-gray-200 dark:hover:bg-gray-700 rounded cursor-pointer">
<Image
src={currentLocale.flag}
alt={currentLocale.name}
src={locale.flag}
alt={locale.name}
width={20}
height={20}
shouldOpenLightbox={false}
/>
</PopoverTrigger>
<PopoverContent className="bg-white dark:bg-dark w-32" sideOffset={8}>
<div className="space-y-1">
{router.locales.map((code) => {
let locale = getLocale(code)
{localeCodes.map((code) => {
let { flag, name } = getLocale(code)
return (
<PopoverClose
key={code}
onClick={() => handleChange(code)}
onClick={() => updateLocale(code)}
className={clsx(
'inline-flex w-full font-normal items-center gap-3 px-2 py-1 rounded w-fdivl text-left hover:bg-gray-100 dark:hover:bg-gray-700',
code === localeCode && 'text-primary-500 dark:text-primary-400'
code === locale.code && 'text-primary-500 dark:text-primary-400'
)}
>
<Image
src={locale.flag}
alt={locale.name}
src={flag}
alt={name}
width={20}
height={20}
shouldOpenLightbox={false}
className="shrink-0"
/>
<span>{locale.name}</span>
<span>{name}</span>
</PopoverClose>
)
})}
Expand Down
15 changes: 10 additions & 5 deletions hooks/useLocale.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
import { useRouter } from 'next/router'
import { getLocale } from '~/utils/locale'

let useLocale = () => {
let { locale, defaultLocale } = useRouter()
export function useLocale() {
let router = useRouter()
let locale = getLocale(router.locale)
let localeCodes = router.locales

return locale || defaultLocale
}
function updateLocale(code: string) {
router.push(router.pathname, router.asPath, { locale: code })
}

export default useLocale
return [locale, localeCodes, updateLocale] as const
}
5 changes: 5 additions & 0 deletions utils/locale.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { LOCALES } from '~/constant'

export function getLocale(code: string) {
return LOCALES.find((locale) => locale.code === code)
}

0 comments on commit 7d711c3

Please sign in to comment.