PluginProbe ʕ •ᴥ•ʔ
Presto Player / trunk
Presto Player vtrunk
4.3.0 4.2.4 4.2.3 4.2.2 4.2.0 4.2.1 trunk 1.10.0 1.10.1 1.10.2 1.11.0 1.12.0 1.13.0 1.14.0 1.14.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.10 1.6.11 1.6.12 1.6.13 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.2.0 2.2.1 2.2.2 2.2.3 2.2.3-beta1 2.3.0 2.3.1 2.3.2 2.3.3 3.0.0 3.0.0-beta1 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.1.0 3.1.1 3.1.2 3.1.3 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4
presto-player / src / admin / ui / Menu.js
presto-player / src / admin / ui Last commit date
Menu.js 2 years ago
Menu.js
131 lines
1 /**
2 * External dependencies
3 */
4 import classnames from "classnames";
5
6 /**
7 * WordPress dependencies
8 */
9 import { __ } from "@wordpress/i18n";
10 import { useState, useEffect } from "@wordpress/element";
11
12 import { partial, noop, find } from "lodash";
13
14 /**
15 * WordPress components
16 */
17 import { NavigableMenu, Animate } from "@wordpress/components";
18
19 export default ({
20 className,
21 children,
22 items,
23 title,
24 orientation = "horizontal",
25 activeClass = "is-active",
26 onSelect = noop,
27 }) => {
28 const [selected, setSelected] = useState(null);
29 const [origin, setOrigin] = useState("left");
30
31 const handleClick = (itemKey) => {
32 setSelected(itemKey);
33 onSelect && onSelect(itemKey);
34 };
35
36 const onNavigate = (childIndex, child) => {
37 child.click();
38 };
39
40 const selectedTab = find(items, { name: selected });
41 const selectedId = `${selectedTab?.name ?? "none"}`;
42
43 useEffect(() => {
44 setOrigin(selected ? "right" : "left");
45 }, [selected]);
46
47 return (
48 <div className={className}>
49 <Animate type="slide-in" origin={!!selectedTab ? "right" : "left"}>
50 {({ className }) =>
51 !selectedTab ? (
52 <div className={classnames(className, "is-from-right")}>
53 {!!title && <h2>{title}</h2>}
54 <NavigableMenu
55 role="itemlist"
56 orientation={orientation}
57 onNavigate={onNavigate}
58 className={classnames("presto-player__menu-items")}
59 >
60 {items.map((item) => (
61 <div
62 className={classnames(
63 "presto-player__menu-item",
64 item.className,
65 {
66 [activeClass]: item.name === selected,
67 }
68 )}
69 itemId={`${item.name}`}
70 aria-controls={`${item.name}-view`}
71 selected={item.name === selected}
72 key={item.name}
73 onClick={partial(handleClick, item.name)}
74 >
75 {!!item.icon && (
76 <div class="presto-player__menu-icon">{item.icon}</div>
77 )}
78 {item.title}
79 <svg
80 className="submenu-icon"
81 xmlns="http://www.w3.org/2000/svg"
82 viewBox="0 0 24 24"
83 width="24"
84 height="24"
85 role="img"
86 ariaHidden="true"
87 focusable="false"
88 >
89 <path d="M10.6 6L9.4 7l4.6 5-4.6 5 1.2 1 5.4-6z"></path>
90 </svg>
91 </div>
92 ))}
93 </NavigableMenu>
94 </div>
95 ) : (
96 <div
97 key={selectedId}
98 aria-labelledby={selectedId}
99 role="itempanel"
100 id={`${selectedId}-view`}
101 className={classnames(className, "presto-player__menu-content")}
102 >
103 <div className="presto-player__menu-items">
104 <div
105 className="presto-player__menu-item is-back-button"
106 onClick={() => handleClick("")}
107 >
108 <svg
109 class="back-icon"
110 xmlns="http://www.w3.org/2000/svg"
111 viewBox="0 0 24 24"
112 width="24"
113 height="24"
114 role="img"
115 aria-hidden="true"
116 focusable="false"
117 >
118 <path d="M14.6 7l-1.2-1L8 12l5.4 6 1.2-1-4.6-5z"></path>
119 </svg>
120 {__("Back", "presto-player")}
121 </div>
122 </div>
123 {children(selectedTab)}
124 </div>
125 )
126 }
127 </Animate>
128 </div>
129 );
130 };
131