mirror of https://github.com/usememos/memos.git
Merge 5ca4e46abd into 8659f69da0
This commit is contained in:
commit
645f8d54ff
|
|
@ -102,6 +102,10 @@ message InstanceSetting {
|
|||
bool disallow_change_username = 8;
|
||||
// disallow_change_nickname disallows changing nickname.
|
||||
bool disallow_change_nickname = 9;
|
||||
// enable_explore_auto_refresh enables auto-refresh on Explore page. Default: true.
|
||||
bool enable_explore_auto_refresh = 10;
|
||||
// min_auto_refresh_interval is the minimum auto-refresh interval in seconds. Default: 1.
|
||||
int32 min_auto_refresh_interval = 11;
|
||||
|
||||
// Custom profile configuration for instance branding.
|
||||
message CustomProfile {
|
||||
|
|
|
|||
|
|
@ -416,6 +416,8 @@ message UserSetting {
|
|||
// This references a CSS file in the web/public/themes/ directory.
|
||||
// If not set, the default theme will be used.
|
||||
string theme = 4 [(google.api.field_behavior) = OPTIONAL];
|
||||
// Auto-refresh interval in seconds. 0 = disabled, default = 30.
|
||||
int32 auto_refresh_interval = 5 [(google.api.field_behavior) = OPTIONAL];
|
||||
}
|
||||
|
||||
// User authentication sessions configuration.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: api/v1/activity_service.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: api/v1/attachment_service.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: api/v1/auth_service.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: api/v1/common.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: api/v1/idp_service.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: api/v1/instance_service.proto
|
||||
|
||||
|
|
@ -478,6 +478,10 @@ type InstanceSetting_GeneralSetting struct {
|
|||
DisallowChangeUsername bool `protobuf:"varint,8,opt,name=disallow_change_username,json=disallowChangeUsername,proto3" json:"disallow_change_username,omitempty"`
|
||||
// disallow_change_nickname disallows changing nickname.
|
||||
DisallowChangeNickname bool `protobuf:"varint,9,opt,name=disallow_change_nickname,json=disallowChangeNickname,proto3" json:"disallow_change_nickname,omitempty"`
|
||||
// enable_explore_auto_refresh enables auto-refresh on Explore page. Default: true.
|
||||
EnableExploreAutoRefresh bool `protobuf:"varint,10,opt,name=enable_explore_auto_refresh,json=enableExploreAutoRefresh,proto3" json:"enable_explore_auto_refresh,omitempty"`
|
||||
// min_auto_refresh_interval is the minimum auto-refresh interval in seconds. Default: 1.
|
||||
MinAutoRefreshInterval int32 `protobuf:"varint,11,opt,name=min_auto_refresh_interval,json=minAutoRefreshInterval,proto3" json:"min_auto_refresh_interval,omitempty"`
|
||||
unknownFields protoimpl.UnknownFields
|
||||
sizeCache protoimpl.SizeCache
|
||||
}
|
||||
|
|
@ -568,6 +572,20 @@ func (x *InstanceSetting_GeneralSetting) GetDisallowChangeNickname() bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func (x *InstanceSetting_GeneralSetting) GetEnableExploreAutoRefresh() bool {
|
||||
if x != nil {
|
||||
return x.EnableExploreAutoRefresh
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *InstanceSetting_GeneralSetting) GetMinAutoRefreshInterval() int32 {
|
||||
if x != nil {
|
||||
return x.MinAutoRefreshInterval
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// Storage configuration settings for instance attachments.
|
||||
type InstanceSetting_StorageSetting struct {
|
||||
state protoimpl.MessageState `protogen:"open.v1"`
|
||||
|
|
@ -899,12 +917,12 @@ const file_api_v1_instance_service_proto_rawDesc = "" +
|
|||
"\aversion\x18\x02 \x01(\tR\aversion\x12\x12\n" +
|
||||
"\x04mode\x18\x03 \x01(\tR\x04mode\x12!\n" +
|
||||
"\finstance_url\x18\x06 \x01(\tR\vinstanceUrl\"\x1b\n" +
|
||||
"\x19GetInstanceProfileRequest\"\xef\x0f\n" +
|
||||
"\x19GetInstanceProfileRequest\"\xe9\x10\n" +
|
||||
"\x0fInstanceSetting\x12\x17\n" +
|
||||
"\x04name\x18\x01 \x01(\tB\x03\xe0A\bR\x04name\x12W\n" +
|
||||
"\x0fgeneral_setting\x18\x02 \x01(\v2,.memos.api.v1.InstanceSetting.GeneralSettingH\x00R\x0egeneralSetting\x12W\n" +
|
||||
"\x0fstorage_setting\x18\x03 \x01(\v2,.memos.api.v1.InstanceSetting.StorageSettingH\x00R\x0estorageSetting\x12d\n" +
|
||||
"\x14memo_related_setting\x18\x04 \x01(\v20.memos.api.v1.InstanceSetting.MemoRelatedSettingH\x00R\x12memoRelatedSetting\x1a\xca\x04\n" +
|
||||
"\x14memo_related_setting\x18\x04 \x01(\v20.memos.api.v1.InstanceSetting.MemoRelatedSettingH\x00R\x12memoRelatedSetting\x1a\xc4\x05\n" +
|
||||
"\x0eGeneralSetting\x12<\n" +
|
||||
"\x1adisallow_user_registration\x18\x02 \x01(\bR\x18disallowUserRegistration\x124\n" +
|
||||
"\x16disallow_password_auth\x18\x03 \x01(\bR\x14disallowPasswordAuth\x12+\n" +
|
||||
|
|
@ -913,7 +931,10 @@ const file_api_v1_instance_service_proto_rawDesc = "" +
|
|||
"\x0ecustom_profile\x18\x06 \x01(\v2:.memos.api.v1.InstanceSetting.GeneralSetting.CustomProfileR\rcustomProfile\x121\n" +
|
||||
"\x15week_start_day_offset\x18\a \x01(\x05R\x12weekStartDayOffset\x128\n" +
|
||||
"\x18disallow_change_username\x18\b \x01(\bR\x16disallowChangeUsername\x128\n" +
|
||||
"\x18disallow_change_nickname\x18\t \x01(\bR\x16disallowChangeNickname\x1ab\n" +
|
||||
"\x18disallow_change_nickname\x18\t \x01(\bR\x16disallowChangeNickname\x12=\n" +
|
||||
"\x1benable_explore_auto_refresh\x18\n" +
|
||||
" \x01(\bR\x18enableExploreAutoRefresh\x129\n" +
|
||||
"\x19min_auto_refresh_interval\x18\v \x01(\x05R\x16minAutoRefreshInterval\x1ab\n" +
|
||||
"\rCustomProfile\x12\x14\n" +
|
||||
"\x05title\x18\x01 \x01(\tR\x05title\x12 \n" +
|
||||
"\vdescription\x18\x02 \x01(\tR\vdescription\x12\x19\n" +
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: api/v1/memo_service.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: api/v1/shortcut_service.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: api/v1/user_service.proto
|
||||
|
||||
|
|
@ -2607,9 +2607,11 @@ type UserSetting_GeneralSetting struct {
|
|||
// The preferred theme of the user.
|
||||
// This references a CSS file in the web/public/themes/ directory.
|
||||
// If not set, the default theme will be used.
|
||||
Theme string `protobuf:"bytes,4,opt,name=theme,proto3" json:"theme,omitempty"`
|
||||
unknownFields protoimpl.UnknownFields
|
||||
sizeCache protoimpl.SizeCache
|
||||
Theme string `protobuf:"bytes,4,opt,name=theme,proto3" json:"theme,omitempty"`
|
||||
// Auto-refresh interval in seconds. 0 = disabled, default = 30.
|
||||
AutoRefreshInterval int32 `protobuf:"varint,5,opt,name=auto_refresh_interval,json=autoRefreshInterval,proto3" json:"auto_refresh_interval,omitempty"`
|
||||
unknownFields protoimpl.UnknownFields
|
||||
sizeCache protoimpl.SizeCache
|
||||
}
|
||||
|
||||
func (x *UserSetting_GeneralSetting) Reset() {
|
||||
|
|
@ -2663,6 +2665,13 @@ func (x *UserSetting_GeneralSetting) GetTheme() string {
|
|||
return ""
|
||||
}
|
||||
|
||||
func (x *UserSetting_GeneralSetting) GetAutoRefreshInterval() int32 {
|
||||
if x != nil {
|
||||
return x.AutoRefreshInterval
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// User authentication sessions configuration.
|
||||
type UserSetting_SessionsSetting struct {
|
||||
state protoimpl.MessageState `protogen:"open.v1"`
|
||||
|
|
@ -2964,17 +2973,18 @@ const file_api_v1_user_service_proto_rawDesc = "" +
|
|||
"\x11memos.api.v1/UserR\x04name\"\x19\n" +
|
||||
"\x17ListAllUserStatsRequest\"I\n" +
|
||||
"\x18ListAllUserStatsResponse\x12-\n" +
|
||||
"\x05stats\x18\x01 \x03(\v2\x17.memos.api.v1.UserStatsR\x05stats\"\xb3\a\n" +
|
||||
"\x05stats\x18\x01 \x03(\v2\x17.memos.api.v1.UserStatsR\x05stats\"\xed\a\n" +
|
||||
"\vUserSetting\x12\x17\n" +
|
||||
"\x04name\x18\x01 \x01(\tB\x03\xe0A\bR\x04name\x12S\n" +
|
||||
"\x0fgeneral_setting\x18\x02 \x01(\v2(.memos.api.v1.UserSetting.GeneralSettingH\x00R\x0egeneralSetting\x12V\n" +
|
||||
"\x10sessions_setting\x18\x03 \x01(\v2).memos.api.v1.UserSetting.SessionsSettingH\x00R\x0fsessionsSetting\x12c\n" +
|
||||
"\x15access_tokens_setting\x18\x04 \x01(\v2-.memos.api.v1.UserSetting.AccessTokensSettingH\x00R\x13accessTokensSetting\x12V\n" +
|
||||
"\x10webhooks_setting\x18\x05 \x01(\v2).memos.api.v1.UserSetting.WebhooksSettingH\x00R\x0fwebhooksSetting\x1av\n" +
|
||||
"\x10webhooks_setting\x18\x05 \x01(\v2).memos.api.v1.UserSetting.WebhooksSettingH\x00R\x0fwebhooksSetting\x1a\xaf\x01\n" +
|
||||
"\x0eGeneralSetting\x12\x1b\n" +
|
||||
"\x06locale\x18\x01 \x01(\tB\x03\xe0A\x01R\x06locale\x12,\n" +
|
||||
"\x0fmemo_visibility\x18\x03 \x01(\tB\x03\xe0A\x01R\x0ememoVisibility\x12\x19\n" +
|
||||
"\x05theme\x18\x04 \x01(\tB\x03\xe0A\x01R\x05theme\x1aH\n" +
|
||||
"\x05theme\x18\x04 \x01(\tB\x03\xe0A\x01R\x05theme\x127\n" +
|
||||
"\x15auto_refresh_interval\x18\x05 \x01(\x05B\x03\xe0A\x01R\x13autoRefreshInterval\x1aH\n" +
|
||||
"\x0fSessionsSetting\x125\n" +
|
||||
"\bsessions\x18\x01 \x03(\v2\x19.memos.api.v1.UserSessionR\bsessions\x1aY\n" +
|
||||
"\x13AccessTokensSetting\x12B\n" +
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: google/api/annotations.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: google/api/client.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: google/api/field_behavior.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: google/api/http.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: google/api/resource.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: store/activity.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: store/attachment.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: store/idp.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: store/inbox.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: store/instance_setting.proto
|
||||
|
||||
|
|
@ -331,6 +331,10 @@ type InstanceGeneralSetting struct {
|
|||
DisallowChangeUsername bool `protobuf:"varint,8,opt,name=disallow_change_username,json=disallowChangeUsername,proto3" json:"disallow_change_username,omitempty"`
|
||||
// disallow_change_nickname disallows changing nickname.
|
||||
DisallowChangeNickname bool `protobuf:"varint,9,opt,name=disallow_change_nickname,json=disallowChangeNickname,proto3" json:"disallow_change_nickname,omitempty"`
|
||||
// enable_explore_auto_refresh enables auto-refresh on Explore page. Default: true.
|
||||
EnableExploreAutoRefresh bool `protobuf:"varint,10,opt,name=enable_explore_auto_refresh,json=enableExploreAutoRefresh,proto3" json:"enable_explore_auto_refresh,omitempty"`
|
||||
// min_auto_refresh_interval is the minimum auto-refresh interval in seconds. Default: 1.
|
||||
MinAutoRefreshInterval int32 `protobuf:"varint,11,opt,name=min_auto_refresh_interval,json=minAutoRefreshInterval,proto3" json:"min_auto_refresh_interval,omitempty"`
|
||||
unknownFields protoimpl.UnknownFields
|
||||
sizeCache protoimpl.SizeCache
|
||||
}
|
||||
|
|
@ -421,6 +425,20 @@ func (x *InstanceGeneralSetting) GetDisallowChangeNickname() bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func (x *InstanceGeneralSetting) GetEnableExploreAutoRefresh() bool {
|
||||
if x != nil {
|
||||
return x.EnableExploreAutoRefresh
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *InstanceGeneralSetting) GetMinAutoRefreshInterval() int32 {
|
||||
if x != nil {
|
||||
return x.MinAutoRefreshInterval
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type InstanceCustomProfile struct {
|
||||
state protoimpl.MessageState `protogen:"open.v1"`
|
||||
Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
|
||||
|
|
@ -753,7 +771,7 @@ const file_store_instance_setting_proto_rawDesc = "" +
|
|||
"\x14InstanceBasicSetting\x12\x1d\n" +
|
||||
"\n" +
|
||||
"secret_key\x18\x01 \x01(\tR\tsecretKey\x12%\n" +
|
||||
"\x0eschema_version\x18\x02 \x01(\tR\rschemaVersion\"\xd6\x03\n" +
|
||||
"\x0eschema_version\x18\x02 \x01(\tR\rschemaVersion\"\xd0\x04\n" +
|
||||
"\x16InstanceGeneralSetting\x12<\n" +
|
||||
"\x1adisallow_user_registration\x18\x02 \x01(\bR\x18disallowUserRegistration\x124\n" +
|
||||
"\x16disallow_password_auth\x18\x03 \x01(\bR\x14disallowPasswordAuth\x12+\n" +
|
||||
|
|
@ -762,7 +780,10 @@ const file_store_instance_setting_proto_rawDesc = "" +
|
|||
"\x0ecustom_profile\x18\x06 \x01(\v2\".memos.store.InstanceCustomProfileR\rcustomProfile\x121\n" +
|
||||
"\x15week_start_day_offset\x18\a \x01(\x05R\x12weekStartDayOffset\x128\n" +
|
||||
"\x18disallow_change_username\x18\b \x01(\bR\x16disallowChangeUsername\x128\n" +
|
||||
"\x18disallow_change_nickname\x18\t \x01(\bR\x16disallowChangeNickname\"j\n" +
|
||||
"\x18disallow_change_nickname\x18\t \x01(\bR\x16disallowChangeNickname\x12=\n" +
|
||||
"\x1benable_explore_auto_refresh\x18\n" +
|
||||
" \x01(\bR\x18enableExploreAutoRefresh\x129\n" +
|
||||
"\x19min_auto_refresh_interval\x18\v \x01(\x05R\x16minAutoRefreshInterval\"j\n" +
|
||||
"\x15InstanceCustomProfile\x12\x14\n" +
|
||||
"\x05title\x18\x01 \x01(\tR\x05title\x12 \n" +
|
||||
"\vdescription\x18\x02 \x01(\tR\vdescription\x12\x19\n" +
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: store/memo.proto
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.10
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc (unknown)
|
||||
// source: store/user_setting.proto
|
||||
|
||||
|
|
@ -239,9 +239,11 @@ type GeneralUserSetting struct {
|
|||
MemoVisibility string `protobuf:"bytes,2,opt,name=memo_visibility,json=memoVisibility,proto3" json:"memo_visibility,omitempty"`
|
||||
// The user's theme preference.
|
||||
// This references a CSS file in the web/public/themes/ directory.
|
||||
Theme string `protobuf:"bytes,3,opt,name=theme,proto3" json:"theme,omitempty"`
|
||||
unknownFields protoimpl.UnknownFields
|
||||
sizeCache protoimpl.SizeCache
|
||||
Theme string `protobuf:"bytes,3,opt,name=theme,proto3" json:"theme,omitempty"`
|
||||
// Auto-refresh interval in seconds. 0 = disabled, default = 30.
|
||||
AutoRefreshInterval int32 `protobuf:"varint,4,opt,name=auto_refresh_interval,json=autoRefreshInterval,proto3" json:"auto_refresh_interval,omitempty"`
|
||||
unknownFields protoimpl.UnknownFields
|
||||
sizeCache protoimpl.SizeCache
|
||||
}
|
||||
|
||||
func (x *GeneralUserSetting) Reset() {
|
||||
|
|
@ -295,6 +297,13 @@ func (x *GeneralUserSetting) GetTheme() string {
|
|||
return ""
|
||||
}
|
||||
|
||||
func (x *GeneralUserSetting) GetAutoRefreshInterval() int32 {
|
||||
if x != nil {
|
||||
return x.AutoRefreshInterval
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type SessionsUserSetting struct {
|
||||
state protoimpl.MessageState `protogen:"open.v1"`
|
||||
Sessions []*SessionsUserSetting_Session `protobuf:"bytes,1,rep,name=sessions,proto3" json:"sessions,omitempty"`
|
||||
|
|
@ -823,11 +832,12 @@ const file_store_user_setting_proto_rawDesc = "" +
|
|||
"\rACCESS_TOKENS\x10\x03\x12\r\n" +
|
||||
"\tSHORTCUTS\x10\x04\x12\f\n" +
|
||||
"\bWEBHOOKS\x10\x05B\a\n" +
|
||||
"\x05value\"k\n" +
|
||||
"\x05value\"\x9f\x01\n" +
|
||||
"\x12GeneralUserSetting\x12\x16\n" +
|
||||
"\x06locale\x18\x01 \x01(\tR\x06locale\x12'\n" +
|
||||
"\x0fmemo_visibility\x18\x02 \x01(\tR\x0ememoVisibility\x12\x14\n" +
|
||||
"\x05theme\x18\x03 \x01(\tR\x05theme\"\xf3\x03\n" +
|
||||
"\x05theme\x18\x03 \x01(\tR\x05theme\x122\n" +
|
||||
"\x15auto_refresh_interval\x18\x04 \x01(\x05R\x13autoRefreshInterval\"\xf3\x03\n" +
|
||||
"\x13SessionsUserSetting\x12D\n" +
|
||||
"\bsessions\x18\x01 \x03(\v2(.memos.store.SessionsUserSetting.SessionR\bsessions\x1a\xfd\x01\n" +
|
||||
"\aSession\x12\x1d\n" +
|
||||
|
|
|
|||
|
|
@ -52,6 +52,10 @@ message InstanceGeneralSetting {
|
|||
bool disallow_change_username = 8;
|
||||
// disallow_change_nickname disallows changing nickname.
|
||||
bool disallow_change_nickname = 9;
|
||||
// enable_explore_auto_refresh enables auto-refresh on Explore page. Default: true.
|
||||
bool enable_explore_auto_refresh = 10;
|
||||
// min_auto_refresh_interval is the minimum auto-refresh interval in seconds. Default: 1.
|
||||
int32 min_auto_refresh_interval = 11;
|
||||
}
|
||||
|
||||
message InstanceCustomProfile {
|
||||
|
|
|
|||
|
|
@ -41,6 +41,8 @@ message GeneralUserSetting {
|
|||
// The user's theme preference.
|
||||
// This references a CSS file in the web/public/themes/ directory.
|
||||
string theme = 3;
|
||||
// Auto-refresh interval in seconds. 0 = disabled, default = 30.
|
||||
int32 auto_refresh_interval = 4;
|
||||
}
|
||||
|
||||
message SessionsUserSetting {
|
||||
|
|
|
|||
|
|
@ -156,13 +156,15 @@ func convertInstanceGeneralSettingFromStore(setting *storepb.InstanceGeneralSett
|
|||
}
|
||||
|
||||
generalSetting := &v1pb.InstanceSetting_GeneralSetting{
|
||||
DisallowUserRegistration: setting.DisallowUserRegistration,
|
||||
DisallowPasswordAuth: setting.DisallowPasswordAuth,
|
||||
AdditionalScript: setting.AdditionalScript,
|
||||
AdditionalStyle: setting.AdditionalStyle,
|
||||
WeekStartDayOffset: setting.WeekStartDayOffset,
|
||||
DisallowChangeUsername: setting.DisallowChangeUsername,
|
||||
DisallowChangeNickname: setting.DisallowChangeNickname,
|
||||
DisallowUserRegistration: setting.DisallowUserRegistration,
|
||||
DisallowPasswordAuth: setting.DisallowPasswordAuth,
|
||||
AdditionalScript: setting.AdditionalScript,
|
||||
AdditionalStyle: setting.AdditionalStyle,
|
||||
WeekStartDayOffset: setting.WeekStartDayOffset,
|
||||
DisallowChangeUsername: setting.DisallowChangeUsername,
|
||||
DisallowChangeNickname: setting.DisallowChangeNickname,
|
||||
EnableExploreAutoRefresh: setting.EnableExploreAutoRefresh,
|
||||
MinAutoRefreshInterval: setting.MinAutoRefreshInterval,
|
||||
}
|
||||
if setting.CustomProfile != nil {
|
||||
generalSetting.CustomProfile = &v1pb.InstanceSetting_GeneralSetting_CustomProfile{
|
||||
|
|
@ -179,13 +181,15 @@ func convertInstanceGeneralSettingToStore(setting *v1pb.InstanceSetting_GeneralS
|
|||
return nil
|
||||
}
|
||||
generalSetting := &storepb.InstanceGeneralSetting{
|
||||
DisallowUserRegistration: setting.DisallowUserRegistration,
|
||||
DisallowPasswordAuth: setting.DisallowPasswordAuth,
|
||||
AdditionalScript: setting.AdditionalScript,
|
||||
AdditionalStyle: setting.AdditionalStyle,
|
||||
WeekStartDayOffset: setting.WeekStartDayOffset,
|
||||
DisallowChangeUsername: setting.DisallowChangeUsername,
|
||||
DisallowChangeNickname: setting.DisallowChangeNickname,
|
||||
DisallowUserRegistration: setting.DisallowUserRegistration,
|
||||
DisallowPasswordAuth: setting.DisallowPasswordAuth,
|
||||
AdditionalScript: setting.AdditionalScript,
|
||||
AdditionalStyle: setting.AdditionalStyle,
|
||||
WeekStartDayOffset: setting.WeekStartDayOffset,
|
||||
DisallowChangeUsername: setting.DisallowChangeUsername,
|
||||
DisallowChangeNickname: setting.DisallowChangeNickname,
|
||||
EnableExploreAutoRefresh: setting.EnableExploreAutoRefresh,
|
||||
MinAutoRefreshInterval: setting.MinAutoRefreshInterval,
|
||||
}
|
||||
if setting.CustomProfile != nil {
|
||||
generalSetting.CustomProfile = &storepb.InstanceCustomProfile{
|
||||
|
|
|
|||
|
|
@ -396,9 +396,10 @@ func (s *APIV1Service) UpdateUserSetting(ctx context.Context, request *v1pb.Upda
|
|||
}
|
||||
|
||||
updatedGeneral := &v1pb.UserSetting_GeneralSetting{
|
||||
MemoVisibility: generalSetting.GetMemoVisibility(),
|
||||
Locale: generalSetting.GetLocale(),
|
||||
Theme: generalSetting.GetTheme(),
|
||||
MemoVisibility: generalSetting.GetMemoVisibility(),
|
||||
Locale: generalSetting.GetLocale(),
|
||||
Theme: generalSetting.GetTheme(),
|
||||
AutoRefreshInterval: generalSetting.GetAutoRefreshInterval(),
|
||||
}
|
||||
|
||||
// Apply updates for fields specified in the update mask
|
||||
|
|
@ -411,6 +412,8 @@ func (s *APIV1Service) UpdateUserSetting(ctx context.Context, request *v1pb.Upda
|
|||
updatedGeneral.Theme = incomingGeneral.Theme
|
||||
case "locale":
|
||||
updatedGeneral.Locale = incomingGeneral.Locale
|
||||
case "auto_refresh_interval":
|
||||
updatedGeneral.AutoRefreshInterval = incomingGeneral.AutoRefreshInterval
|
||||
default:
|
||||
// Ignore unsupported fields
|
||||
}
|
||||
|
|
@ -1263,9 +1266,10 @@ func convertUserSettingFromStore(storeSetting *storepb.UserSetting, userID int32
|
|||
if general := storeSetting.GetGeneral(); general != nil {
|
||||
setting.Value = &v1pb.UserSetting_GeneralSetting_{
|
||||
GeneralSetting: &v1pb.UserSetting_GeneralSetting{
|
||||
Locale: general.Locale,
|
||||
MemoVisibility: general.MemoVisibility,
|
||||
Theme: general.Theme,
|
||||
Locale: general.Locale,
|
||||
MemoVisibility: general.MemoVisibility,
|
||||
Theme: general.Theme,
|
||||
AutoRefreshInterval: general.AutoRefreshInterval,
|
||||
},
|
||||
}
|
||||
} else {
|
||||
|
|
@ -1351,9 +1355,10 @@ func convertUserSettingToStore(apiSetting *v1pb.UserSetting, userID int32, key s
|
|||
if general := apiSetting.GetGeneralSetting(); general != nil {
|
||||
storeSetting.Value = &storepb.UserSetting_General{
|
||||
General: &storepb.GeneralUserSetting{
|
||||
Locale: general.Locale,
|
||||
MemoVisibility: general.MemoVisibility,
|
||||
Theme: general.Theme,
|
||||
Locale: general.Locale,
|
||||
MemoVisibility: general.MemoVisibility,
|
||||
Theme: general.Theme,
|
||||
AutoRefreshInterval: general.AutoRefreshInterval,
|
||||
},
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -4,10 +4,11 @@ import { useCallback, useEffect, useRef, useState } from "react";
|
|||
import { matchPath } from "react-router-dom";
|
||||
import PullToRefresh from "react-simple-pull-to-refresh";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { DEFAULT_LIST_MEMOS_PAGE_SIZE } from "@/helpers/consts";
|
||||
import { DEFAULT_AUTO_REFRESH_INTERVAL, DEFAULT_LIST_MEMOS_PAGE_SIZE, DEFAULT_MIN_AUTO_REFRESH_INTERVAL } from "@/helpers/consts";
|
||||
import useResponsiveWidth from "@/hooks/useResponsiveWidth";
|
||||
import useAutoRefresh from "@/hooks/useAutoRefresh";
|
||||
import { Routes } from "@/router";
|
||||
import { memoStore, userStore, viewStore } from "@/store";
|
||||
import { instanceStore, memoStore, userStore, viewStore } from "@/store";
|
||||
import { State } from "@/types/proto/api/v1/common_pb";
|
||||
import type { Memo } from "@/types/proto/api/v1/memo_service_pb";
|
||||
import { useTranslate } from "@/utils/i18n";
|
||||
|
|
@ -26,6 +27,7 @@ interface Props {
|
|||
filter?: string;
|
||||
pageSize?: number;
|
||||
showCreator?: boolean;
|
||||
autoRefresh?: boolean;
|
||||
}
|
||||
|
||||
const PagedMemoList = observer((props: Props) => {
|
||||
|
|
@ -161,10 +163,25 @@ const PagedMemoList = observer((props: Props) => {
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
window.addEventListener("scroll", handleScroll);
|
||||
return () => window.removeEventListener("scroll", handleScroll);
|
||||
}, [nextPageToken, isRequesting, fetchMoreMemos]);
|
||||
|
||||
const userInterval = userStore.state.userGeneralSetting?.autoRefreshInterval ?? DEFAULT_AUTO_REFRESH_INTERVAL;
|
||||
const minInterval = instanceStore.state.generalSetting?.minAutoRefreshInterval ?? DEFAULT_MIN_AUTO_REFRESH_INTERVAL;
|
||||
const effectiveInterval = userInterval === 0 ? 0 : Math.max(userInterval, minInterval);
|
||||
|
||||
// Auto-refresh: periodically check for new memos and refresh the list
|
||||
useAutoRefresh({
|
||||
state: props.state || State.NORMAL,
|
||||
orderBy: props.orderBy || "display_time desc",
|
||||
filter: props.filter,
|
||||
enabled: props.autoRefresh ?? false,
|
||||
intervalSeconds: effectiveInterval,
|
||||
onRefresh: refreshList,
|
||||
});
|
||||
|
||||
const children = (
|
||||
<div className="flex flex-col justify-start items-start w-full max-w-full">
|
||||
{/* Show skeleton loader during initial load */}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import { observer } from "mobx-react-lite";
|
|||
import { useEffect, useState } from "react";
|
||||
import { toast } from "react-hot-toast";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
|
||||
import { Switch } from "@/components/ui/switch";
|
||||
import { Textarea } from "@/components/ui/textarea";
|
||||
|
|
@ -170,6 +171,27 @@ const InstanceSection = observer(() => {
|
|||
</SelectContent>
|
||||
</Select>
|
||||
</SettingRow>
|
||||
|
||||
<SettingRow label={t("setting.instance-section.enable-explore-auto-refresh")}>
|
||||
<Switch
|
||||
checked={instanceGeneralSetting.enableExploreAutoRefresh !== false}
|
||||
onCheckedChange={(checked) => updatePartialSetting({ enableExploreAutoRefresh: checked })}
|
||||
/>
|
||||
</SettingRow>
|
||||
|
||||
<SettingRow label={t("setting.instance-section.min-auto-refresh-interval")}>
|
||||
<div className="flex items-center gap-2">
|
||||
<Input
|
||||
className="w-20 font-mono"
|
||||
value={instanceGeneralSetting.minAutoRefreshInterval || 1}
|
||||
onChange={(e) => {
|
||||
const value = parseInt(e.target.value) || 1;
|
||||
updatePartialSetting({ minAutoRefreshInterval: value });
|
||||
}}
|
||||
/>
|
||||
<span className="text-sm text-muted-foreground">{t("setting.preference-section.seconds")}</span>
|
||||
</div>
|
||||
</SettingRow>
|
||||
</SettingGroup>
|
||||
|
||||
<div className="w-full flex justify-end">
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import { create } from "@bufbuild/protobuf";
|
||||
import { observer } from "mobx-react-lite";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
|
||||
import { userStore } from "@/store";
|
||||
import { Visibility } from "@/types/proto/api/v1/memo_service_pb";
|
||||
|
|
@ -78,6 +79,20 @@ const PreferencesSection = observer(() => {
|
|||
</SelectContent>
|
||||
</Select>
|
||||
</SettingRow>
|
||||
|
||||
<SettingRow label={t("setting.preference-section.auto-refresh-interval")}>
|
||||
<div className="flex items-center gap-2">
|
||||
<Input
|
||||
className="w-20 font-mono"
|
||||
value={setting.autoRefreshInterval ?? 10}
|
||||
onChange={async (e) => {
|
||||
const value = parseInt(e.target.value) || 0;
|
||||
await userStore.updateUserGeneralSetting({ autoRefreshInterval: value }, ["auto_refresh_interval"]);
|
||||
}}
|
||||
/>
|
||||
<span className="text-sm text-muted-foreground">{t("setting.preference-section.seconds")}</span>
|
||||
</div>
|
||||
</SettingRow>
|
||||
</SettingGroup>
|
||||
|
||||
<SettingGroup showSeparator>
|
||||
|
|
|
|||
|
|
@ -3,3 +3,9 @@ export const TAB_SPACE_WIDTH = 2;
|
|||
|
||||
// DEFAULT_LIST_MEMOS_PAGE_SIZE is the default page size for list memos request.
|
||||
export const DEFAULT_LIST_MEMOS_PAGE_SIZE = 16;
|
||||
|
||||
// DEFAULT_AUTO_REFRESH_INTERVAL is the default auto-refresh interval in seconds.
|
||||
export const DEFAULT_AUTO_REFRESH_INTERVAL = 10;
|
||||
|
||||
// DEFAULT_MIN_AUTO_REFRESH_INTERVAL is the default minimum auto-refresh interval in seconds.
|
||||
export const DEFAULT_MIN_AUTO_REFRESH_INTERVAL = 1;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
export * from "./useAsyncEffect";
|
||||
export * from "./useAutoRefresh";
|
||||
export * from "./useCurrentUser";
|
||||
export * from "./useFilteredMemoStats";
|
||||
export * from "./useLoading";
|
||||
|
|
|
|||
|
|
@ -0,0 +1,128 @@
|
|||
import { create } from "@bufbuild/protobuf";
|
||||
import { useCallback, useEffect, useRef } from "react";
|
||||
import { memoServiceClient } from "@/grpcweb";
|
||||
import { instanceStore } from "@/store";
|
||||
import { State } from "@/types/proto/api/v1/common_pb";
|
||||
import { ListMemosRequestSchema, Memo } from "@/types/proto/api/v1/memo_service_pb";
|
||||
|
||||
interface UseAutoRefreshOptions {
|
||||
filter?: string;
|
||||
orderBy?: string;
|
||||
state?: State;
|
||||
enabled?: boolean;
|
||||
intervalSeconds: number;
|
||||
onRefresh: () => Promise<void>;
|
||||
}
|
||||
|
||||
const shouldSkipRefreshCheck = (isRefreshing: boolean): boolean => {
|
||||
if (isRefreshing) return true;
|
||||
if (document.hidden) return true;
|
||||
if (!navigator.onLine) return true;
|
||||
return false;
|
||||
};
|
||||
|
||||
const checkMemoUpdate = (
|
||||
latestMemo: Memo | undefined,
|
||||
previousUpdateTime: bigint | undefined,
|
||||
): { shouldRefresh: boolean; newUpdateTime?: bigint } => {
|
||||
if (!latestMemo) {
|
||||
return { shouldRefresh: false };
|
||||
}
|
||||
|
||||
const currentUpdateTime = latestMemo.updateTime?.seconds;
|
||||
|
||||
if (previousUpdateTime === undefined) {
|
||||
return { shouldRefresh: false, newUpdateTime: currentUpdateTime };
|
||||
}
|
||||
|
||||
const hasNewerMemo = currentUpdateTime !== undefined && currentUpdateTime > previousUpdateTime;
|
||||
return {
|
||||
shouldRefresh: hasNewerMemo,
|
||||
newUpdateTime: currentUpdateTime,
|
||||
};
|
||||
};
|
||||
|
||||
const useAutoRefresh = (options: UseAutoRefreshOptions) => {
|
||||
const { filter, orderBy, state = State.NORMAL, enabled = true, intervalSeconds, onRefresh } = options;
|
||||
|
||||
const isAutoRefreshDisabled = intervalSeconds === 0;
|
||||
|
||||
const latestUpdateTimeRef = useRef<bigint | undefined>(undefined);
|
||||
const isRefreshingRef = useRef(false);
|
||||
|
||||
const optionsRef = useRef({ filter, orderBy, state, onRefresh });
|
||||
optionsRef.current = { filter, orderBy, state, onRefresh };
|
||||
|
||||
const checkForUpdates = useCallback(async () => {
|
||||
if (shouldSkipRefreshCheck(isRefreshingRef.current)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { filter, orderBy, state, onRefresh } = optionsRef.current;
|
||||
|
||||
try {
|
||||
const response = await memoServiceClient.listMemos(
|
||||
create(ListMemosRequestSchema, {
|
||||
pageSize: 1,
|
||||
orderBy: orderBy || "display_time desc",
|
||||
filter,
|
||||
state,
|
||||
}),
|
||||
);
|
||||
|
||||
const latestMemo = response.memos[0];
|
||||
const { shouldRefresh, newUpdateTime } = checkMemoUpdate(latestMemo, latestUpdateTimeRef.current);
|
||||
|
||||
if (newUpdateTime !== undefined) {
|
||||
latestUpdateTimeRef.current = newUpdateTime;
|
||||
}
|
||||
|
||||
if (shouldRefresh) {
|
||||
isRefreshingRef.current = true;
|
||||
try {
|
||||
await onRefresh();
|
||||
} finally {
|
||||
isRefreshingRef.current = false;
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
// Silently ignore polling errors
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (!enabled || isAutoRefreshDisabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
checkForUpdates();
|
||||
|
||||
const intervalId = setInterval(checkForUpdates, intervalSeconds * 1000);
|
||||
|
||||
const handleVisibilityChange = () => {
|
||||
if (!document.hidden) {
|
||||
checkForUpdates();
|
||||
}
|
||||
};
|
||||
document.addEventListener("visibilitychange", handleVisibilityChange);
|
||||
|
||||
const handleOnline = () => checkForUpdates();
|
||||
window.addEventListener("online", handleOnline);
|
||||
|
||||
return () => {
|
||||
clearInterval(intervalId);
|
||||
document.removeEventListener("visibilitychange", handleVisibilityChange);
|
||||
window.removeEventListener("online", handleOnline);
|
||||
};
|
||||
}, [enabled, isAutoRefreshDisabled, intervalSeconds, checkForUpdates]);
|
||||
|
||||
useEffect(() => {
|
||||
latestUpdateTimeRef.current = undefined;
|
||||
}, [filter, orderBy, state]);
|
||||
};
|
||||
|
||||
export const isExploreAutoRefreshEnabled = (): boolean => {
|
||||
return instanceStore.state.generalSetting?.enableExploreAutoRefresh !== false;
|
||||
};
|
||||
|
||||
export default useAutoRefresh;
|
||||
|
|
@ -330,7 +330,9 @@
|
|||
"preference-section": {
|
||||
"default-memo-sort-option": "Memo display time",
|
||||
"default-memo-visibility": "Default memo visibility",
|
||||
"theme": "Theme"
|
||||
"theme": "Theme",
|
||||
"auto-refresh-interval": "Auto-refresh interval",
|
||||
"seconds": "seconds"
|
||||
},
|
||||
"shortcut": {
|
||||
"delete-confirm": "Are you sure you want to delete shortcut `{{title}}`?",
|
||||
|
|
@ -452,7 +454,9 @@
|
|||
"monday": "Monday",
|
||||
"saturday": "Saturday",
|
||||
"sunday": "Sunday",
|
||||
"week-start-day": "Week start day"
|
||||
"week-start-day": "Week start day",
|
||||
"enable-explore-auto-refresh": "Enable Explore page auto-refresh",
|
||||
"min-auto-refresh-interval": "Minimum auto-refresh interval"
|
||||
}
|
||||
},
|
||||
"tag": {
|
||||
|
|
@ -479,4 +483,4 @@
|
|||
"tags": "Tags",
|
||||
"upload-attachment": "Upload Attachment(s)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -18,7 +18,7 @@
|
|||
"about": "Memos について",
|
||||
"add": "追加",
|
||||
"admin": "管理者設定",
|
||||
"archive": "アーカイブにする",
|
||||
"archive": "アーカイブする",
|
||||
"archived": "ゴミ箱",
|
||||
"attachments": "添付ファイル",
|
||||
"avatar": "アイコン",
|
||||
|
|
@ -30,6 +30,7 @@
|
|||
"close": "閉じる",
|
||||
"collapse": "折りたたむ",
|
||||
"confirm": "確認する",
|
||||
"copy": "コピー",
|
||||
"create": "作成する",
|
||||
"created-at": "作成日時",
|
||||
"database": "データベース",
|
||||
|
|
@ -99,7 +100,7 @@
|
|||
"username": "ユーザーネーム",
|
||||
"version": "バージョン",
|
||||
"visibility": "公開範囲",
|
||||
"yourself": "あなた自身の"
|
||||
"yourself": "あなた自身"
|
||||
},
|
||||
"days": {
|
||||
"fri": "金",
|
||||
|
|
@ -132,14 +133,15 @@
|
|||
},
|
||||
"memo": {
|
||||
"archived-at": "アーカイブ:",
|
||||
"click-to-hide-nsfw-content": "クリックしてセンシティブ内容を隠す",
|
||||
"click-to-show-nsfw-content": "クリックしてセンシティブ内容を表示",
|
||||
"click-to-hide-nsfw-content": "クリックしてセンシティブな内容を隠す",
|
||||
"click-to-show-nsfw-content": "クリックしてセンシティブな内容を表示",
|
||||
"code": "コード",
|
||||
"comment": {
|
||||
"self": "コメント",
|
||||
"write-a-comment": "コメントを書く"
|
||||
},
|
||||
"copy-link": "リンクをコピー",
|
||||
"copy-content": "内容をコピー",
|
||||
"count-memos-in-date": "{{date}} 日に {{count}} 件のメモ",
|
||||
"delete-confirm": "本当に削除しますか? この操作は元に戻せません。",
|
||||
"direction": "並び順",
|
||||
|
|
@ -293,7 +295,7 @@
|
|||
"memo-related": "Memo",
|
||||
"memo-related-settings": {
|
||||
"content-lenght-limit": "内容の最大長(バイト)",
|
||||
"enable-blur-nsfw-content": "センシティブ(NSFW)内容のぼかしを有効化",
|
||||
"enable-blur-nsfw-content": "センシティブ(NSFW)な内容のぼかしを有効化",
|
||||
"enable-memo-comments": "メモコメントを有効化",
|
||||
"enable-memo-location": "メモの位置情報を有効化",
|
||||
"reactions": "リアクション",
|
||||
|
|
@ -304,7 +306,9 @@
|
|||
"preference-section": {
|
||||
"default-memo-sort-option": "メモの表示時間",
|
||||
"default-memo-visibility": "公開範囲の初期設定",
|
||||
"theme": "テーマ"
|
||||
"theme": "テーマ",
|
||||
"auto-refresh-interval": "更新の間隔",
|
||||
"seconds": "秒"
|
||||
},
|
||||
"sso": "SSO",
|
||||
"sso-section": {
|
||||
|
|
@ -416,7 +420,9 @@
|
|||
"monday": "月曜日",
|
||||
"saturday": "土曜日",
|
||||
"sunday": "日曜日",
|
||||
"week-start-day": "週の開始日"
|
||||
"week-start-day": "週の開始日",
|
||||
"enable-explore-auto-refresh": "共有メモページのオートリロードを有効化",
|
||||
"min-auto-refresh-interval": "オートリロード間隔の最小値を設定"
|
||||
}
|
||||
},
|
||||
"tag": {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import { observer } from "mobx-react-lite";
|
|||
import { MemoRenderContext } from "@/components/MasonryView";
|
||||
import MemoView from "@/components/MemoView";
|
||||
import PagedMemoList from "@/components/PagedMemoList";
|
||||
import { useMemoFilters, useMemoSorting } from "@/hooks";
|
||||
import { useMemoFilters, useMemoSorting, isExploreAutoRefreshEnabled } from "@/hooks";
|
||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
||||
import { State } from "@/types/proto/api/v1/common_pb";
|
||||
import { Memo, Visibility } from "@/types/proto/api/v1/memo_service_pb";
|
||||
|
|
@ -29,6 +29,8 @@ const Explore = observer(() => {
|
|||
state: State.NORMAL,
|
||||
});
|
||||
|
||||
const enableAutoRefresh = isExploreAutoRefreshEnabled();
|
||||
|
||||
return (
|
||||
<PagedMemoList
|
||||
renderer={(memo: Memo, context?: MemoRenderContext) => (
|
||||
|
|
@ -38,8 +40,10 @@ const Explore = observer(() => {
|
|||
orderBy={orderBy}
|
||||
filter={memoFilter}
|
||||
showCreator
|
||||
autoRefresh={enableAutoRefresh}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default Explore;
|
||||
|
||||
|
|
|
|||
|
|
@ -32,9 +32,11 @@ const Home = observer(() => {
|
|||
listSort={listSort}
|
||||
orderBy={orderBy}
|
||||
filter={memoFilter}
|
||||
autoRefresh
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
});
|
||||
|
||||
export default Home;
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ import type { Message } from "@bufbuild/protobuf";
|
|||
* Describes the file api/v1/instance_service.proto.
|
||||
*/
|
||||
export const file_api_v1_instance_service: GenFile = /*@__PURE__*/
|
||||
fileDesc("Ch1hcGkvdjEvaW5zdGFuY2Vfc2VydmljZS5wcm90bxIMbWVtb3MuYXBpLnYxIlUKD0luc3RhbmNlUHJvZmlsZRINCgVvd25lchgBIAEoCRIPCgd2ZXJzaW9uGAIgASgJEgwKBG1vZGUYAyABKAkSFAoMaW5zdGFuY2VfdXJsGAYgASgJIhsKGUdldEluc3RhbmNlUHJvZmlsZVJlcXVlc3Qi6AsKD0luc3RhbmNlU2V0dGluZxIRCgRuYW1lGAEgASgJQgPgQQgSRwoPZ2VuZXJhbF9zZXR0aW5nGAIgASgLMiwubWVtb3MuYXBpLnYxLkluc3RhbmNlU2V0dGluZy5HZW5lcmFsU2V0dGluZ0gAEkcKD3N0b3JhZ2Vfc2V0dGluZxgDIAEoCzIsLm1lbW9zLmFwaS52MS5JbnN0YW5jZVNldHRpbmcuU3RvcmFnZVNldHRpbmdIABJQChRtZW1vX3JlbGF0ZWRfc2V0dGluZxgEIAEoCzIwLm1lbW9zLmFwaS52MS5JbnN0YW5jZVNldHRpbmcuTWVtb1JlbGF0ZWRTZXR0aW5nSAAahwMKDkdlbmVyYWxTZXR0aW5nEiIKGmRpc2FsbG93X3VzZXJfcmVnaXN0cmF0aW9uGAIgASgIEh4KFmRpc2FsbG93X3Bhc3N3b3JkX2F1dGgYAyABKAgSGQoRYWRkaXRpb25hbF9zY3JpcHQYBCABKAkSGAoQYWRkaXRpb25hbF9zdHlsZRgFIAEoCRJSCg5jdXN0b21fcHJvZmlsZRgGIAEoCzI6Lm1lbW9zLmFwaS52MS5JbnN0YW5jZVNldHRpbmcuR2VuZXJhbFNldHRpbmcuQ3VzdG9tUHJvZmlsZRIdChV3ZWVrX3N0YXJ0X2RheV9vZmZzZXQYByABKAUSIAoYZGlzYWxsb3dfY2hhbmdlX3VzZXJuYW1lGAggASgIEiAKGGRpc2FsbG93X2NoYW5nZV9uaWNrbmFtZRgJIAEoCBpFCg1DdXN0b21Qcm9maWxlEg0KBXRpdGxlGAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEhAKCGxvZ29fdXJsGAMgASgJGroDCg5TdG9yYWdlU2V0dGluZxJOCgxzdG9yYWdlX3R5cGUYASABKA4yOC5tZW1vcy5hcGkudjEuSW5zdGFuY2VTZXR0aW5nLlN0b3JhZ2VTZXR0aW5nLlN0b3JhZ2VUeXBlEhkKEWZpbGVwYXRoX3RlbXBsYXRlGAIgASgJEhwKFHVwbG9hZF9zaXplX2xpbWl0X21iGAMgASgDEkgKCXMzX2NvbmZpZxgEIAEoCzI1Lm1lbW9zLmFwaS52MS5JbnN0YW5jZVNldHRpbmcuU3RvcmFnZVNldHRpbmcuUzNDb25maWcahgEKCFMzQ29uZmlnEhUKDWFjY2Vzc19rZXlfaWQYASABKAkSGQoRYWNjZXNzX2tleV9zZWNyZXQYAiABKAkSEAoIZW5kcG9pbnQYAyABKAkSDgoGcmVnaW9uGAQgASgJEg4KBmJ1Y2tldBgFIAEoCRIWCg51c2VfcGF0aF9zdHlsZRgGIAEoCCJMCgtTdG9yYWdlVHlwZRIcChhTVE9SQUdFX1RZUEVfVU5TUEVDSUZJRUQQABIMCghEQVRBQkFTRRABEgkKBUxPQ0FMEAISBgoCUzMQAxriAQoSTWVtb1JlbGF0ZWRTZXR0aW5nEiIKGmRpc2FsbG93X3B1YmxpY192aXNpYmlsaXR5GAEgASgIEiAKGGRpc3BsYXlfd2l0aF91cGRhdGVfdGltZRgCIAEoCBIcChRjb250ZW50X2xlbmd0aF9saW1pdBgDIAEoBRIgChhlbmFibGVfZG91YmxlX2NsaWNrX2VkaXQYBCABKAgSEQoJcmVhY3Rpb25zGAcgAygJEiAKGGVuYWJsZV9ibHVyX25zZndfY29udGVudBgJIAEoCBIRCgluc2Z3X3RhZ3MYCiADKAkiRgoDS2V5EhMKD0tFWV9VTlNQRUNJRklFRBAAEgsKB0dFTkVSQUwQARILCgdTVE9SQUdFEAISEAoMTUVNT19SRUxBVEVEEAM6YepBXgocbWVtb3MuYXBpLnYxL0luc3RhbmNlU2V0dGluZxIbaW5zdGFuY2Uvc2V0dGluZ3Mve3NldHRpbmd9KhBpbnN0YW5jZVNldHRpbmdzMg9pbnN0YW5jZVNldHRpbmdCBwoFdmFsdWUiTwoZR2V0SW5zdGFuY2VTZXR0aW5nUmVxdWVzdBIyCgRuYW1lGAEgASgJQiTgQQL6QR4KHG1lbW9zLmFwaS52MS9JbnN0YW5jZVNldHRpbmciiQEKHFVwZGF0ZUluc3RhbmNlU2V0dGluZ1JlcXVlc3QSMwoHc2V0dGluZxgBIAEoCzIdLm1lbW9zLmFwaS52MS5JbnN0YW5jZVNldHRpbmdCA+BBAhI0Cgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBATLbAwoPSW5zdGFuY2VTZXJ2aWNlEn4KEkdldEluc3RhbmNlUHJvZmlsZRInLm1lbW9zLmFwaS52MS5HZXRJbnN0YW5jZVByb2ZpbGVSZXF1ZXN0Gh0ubWVtb3MuYXBpLnYxLkluc3RhbmNlUHJvZmlsZSIggtPkkwIaEhgvYXBpL3YxL2luc3RhbmNlL3Byb2ZpbGUSjwEKEkdldEluc3RhbmNlU2V0dGluZxInLm1lbW9zLmFwaS52MS5HZXRJbnN0YW5jZVNldHRpbmdSZXF1ZXN0Gh0ubWVtb3MuYXBpLnYxLkluc3RhbmNlU2V0dGluZyIx2kEEbmFtZYLT5JMCJBIiL2FwaS92MS97bmFtZT1pbnN0YW5jZS9zZXR0aW5ncy8qfRK1AQoVVXBkYXRlSW5zdGFuY2VTZXR0aW5nEioubWVtb3MuYXBpLnYxLlVwZGF0ZUluc3RhbmNlU2V0dGluZ1JlcXVlc3QaHS5tZW1vcy5hcGkudjEuSW5zdGFuY2VTZXR0aW5nIlHaQRNzZXR0aW5nLHVwZGF0ZV9tYXNrgtPkkwI1OgdzZXR0aW5nMiovYXBpL3YxL3tzZXR0aW5nLm5hbWU9aW5zdGFuY2Uvc2V0dGluZ3MvKn1CrAEKEGNvbS5tZW1vcy5hcGkudjFCFEluc3RhbmNlU2VydmljZVByb3RvUAFaMGdpdGh1Yi5jb20vdXNlbWVtb3MvbWVtb3MvcHJvdG8vZ2VuL2FwaS92MTthcGl2MaICA01BWKoCDE1lbW9zLkFwaS5WMcoCDE1lbW9zXEFwaVxWMeICGE1lbW9zXEFwaVxWMVxHUEJNZXRhZGF0YeoCDk1lbW9zOjpBcGk6OlYxYgZwcm90bzM", [file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask]);
|
||||
fileDesc("Ch1hcGkvdjEvaW5zdGFuY2Vfc2VydmljZS5wcm90bxIMbWVtb3MuYXBpLnYxIlUKD0luc3RhbmNlUHJvZmlsZRINCgVvd25lchgBIAEoCRIPCgd2ZXJzaW9uGAIgASgJEgwKBG1vZGUYAyABKAkSFAoMaW5zdGFuY2VfdXJsGAYgASgJIhsKGUdldEluc3RhbmNlUHJvZmlsZVJlcXVlc3QisAwKD0luc3RhbmNlU2V0dGluZxIRCgRuYW1lGAEgASgJQgPgQQgSRwoPZ2VuZXJhbF9zZXR0aW5nGAIgASgLMiwubWVtb3MuYXBpLnYxLkluc3RhbmNlU2V0dGluZy5HZW5lcmFsU2V0dGluZ0gAEkcKD3N0b3JhZ2Vfc2V0dGluZxgDIAEoCzIsLm1lbW9zLmFwaS52MS5JbnN0YW5jZVNldHRpbmcuU3RvcmFnZVNldHRpbmdIABJQChRtZW1vX3JlbGF0ZWRfc2V0dGluZxgEIAEoCzIwLm1lbW9zLmFwaS52MS5JbnN0YW5jZVNldHRpbmcuTWVtb1JlbGF0ZWRTZXR0aW5nSAAazwMKDkdlbmVyYWxTZXR0aW5nEiIKGmRpc2FsbG93X3VzZXJfcmVnaXN0cmF0aW9uGAIgASgIEh4KFmRpc2FsbG93X3Bhc3N3b3JkX2F1dGgYAyABKAgSGQoRYWRkaXRpb25hbF9zY3JpcHQYBCABKAkSGAoQYWRkaXRpb25hbF9zdHlsZRgFIAEoCRJSCg5jdXN0b21fcHJvZmlsZRgGIAEoCzI6Lm1lbW9zLmFwaS52MS5JbnN0YW5jZVNldHRpbmcuR2VuZXJhbFNldHRpbmcuQ3VzdG9tUHJvZmlsZRIdChV3ZWVrX3N0YXJ0X2RheV9vZmZzZXQYByABKAUSIAoYZGlzYWxsb3dfY2hhbmdlX3VzZXJuYW1lGAggASgIEiAKGGRpc2FsbG93X2NoYW5nZV9uaWNrbmFtZRgJIAEoCBIjChtlbmFibGVfZXhwbG9yZV9hdXRvX3JlZnJlc2gYCiABKAgSIQoZbWluX2F1dG9fcmVmcmVzaF9pbnRlcnZhbBgLIAEoBRpFCg1DdXN0b21Qcm9maWxlEg0KBXRpdGxlGAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEhAKCGxvZ29fdXJsGAMgASgJGroDCg5TdG9yYWdlU2V0dGluZxJOCgxzdG9yYWdlX3R5cGUYASABKA4yOC5tZW1vcy5hcGkudjEuSW5zdGFuY2VTZXR0aW5nLlN0b3JhZ2VTZXR0aW5nLlN0b3JhZ2VUeXBlEhkKEWZpbGVwYXRoX3RlbXBsYXRlGAIgASgJEhwKFHVwbG9hZF9zaXplX2xpbWl0X21iGAMgASgDEkgKCXMzX2NvbmZpZxgEIAEoCzI1Lm1lbW9zLmFwaS52MS5JbnN0YW5jZVNldHRpbmcuU3RvcmFnZVNldHRpbmcuUzNDb25maWcahgEKCFMzQ29uZmlnEhUKDWFjY2Vzc19rZXlfaWQYASABKAkSGQoRYWNjZXNzX2tleV9zZWNyZXQYAiABKAkSEAoIZW5kcG9pbnQYAyABKAkSDgoGcmVnaW9uGAQgASgJEg4KBmJ1Y2tldBgFIAEoCRIWCg51c2VfcGF0aF9zdHlsZRgGIAEoCCJMCgtTdG9yYWdlVHlwZRIcChhTVE9SQUdFX1RZUEVfVU5TUEVDSUZJRUQQABIMCghEQVRBQkFTRRABEgkKBUxPQ0FMEAISBgoCUzMQAxriAQoSTWVtb1JlbGF0ZWRTZXR0aW5nEiIKGmRpc2FsbG93X3B1YmxpY192aXNpYmlsaXR5GAEgASgIEiAKGGRpc3BsYXlfd2l0aF91cGRhdGVfdGltZRgCIAEoCBIcChRjb250ZW50X2xlbmd0aF9saW1pdBgDIAEoBRIgChhlbmFibGVfZG91YmxlX2NsaWNrX2VkaXQYBCABKAgSEQoJcmVhY3Rpb25zGAcgAygJEiAKGGVuYWJsZV9ibHVyX25zZndfY29udGVudBgJIAEoCBIRCgluc2Z3X3RhZ3MYCiADKAkiRgoDS2V5EhMKD0tFWV9VTlNQRUNJRklFRBAAEgsKB0dFTkVSQUwQARILCgdTVE9SQUdFEAISEAoMTUVNT19SRUxBVEVEEAM6YepBXgocbWVtb3MuYXBpLnYxL0luc3RhbmNlU2V0dGluZxIbaW5zdGFuY2Uvc2V0dGluZ3Mve3NldHRpbmd9KhBpbnN0YW5jZVNldHRpbmdzMg9pbnN0YW5jZVNldHRpbmdCBwoFdmFsdWUiTwoZR2V0SW5zdGFuY2VTZXR0aW5nUmVxdWVzdBIyCgRuYW1lGAEgASgJQiTgQQL6QR4KHG1lbW9zLmFwaS52MS9JbnN0YW5jZVNldHRpbmciiQEKHFVwZGF0ZUluc3RhbmNlU2V0dGluZ1JlcXVlc3QSMwoHc2V0dGluZxgBIAEoCzIdLm1lbW9zLmFwaS52MS5JbnN0YW5jZVNldHRpbmdCA+BBAhI0Cgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBATLbAwoPSW5zdGFuY2VTZXJ2aWNlEn4KEkdldEluc3RhbmNlUHJvZmlsZRInLm1lbW9zLmFwaS52MS5HZXRJbnN0YW5jZVByb2ZpbGVSZXF1ZXN0Gh0ubWVtb3MuYXBpLnYxLkluc3RhbmNlUHJvZmlsZSIggtPkkwIaEhgvYXBpL3YxL2luc3RhbmNlL3Byb2ZpbGUSjwEKEkdldEluc3RhbmNlU2V0dGluZxInLm1lbW9zLmFwaS52MS5HZXRJbnN0YW5jZVNldHRpbmdSZXF1ZXN0Gh0ubWVtb3MuYXBpLnYxLkluc3RhbmNlU2V0dGluZyIx2kEEbmFtZYLT5JMCJBIiL2FwaS92MS97bmFtZT1pbnN0YW5jZS9zZXR0aW5ncy8qfRK1AQoVVXBkYXRlSW5zdGFuY2VTZXR0aW5nEioubWVtb3MuYXBpLnYxLlVwZGF0ZUluc3RhbmNlU2V0dGluZ1JlcXVlc3QaHS5tZW1vcy5hcGkudjEuSW5zdGFuY2VTZXR0aW5nIlHaQRNzZXR0aW5nLHVwZGF0ZV9tYXNrgtPkkwI1OgdzZXR0aW5nMiovYXBpL3YxL3tzZXR0aW5nLm5hbWU9aW5zdGFuY2Uvc2V0dGluZ3MvKn1CrAEKEGNvbS5tZW1vcy5hcGkudjFCFEluc3RhbmNlU2VydmljZVByb3RvUAFaMGdpdGh1Yi5jb20vdXNlbWVtb3MvbWVtb3MvcHJvdG8vZ2VuL2FwaS92MTthcGl2MaICA01BWKoCDE1lbW9zLkFwaS5WMcoCDE1lbW9zXEFwaVxWMeICGE1lbW9zXEFwaVxWMVxHUEJNZXRhZGF0YeoCDk1lbW9zOjpBcGk6OlYxYgZwcm90bzM", [file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_field_mask]);
|
||||
|
||||
/**
|
||||
* Instance profile message containing basic instance information.
|
||||
|
|
@ -184,6 +184,20 @@ export type InstanceSetting_GeneralSetting = Message<"memos.api.v1.InstanceSetti
|
|||
* @generated from field: bool disallow_change_nickname = 9;
|
||||
*/
|
||||
disallowChangeNickname: boolean;
|
||||
|
||||
/**
|
||||
* enable_explore_auto_refresh enables auto-refresh on Explore page. Default: true.
|
||||
*
|
||||
* @generated from field: bool enable_explore_auto_refresh = 10;
|
||||
*/
|
||||
enableExploreAutoRefresh: boolean;
|
||||
|
||||
/**
|
||||
* min_auto_refresh_interval is the minimum auto-refresh interval in seconds. Default: 1.
|
||||
*
|
||||
* @generated from field: int32 min_auto_refresh_interval = 11;
|
||||
*/
|
||||
minAutoRefreshInterval: number;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue