Messages.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import React, { useCallback, useMemo, useState } from 'react';
  2. import TopicMessagesContext from 'components/contexts/TopicMessagesContext';
  3. import { SeekDirection, SerdeUsage } from 'generated-sources';
  4. import { useSearchParams } from 'react-router-dom';
  5. import { useSerdes } from 'lib/hooks/api/topicMessages';
  6. import useAppParams from 'lib/hooks/useAppParams';
  7. import { RouteParamsClusterTopic } from 'lib/paths';
  8. import { getDefaultSerdeName } from 'components/Topics/Topic/MessagesV2/utils/getDefaultSerdeName';
  9. import MessagesTable from './MessagesTable';
  10. import FiltersContainer from './Filters/FiltersContainer';
  11. export const SeekDirectionOptionsObj = {
  12. [SeekDirection.FORWARD]: {
  13. value: SeekDirection.FORWARD,
  14. label: 'Oldest First',
  15. isLive: false,
  16. },
  17. [SeekDirection.BACKWARD]: {
  18. value: SeekDirection.BACKWARD,
  19. label: 'Newest First',
  20. isLive: false,
  21. },
  22. [SeekDirection.TAILING]: {
  23. value: SeekDirection.TAILING,
  24. label: 'Live Mode',
  25. isLive: true,
  26. },
  27. };
  28. export const SeekDirectionOptions = Object.values(SeekDirectionOptionsObj);
  29. const Messages: React.FC = () => {
  30. const [searchParams, setSearchParams] = useSearchParams();
  31. const { clusterName, topicName } = useAppParams<RouteParamsClusterTopic>();
  32. const { data: serdes = {} } = useSerdes({
  33. clusterName,
  34. topicName,
  35. use: SerdeUsage.DESERIALIZE,
  36. });
  37. React.useEffect(() => {
  38. if (!searchParams.get('keySerde')) {
  39. searchParams.set('keySerde', getDefaultSerdeName(serdes.key || []));
  40. }
  41. if (!searchParams.get('valueSerde')) {
  42. searchParams.set('valueSerde', getDefaultSerdeName(serdes.value || []));
  43. }
  44. setSearchParams(searchParams);
  45. }, [serdes]);
  46. const defaultSeekValue = SeekDirectionOptions[0];
  47. const [seekDirection, setSeekDirection] = React.useState<SeekDirection>(
  48. (searchParams.get('seekDirection') as SeekDirection) ||
  49. defaultSeekValue.value
  50. );
  51. const [isLive, setIsLive] = useState<boolean>(
  52. SeekDirectionOptionsObj[seekDirection].isLive
  53. );
  54. const changeSeekDirection = useCallback((val: string) => {
  55. switch (val) {
  56. case SeekDirection.FORWARD:
  57. setSeekDirection(SeekDirection.FORWARD);
  58. setIsLive(SeekDirectionOptionsObj[SeekDirection.FORWARD].isLive);
  59. break;
  60. case SeekDirection.BACKWARD:
  61. setSeekDirection(SeekDirection.BACKWARD);
  62. setIsLive(SeekDirectionOptionsObj[SeekDirection.BACKWARD].isLive);
  63. break;
  64. case SeekDirection.TAILING:
  65. setSeekDirection(SeekDirection.TAILING);
  66. setIsLive(SeekDirectionOptionsObj[SeekDirection.TAILING].isLive);
  67. break;
  68. default:
  69. }
  70. }, []);
  71. const contextValue = useMemo(
  72. () => ({
  73. seekDirection,
  74. changeSeekDirection,
  75. isLive,
  76. }),
  77. [seekDirection, changeSeekDirection]
  78. );
  79. return (
  80. <TopicMessagesContext.Provider value={contextValue}>
  81. <FiltersContainer />
  82. <MessagesTable />
  83. </TopicMessagesContext.Provider>
  84. );
  85. };
  86. export default Messages;