PluginProbe
Code Snippets / 3.10.0-beta.1
Code Snippets v3.10.0-beta.1
4.0.0-beta.2 3.10.2 3.10.1 3.10.0 3.10.0-beta.2 3.10.0-beta.1 4.0.0-beta.1 3.9.6 trunk 2.10.0 2.10.1 2.12.0 2.12.1 2.13.0 2.13.1 2.13.2 2.13.3 2.14.0 2.14.1 2.14.2 2.14.3 2.14.4 2.14.5 2.14.6 3.0.0 All 65 releases
code-snippets / js / components / common / SubnavTabs.tsx

SubnavTabs.tsx in Code Snippets 3.10.0-beta.1, at js/components/common/SubnavTabs.tsx

77 lines 1.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import classnames from 'classnames'
2 import { __ } from '@wordpress/i18n'
3 import React from 'react'
4 import { isLicensed } from '../../utils/screen'
5 import { fetchQueryParam, updateQueryParams } from '../../utils/urls'
6
7 export interface SubnavTab {
8 name: string
9 label: string
10 pro?: boolean
11 }
12
13 export const getTabFromQuery = <Tab extends SubnavTab>(
14 tabs: Tab[],
15 queryParamName: string
16 ): Tab => {
17 const tabParam = fetchQueryParam(queryParamName)
18
19 for (const tab of tabs) {
20 if (tab.name === tabParam) {
21 return tab
22 }
23 }
24
25 return tabs[0]
26 }
27
28 export interface SubnavTabsProps<Tab extends SubnavTab> {
29 tabs: readonly Tab[]
30 ariaLabel: string
31 className?: string
32 currentTab: Tab
33 getTabCount?: (tab: Tab) => number | undefined
34 setCurrentTab: (tab: Tab) => void
35 queryParamName?: string
36 }
37
38 export const SubnavTabs = <Tab extends SubnavTab>({
39 tabs,
40 ariaLabel,
41 className,
42 currentTab,
43 getTabCount,
44 setCurrentTab,
45 queryParamName,
46 }: SubnavTabsProps<Tab>) =>
47 <nav className={classnames('snippet-type-nav', className)} aria-label={ariaLabel}>
48 <ul>
49 {tabs.map(tab => {
50 const count = getTabCount?.(tab)
51
52 return (
53 <li key={tab.name}>
54 <button
55 type="button"
56 className={classnames('snippet-type-link', `${tab.name}-subnav-link`, {
57 'active-type': tab.name === currentTab.name
58 })}
59 aria-current={tab.name === currentTab.name ? 'page' : undefined}
60 onClick={() => {
61 setCurrentTab(tab)
62
63 if (queryParamName) {
64 updateQueryParams({ [queryParamName]: tab.name })
65 }
66 }}
67 >
68 <span>{tab.label}</span>
69 {count && <span className="subnav-count">{count}</span>}
70 {tab.pro && !isLicensed() && <span className="pro-chip">{__('Pro', 'code-snippets')}</span>}
71 </button>
72 </li>
73 )
74 })}
75 </ul>
76 </nav>
77