Second frontend, written in Next.JS + Typescript.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
1.5 KiB

4 years ago
  1. import React, { useContext, useEffect } from "react";
  2. import { parse } from "url";
  3. import { GetServerSideProps } from "next";
  4. import Head from "next/head";
  5. import { LogHeader, listLogs, LogFilter, logFilterFromQueryString } from "../../lib/rpdata/logs";
  6. import gqlSsrClient from "../../lib/client/graphql-ssr";
  7. import LogListContext, { LogListContextProvider } from "../../hooks/LogListContext";
  8. interface LogsPageProps {
  9. headers: LogHeader[]
  10. filter: LogFilter
  11. };
  12. export default function LogsPage(props: LogsPageProps) {
  13. return (
  14. <LogListContextProvider initialFilter={props.filter} initialHeader={props.headers}>
  15. <Head>
  16. <title>Logs - Aite RP</title>
  17. </Head>
  18. <LogList />
  19. </LogListContextProvider>
  20. );
  21. }
  22. function LogList() {
  23. const {headers, filter, updateFilter} = useContext(LogListContext);
  24. useEffect(() => {
  25. const timeout = setTimeout(() => {
  26. updateFilter({...filter, limit: 10});
  27. }, 3000);
  28. return () => clearTimeout(timeout);
  29. }, [updateFilter]);
  30. return (
  31. <>
  32. <ol>
  33. {headers.map(l => <li key={l.shortId}>{l.title || `${l.channelName}${l.date}`}</li>)}
  34. </ol>
  35. <pre>{JSON.stringify(filter, null, 4)}</pre>
  36. </>
  37. );
  38. }
  39. export const getServerSideProps: GetServerSideProps = async (ctx) => {
  40. const u = parse(ctx.req.url);
  41. const filter = logFilterFromQueryString(u.search || "");
  42. const headers = await listLogs(gqlSsrClient, filter)
  43. return {
  44. props: {
  45. filter,
  46. headers,
  47. },
  48. };
  49. }
  50. export const experimental = {
  51. trailingSlash: true
  52. }