HomeBar.tsx 3.4 KB

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