diff --git a/store/db/sqlite/seed/10002__memo.sql b/store/db/sqlite/seed/10002__memo.sql
index de27dbb9..2fb84812 100644
--- a/store/db/sqlite/seed/10002__memo.sql
+++ b/store/db/sqlite/seed/10002__memo.sql
@@ -20,8 +20,7 @@ VALUES
'#TODO
- [x] Take more photos about **🌄 sunset**;
- [x] Clean the room;
-- [ ] Read *📖 The Little Prince*;
-(👆 click to toggle status)',
+- [ ] Read *📖 The Little Prince*;',
101,
'PROTECTED'
);
diff --git a/web/src/components/MemoEditor/index.tsx b/web/src/components/MemoEditor/index.tsx
index b6b7ff36..a6f80d08 100644
--- a/web/src/components/MemoEditor/index.tsx
+++ b/web/src/components/MemoEditor/index.tsx
@@ -72,7 +72,6 @@ const MemoEditor = (props: Props) => {
useEffect(() => {
editorRef.current?.setContent(contentCache || "");
- handleEditorFocus();
}, []);
useEffect(() => {
diff --git a/web/src/components/MobileHeader.tsx b/web/src/components/MobileHeader.tsx
index 7c0688a3..96f64ae7 100644
--- a/web/src/components/MobileHeader.tsx
+++ b/web/src/components/MobileHeader.tsx
@@ -1,4 +1,6 @@
+import classNames from "classnames";
import { useState } from "react";
+import { useWindowScroll } from "react-use";
import useResponsiveWidth from "@/hooks/useResponsiveWidth";
import NavigationDrawer from "./NavigationDrawer";
@@ -10,9 +12,15 @@ const MobileHeader = (props: Props) => {
const { children } = props;
const { sm } = useResponsiveWidth();
const [titleText] = useState("MEMOS");
+ const { y: offsetTop } = useWindowScroll();
return (
-
+
0 && "shadow-md"
+ )}
+ >
{!sm && }
)}
-
+
diff --git a/web/src/pages/Archived.tsx b/web/src/pages/Archived.tsx
index 2497dec9..e6b94fb1 100644
--- a/web/src/pages/Archived.tsx
+++ b/web/src/pages/Archived.tsx
@@ -30,24 +30,26 @@ const Archived = () => {
}, [memos]);
return (
-
+
- {loadingState.isLoading ? (
-
-
{t("memo.fetching-data")}
-
- ) : archivedMemos.length === 0 ? (
-
-
-
{t("message.no-data")}
-
- ) : (
-
- {archivedMemos.map((memo) => (
-
- ))}
-
- )}
+
+ {loadingState.isLoading ? (
+
+
{t("memo.fetching-data")}
+
+ ) : archivedMemos.length === 0 ? (
+
+
+
{t("message.no-data")}
+
+ ) : (
+
+ {archivedMemos.map((memo) => (
+
+ ))}
+
+ )}
+
);
};
diff --git a/web/src/pages/Explore.tsx b/web/src/pages/Explore.tsx
index df2cc91f..8a0d55a3 100644
--- a/web/src/pages/Explore.tsx
+++ b/web/src/pages/Explore.tsx
@@ -54,9 +54,9 @@ const Explore = () => {
};
return (
-
+
-
+
{sortedMemos.map((memo) => (
diff --git a/web/src/pages/Home.tsx b/web/src/pages/Home.tsx
index 5734a9fd..a23610ca 100644
--- a/web/src/pages/Home.tsx
+++ b/web/src/pages/Home.tsx
@@ -9,14 +9,16 @@ const Home = () => {
const { md } = useResponsiveWidth();
return (
-
-
+
+
{md && (
-
+
)}
diff --git a/web/src/pages/Inboxes.tsx b/web/src/pages/Inboxes.tsx
index 49fb907c..dd209249 100644
--- a/web/src/pages/Inboxes.tsx
+++ b/web/src/pages/Inboxes.tsx
@@ -20,30 +20,32 @@ const Inboxes = () => {
}, []);
return (
-
+
-
-
-
- {t("common.inbox")}
-
-
-
- {inboxes.length === 0 && (
-
-
-
{t("message.no-data")}
+
+
+
+
+ {t("common.inbox")}
+
+
+
+ {inboxes.length === 0 && (
+
+
+
{t("message.no-data")}
+
+ )}
+
+ {inboxes.map((inbox) => {
+ if (inbox.type === Inbox_Type.TYPE_MEMO_COMMENT) {
+ return ;
+ } else if (inbox.type === Inbox_Type.TYPE_VERSION_UPDATE) {
+ return ;
+ }
+ return undefined;
+ })}
- )}
-
- {inboxes.map((inbox) => {
- if (inbox.type === Inbox_Type.TYPE_MEMO_COMMENT) {
- return ;
- } else if (inbox.type === Inbox_Type.TYPE_VERSION_UPDATE) {
- return ;
- }
- return undefined;
- })}
diff --git a/web/src/pages/MemoDetail.tsx b/web/src/pages/MemoDetail.tsx
index 2e600bca..bcd1c48e 100644
--- a/web/src/pages/MemoDetail.tsx
+++ b/web/src/pages/MemoDetail.tsx
@@ -110,114 +110,116 @@ const MemoDetail = () => {
};
return (
-
+
-
- {memo.parent && (
-
-
-
-
#{memo.parent.id}
-
{memo.parent.content}
-
+
+
+ {memo.parent && (
+
+
+
+ #{memo.parent.id}
+ {memo.parent.content}
+
+
+ )}
+
+ {getDateTimeString(memo.displayTs)}
- )}
-
- {getDateTimeString(memo.displayTs)}
-
-
-
-
-
-
-
- #{memo.id}
-
-
-
-
-
-
- {creator?.nickname}
-
+
+
+
+
+
+
+ #{memo.id}
-
- {allowEdit && (
- <>
-
- }
- onChange={(_, visibility) => {
- if (visibility) {
- handleMemoVisibilityOptionChanged(visibility);
- }
- }}
- >
- {VISIBILITY_SELECTOR_ITEMS.map((item) => (
-
- ))}
-
- >
- )}
-
-
- {allowEdit && (
-
-
-
+
+
+
+
+
+ {creator?.nickname}
+
+
+
+ {allowEdit && (
+ <>
+
+ }
+ onChange={(_, visibility) => {
+ if (visibility) {
+ handleMemoVisibilityOptionChanged(visibility);
+ }
+ }}
+ >
+ {VISIBILITY_SELECTOR_ITEMS.map((item) => (
+
+ ))}
+
+ >
+ )}
+
+
+ {allowEdit && (
+
+
+
+
+
+ )}
+
+
+
- )}
-
-
-
-
-
-
- showShareMemoDialog(memo)}>
-
-
-
+
+ showShareMemoDialog(memo)}>
+
+
+
+
-
-
-
- {comments.length === 0 ? (
-
-
-
{t("memo.comment.no-comment")}
-
- ) : (
- <>
-
-
-
{t("memo.comment.self")}
-
({comments.length})
+
+
+ {comments.length === 0 ? (
+
+
+
{t("memo.comment.no-comment")}
- {comments.map((comment) => (
-
- ))}
- >
- )}
+ ) : (
+ <>
+
+
+ {t("memo.comment.self")}
+ ({comments.length})
+
+ {comments.map((comment) => (
+
+ ))}
+ >
+ )}
- {/* Only show comment editor when user login */}
- {currentUser && (
-
- )}
+ {/* Only show comment editor when user login */}
+ {currentUser && (
+
+ )}
+
diff --git a/web/src/pages/Resources.tsx b/web/src/pages/Resources.tsx
index c9d50b36..e6226625 100644
--- a/web/src/pages/Resources.tsx
+++ b/web/src/pages/Resources.tsx
@@ -66,106 +66,108 @@ const Resources = () => {
};
return (
-
+
-
-
-
- {t("common.resources")}
-
-
- }
- value={state.searchQuery}
- onChange={(e) => setState({ ...state, searchQuery: e.target.value })}
- />
-
-
-
- {loadingState.isLoading ? (
-
-
{t("resource.fetching-data")}
+
+
+
+
+ {t("common.resources")}
+
+
+ }
+ value={state.searchQuery}
+ onChange={(e) => setState({ ...state, searchQuery: e.target.value })}
+ />
- ) : (
- <>
- {filteredResources.length === 0 ? (
-
-
-
{t("message.no-data")}
-
- ) : (
-
- {Array.from(groupedResources.entries()).map(([timestamp, resources]) => {
- const date = new Date(timestamp);
- return (
-
-
- {date.getFullYear()}
- {date.toLocaleString(i18n.language, { month: "short" })}
-
-
- {resources.map((resource) => {
- return (
-
-
-
-
-
-
{resource.filename}
-
- #{resource.memoId}
-
-
-
- );
- })}
-
-
- );
- })}
-
- {unusedResources.length > 0 && (
- <>
-
-
-
-
-
- Unused resources
- ({unusedResources.length})
-
-
-
-
-
+
+
+ {loadingState.isLoading ? (
+
+
{t("resource.fetching-data")}
+
+ ) : (
+ <>
+ {filteredResources.length === 0 ? (
+
+
+
{t("message.no-data")}
+
+ ) : (
+
+ {Array.from(groupedResources.entries()).map(([timestamp, resources]) => {
+ const date = new Date(timestamp);
+ return (
+
+
+ {date.getFullYear()}
+ {date.toLocaleString(i18n.language, { month: "short" })}
- {unusedResources.map((resource) => {
- return (
-
-
-
+
+ {resources.map((resource) => {
+ return (
+
+
+
+
+
+
{resource.filename}
+
+ #{resource.memoId}
+
+
-
-
- );
- })}
+ );
+ })}
+
-
- >
- )}
-
- )}
- >
- )}
+ );
+ })}
+
+ {unusedResources.length > 0 && (
+ <>
+
+
+
+
+
+ Unused resources
+ ({unusedResources.length})
+
+
+
+
+
+
+ {unusedResources.map((resource) => {
+ return (
+
+ );
+ })}
+
+
+ >
+ )}
+
+ )}
+ >
+ )}
+
diff --git a/web/src/pages/Setting.tsx b/web/src/pages/Setting.tsx
index 084f4182..7401c37e 100644
--- a/web/src/pages/Setting.tsx
+++ b/web/src/pages/Setting.tsx
@@ -42,82 +42,84 @@ const Setting = () => {
};
return (
-
+
-
-
-
{t("common.basic")}
-
-
handleSectionSelectorItemClick("my-account")}
- className={`section-item ${state.selectedSection === "my-account" ? "selected" : ""}`}
- >
- {t("setting.my-account")}
-
-
handleSectionSelectorItemClick("preference")}
- className={`section-item ${state.selectedSection === "preference" ? "selected" : ""}`}
- >
- {t("setting.preference")}
-
+
+
+
+
{t("common.basic")}
+
+ handleSectionSelectorItemClick("my-account")}
+ className={`section-item ${state.selectedSection === "my-account" ? "selected" : ""}`}
+ >
+ {t("setting.my-account")}
+
+ handleSectionSelectorItemClick("preference")}
+ className={`section-item ${state.selectedSection === "preference" ? "selected" : ""}`}
+ >
+ {t("setting.preference")}
+
+
+ {isHost ? (
+ <>
+
{t("common.admin")}
+
+ handleSectionSelectorItemClick("member")}
+ className={`section-item ${state.selectedSection === "member" ? "selected" : ""}`}
+ >
+ {t("setting.member")}
+
+ handleSectionSelectorItemClick("system")}
+ className={`section-item ${state.selectedSection === "system" ? "selected" : ""}`}
+ >
+ {t("setting.system")}
+
+ handleSectionSelectorItemClick("storage")}
+ className={`section-item ${state.selectedSection === "storage" ? "selected" : ""}`}
+ >
+ {t("setting.storage")}
+
+ handleSectionSelectorItemClick("sso")}
+ className={`section-item ${state.selectedSection === "sso" ? "selected" : ""}`}
+ >
+ {t("setting.sso")}
+
+
+ >
+ ) : null}
+
+
+
+ {state.selectedSection === "my-account" ? (
+
+ ) : state.selectedSection === "preference" ? (
+
+ ) : state.selectedSection === "member" ? (
+
+ ) : state.selectedSection === "system" ? (
+
+ ) : state.selectedSection === "storage" ? (
+
+ ) : state.selectedSection === "sso" ? (
+
+ ) : null}
- {isHost ? (
- <>
-
{t("common.admin")}
-
- handleSectionSelectorItemClick("member")}
- className={`section-item ${state.selectedSection === "member" ? "selected" : ""}`}
- >
- {t("setting.member")}
-
- handleSectionSelectorItemClick("system")}
- className={`section-item ${state.selectedSection === "system" ? "selected" : ""}`}
- >
- {t("setting.system")}
-
- handleSectionSelectorItemClick("storage")}
- className={`section-item ${state.selectedSection === "storage" ? "selected" : ""}`}
- >
- {t("setting.storage")}
-
- handleSectionSelectorItemClick("sso")}
- className={`section-item ${state.selectedSection === "sso" ? "selected" : ""}`}
- >
- {t("setting.sso")}
-
-
- >
- ) : null}
-
-
-
- {state.selectedSection === "my-account" ? (
-
- ) : state.selectedSection === "preference" ? (
-
- ) : state.selectedSection === "member" ? (
-
- ) : state.selectedSection === "system" ? (
-
- ) : state.selectedSection === "storage" ? (
-
- ) : state.selectedSection === "sso" ? (
-
- ) : null}
diff --git a/web/src/pages/SignIn.tsx b/web/src/pages/SignIn.tsx
index 19aaeb77..a9f411c8 100644
--- a/web/src/pages/SignIn.tsx
+++ b/web/src/pages/SignIn.tsx
@@ -104,7 +104,7 @@ const SignIn = () => {
};
return (
-
+
![]({systemStatus.customizedProfile.logoUrl})
diff --git a/web/src/pages/SignUp.tsx b/web/src/pages/SignUp.tsx
index 13ce39b9..ec6e8a1a 100644
--- a/web/src/pages/SignUp.tsx
+++ b/web/src/pages/SignUp.tsx
@@ -70,7 +70,7 @@ const SignUp = () => {
};
return (
-
+
![]({systemStatus.customizedProfile.logoUrl})
diff --git a/web/src/pages/Timeline.tsx b/web/src/pages/Timeline.tsx
index 2205124e..58145d05 100644
--- a/web/src/pages/Timeline.tsx
+++ b/web/src/pages/Timeline.tsx
@@ -64,73 +64,75 @@ const Timeline = () => {
};
return (
-
+
-
-
-
toggleShowDatePicker()}
- >
-
- {new Date(selectedDateStamp).toLocaleDateString()}
-
- {selectedDateStamp !== currentDateStamp && (
-
}
- onClick={() => setSelectedDateStamp(currentDateStamp)}
+
+
+
+
toggleShowDatePicker()}
>
- {"Back to today"}
-
- )}
- toggleShowDatePicker(false)}
- />
-
-
- {dailyMemos.length === 0 && (
-
-
-
{t("message.no-data")}
-
- )}
-
- {dailyMemos.map((memo, index) => (
-
+
{new Date(selectedDateStamp).toLocaleDateString()}
+
+ {selectedDateStamp !== currentDateStamp && (
+
}
+ onClick={() => setSelectedDateStamp(currentDateStamp)}
>
-
- {getTimeString(memo.displayTs)}
-
- #{memo.id}
-
-
-
-
relation.type === "REFERENCE")} />
-
- {index !== dailyMemos.length - 1 && (
-
- )}
-
-
-
-
-
- ))}
-
- {selectedDateStamp === currentDateStamp && (
-
-
+ {"Back to today"}
+
+ )}
+ toggleShowDatePicker(false)}
+ />
+
+
+ {dailyMemos.length === 0 && (
+
+
+
{t("message.no-data")}
)}
+
+ {dailyMemos.map((memo, index) => (
+
+
+ {getTimeString(memo.displayTs)}
+
+ #{memo.id}
+
+
+
+
relation.type === "REFERENCE")} />
+
+ {index !== dailyMemos.length - 1 && (
+
+ )}
+
+
+
+
+
+ ))}
+
+ {selectedDateStamp === currentDateStamp && (
+
+
+
+ )}
+
diff --git a/web/src/pages/UserProfile.tsx b/web/src/pages/UserProfile.tsx
index 3315e36b..ca99416a 100644
--- a/web/src/pages/UserProfile.tsx
+++ b/web/src/pages/UserProfile.tsx
@@ -35,28 +35,20 @@ const UserProfile = () => {
}, [params.username]);
return (
-
+
-
+
{!loadingState.isLoading &&
(user ? (
<>
-
-
+
+
>
) : (
- <>
-
Not found
- >
+
Not found
))}