|
1 | 1 | type Props = {}
|
2 |
| -import { useSelectedTab,useUserData,useAllResources, useCompleteResourceLength,useLoginModal } from 'hooks/Zustand'; |
| 2 | +import { useSelectedTab, useUserData, useAllResources, useCompleteResourceLength, useLoginModal } from 'hooks/Zustand'; |
3 | 3 | import { event } from 'nextjs-google-analytics';
|
4 | 4 | import { useState, useEffect } from 'react';
|
5 |
| -import {Tabs, Tab,} from "@nextui-org/react"; |
6 |
| -import {Kbd} from "@nextui-org/react"; |
| 5 | +import { Tabs, Tab, } from "@nextui-org/react"; |
| 6 | +import { Kbd } from "@nextui-org/react"; |
7 | 7 | import { useRouter } from 'next/router';
|
8 | 8 |
|
9 | 9 | const ResourceListBar = (props: Props) => {
|
10 |
| - const {session} = useUserData() |
11 |
| - const {setSelectedTab, selectedTab} = useSelectedTab() |
12 |
| - const {setAllResources,allResources} = useAllResources() |
13 |
| - const {completeResourceLength,setCompleteResourceLength} = useCompleteResourceLength() |
14 |
| - const {setIsLoginModalOpen} = useLoginModal() |
| 10 | + const { session } = useUserData() |
| 11 | + const { setSelectedTab, selectedTab } = useSelectedTab() |
| 12 | + const { setAllResources, allResources } = useAllResources() |
| 13 | + const { completeResourceLength, setCompleteResourceLength } = useCompleteResourceLength() |
| 14 | + const { setIsLoginModalOpen } = useLoginModal() |
| 15 | + const [isInitialized, setIsInitialized] = useState(false); |
15 | 16 | const router = useRouter()
|
16 | 17 | const [tabs, setTabs] = useState([
|
17 | 18 | {
|
18 |
| - id:1, |
19 |
| - name:'All Resources', |
20 |
| - slug:'all', |
21 |
| - selected:true |
| 19 | + id: 1, |
| 20 | + name: 'All Resources', |
| 21 | + slug: 'all', |
| 22 | + selected: true |
22 | 23 | },
|
23 | 24 | {
|
24 |
| - id:2, |
25 |
| - name:'Saved Resources', |
26 |
| - slug:'saved', |
27 |
| - selected:false |
28 |
| - },{ |
29 |
| - id:3, |
30 |
| - name:'My Resources', |
31 |
| - slug:'my', |
32 |
| - selected:false |
33 |
| - },{ |
34 |
| - id:4, |
35 |
| - name:'Publish', |
36 |
| - slug:'publish', |
37 |
| - selected:false |
| 25 | + id: 2, |
| 26 | + name: 'Saved Resources', |
| 27 | + slug: 'saved', |
| 28 | + selected: false |
| 29 | + }, { |
| 30 | + id: 3, |
| 31 | + name: 'My Resources', |
| 32 | + slug: 'my', |
| 33 | + selected: false |
| 34 | + }, { |
| 35 | + id: 4, |
| 36 | + name: 'Publish', |
| 37 | + slug: 'publish', |
| 38 | + selected: false |
38 | 39 | }
|
39 | 40 | ])
|
40 | 41 |
|
41 |
| - const selectionHandler = (id:number)=>{ |
42 |
| - if(session){ |
43 |
| - const newTabs = tabs.map(e=>{ |
| 42 | + const selectionHandler = (id: number) => { |
| 43 | + if (session) { |
| 44 | + const newTabs = tabs.map(e => { |
44 | 45 | return {
|
45 | 46 | ...e,
|
46 |
| - selected:false |
| 47 | + selected: false |
47 | 48 | }
|
48 | 49 | })
|
49 |
| - newTabs[id-1].selected = true |
50 |
| - setSelectedTab(newTabs[id-1].slug) |
51 |
| - setAllResources(newTabs[id-1].slug) |
52 |
| - setCompleteResourceLength(newTabs[id-1].slug) |
53 |
| - if(newTabs[id-1].slug === 'all'){ |
| 50 | + newTabs[id - 1].selected = true |
| 51 | + setSelectedTab(newTabs[id - 1].slug) |
| 52 | + setAllResources(newTabs[id - 1].slug) |
| 53 | + setCompleteResourceLength(newTabs[id - 1].slug) |
| 54 | + if (newTabs[id - 1].slug === 'all') { |
54 | 55 | router.replace({
|
55 | 56 | pathname: '/',
|
56 | 57 | }, undefined, { shallow: true })
|
57 |
| - }else{ |
| 58 | + } else { |
58 | 59 | router.replace({
|
59 | 60 | pathname: '/',
|
60 |
| - query: { |
| 61 | + query: { |
61 | 62 | ...router.query,
|
62 |
| - tab: newTabs[id-1].slug |
63 |
| - }, |
| 63 | + tab: newTabs[id - 1].slug |
| 64 | + }, |
64 | 65 | }, undefined, { shallow: true })
|
65 | 66 | }
|
66 | 67 | setTabs(newTabs)
|
67 |
| - }else{ |
| 68 | + } else { |
68 | 69 | setIsLoginModalOpen(true)
|
69 | 70 | }
|
70 | 71 | }
|
71 | 72 |
|
72 |
| - useEffect(()=>{ |
73 |
| - if(!localStorage.getItem('token') && router.query.tab){ |
74 |
| - router.replace({ |
75 |
| - pathname: '/', |
76 |
| - }, undefined, { shallow: true }) |
77 |
| - } |
78 | 73 |
|
79 |
| - if(localStorage.getItem('token') && !router.query.tab){ |
80 |
| - router.replace({ |
81 |
| - pathname: '/', |
82 |
| - query: { |
83 |
| - ...router.query, |
84 |
| - tab: 'all' |
85 |
| - }, |
86 |
| - }, undefined, { shallow: true }) |
87 |
| - } |
88 | 74 |
|
89 |
| - if(localStorage.getItem('token') && router.query.tab){ |
90 |
| - const tab = tabs.find(e=>e.slug === router.query.tab) |
91 |
| - if(tab){ |
92 |
| - selectionHandler(tab.id) |
| 75 | + useEffect(() => { |
| 76 | + // Only proceed if router.query is ready |
| 77 | + if (!isInitialized && Object.keys(router.query).length > 0) { |
| 78 | + setIsInitialized(true); |
| 79 | + |
| 80 | + if (!localStorage.getItem('token') && router.query.tab) { |
| 81 | + router.replace('/', undefined, { shallow: true }); |
| 82 | + } else if (localStorage.getItem('token') && !router.query.tab) { |
| 83 | + router.replace({ |
| 84 | + pathname: '/', |
| 85 | + query: { ...router.query, tab: 'all' }, |
| 86 | + }, undefined, { shallow: true }); |
| 87 | + } else if (localStorage.getItem('token') && router.query.tab) { |
| 88 | + const tab = tabs.find(e => e.slug === router.query.tab); |
| 89 | + if (tab) { |
| 90 | + selectionHandler(tab.id); |
| 91 | + } |
93 | 92 | }
|
94 |
| - } |
95 |
| - |
96 |
| - |
97 |
| - if(session?.email){ |
98 |
| - if(router.query.tab){ |
99 |
| - const tab = tabs.find(e=>e.slug === router.query.tab) |
100 |
| - if(tab){ |
101 |
| - selectionHandler(tab.id) |
| 93 | + |
| 94 | + if (session?.email && router.query.tab) { |
| 95 | + const tab = tabs.find(e => e.slug === router.query.tab); |
| 96 | + if (tab) { |
| 97 | + selectionHandler(tab.id); |
102 | 98 | }
|
103 | 99 | }
|
104 | 100 | }
|
105 |
| - } |
106 |
| - ,[session?.email]) |
| 101 | + }, [session?.email, router.query, isInitialized]); |
107 | 102 |
|
108 | 103 |
|
109 |
| - useEffect(()=>{ |
| 104 | + |
| 105 | + useEffect(() => { |
110 | 106 | window.scrollTo({
|
111 | 107 | top: 0,
|
112 | 108 | behavior: "smooth",
|
113 | 109 | });
|
114 |
| - },[selectedTab]) |
| 110 | + }, [selectedTab]) |
115 | 111 |
|
116 | 112 | return (
|
117 | 113 | <div className="w-[100%] sticky mt-[0.5rem] items-center top-[70px] z-[2] bg-gray lazyweb-resource-list flex justify-start">
|
118 |
| - <div className="flex flex-col ml-[1rem] py-[0.5rem]"> |
119 |
| - <Tabs |
120 |
| - aria-label="Options" |
121 |
| - color='default' |
122 |
| - |
123 |
| - variant='bordered' |
124 |
| - selectedKey={tabs.find(e=>e.selected)?.slug} |
125 |
| - onSelectionChange={(e)=>{ |
126 |
| - const tab = tabs.find(ee=>ee.slug === e) |
127 |
| - if(tab){ |
128 |
| - selectionHandler(tab.id) |
| 114 | + <div className="flex flex-col ml-[1rem] py-[0.5rem]"> |
| 115 | + <Tabs |
| 116 | + aria-label="Options" |
| 117 | + color='default' |
| 118 | + |
| 119 | + variant='bordered' |
| 120 | + selectedKey={tabs.find(e => e.selected)?.slug} |
| 121 | + onSelectionChange={(e) => { |
| 122 | + const tab = tabs.find(ee => ee.slug === e) |
| 123 | + if (tab) { |
| 124 | + selectionHandler(tab.id) |
| 125 | + } |
| 126 | + }} |
| 127 | + > |
| 128 | + { |
| 129 | + tabs.map((e, i) => { |
| 130 | + if (e.slug === 'publish' && !session?.isAdmin) return null |
| 131 | + return ( |
| 132 | + <Tab key={e.slug} title={e.name}> |
| 133 | + </Tab> |
| 134 | + ) |
| 135 | + }) |
129 | 136 | }
|
130 |
| - }} |
131 |
| - > |
132 |
| - { |
133 |
| - tabs.map((e,i)=>{ |
134 |
| - if(e.slug === 'publish' && !session?.isAdmin) return null |
135 |
| - return ( |
136 |
| - <Tab key={e.slug} title={e.name}> |
137 |
| - </Tab> |
138 |
| - ) |
139 |
| - }) |
140 |
| - } |
141 |
| - </Tabs> |
142 |
| - </div> |
| 137 | + </Tabs> |
| 138 | + </div> |
143 | 139 | <div className="flex scale-75 items-center ml-[0rem]">
|
144 |
| - <kbd className="px-2 py-1 text-white bg-gray-900 border border-gray-700 rounded"> |
145 |
| - ctrl |
146 |
| - </kbd> |
147 |
| - <span className="ml-2 text-trueGray-200">+</span> |
148 |
| - <kbd className="px-2 py-1 ml-2 text-white bg-gray-900 border border-gray-700 rounded"> |
149 |
| - space |
150 |
| - </kbd> |
151 |
| - <span className="ml-2 text-trueGray-200">for AI search</span> |
152 |
| - </div> |
| 140 | + <kbd className="px-2 py-1 text-white bg-gray-900 border border-gray-700 rounded"> |
| 141 | + ctrl |
| 142 | + </kbd> |
| 143 | + <span className="ml-2 text-trueGray-200">+</span> |
| 144 | + <kbd className="px-2 py-1 ml-2 text-white bg-gray-900 border border-gray-700 rounded"> |
| 145 | + space |
| 146 | + </kbd> |
| 147 | + <span className="ml-2 text-trueGray-200">for AI search</span> |
| 148 | + </div> |
153 | 149 | </div>
|
154 | 150 | )
|
155 | 151 | }
|
|
0 commit comments