Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: <Select /> takes array of options rather than object of objects #186

Merged
merged 2 commits into from
Feb 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 34 additions & 41 deletions app/components/DocsLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ function useCurrentFramework(frameworks: AvailableOptions) {

return (
paramsFramework ||
(localStorageFramework && localStorageFramework in frameworks
(localStorageFramework &&
frameworks.find(({ value }) => localStorageFramework === value)
? localStorageFramework
: 'react')
)
Expand Down Expand Up @@ -110,7 +111,7 @@ const useFrameworkConfig = ({
const frameworkConfig = React.useMemo(() => {
return {
label: 'Framework',
selected: frameworks[framework] ? framework : 'react',
selected: framework,
available: frameworks,
onSelect: (option: { label: string; value: string }) => {
const url = generatePath(match.id, {
Expand Down Expand Up @@ -142,18 +143,18 @@ const useVersionConfig = ({
const versionConfig = React.useMemo(() => {
const available = availableVersions.reduce(
(acc: AvailableOptions, version) => {
acc[version] = {
acc.push({
label: version,
value: version,
}
})
return acc
},
{
latest: {
[
{
label: 'Latest',
value: 'latest',
},
}
]
)

return {
Expand Down Expand Up @@ -330,22 +331,18 @@ export function DocsLayout({
dark:bg-gray-900"
>
<div className="flex gap-4">
{frameworkConfig?.selected ? (
<Select
label={frameworkConfig.label}
selected={frameworkConfig.selected}
available={frameworkConfig.available}
onSelect={frameworkConfig.onSelect}
/>
) : null}
{versionConfig?.selected ? (
<Select
label={versionConfig.label}
selected={versionConfig.selected}
available={versionConfig.available}
onSelect={versionConfig.onSelect}
/>
) : null}
<Select
label={frameworkConfig.label}
selected={frameworkConfig.selected}
available={frameworkConfig.available}
onSelect={frameworkConfig.onSelect}
/>
<Select
label={versionConfig.label}
selected={versionConfig.selected}
available={versionConfig.available}
onSelect={versionConfig.onSelect}
/>
</div>
{menuItems}
</div>
Expand All @@ -364,24 +361,20 @@ export function DocsLayout({
/>
</div>
<div className="flex gap-2 px-4">
{frameworkConfig?.selected ? (
<Select
className="flex-[3_1_0%]"
label={frameworkConfig.label}
selected={frameworkConfig.selected}
available={frameworkConfig.available}
onSelect={frameworkConfig.onSelect}
/>
) : null}
{versionConfig?.selected ? (
<Select
className="flex-[2_1_0%]"
label={versionConfig.label}
selected={versionConfig.selected}
available={versionConfig.available}
onSelect={versionConfig.onSelect}
/>
) : null}
<Select
className="flex-[3_1_0%]"
label={frameworkConfig.label}
selected={frameworkConfig.selected}
available={frameworkConfig.available}
onSelect={frameworkConfig.onSelect}
/>
<Select
className="flex-[2_1_0%]"
label={versionConfig.label}
selected={versionConfig.selected}
available={versionConfig.available}
onSelect={versionConfig.onSelect}
/>
</div>
<div className="flex-1 flex flex-col gap-4 px-4 whitespace-nowrap overflow-y-auto text-base pb-[300px]">
{menuItems}
Expand Down
19 changes: 14 additions & 5 deletions app/components/Select.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import { Listbox, Transition } from '@headlessui/react'
import { HiCheck, HiChevronDown } from 'react-icons/hi'
import { Form } from '@remix-run/react'

export type AvailableOptions = Record<
string,
{ label: string; value: string; logo?: string }
>
export type AvailableOptions = Array<{
label: string
value: string
logo?: string
}>

export type SelectProps = {
className?: string
Expand All @@ -24,7 +25,15 @@ export function Select({
available,
onSelect,
}: SelectProps) {
const selectedOption = available[selected]
if (available.length === 0) {
return null
}

const selectedOption = available.find(({ value }) => selected === value)

if (!selectedOption) {
return null
}

return (
<div className={`top-16 w-full flex-1 ${className}`}>
Expand Down
11 changes: 6 additions & 5 deletions app/projects/form.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import reactLogo from '~/images/react-logo.svg'
import solidLogo from '~/images/solid-logo.svg'
import vueLogo from '~/images/vue-logo.svg'
import type { AvailableOptions } from '~/components/Select'

export const repo = 'tanstack/form'

Expand All @@ -12,11 +13,11 @@ export const colorFrom = 'from-yellow-500'
export const colorTo = 'to-yellow-600'
export const textColor = 'text-yellow-600'

export const frameworks = {
react: { label: 'React', logo: reactLogo, value: 'react' },
solid: { label: 'Solid', logo: solidLogo, value: 'solid' },
vue: { label: 'Vue', logo: vueLogo, value: 'vue' },
} as const
export const frameworks: AvailableOptions = [
{ label: 'React', value: 'react', logo: reactLogo },
{ label: 'Solid', value: 'solid', logo: solidLogo },
{ label: 'Vue', value: 'vue', logo: vueLogo },
]

export type Framework = keyof typeof frameworks

Expand Down
15 changes: 8 additions & 7 deletions app/projects/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import solidLogo from '~/images/solid-logo.svg'
import vueLogo from '~/images/vue-logo.svg'
import svelteLogo from '~/images/svelte-logo.svg'
import angularLogo from '~/images/angular-logo.svg'
import type { AvailableOptions } from '~/components/Select'

export const repo = 'tanstack/query'

Expand All @@ -14,13 +15,13 @@ export const colorFrom = 'from-red-500'
export const colorTo = 'to-amber-500'
export const textColor = 'text-amber-500'

export const frameworks = {
react: { label: 'React', logo: reactLogo, value: 'react' },
solid: { label: 'Solid', logo: solidLogo, value: 'solid' },
vue: { label: 'Vue', logo: vueLogo, value: 'vue' },
svelte: { label: 'Svelte', logo: svelteLogo, value: 'svelte' },
angular: { label: 'Angular', logo: angularLogo, value: 'angular' },
} as const
export const frameworks: AvailableOptions = [
{ label: 'React', value: 'react', logo: reactLogo },
{ label: 'Solid', value: 'solid', logo: solidLogo },
{ label: 'Vue', value: 'vue', logo: vueLogo },
{ label: 'Svelte', value: 'svelte', logo: svelteLogo },
{ label: 'Angular', value: 'angular', logo: angularLogo },
]

export type Framework = keyof typeof frameworks

Expand Down
7 changes: 4 additions & 3 deletions app/projects/ranger.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import reactLogo from '~/images/react-logo.svg'
import type { AvailableOptions } from '~/components/Select'

export const repo = 'tanstack/ranger'

Expand All @@ -10,9 +11,9 @@ export const colorFrom = 'from-lime-500'
export const colorTo = 'to-emerald-500'
export const textColor = 'text-emerald-500'

export const frameworks = {
react: { label: 'React', logo: reactLogo, value: 'react' },
} as const
export const frameworks: AvailableOptions = [
{ label: 'React', value: 'react', logo: reactLogo },
]

export type Framework = keyof typeof frameworks

Expand Down
7 changes: 4 additions & 3 deletions app/projects/router.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import reactLogo from '~/images/react-logo.svg'
import type { AvailableOptions } from '~/components/Select'

export const repo = 'tanstack/router'

Expand All @@ -10,9 +11,9 @@ export const colorFrom = 'from-lime-500'
export const colorTo = 'to-emerald-500'
export const textColor = 'text-emerald-500'

export const frameworks = {
react: { label: 'React', logo: reactLogo, value: 'react' },
} as const
export const frameworks: AvailableOptions = [
{ label: 'React', value: 'react', logo: reactLogo },
]

export type Framework = keyof typeof frameworks

Expand Down
13 changes: 7 additions & 6 deletions app/projects/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import reactLogo from '~/images/react-logo.svg'
import solidLogo from '~/images/solid-logo.svg'
import vueLogo from '~/images/vue-logo.svg'
import angularLogo from '~/images/angular-logo.svg'
import type { AvailableOptions } from '~/components/Select'

export const repo = 'tanstack/store'

Expand All @@ -13,12 +14,12 @@ export const colorFrom = 'from-gray-500'
export const colorTo = 'to-gray-700'
export const textColor = 'text-gray-700'

export const frameworks = {
react: { label: 'React', logo: reactLogo, value: 'react' },
solid: { label: 'Solid', logo: solidLogo, value: 'solid' },
vue: { label: 'Vue', logo: vueLogo, value: 'vue' },
angular: { label: 'Angular', logo: angularLogo, value: 'angular' },
} as const
export const frameworks: AvailableOptions = [
{ label: 'React', value: 'react', logo: reactLogo },
{ label: 'Solid', value: 'solid', logo: solidLogo },
{ label: 'Vue', value: 'vue', logo: vueLogo },
{ label: 'Angular', value: 'angular', logo: angularLogo },
]

export type Framework = keyof typeof frameworks

Expand Down
13 changes: 7 additions & 6 deletions app/projects/table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import reactLogo from '~/images/react-logo.svg'
import solidLogo from '~/images/solid-logo.svg'
import vueLogo from '~/images/vue-logo.svg'
import svelteLogo from '~/images/svelte-logo.svg'
import type { AvailableOptions } from '~/components/Select'

export const repo = 'tanstack/table'

Expand All @@ -13,12 +14,12 @@ export const colorFrom = 'from-teal-500'
export const colorTo = 'to-blue-600'
export const textColor = 'text-blue-600'

export const frameworks = {
react: { label: 'React', logo: reactLogo, value: 'react' },
solid: { label: 'Solid', logo: solidLogo, value: 'solid' },
svelte: { label: 'Svelte', logo: svelteLogo, value: 'svelte' },
vue: { label: 'Vue', logo: vueLogo, value: 'vue' },
} as const
export const frameworks: AvailableOptions = [
{ label: 'React', value: 'react', logo: reactLogo },
{ label: 'Solid', value: 'solid', logo: solidLogo },
{ label: 'Svelte', value: 'svelte', logo: svelteLogo },
{ label: 'Vue', value: 'vue', logo: vueLogo },
]

export type Framework = keyof typeof frameworks

Expand Down
13 changes: 7 additions & 6 deletions app/projects/virtual.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import reactLogo from '~/images/react-logo.svg'
import solidLogo from '~/images/solid-logo.svg'
import vueLogo from '~/images/vue-logo.svg'
import svelteLogo from '~/images/svelte-logo.svg'
import type { AvailableOptions } from '~/components/Select'

export const repo = 'tanstack/virtual'

Expand All @@ -13,12 +14,12 @@ export const colorFrom = 'from-rose-500'
export const colorTo = 'to-violet-600'
export const textColor = 'text-violet-600'

export const frameworks = {
react: { label: 'React', logo: reactLogo, value: 'react' },
solid: { label: 'Solid', logo: solidLogo, value: 'solid' },
svelte: { label: 'Svelte', logo: svelteLogo, value: 'svelte' },
vue: { label: 'Vue', logo: vueLogo, value: 'vue' },
} as const
export const frameworks: AvailableOptions = [
{ label: 'React', value: 'react', logo: reactLogo },
{ label: 'Solid', value: 'solid', logo: solidLogo },
{ label: 'Svelte', value: 'svelte', logo: svelteLogo },
{ label: 'Vue', value: 'vue', logo: vueLogo },
]

export type Framework = keyof typeof frameworks

Expand Down
Loading