Commit 834b58fb authored by Steven's avatar Steven

feat: add version update inbox message

parent 342d1aee
...@@ -49,5 +49,10 @@ func convertActivityPayloadFromStore(payload *storepb.ActivityPayload) *apiv2pb. ...@@ -49,5 +49,10 @@ func convertActivityPayloadFromStore(payload *storepb.ActivityPayload) *apiv2pb.
RelatedMemoId: payload.MemoComment.RelatedMemoId, RelatedMemoId: payload.MemoComment.RelatedMemoId,
} }
} }
if payload.VersionUpdate != nil {
v2Payload.VersionUpdate = &apiv2pb.ActivityVersionUpdatePayload{
Version: payload.VersionUpdate.Version,
}
}
return v2Payload return v2Payload
} }
...@@ -32,8 +32,13 @@ message ActivityMemoCommentPayload { ...@@ -32,8 +32,13 @@ message ActivityMemoCommentPayload {
int32 related_memo_id = 2; int32 related_memo_id = 2;
} }
message ActivityVersionUpdatePayload {
string version = 1;
}
message ActivityPayload { message ActivityPayload {
ActivityMemoCommentPayload memo_comment = 1; ActivityMemoCommentPayload memo_comment = 1;
ActivityVersionUpdatePayload version_update = 2;
} }
message GetActivityRequest { message GetActivityRequest {
......
...@@ -49,6 +49,7 @@ message Inbox { ...@@ -49,6 +49,7 @@ message Inbox {
enum Type { enum Type {
TYPE_UNSPECIFIED = 0; TYPE_UNSPECIFIED = 0;
TYPE_MEMO_COMMENT = 1; TYPE_MEMO_COMMENT = 1;
TYPE_VERSION_UPDATE = 2;
} }
Type type = 6; Type type = 6;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
- [Activity](#memos-api-v2-Activity) - [Activity](#memos-api-v2-Activity)
- [ActivityMemoCommentPayload](#memos-api-v2-ActivityMemoCommentPayload) - [ActivityMemoCommentPayload](#memos-api-v2-ActivityMemoCommentPayload)
- [ActivityPayload](#memos-api-v2-ActivityPayload) - [ActivityPayload](#memos-api-v2-ActivityPayload)
- [ActivityVersionUpdatePayload](#memos-api-v2-ActivityVersionUpdatePayload)
- [GetActivityRequest](#memos-api-v2-GetActivityRequest) - [GetActivityRequest](#memos-api-v2-GetActivityRequest)
- [GetActivityResponse](#memos-api-v2-GetActivityResponse) - [GetActivityResponse](#memos-api-v2-GetActivityResponse)
...@@ -155,6 +156,22 @@ ...@@ -155,6 +156,22 @@
| Field | Type | Label | Description | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| memo_comment | [ActivityMemoCommentPayload](#memos-api-v2-ActivityMemoCommentPayload) | | | | memo_comment | [ActivityMemoCommentPayload](#memos-api-v2-ActivityMemoCommentPayload) | | |
| version_update | [ActivityVersionUpdatePayload](#memos-api-v2-ActivityVersionUpdatePayload) | | |
<a name="memos-api-v2-ActivityVersionUpdatePayload"></a>
### ActivityVersionUpdatePayload
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| version | [string](#string) | | |
...@@ -377,6 +394,7 @@ ...@@ -377,6 +394,7 @@
| ---- | ------ | ----------- | | ---- | ------ | ----------- |
| TYPE_UNSPECIFIED | 0 | | | TYPE_UNSPECIFIED | 0 | |
| TYPE_MEMO_COMMENT | 1 | | | TYPE_MEMO_COMMENT | 1 | |
| TYPE_VERSION_UPDATE | 2 | |
......
This diff is collapsed.
This diff is collapsed.
import { Tooltip } from "@mui/joy";
import classNames from "classnames";
import { useEffect, useState } from "react";
import toast from "react-hot-toast";
import { activityServiceClient } from "@/grpcweb";
import { useInboxStore } from "@/store/v1";
import { Activity } from "@/types/proto/api/v2/activity_service";
import { Inbox, Inbox_Status } from "@/types/proto/api/v2/inbox_service";
import { useTranslate } from "@/utils/i18n";
import Icon from "../Icon";
interface Props {
inbox: Inbox;
}
const VersionUpdateMessage = ({ inbox }: Props) => {
const t = useTranslate();
const inboxStore = useInboxStore();
const [activity, setActivity] = useState<Activity | undefined>(undefined);
useEffect(() => {
if (!inbox.activityId) {
return;
}
activityServiceClient
.getActivity({
id: inbox.activityId,
})
.then(({ activity }) => {
console.log("activity", activity);
setActivity(activity);
});
}, [inbox.activityId]);
const handleNavigate = () => {
if (!activity?.payload?.versionUpdate?.version) {
return;
}
window.open(`https://github.com/usememos/memos/releases/tag/v${activity?.payload?.versionUpdate?.version}`);
if (inbox.status === Inbox_Status.UNREAD) {
handleArchiveMessage(true);
}
};
const handleArchiveMessage = async (silence = false) => {
await inboxStore.updateInbox(
{
name: inbox.name,
status: Inbox_Status.ARCHIVED,
},
["status"]
);
if (!silence) {
toast.success("Archived");
}
};
return (
<div className="w-full flex flex-row justify-start items-start gap-3">
<div
className={classNames(
"shrink-0 mt-2 p-2 rounded-full border",
inbox.status === Inbox_Status.UNREAD
? "border-green-600 text-green-600 bg-blue-50 dark:bg-zinc-800"
: "border-gray-400 text-gray-400 bg-gray-50 dark:bg-zinc-800"
)}
>
<Tooltip title={"Comment"} placement="bottom">
<Icon.ArrowUp className="w-4 sm:w-5 h-auto" />
</Tooltip>
</div>
<div
className={classNames(
"border w-full p-3 px-4 rounded-lg flex flex-col justify-start items-start gap-2 dark:border-zinc-800 hover:bg-gray-100 dark:hover:bg-zinc-800",
inbox.status !== Inbox_Status.UNREAD && "opacity-60"
)}
>
<div className="w-full flex flex-row justify-between items-center">
<span className="text-xs text-gray-500">{inbox.createTime?.toLocaleString()}</span>
<div>
{inbox.status === Inbox_Status.UNREAD && (
<Tooltip title={t("common.archive")} placement="top">
<Icon.Inbox
className="w-4 h-auto cursor-pointer text-gray-400 hover:text-blue-600"
onClick={() => handleArchiveMessage()}
/>
</Tooltip>
)}
</div>
</div>
<p
className="text-base leading-tight cursor-pointer text-gray-500 dark:text-gray-400 hover:underline hover:text-blue-600"
onClick={handleNavigate}
>
{t("inbox.version-update", {
version: activity?.payload?.versionUpdate?.version,
})}
</p>
</div>
</div>
);
};
export default VersionUpdateMessage;
...@@ -370,6 +370,7 @@ ...@@ -370,6 +370,7 @@
"password-login-disabled": "Can't remove last identity provider when password login is disabled" "password-login-disabled": "Can't remove last identity provider when password login is disabled"
}, },
"inbox": { "inbox": {
"memo-comment": "{{user}} has a comment on your {{memo}}." "memo-comment": "{{user}} has a comment on your {{memo}}.",
"version-update": "New version {{version}} is available now!"
} }
} }
...@@ -2,6 +2,7 @@ import { useEffect } from "react"; ...@@ -2,6 +2,7 @@ import { useEffect } from "react";
import Empty from "@/components/Empty"; import Empty from "@/components/Empty";
import Icon from "@/components/Icon"; import Icon from "@/components/Icon";
import MemoCommentMessage from "@/components/Inbox/MemoCommentMessage"; import MemoCommentMessage from "@/components/Inbox/MemoCommentMessage";
import VersionUpdateMessage from "@/components/Inbox/VersionUpdateMessage";
import MobileHeader from "@/components/MobileHeader"; import MobileHeader from "@/components/MobileHeader";
import { useInboxStore } from "@/store/v1"; import { useInboxStore } from "@/store/v1";
import { Inbox_Type } from "@/types/proto/api/v2/inbox_service"; import { Inbox_Type } from "@/types/proto/api/v2/inbox_service";
...@@ -38,6 +39,8 @@ const Inboxes = () => { ...@@ -38,6 +39,8 @@ const Inboxes = () => {
{inboxes.map((inbox) => { {inboxes.map((inbox) => {
if (inbox.type === Inbox_Type.TYPE_MEMO_COMMENT) { if (inbox.type === Inbox_Type.TYPE_MEMO_COMMENT) {
return <MemoCommentMessage key={`${inbox.name}-${inbox.status}`} inbox={inbox} />; return <MemoCommentMessage key={`${inbox.name}-${inbox.status}`} inbox={inbox} />;
} else if (inbox.type === Inbox_Type.TYPE_VERSION_UPDATE) {
return <VersionUpdateMessage key={`${inbox.name}-${inbox.status}`} inbox={inbox} />;
} }
return undefined; return undefined;
})} })}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment