1
- import {
2
- useContext ,
3
- useEffect ,
4
- useState ,
5
- useMemo ,
6
- } from "react" ;
1
+ import { useContext , useEffect , useState , useMemo } from "react" ;
7
2
import { ProposalContext } from "./context/ProposalContext" ;
8
3
import { useRouter } from "next/router" ;
9
4
import { classNames } from "@/utils/functions/tailwind" ;
10
5
import ProposalContent from "./ProposalContent" ;
11
6
import ProposalActivityFeeds from "./sub/ProposalActivityFeeds" ;
12
7
import ProposalMetadata from "./sub/ProposalMetadata" ;
8
+ import { SnapshotVotingType } from "@/models/SnapshotTypes" ;
9
+ import ProposalOptions from "./ProposalOptions" ;
13
10
14
-
15
- const TABS = [ "Content" , "Activity" , "Actions" ] as const ;
11
+ const TABS = [ "Content" , "Activity" , "Actions" , "Results" ] as const ;
16
12
const LG_MIN_WIDTH = 1024 ;
17
13
18
14
export default function ProposalTabs ( ) {
19
15
const router = useRouter ( ) ;
20
- const [ query , setQuery ] = useState < typeof TABS [ number ] > ( "Content" ) ;
21
- const { commonProps } = useContext ( ProposalContext ) ;
16
+ const [ query , setQuery ] = useState < ( typeof TABS ) [ number ] > ( "Content" ) ;
17
+ const { commonProps, proposalInfo } = useContext ( ProposalContext ) ;
22
18
23
19
// Memoize filtered tabs
24
20
const filteredTabs = useMemo ( ( ) => {
25
- const tabs = TABS . filter ( t => t !== "Content" ) ;
21
+ const tabs = TABS . filter ( ( t ) => t !== "Content" ) ;
26
22
if ( commonProps . actions . length === 0 ) {
27
- return tabs . filter ( t => t !== "Actions" ) ;
23
+ return tabs . filter ( ( t ) => t !== "Actions" ) ;
24
+ }
25
+ if (
26
+ proposalInfo === undefined ||
27
+ proposalInfo ?. type === SnapshotVotingType . BASIC
28
+ ) {
29
+ return tabs . filter ( ( t ) => t !== "Results" ) ;
28
30
}
29
31
return tabs ;
30
32
} , [ commonProps . actions ] ) ;
31
33
32
34
useEffect ( ( ) => {
33
35
const correctContentTab = ( ) => {
34
- if ( window . innerWidth >= LG_MIN_WIDTH && query === "Content" && router . isReady ) {
36
+ if (
37
+ window . innerWidth >= LG_MIN_WIDTH &&
38
+ query === "Content" &&
39
+ router . isReady
40
+ ) {
35
41
handleTabChange ( "Activity" ) ;
36
42
}
37
43
} ;
@@ -51,21 +57,18 @@ export default function ProposalTabs() {
51
57
} ;
52
58
} , [ query , router . isReady ] ) ;
53
59
54
- const handleTabChange = ( tab : typeof TABS [ number ] ) => {
60
+ const handleTabChange = ( tab : ( typeof TABS ) [ number ] ) => {
55
61
setQuery ( tab ) ;
56
- router . replace ( {
57
- pathname : router . pathname ,
58
- query : { ...router . query , tab } ,
59
- } ) ;
60
62
} ;
61
63
62
- const getTabClasses = useMemo ( ( ) => ( isActive : boolean ) =>
63
- classNames (
64
- isActive
65
- ? "border-indigo-500 text-indigo-600"
66
- : "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700" ,
67
- "whitespace-nowrap border-b-2 p-1 text-sm font-medium cursor-pointer"
68
- ) ,
64
+ const getTabClasses = useMemo (
65
+ ( ) => ( isActive : boolean ) =>
66
+ classNames (
67
+ isActive
68
+ ? "border-indigo-500 text-indigo-600"
69
+ : "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700" ,
70
+ "whitespace-nowrap border-b-2 p-1 text-sm font-medium cursor-pointer"
71
+ ) ,
69
72
[ ]
70
73
) ;
71
74
@@ -88,7 +91,7 @@ export default function ProposalTabs() {
88
91
89
92
{ /* Small screen nav */ }
90
93
< nav aria-label = "Tabs" className = "-mb-px flex lg:hidden space-x-8" >
91
- { TABS . map ( ( tab ) => (
94
+ { [ TABS [ 0 ] , ... filteredTabs ] . map ( ( tab ) => (
92
95
< button
93
96
key = { tab }
94
97
onClick = { ( ) => handleTabChange ( tab ) }
@@ -102,13 +105,15 @@ export default function ProposalTabs() {
102
105
</ div >
103
106
104
107
< div >
105
- { ( query === "Content" || ( ! query && window . innerWidth < LG_MIN_WIDTH ) ) && (
108
+ { ( query === "Content" ||
109
+ ( ! query && window . innerWidth < LG_MIN_WIDTH ) ) && (
106
110
< div className = "hidden mt-4 w-[90vw] max-lg:block" >
107
111
< ProposalContent />
108
112
</ div >
109
113
) }
110
114
111
- { ( query === "Activity" || ( ! query && window . innerWidth >= LG_MIN_WIDTH ) ) && (
115
+ { ( query === "Activity" ||
116
+ ( ! query && window . innerWidth >= LG_MIN_WIDTH ) ) && (
112
117
< div className = "mt-4 max-lg:w-[90vw] block" >
113
118
< ProposalActivityFeeds />
114
119
</ div >
@@ -119,6 +124,12 @@ export default function ProposalTabs() {
119
124
< ProposalMetadata />
120
125
</ div >
121
126
) }
127
+
128
+ { query === "Results" && proposalInfo !== undefined && (
129
+ < div className = "mt-4 max-lg:w-[90vw] overflow-x-auto block" >
130
+ < ProposalOptions proposal = { proposalInfo } />
131
+ </ div >
132
+ ) }
122
133
</ div >
123
134
</ div >
124
135
) ;
0 commit comments