HomeBar.tsx 3.2 KB

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