index.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import { Tab } from '@headlessui/react'
  2. import type { NextPage } from 'next'
  3. import { useRouter } from 'next/router'
  4. import { useEffect, useState } from 'react'
  5. import Layout from '../components/layout/Layout'
  6. import AddRemovePublishers from '../components/tabs/AddRemovePublishers'
  7. import MinPublishers from '../components/tabs/MinPublishers'
  8. import UpdatePermissions from '../components/tabs/UpdatePermissions'
  9. import UpdateProductMetadata from '../components/tabs/UpdateProductMetadata'
  10. import { PythContextProvider } from '../contexts/PythContext'
  11. import { classNames } from '../utils/classNames'
  12. const TAB_INFO = {
  13. MinPublishers: {
  14. title: 'Min Publishers',
  15. description:
  16. 'Set the minimum number of publishers required to publish a price.',
  17. queryString: 'min-publishers',
  18. },
  19. UpdatePermissions: {
  20. title: 'Update Permissions',
  21. description: 'Update the permissions of the program.',
  22. queryString: 'update-permissions',
  23. },
  24. AddRemovePublishers: {
  25. title: 'Add/Remove Publishers',
  26. description: 'Add or remove publishers from price feeds.',
  27. queryString: 'add-remove-publishers',
  28. },
  29. UpdateProductMetadata: {
  30. title: 'Update Product Metadata',
  31. description: 'Update the metadata of a product.',
  32. queryString: 'update-product-metadata',
  33. },
  34. }
  35. const DEFAULT_TAB = 'min-publishers'
  36. const Home: NextPage = () => {
  37. const [currentTabIndex, setCurrentTabIndex] = useState(0)
  38. const tabInfoArray = Object.values(TAB_INFO)
  39. const router = useRouter()
  40. // set current tab value when tab is clicked
  41. const handleChangeTab = (index: number) => {
  42. router.query.tab = tabInfoArray[index].queryString
  43. setCurrentTabIndex(index)
  44. router.push(
  45. {
  46. pathname: router.pathname,
  47. query: router.query,
  48. },
  49. undefined,
  50. { scroll: false }
  51. )
  52. }
  53. // set current tab value when page is loaded
  54. useEffect(() => {
  55. router.query && router.query.tab
  56. ? setCurrentTabIndex(
  57. tabInfoArray.findIndex((v) => v.queryString === router.query.tab)
  58. )
  59. : setCurrentTabIndex(
  60. tabInfoArray.findIndex((v) => v.queryString === DEFAULT_TAB)
  61. )
  62. }, [router, tabInfoArray])
  63. return (
  64. <Layout>
  65. <PythContextProvider>
  66. <div className="container relative pt-16 md:pt-20">
  67. <div className="py-8 md:py-16">
  68. <Tab.Group
  69. selectedIndex={currentTabIndex}
  70. onChange={handleChangeTab}
  71. >
  72. <Tab.List className="mx-auto gap-1 space-x-4 text-center sm:gap-2.5 md:space-x-8">
  73. {Object.entries(TAB_INFO).map((tab, idx) => (
  74. <Tab
  75. key={idx}
  76. className={({ selected }) =>
  77. classNames(
  78. 'p-3 text-xs font-semibold uppercase outline-none transition-colors md:text-base',
  79. currentTabIndex === idx
  80. ? 'bg-darkGray3'
  81. : 'bg-darkGray2',
  82. selected ? 'bg-darkGray3' : 'hover:bg-darkGray3'
  83. )
  84. }
  85. >
  86. {tab[1].title}
  87. </Tab>
  88. ))}
  89. </Tab.List>
  90. </Tab.Group>
  91. </div>
  92. </div>
  93. {tabInfoArray[currentTabIndex].queryString ===
  94. TAB_INFO.MinPublishers.queryString ? (
  95. <MinPublishers />
  96. ) : tabInfoArray[currentTabIndex].queryString ===
  97. TAB_INFO.UpdatePermissions.queryString ? (
  98. <UpdatePermissions />
  99. ) : tabInfoArray[currentTabIndex].queryString ===
  100. TAB_INFO.AddRemovePublishers.queryString ? (
  101. <AddRemovePublishers />
  102. ) : tabInfoArray[currentTabIndex].queryString ===
  103. TAB_INFO.UpdateProductMetadata.queryString ? (
  104. <UpdateProductMetadata />
  105. ) : null}
  106. </PythContextProvider>
  107. </Layout>
  108. )
  109. }
  110. export default Home