Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
df5aeb6d
Commit
df5aeb6d
authored
Dec 23, 2023
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: remove v1 prefix in store name
parent
df3303dc
Changes
26
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
132 additions
and
130 deletions
+132
-130
App.tsx
web/src/App.tsx
+3
-3
ChangeMemberPasswordDialog.tsx
web/src/components/ChangeMemberPasswordDialog.tsx
+3
-3
ChangeMemoCreatedTsDialog.tsx
web/src/components/ChangeMemoCreatedTsDialog.tsx
+2
-2
ChangePasswordDialog.tsx
web/src/components/ChangePasswordDialog.tsx
+3
-3
RelationListView.tsx
web/src/components/MemoEditor/RelationListView.tsx
+2
-2
index.tsx
web/src/components/MemoEditor/index.tsx
+4
-4
MemoRelationListView.tsx
web/src/components/MemoRelationListView.tsx
+2
-2
MemoView.tsx
web/src/components/MemoView.tsx
+5
-5
MemberSection.tsx
web/src/components/Settings/MemberSection.tsx
+4
-4
PreferencesSection.tsx
web/src/components/Settings/PreferencesSection.tsx
+7
-7
ShareMemoDialog.tsx
web/src/components/ShareMemoDialog.tsx
+4
-4
UpdateAccountDialog.tsx
web/src/components/UpdateAccountDialog.tsx
+3
-3
UsageHeatMap.tsx
web/src/components/UsageHeatMap.tsx
+5
-5
useCurrentUser.ts
web/src/hooks/useCurrentUser.ts
+3
-3
Archived.tsx
web/src/pages/Archived.tsx
+2
-2
AuthCallback.tsx
web/src/pages/AuthCallback.tsx
+3
-3
Explore.tsx
web/src/pages/Explore.tsx
+2
-2
Home.tsx
web/src/pages/Home.tsx
+2
-2
MemoDetail.tsx
web/src/pages/MemoDetail.tsx
+4
-4
SignIn.tsx
web/src/pages/SignIn.tsx
+3
-3
SignUp.tsx
web/src/pages/SignUp.tsx
+3
-3
Timeline.tsx
web/src/pages/Timeline.tsx
+2
-2
UserProfile.tsx
web/src/pages/UserProfile.tsx
+4
-4
inbox.ts
web/src/store/v1/inbox.ts
+26
-22
memo.ts
web/src/store/v1/memo.ts
+30
-32
user.ts
web/src/store/v1/user.ts
+1
-1
No files found.
web/src/App.tsx
View file @
df5aeb6d
...
...
@@ -6,14 +6,14 @@ import storage from "./helpers/storage";
import
{
getSystemColorScheme
}
from
"./helpers/utils"
;
import
useNavigateTo
from
"./hooks/useNavigateTo"
;
import
{
useGlobalStore
}
from
"./store/module"
;
import
{
useUser
V1
Store
}
from
"./store/v1"
;
import
{
useUserStore
}
from
"./store/v1"
;
const
App
=
()
=>
{
const
{
i18n
}
=
useTranslation
();
const
navigateTo
=
useNavigateTo
();
const
{
mode
,
setMode
}
=
useColorScheme
();
const
globalStore
=
useGlobalStore
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
[
loading
,
setLoading
]
=
useState
(
true
);
const
{
appearance
,
locale
,
systemStatus
}
=
globalStore
.
state
;
...
...
@@ -27,7 +27,7 @@ const App = () => {
useEffect
(()
=>
{
const
initialState
=
async
()
=>
{
try
{
await
user
V1
Store
.
fetchCurrentUser
();
await
userStore
.
fetchCurrentUser
();
}
catch
(
error
)
{
// Do nothing.
}
...
...
web/src/components/ChangeMemberPasswordDialog.tsx
View file @
df5aeb6d
import
{
useEffect
,
useState
}
from
"react"
;
import
{
toast
}
from
"react-hot-toast"
;
import
{
useUser
V1
Store
}
from
"@/store/v1"
;
import
{
useUserStore
}
from
"@/store/v1"
;
import
{
User
}
from
"@/types/proto/api/v2/user_service"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
import
{
generateDialog
}
from
"./Dialog"
;
...
...
@@ -13,7 +13,7 @@ interface Props extends DialogProps {
const
ChangeMemberPasswordDialog
:
React
.
FC
<
Props
>
=
(
props
:
Props
)
=>
{
const
{
user
,
destroy
}
=
props
;
const
t
=
useTranslate
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
[
newPassword
,
setNewPassword
]
=
useState
(
""
);
const
[
newPasswordAgain
,
setNewPasswordAgain
]
=
useState
(
""
);
...
...
@@ -48,7 +48,7 @@ const ChangeMemberPasswordDialog: React.FC<Props> = (props: Props) => {
}
try
{
await
user
V1
Store
.
updateUser
(
await
userStore
.
updateUser
(
{
name
:
user
.
name
,
password
:
newPassword
,
...
...
web/src/components/ChangeMemoCreatedTsDialog.tsx
View file @
df5aeb6d
...
...
@@ -2,7 +2,7 @@ import { Button } from "@mui/joy";
import
{
useEffect
,
useState
}
from
"react"
;
import
{
toast
}
from
"react-hot-toast"
;
import
{
getNormalizedTimeString
,
getUnixTime
}
from
"@/helpers/datetime"
;
import
{
useMemo
V1
Store
}
from
"@/store/v1"
;
import
{
useMemoStore
}
from
"@/store/v1"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
import
{
generateDialog
}
from
"./Dialog"
;
import
Icon
from
"./Icon"
;
...
...
@@ -14,7 +14,7 @@ interface Props extends DialogProps {
const
ChangeMemoCreatedTsDialog
:
React
.
FC
<
Props
>
=
(
props
:
Props
)
=>
{
const
t
=
useTranslate
();
const
{
destroy
,
memoId
}
=
props
;
const
memoStore
=
useMemo
V1
Store
();
const
memoStore
=
useMemoStore
();
const
[
createdAt
,
setCreatedAt
]
=
useState
(
""
);
const
maxDatetimeValue
=
getNormalizedTimeString
();
...
...
web/src/components/ChangePasswordDialog.tsx
View file @
df5aeb6d
...
...
@@ -2,7 +2,7 @@ import { useEffect, useState } from "react";
import
{
toast
}
from
"react-hot-toast"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
{
useGlobalStore
}
from
"@/store/module"
;
import
{
useUser
V1
Store
}
from
"@/store/v1"
;
import
{
useUserStore
}
from
"@/store/v1"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
import
{
generateDialog
}
from
"./Dialog"
;
import
Icon
from
"./Icon"
;
...
...
@@ -12,7 +12,7 @@ type Props = DialogProps;
const
ChangePasswordDialog
:
React
.
FC
<
Props
>
=
({
destroy
}:
Props
)
=>
{
const
t
=
useTranslate
();
const
currentUser
=
useCurrentUser
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
globalStore
=
useGlobalStore
();
const
profile
=
globalStore
.
state
.
systemStatus
.
profile
;
const
[
newPassword
,
setNewPassword
]
=
useState
(
""
);
...
...
@@ -52,7 +52,7 @@ const ChangePasswordDialog: React.FC<Props> = ({ destroy }: Props) => {
}
try
{
await
user
V1
Store
.
updateUser
(
await
userStore
.
updateUser
(
{
name
:
currentUser
.
name
,
password
:
newPassword
,
...
...
web/src/components/MemoEditor/RelationListView.tsx
View file @
df5aeb6d
import
{
useEffect
,
useState
}
from
"react"
;
import
{
useMemo
V1
Store
}
from
"@/store/v1"
;
import
{
useMemoStore
}
from
"@/store/v1"
;
import
{
MemoRelation
,
MemoRelation_Type
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
import
Icon
from
"../Icon"
;
...
...
@@ -11,7 +11,7 @@ interface Props {
const
RelationListView
=
(
props
:
Props
)
=>
{
const
{
relationList
,
setRelationList
}
=
props
;
const
memoStore
=
useMemo
V1
Store
();
const
memoStore
=
useMemoStore
();
const
[
referencingMemoList
,
setReferencingMemoList
]
=
useState
<
Memo
[]
>
([]);
useEffect
(()
=>
{
...
...
web/src/components/MemoEditor/index.tsx
View file @
df5aeb6d
...
...
@@ -7,7 +7,7 @@ import useLocalStorage from "react-use/lib/useLocalStorage";
import
{
memoServiceClient
}
from
"@/grpcweb"
;
import
{
TAB_SPACE_WIDTH
,
UNKNOWN_ID
}
from
"@/helpers/consts"
;
import
{
useGlobalStore
,
useResourceStore
}
from
"@/store/module"
;
import
{
useMemo
V1Store
,
useUserV1
Store
}
from
"@/store/v1"
;
import
{
useMemo
Store
,
useUser
Store
}
from
"@/store/v1"
;
import
{
MemoRelation
,
MemoRelation_Type
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
Visibility
}
from
"@/types/proto/api/v2/memo_service"
;
import
{
Resource
}
from
"@/types/proto/api/v2/resource_service"
;
...
...
@@ -49,8 +49,8 @@ const MemoEditor = (props: Props) => {
const
{
state
:
{
systemStatus
},
}
=
useGlobalStore
();
const
user
V1Store
=
useUserV1
Store
();
const
memoStore
=
useMemo
V1
Store
();
const
user
Store
=
useUser
Store
();
const
memoStore
=
useMemoStore
();
const
resourceStore
=
useResourceStore
();
const
[
state
,
setState
]
=
useState
<
State
>
({
memoVisibility
:
Visibility
.
PRIVATE
,
...
...
@@ -61,7 +61,7 @@ const MemoEditor = (props: Props) => {
});
const
[
hasContent
,
setHasContent
]
=
useState
<
boolean
>
(
false
);
const
editorRef
=
useRef
<
EditorRefActions
>
(
null
);
const
userSetting
=
user
V1
Store
.
userSetting
as
UserSetting
;
const
userSetting
=
userStore
.
userSetting
as
UserSetting
;
const
referenceRelations
=
memoId
?
state
.
relationList
.
filter
(
(
relation
)
=>
relation
.
memoId
===
memoId
&&
relation
.
relatedMemoId
!==
memoId
&&
relation
.
type
===
MemoRelation_Type
.
REFERENCE
...
...
web/src/components/MemoRelationListView.tsx
View file @
df5aeb6d
import
{
Tooltip
}
from
"@mui/joy"
;
import
{
useEffect
,
useState
}
from
"react"
;
import
{
Link
}
from
"react-router-dom"
;
import
{
useMemo
V1
Store
}
from
"@/store/v1"
;
import
{
useMemoStore
}
from
"@/store/v1"
;
import
{
MemoRelation
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
import
Icon
from
"./Icon"
;
...
...
@@ -13,7 +13,7 @@ interface Props {
const
MemoRelationListView
=
(
props
:
Props
)
=>
{
const
{
memo
,
relationList
}
=
props
;
const
memoStore
=
useMemo
V1
Store
();
const
memoStore
=
useMemoStore
();
const
[
referencingMemoList
,
setReferencingMemoList
]
=
useState
<
Memo
[]
>
([]);
const
[
referencedMemoList
,
setReferencedMemoList
]
=
useState
<
Memo
[]
>
([]);
...
...
web/src/components/MemoView.tsx
View file @
df5aeb6d
...
...
@@ -8,7 +8,7 @@ import { getRelativeTimeString, getTimeStampByDate } from "@/helpers/datetime";
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useNavigateTo
from
"@/hooks/useNavigateTo"
;
import
{
useFilterStore
}
from
"@/store/module"
;
import
{
useUser
V1Store
,
extractUsernameFromName
,
useMemoV1
Store
}
from
"@/store/v1"
;
import
{
useUser
Store
,
extractUsernameFromName
,
useMemo
Store
}
from
"@/store/v1"
;
import
{
RowStatus
}
from
"@/types/proto/api/v2/common"
;
import
{
MemoRelation_Type
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
Memo
,
Visibility
}
from
"@/types/proto/api/v2/memo_service"
;
...
...
@@ -42,12 +42,12 @@ const MemoView: React.FC<Props> = (props: Props) => {
const
navigateTo
=
useNavigateTo
();
const
{
i18n
}
=
useTranslation
();
const
filterStore
=
useFilterStore
();
const
memoStore
=
useMemo
V1
Store
();
const
user
V1Store
=
useUserV1
Store
();
const
memoStore
=
useMemoStore
();
const
user
Store
=
useUser
Store
();
const
user
=
useCurrentUser
();
const
[
shouldRender
,
setShouldRender
]
=
useState
<
boolean
>
(
lazyRendering
?
false
:
true
);
const
[
displayTime
,
setDisplayTime
]
=
useState
<
string
>
(
getRelativeTimeString
(
getTimeStampByDate
(
memo
.
displayTime
)));
const
[
creator
,
setCreator
]
=
useState
(
user
V1
Store
.
getUserByUsername
(
extractUsernameFromName
(
memo
.
creator
)));
const
[
creator
,
setCreator
]
=
useState
(
userStore
.
getUserByUsername
(
extractUsernameFromName
(
memo
.
creator
)));
const
[
parentMemo
,
setParentMemo
]
=
useState
<
Memo
|
undefined
>
(
undefined
);
const
memoContainerRef
=
useRef
<
HTMLDivElement
>
(
null
);
const
referenceRelations
=
memo
.
relations
.
filter
((
relation
)
=>
relation
.
type
===
MemoRelation_Type
.
REFERENCE
);
...
...
@@ -58,7 +58,7 @@ const MemoView: React.FC<Props> = (props: Props) => {
if
(
creator
)
return
;
(
async
()
=>
{
const
user
=
await
user
V1
Store
.
getOrFetchUserByUsername
(
extractUsernameFromName
(
memo
.
creator
));
const
user
=
await
userStore
.
getOrFetchUserByUsername
(
extractUsernameFromName
(
memo
.
creator
));
setCreator
(
user
);
})();
},
[
memo
.
creator
]);
...
...
web/src/components/Settings/MemberSection.tsx
View file @
df5aeb6d
...
...
@@ -3,7 +3,7 @@ import React, { useEffect, useState } from "react";
import
{
toast
}
from
"react-hot-toast"
;
import
{
userServiceClient
}
from
"@/grpcweb"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
{
UserNamePrefix
,
extractUsernameFromName
,
useUser
V1
Store
}
from
"@/store/v1"
;
import
{
UserNamePrefix
,
extractUsernameFromName
,
useUserStore
}
from
"@/store/v1"
;
import
{
RowStatus
}
from
"@/types/proto/api/v2/common"
;
import
{
User
,
User_Role
}
from
"@/types/proto/api/v2/user_service"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
...
...
@@ -19,7 +19,7 @@ interface State {
const
MemberSection
=
()
=>
{
const
t
=
useTranslate
();
const
currentUser
=
useCurrentUser
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
[
state
,
setState
]
=
useState
<
State
>
({
createUserUsername
:
""
,
createUserPassword
:
""
,
...
...
@@ -31,7 +31,7 @@ const MemberSection = () => {
},
[]);
const
fetchUserList
=
async
()
=>
{
const
users
=
await
user
V1
Store
.
fetchUsers
();
const
users
=
await
userStore
.
fetchUsers
();
setUserList
(
users
);
};
...
...
@@ -114,7 +114,7 @@ const MemberSection = () => {
style
:
"danger"
,
dialogName
:
"delete-user-dialog"
,
onConfirm
:
async
()
=>
{
await
user
V1
Store
.
deleteUser
(
user
.
name
);
await
userStore
.
deleteUser
(
user
.
name
);
fetchUserList
();
},
});
...
...
web/src/components/Settings/PreferencesSection.tsx
View file @
df5aeb6d
...
...
@@ -3,7 +3,7 @@ import { useState } from "react";
import
{
toast
}
from
"react-hot-toast"
;
import
{
Link
}
from
"react-router-dom"
;
import
{
useGlobalStore
}
from
"@/store/module"
;
import
{
useUser
V1
Store
}
from
"@/store/v1"
;
import
{
useUserStore
}
from
"@/store/v1"
;
import
{
Visibility
}
from
"@/types/proto/api/v2/memo_service"
;
import
{
UserSetting
}
from
"@/types/proto/api/v2/user_service"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
...
...
@@ -18,13 +18,13 @@ import "@/less/settings/preferences-section.less";
const
PreferencesSection
=
()
=>
{
const
t
=
useTranslate
();
const
globalStore
=
useGlobalStore
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
{
appearance
,
locale
}
=
globalStore
.
state
;
const
setting
=
user
V1
Store
.
userSetting
as
UserSetting
;
const
setting
=
userStore
.
userSetting
as
UserSetting
;
const
[
telegramUserId
,
setTelegramUserId
]
=
useState
<
string
>
(
setting
.
telegramUserId
);
const
handleLocaleSelectChange
=
async
(
locale
:
Locale
)
=>
{
await
user
V1
Store
.
updateUserSetting
(
await
userStore
.
updateUserSetting
(
{
locale
,
},
...
...
@@ -34,7 +34,7 @@ const PreferencesSection = () => {
};
const
handleAppearanceSelectChange
=
async
(
appearance
:
Appearance
)
=>
{
await
user
V1
Store
.
updateUserSetting
(
await
userStore
.
updateUserSetting
(
{
appearance
,
},
...
...
@@ -44,7 +44,7 @@ const PreferencesSection = () => {
};
const
handleDefaultMemoVisibilityChanged
=
async
(
value
:
string
)
=>
{
await
user
V1
Store
.
updateUserSetting
(
await
userStore
.
updateUserSetting
(
{
memoVisibility
:
value
,
},
...
...
@@ -54,7 +54,7 @@ const PreferencesSection = () => {
const
handleSaveTelegramUserId
=
async
()
=>
{
try
{
await
user
V1
Store
.
updateUserSetting
(
await
userStore
.
updateUserSetting
(
{
telegramUserId
:
telegramUserId
,
},
...
...
web/src/components/ShareMemoDialog.tsx
View file @
df5aeb6d
...
...
@@ -5,7 +5,7 @@ import { toast } from "react-hot-toast";
import
{
getDateTimeString
,
getTimeString
}
from
"@/helpers/datetime"
;
import
useLoading
from
"@/hooks/useLoading"
;
import
toImage
from
"@/labs/html2image"
;
import
{
useUser
V1
Store
,
extractUsernameFromName
}
from
"@/store/v1"
;
import
{
useUserStore
,
extractUsernameFromName
}
from
"@/store/v1"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
import
{
generateDialog
}
from
"./Dialog"
;
...
...
@@ -22,15 +22,15 @@ interface Props extends DialogProps {
const
ShareMemoDialog
:
React
.
FC
<
Props
>
=
(
props
:
Props
)
=>
{
const
{
memo
,
destroy
}
=
props
;
const
t
=
useTranslate
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
downloadingImageState
=
useLoading
(
false
);
const
loadingState
=
useLoading
();
const
memoElRef
=
useRef
<
HTMLDivElement
>
(
null
);
const
user
=
user
V1
Store
.
getUserByUsername
(
extractUsernameFromName
(
memo
.
creator
));
const
user
=
userStore
.
getUserByUsername
(
extractUsernameFromName
(
memo
.
creator
));
useEffect
(()
=>
{
(
async
()
=>
{
await
user
V1
Store
.
getOrFetchUserByUsername
(
extractUsernameFromName
(
memo
.
creator
));
await
userStore
.
getOrFetchUserByUsername
(
extractUsernameFromName
(
memo
.
creator
));
loadingState
.
setFinish
();
})();
},
[]);
...
...
web/src/components/UpdateAccountDialog.tsx
View file @
df5aeb6d
...
...
@@ -3,7 +3,7 @@ import { useEffect, useState } from "react";
import
{
toast
}
from
"react-hot-toast"
;
import
{
convertFileToBase64
}
from
"@/helpers/utils"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
{
UserNamePrefix
,
useUser
V1
Store
}
from
"@/store/v1"
;
import
{
UserNamePrefix
,
useUserStore
}
from
"@/store/v1"
;
import
{
User
as
UserPb
}
from
"@/types/proto/api/v2/user_service"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
import
{
generateDialog
}
from
"./Dialog"
;
...
...
@@ -22,7 +22,7 @@ interface State {
const
UpdateAccountDialog
:
React
.
FC
<
Props
>
=
({
destroy
}:
Props
)
=>
{
const
t
=
useTranslate
();
const
currentUser
=
useCurrentUser
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
[
state
,
setState
]
=
useState
<
State
>
({
avatarUrl
:
currentUser
.
avatarUrl
,
username
:
currentUser
.
name
.
replace
(
UserNamePrefix
,
""
),
...
...
@@ -108,7 +108,7 @@ const UpdateAccountDialog: React.FC<Props> = ({ destroy }: Props) => {
if
(
!
isEqual
(
currentUser
.
email
,
state
.
email
))
{
updateMask
.
push
(
"email"
);
}
await
user
V1
Store
.
updateUser
(
await
userStore
.
updateUser
(
UserPb
.
fromPartial
({
name
:
`
${
UserNamePrefix
}${
state
.
username
}
`
,
id
:
currentUser
.
id
,
...
...
web/src/components/UsageHeatMap.tsx
View file @
df5aeb6d
...
...
@@ -6,7 +6,7 @@ import * as utils from "@/helpers/utils";
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useNavigateTo
from
"@/hooks/useNavigateTo"
;
import
{
useGlobalStore
}
from
"@/store/module"
;
import
{
useUser
V1Store
,
extractUsernameFromName
,
useMemoV1
Store
}
from
"@/store/v1"
;
import
{
useUser
Store
,
extractUsernameFromName
,
useMemo
Store
}
from
"@/store/v1"
;
import
{
useTranslate
,
Translations
}
from
"@/utils/i18n"
;
import
"@/less/usage-heat-map.less"
;
...
...
@@ -34,9 +34,9 @@ interface DailyUsageStat {
const
UsageHeatMap
=
()
=>
{
const
t
=
useTranslate
();
const
navigateTo
=
useNavigateTo
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
user
=
useCurrentUser
();
const
memoStore
=
useMemo
V1
Store
();
const
memoStore
=
useMemoStore
();
const
todayTimeStamp
=
getDateStampByDate
(
Date
.
now
());
const
weekDay
=
new
Date
(
todayTimeStamp
).
getDay
();
const
weekFromMonday
=
[
"zh-Hans"
,
"ko"
].
includes
(
useGlobalStore
().
state
.
locale
);
...
...
@@ -49,10 +49,10 @@ const UsageHeatMap = () => {
const
[
createdDays
,
setCreatedDays
]
=
useState
(
0
);
const
[
allStat
,
setAllStat
]
=
useState
<
DailyUsageStat
[]
>
(
getInitialUsageStat
(
usedDaysAmount
,
beginDayTimestamp
));
const
containerElRef
=
useRef
<
HTMLDivElement
>
(
null
);
const
memos
=
Array
.
from
(
memoStore
.
getState
().
memoById
.
values
()
);
const
memos
=
Object
.
values
(
memoStore
.
getState
().
memoMapById
);
useEffect
(()
=>
{
user
V1
Store
.
getOrFetchUserByUsername
(
extractUsernameFromName
(
user
.
name
)).
then
((
user
)
=>
{
userStore
.
getOrFetchUserByUsername
(
extractUsernameFromName
(
user
.
name
)).
then
((
user
)
=>
{
if
(
!
user
)
{
return
;
}
...
...
web/src/hooks/useCurrentUser.ts
View file @
df5aeb6d
import
{
useUser
V1
Store
}
from
"@/store/v1"
;
import
{
useUserStore
}
from
"@/store/v1"
;
import
{
User
}
from
"@/types/proto/api/v2/user_service"
;
const
useCurrentUser
=
()
=>
{
const
user
V1Store
=
useUserV1
Store
();
return
user
V1
Store
.
currentUser
as
User
;
const
user
Store
=
useUser
Store
();
return
userStore
.
currentUser
as
User
;
};
export
default
useCurrentUser
;
web/src/pages/Archived.tsx
View file @
df5aeb6d
...
...
@@ -10,7 +10,7 @@ import { memoServiceClient } from "@/grpcweb";
import
{
getDateTimeString
}
from
"@/helpers/datetime"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useLoading
from
"@/hooks/useLoading"
;
import
{
useMemo
V1
Store
}
from
"@/store/v1"
;
import
{
useMemoStore
}
from
"@/store/v1"
;
import
{
RowStatus
}
from
"@/types/proto/api/v2/common"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
...
...
@@ -19,7 +19,7 @@ const Archived = () => {
const
t
=
useTranslate
();
const
loadingState
=
useLoading
();
const
user
=
useCurrentUser
();
const
memoStore
=
useMemo
V1
Store
();
const
memoStore
=
useMemoStore
();
const
[
archivedMemos
,
setArchivedMemos
]
=
useState
<
Memo
[]
>
([]);
useEffect
(()
=>
{
...
...
web/src/pages/AuthCallback.tsx
View file @
df5aeb6d
...
...
@@ -6,7 +6,7 @@ import Icon from "@/components/Icon";
import
*
as
api
from
"@/helpers/api"
;
import
{
absolutifyLink
}
from
"@/helpers/utils"
;
import
useNavigateTo
from
"@/hooks/useNavigateTo"
;
import
{
useUser
V1
Store
}
from
"@/store/v1"
;
import
{
useUserStore
}
from
"@/store/v1"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
interface
State
{
...
...
@@ -18,7 +18,7 @@ const AuthCallback = () => {
const
t
=
useTranslate
();
const
navigateTo
=
useNavigateTo
();
const
[
searchParams
]
=
useSearchParams
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
[
state
,
setState
]
=
useState
<
State
>
({
loading
:
true
,
errorMessage
:
""
,
...
...
@@ -40,7 +40,7 @@ const AuthCallback = () => {
errorMessage
:
""
,
});
if
(
user
)
{
await
user
V1
Store
.
fetchCurrentUser
();
await
userStore
.
fetchCurrentUser
();
navigateTo
(
"/"
);
}
else
{
toast
.
error
(
t
(
"message.login-failed"
));
...
...
web/src/pages/Explore.tsx
View file @
df5aeb6d
...
...
@@ -7,14 +7,14 @@ import { DEFAULT_MEMO_LIMIT } from "@/helpers/consts";
import
{
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
{
useFilterStore
}
from
"@/store/module"
;
import
{
useMemoList
,
useMemo
V1
Store
}
from
"@/store/v1"
;
import
{
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
const
Explore
=
()
=>
{
const
t
=
useTranslate
();
const
user
=
useCurrentUser
();
const
filterStore
=
useFilterStore
();
const
memoStore
=
useMemo
V1
Store
();
const
memoStore
=
useMemoStore
();
const
memoList
=
useMemoList
();
const
[
isRequesting
,
setIsRequesting
]
=
useState
(
true
);
const
[
isComplete
,
setIsComplete
]
=
useState
(
false
);
...
...
web/src/pages/Home.tsx
View file @
df5aeb6d
...
...
@@ -11,7 +11,7 @@ import { getTimeStampByDate } from "@/helpers/datetime";
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useResponsiveWidth
from
"@/hooks/useResponsiveWidth"
;
import
{
useFilterStore
}
from
"@/store/module"
;
import
{
useMemoList
,
useMemo
V1
Store
}
from
"@/store/v1"
;
import
{
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
const
Home
=
()
=>
{
...
...
@@ -19,7 +19,7 @@ const Home = () => {
const
{
md
}
=
useResponsiveWidth
();
const
user
=
useCurrentUser
();
const
filterStore
=
useFilterStore
();
const
memoStore
=
useMemo
V1
Store
();
const
memoStore
=
useMemoStore
();
const
memoList
=
useMemoList
();
const
[
isRequesting
,
setIsRequesting
]
=
useState
(
true
);
const
[
isComplete
,
setIsComplete
]
=
useState
(
false
);
...
...
web/src/pages/MemoDetail.tsx
View file @
df5aeb6d
...
...
@@ -18,7 +18,7 @@ import { UNKNOWN_ID } from "@/helpers/consts";
import
{
getDateTimeString
}
from
"@/helpers/datetime"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useNavigateTo
from
"@/hooks/useNavigateTo"
;
import
{
useUser
V1Store
,
useMemoV1
Store
,
extractUsernameFromName
}
from
"@/store/v1"
;
import
{
useUser
Store
,
useMemo
Store
,
extractUsernameFromName
}
from
"@/store/v1"
;
import
{
MemoRelation_Type
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
Memo
,
Visibility
}
from
"@/types/proto/api/v2/memo_service"
;
import
{
User
}
from
"@/types/proto/api/v2/user_service"
;
...
...
@@ -30,8 +30,8 @@ const MemoDetail = () => {
const
params
=
useParams
();
const
navigateTo
=
useNavigateTo
();
const
currentUser
=
useCurrentUser
();
const
memoStore
=
useMemo
V1
Store
();
const
user
V1Store
=
useUserV1
Store
();
const
memoStore
=
useMemoStore
();
const
user
Store
=
useUser
Store
();
const
[
creator
,
setCreator
]
=
useState
<
User
>
();
const
memoId
=
Number
(
params
.
memoId
);
const
memo
=
memoStore
.
getMemoById
(
memoId
);
...
...
@@ -48,7 +48,7 @@ const MemoDetail = () => {
memoStore
.
getOrFetchMemoById
(
memoId
)
.
then
(
async
(
memo
)
=>
{
const
user
=
await
user
V1
Store
.
getOrFetchUserByUsername
(
extractUsernameFromName
(
memo
.
creator
));
const
user
=
await
userStore
.
getOrFetchUserByUsername
(
extractUsernameFromName
(
memo
.
creator
));
setCreator
(
user
);
})
.
catch
((
error
)
=>
{
...
...
web/src/pages/SignIn.tsx
View file @
df5aeb6d
...
...
@@ -9,14 +9,14 @@ import { absolutifyLink } from "@/helpers/utils";
import
useLoading
from
"@/hooks/useLoading"
;
import
useNavigateTo
from
"@/hooks/useNavigateTo"
;
import
{
useGlobalStore
}
from
"@/store/module"
;
import
{
useUser
V1
Store
}
from
"@/store/v1"
;
import
{
useUserStore
}
from
"@/store/v1"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
const
SignIn
=
()
=>
{
const
t
=
useTranslate
();
const
navigateTo
=
useNavigateTo
();
const
globalStore
=
useGlobalStore
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
actionBtnLoadingState
=
useLoading
(
false
);
const
{
appearance
,
locale
,
systemStatus
}
=
globalStore
.
state
;
const
mode
=
systemStatus
.
profile
.
mode
;
...
...
@@ -77,7 +77,7 @@ const SignIn = () => {
actionBtnLoadingState
.
setLoading
();
const
{
data
:
user
}
=
await
api
.
signin
(
username
,
password
,
remember
);
if
(
user
)
{
await
user
V1
Store
.
fetchCurrentUser
();
await
userStore
.
fetchCurrentUser
();
navigateTo
(
"/"
);
}
else
{
toast
.
error
(
t
(
"message.login-failed"
));
...
...
web/src/pages/SignUp.tsx
View file @
df5aeb6d
...
...
@@ -8,14 +8,14 @@ import * as api from "@/helpers/api";
import
useLoading
from
"@/hooks/useLoading"
;
import
useNavigateTo
from
"@/hooks/useNavigateTo"
;
import
{
useGlobalStore
}
from
"@/store/module"
;
import
{
useUser
V1
Store
}
from
"@/store/v1"
;
import
{
useUserStore
}
from
"@/store/v1"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
const
SignUp
=
()
=>
{
const
t
=
useTranslate
();
const
navigateTo
=
useNavigateTo
();
const
globalStore
=
useGlobalStore
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
actionBtnLoadingState
=
useLoading
(
false
);
const
{
appearance
,
locale
,
systemStatus
}
=
globalStore
.
state
;
const
[
username
,
setUsername
]
=
useState
(
""
);
...
...
@@ -57,7 +57,7 @@ const SignUp = () => {
actionBtnLoadingState
.
setLoading
();
const
{
data
:
user
}
=
await
api
.
signup
(
username
,
password
);
if
(
user
)
{
await
user
V1
Store
.
fetchCurrentUser
();
await
userStore
.
fetchCurrentUser
();
navigateTo
(
"/"
);
}
else
{
toast
.
error
(
t
(
"message.signup-failed"
));
...
...
web/src/pages/Timeline.tsx
View file @
df5aeb6d
...
...
@@ -11,14 +11,14 @@ import DatePicker from "@/components/kit/DatePicker";
import
{
DAILY_TIMESTAMP
}
from
"@/helpers/consts"
;
import
{
getDateStampByDate
,
getNormalizedDateString
,
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
{
useMemoList
,
useMemo
V1
Store
}
from
"@/store/v1"
;
import
{
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
const
Timeline
=
()
=>
{
const
t
=
useTranslate
();
const
[
searchParams
,
setSearchParams
]
=
useSearchParams
();
const
user
=
useCurrentUser
();
const
memoStore
=
useMemo
V1
Store
();
const
memoStore
=
useMemoStore
();
const
memoList
=
useMemoList
();
const
currentDateStamp
=
getDateStampByDate
(
getNormalizedDateString
())
as
number
;
const
[
selectedDateStamp
,
setSelectedDateStamp
]
=
useState
<
number
>
(
...
...
web/src/pages/UserProfile.tsx
View file @
df5aeb6d
...
...
@@ -9,18 +9,18 @@ import { DEFAULT_MEMO_LIMIT } from "@/helpers/consts";
import
{
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
useLoading
from
"@/hooks/useLoading"
;
import
{
useFilterStore
}
from
"@/store/module"
;
import
{
useMemoList
,
useMemo
V1Store
,
useUserV1
Store
}
from
"@/store/v1"
;
import
{
useMemoList
,
useMemo
Store
,
useUser
Store
}
from
"@/store/v1"
;
import
{
User
}
from
"@/types/proto/api/v2/user_service"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
const
UserProfile
=
()
=>
{
const
t
=
useTranslate
();
const
params
=
useParams
();
const
user
V1Store
=
useUserV1
Store
();
const
user
Store
=
useUser
Store
();
const
loadingState
=
useLoading
();
const
[
user
,
setUser
]
=
useState
<
User
>
();
const
filterStore
=
useFilterStore
();
const
memoStore
=
useMemo
V1
Store
();
const
memoStore
=
useMemoStore
();
const
memoList
=
useMemoList
();
const
[
isRequesting
,
setIsRequesting
]
=
useState
(
true
);
const
[
isComplete
,
setIsComplete
]
=
useState
(
false
);
...
...
@@ -35,7 +35,7 @@ const UserProfile = () => {
throw
new
Error
(
"username is required"
);
}
user
V1
Store
userStore
.
getOrFetchUserByUsername
(
username
)
.
then
((
user
)
=>
{
setUser
(
user
);
...
...
web/src/store/v1/inbox.ts
View file @
df5aeb6d
import
{
create
}
from
"zustand"
;
import
{
combine
}
from
"zustand/middleware"
;
import
{
inboxServiceClient
}
from
"@/grpcweb"
;
import
{
Inbox
}
from
"@/types/proto/api/v2/inbox_service"
;
interface
InboxStor
e
{
interface
Stat
e
{
inboxes
:
Inbox
[];
fetchInboxes
:
()
=>
Promise
<
Inbox
[]
>
;
updateInbox
:
(
inbox
:
Partial
<
Inbox
>
,
updateMask
:
string
[])
=>
Promise
<
Inbox
>
;
}
export
const
useInboxStore
=
create
<
InboxStore
>
()((
set
,
get
)
=>
({
const
getDefaultState
=
():
State
=>
({
inboxes
:
[],
fetchInboxes
:
async
()
=>
{
const
{
inboxes
}
=
await
inboxServiceClient
.
listInboxes
({});
set
({
inboxes
});
return
inboxes
;
},
updateInbox
:
async
(
inbox
:
Partial
<
Inbox
>
,
updateMask
:
string
[])
=>
{
const
{
inbox
:
updatedInbox
}
=
await
inboxServiceClient
.
updateInbox
({
inbox
,
updateMask
,
});
if
(
!
updatedInbox
)
{
throw
new
Error
(
"Inbox not found"
);
}
const
inboxes
=
get
().
inboxes
;
set
({
inboxes
:
inboxes
.
map
((
i
)
=>
(
i
.
name
===
updatedInbox
.
name
?
updatedInbox
:
i
))
});
return
updatedInbox
;
},
}));
});
export
const
useInboxStore
=
create
(
combine
(
getDefaultState
(),
(
set
,
get
)
=>
({
fetchInboxes
:
async
()
=>
{
const
{
inboxes
}
=
await
inboxServiceClient
.
listInboxes
({});
set
({
inboxes
});
return
inboxes
;
},
updateInbox
:
async
(
inbox
:
Partial
<
Inbox
>
,
updateMask
:
string
[])
=>
{
const
{
inbox
:
updatedInbox
}
=
await
inboxServiceClient
.
updateInbox
({
inbox
,
updateMask
,
});
if
(
!
updatedInbox
)
{
throw
new
Error
(
"Inbox not found"
);
}
const
inboxes
=
get
().
inboxes
;
set
({
inboxes
:
inboxes
.
map
((
i
)
=>
(
i
.
name
===
updatedInbox
.
name
?
updatedInbox
:
i
))
});
return
updatedInbox
;
},
}))
);
web/src/store/v1/memo.ts
View file @
df5aeb6d
import
{
cloneDeep
}
from
"lodash-es"
;
import
{
create
}
from
"zustand"
;
import
{
combine
}
from
"zustand/middleware"
;
import
{
memoServiceClient
}
from
"@/grpcweb"
;
import
{
CreateMemoRequest
,
ListMemosRequest
,
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
interface
State
{
memo
ById
:
Map
<
number
,
Memo
>
;
memo
MapById
:
Record
<
number
,
Memo
>
;
}
export
const
useMemoV1Store
=
create
(
combine
({
memoById
:
new
Map
<
number
,
Memo
>
()
},
(
set
,
get
)
=>
({
const
getDefaultState
=
():
State
=>
({
memoMapById
:
{},
});
export
const
useMemoStore
=
create
(
combine
(
getDefaultState
(),
(
set
,
get
)
=>
({
setState
:
(
state
:
State
)
=>
set
(
state
),
getState
:
()
=>
get
(),
fetchMemos
:
async
(
request
:
Partial
<
ListMemosRequest
>
)
=>
{
const
{
memos
}
=
await
memoServiceClient
.
listMemos
(
request
);
set
((
state
)
=>
{
for
(
const
memo
of
memos
)
{
state
.
memoById
.
set
(
memo
.
id
,
memo
);
}
return
cloneDeep
(
state
);
});
const
memoMap
=
get
().
memoMapById
;
for
(
const
memo
of
memos
)
{
memoMap
[
memo
.
id
]
=
memo
;
}
set
({
memoMapById
:
memoMap
});
return
memos
;
},
getOrFetchMemoById
:
async
(
id
:
number
,
options
?:
{
skipCache
?:
boolean
;
skipStore
?:
boolean
})
=>
{
const
memo
=
get
().
memoById
.
get
(
id
);
const
memoMap
=
get
().
memoMapById
;
const
memo
=
memoMap
[
id
];
if
(
memo
&&
!
options
?.
skipCache
)
{
return
memo
;
}
...
...
@@ -36,15 +39,13 @@ export const useMemoV1Store = create(
}
if
(
!
options
?.
skipStore
)
{
set
((
state
)
=>
{
state
.
memoById
.
set
(
id
,
res
.
memo
as
Memo
);
return
cloneDeep
(
state
);
});
memoMap
[
id
]
=
res
.
memo
;
set
({
memoMapById
:
memoMap
});
}
return
res
.
memo
;
},
getMemoById
:
(
id
:
number
)
=>
{
return
get
().
memo
ById
.
get
(
id
)
;
return
get
().
memo
MapById
[
id
]
;
},
createMemo
:
async
(
request
:
CreateMemoRequest
)
=>
{
const
{
memo
}
=
await
memoServiceClient
.
createMemo
(
request
);
...
...
@@ -52,10 +53,9 @@ export const useMemoV1Store = create(
throw
new
Error
(
"Memo not found"
);
}
set
((
state
)
=>
{
state
.
memoById
.
set
(
memo
.
id
,
memo
);
return
cloneDeep
(
state
);
});
const
memoMap
=
get
().
memoMapById
;
memoMap
[
memo
.
id
]
=
memo
;
set
({
memoMapById
:
memoMap
});
return
memo
;
},
updateMemo
:
async
(
update
:
Partial
<
Memo
>
,
updateMask
:
string
[])
=>
{
...
...
@@ -68,10 +68,9 @@ export const useMemoV1Store = create(
throw
new
Error
(
"Memo not found"
);
}
set
((
state
)
=>
{
state
.
memoById
.
set
(
memo
.
id
,
memo
);
return
cloneDeep
(
state
);
});
const
memoMap
=
get
().
memoMapById
;
memoMap
[
memo
.
id
]
=
memo
;
set
({
memoMapById
:
memoMap
});
return
memo
;
},
deleteMemo
:
async
(
id
:
number
)
=>
{
...
...
@@ -79,24 +78,23 @@ export const useMemoV1Store = create(
id
:
id
,
});
set
((
state
)
=>
{
state
.
memoById
.
delete
(
id
);
return
cloneDeep
(
state
);
});
const
memoMap
=
get
().
memoMapById
;
delete
memoMap
[
id
];
set
({
memoMapById
:
memoMap
});
},
}))
);
export
const
useMemoList
=
()
=>
{
const
memoStore
=
useMemo
V1
Store
();
const
memos
=
Array
.
from
(
memoStore
.
getState
().
memoById
.
values
()
);
const
memoStore
=
useMemoStore
();
const
memos
=
Object
.
values
(
memoStore
.
getState
().
memoMapById
);
const
reset
=
()
=>
{
memoStore
.
setState
({
memo
ById
:
new
Map
<
number
,
Memo
>
()
});
memoStore
.
setState
({
memo
MapById
:
{}
});
};
const
size
=
()
=>
{
return
memoStore
.
getState
().
memoById
.
size
;
return
Object
.
keys
(
memoStore
.
getState
().
memoMapById
).
length
;
};
return
{
...
...
web/src/store/v1/user.ts
View file @
df5aeb6d
...
...
@@ -27,7 +27,7 @@ const getDefaultUserSetting = () => {
// Request cache is used to prevent multiple requests.
const
requestCache
=
new
Map
<
string
,
Promise
<
any
>>
();
export
const
useUser
V1
Store
=
create
(
export
const
useUserStore
=
create
(
combine
(
getDefaultState
(),
(
set
,
get
)
=>
({
fetchUsers
:
async
()
=>
{
const
{
users
}
=
await
userServiceClient
.
listUsers
({});
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment