HomeBar.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import Input from "../components/form/Input.tsx";
  2. import Button from "../components/form/Button.tsx";
  3. import ThemeToggle from "./ThemeToggle.tsx";
  4. interface HomeBarProps {
  5. name: string;
  6. }
  7. const settingsData: { [key: string]: string } = {};
  8. export default function HomeBar(props: HomeBarProps) {
  9. const doNewPost = async () => {
  10. globalThis.$loading?.show();
  11. const resp = await fetch("/api/post", {
  12. method: "POST",
  13. headers: { "Content-Type": "application/json" },
  14. body: JSON.stringify({
  15. title: "",
  16. content: "",
  17. }),
  18. });
  19. const respJson = await resp.json();
  20. if (respJson.success) {
  21. location.href = `/${respJson.data}`;
  22. return true;
  23. }
  24. return false;
  25. };
  26. const doLogout = async () => {
  27. const resp = await fetch("/api/user/logout");
  28. const respJson = await resp.json();
  29. if (respJson.success) {
  30. location.href = "/login";
  31. return true;
  32. }
  33. return false;
  34. };
  35. const showReset = () => {
  36. settingsData["old"] = "";
  37. settingsData["new"] = "";
  38. settingsData["repeat"] = "";
  39. globalThis.$modal?.show(
  40. "Reset password",
  41. <div>
  42. <Input
  43. label="Old password"
  44. type="password"
  45. placeholder="Old password"
  46. value={settingsData["old"]}
  47. onInput={(e) => {
  48. settingsData["old"] = (e.target as HTMLInputElement).value;
  49. }}
  50. />
  51. <Input
  52. label="New password"
  53. type="password"
  54. placeholder="New password"
  55. value={settingsData["new"]}
  56. onInput={(e) => {
  57. settingsData["new"] = (e.target as HTMLInputElement).value;
  58. }}
  59. />
  60. <Input
  61. label="Repeat new password"
  62. type="password"
  63. placeholder="Repeat new password"
  64. value={settingsData["repeat"]}
  65. onInput={(e) => {
  66. settingsData["repeat"] = (e.target as HTMLInputElement).value;
  67. }}
  68. />
  69. </div>,
  70. [
  71. {
  72. text: "Confirm",
  73. onClick: async () => {
  74. if (
  75. settingsData["old"] && settingsData["new"] &&
  76. settingsData["repeat"] &&
  77. settingsData["new"] === settingsData["repeat"]
  78. ) {
  79. const resp = await fetch("/api/user/reset", {
  80. method: "POST",
  81. headers: { "Content-Type": "application/json" },
  82. body: JSON.stringify({
  83. old: settingsData["old"],
  84. new: settingsData["new"],
  85. }),
  86. });
  87. const respJson = await resp.json();
  88. if (respJson.success) {
  89. globalThis.$modal?.hide();
  90. }
  91. }
  92. },
  93. },
  94. ],
  95. );
  96. };
  97. return (
  98. <div className="flex items-center justify-between">
  99. <Button
  100. type="button"
  101. onClick={doNewPost}
  102. >
  103. New Post
  104. </Button>
  105. <div className="flex items-center">
  106. <span>{props.name}</span>
  107. <Button
  108. type="button"
  109. className="ml-2"
  110. onClick={showReset}
  111. >
  112. Password
  113. </Button>
  114. <Button
  115. type="button"
  116. className="ml-2"
  117. onClick={doLogout}
  118. >
  119. Logout
  120. </Button>
  121. <span className="ml-3">
  122. <ThemeToggle />
  123. </span>
  124. </div>
  125. </div>
  126. );
  127. }