index.svelte 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <script lang="typescript" context="module">
  2. import type { AppSession, PageData, PreloadContext } from "src/utils/session";
  3. import type { Option } from "@shared/common/async_utils";
  4. import type { MDText } from "./md";
  5. import type { VerifyInfo } from "./verify";
  6. export async function preload(
  7. this: PreloadContext,
  8. { path }: PageData,
  9. session: AppSession
  10. ) {
  11. const mdResult = await this.fetch("/rules/md");
  12. const md = (await mdResult.json()) as Option<MDText, { error: string }>;
  13. const verifyReusult = await this.fetch("/rules/verify");
  14. const verify = (await verifyReusult.json()) as VerifyInfo;
  15. return {
  16. rulesText: md.ok ? md.text : "",
  17. sitekey: verify.captchaSitekey,
  18. };
  19. }
  20. </script>
  21. <script lang="typescript">
  22. import { Converter } from "showdown";
  23. import { onMount } from "svelte";
  24. import Icon from "svelte-awesome/components/Icon.svelte";
  25. import { faSpinner } from "@fortawesome/free-solid-svg-icons";
  26. import { fade } from "svelte/transition";
  27. export let rulesText!: string;
  28. export let sitekey!: string;
  29. const spinner = (faSpinner as unknown) as undefined;
  30. let htmlContent = new Converter().makeHtml(rulesText);
  31. enum State { None, Verify, Error, Message };
  32. let state: State = State.None;
  33. let message: string = "";
  34. function onVerified(e: { key: string }) {
  35. // console.log(e.key);
  36. state = State.Verify;
  37. // message = "wew";
  38. }
  39. </script>
  40. <style>
  41. @import "./markdown-dark.css";
  42. .viewport {
  43. @apply bg-gray-700 h-screen w-screen p-8 pt-16;
  44. overflow-y: auto;
  45. }
  46. @screen lg {
  47. .viewport {
  48. @apply w-2/4;
  49. }
  50. }
  51. .message {
  52. @apply text-white;
  53. }
  54. .error {
  55. @apply text-red-600;
  56. }
  57. </style>
  58. <div class="viewport md-dark md-body">
  59. <div>
  60. {@html htmlContent}
  61. </div>
  62. <div class="flex flex-col flex-wrap items-center">
  63. <a href="asd" on:click|preventDefault={() => onVerified({ key: "wew" })}>Verify test</a>
  64. <!-- <h-captcha site-key={sitekey} dark on:verified={onVerified} /> -->
  65. <div class="py-2">
  66. {#if state == State.Verify}
  67. <span transition:fade={{ duration: 50 }}><Icon data={spinner} spin /> Verifying</span>
  68. {:else if state == State.Error || state == State.Message }
  69. <span class:message={state == State.Message} class:error={state == State.Error}>{message}</span>
  70. {/if}
  71. </div>
  72. </div>
  73. </div>