diff options
-rw-r--r-- | server/migrations/2019-10-21-011237_add_default_sorts/down.sql | 2 | ||||
-rw-r--r-- | server/migrations/2019-10-21-011237_add_default_sorts/up.sql | 2 | ||||
-rw-r--r-- | server/src/api/post.rs | 2 | ||||
-rw-r--r-- | server/src/api/site.rs | 6 | ||||
-rw-r--r-- | server/src/api/user.rs | 16 | ||||
-rw-r--r-- | server/src/apub.rs | 3 | ||||
-rw-r--r-- | server/src/db/comment.rs | 2 | ||||
-rw-r--r-- | server/src/db/comment_view.rs | 2 | ||||
-rw-r--r-- | server/src/db/community.rs | 2 | ||||
-rw-r--r-- | server/src/db/mod.rs | 7 | ||||
-rw-r--r-- | server/src/db/moderator.rs | 4 | ||||
-rw-r--r-- | server/src/db/post.rs | 2 | ||||
-rw-r--r-- | server/src/db/post_view.rs | 17 | ||||
-rw-r--r-- | server/src/db/user.rs | 12 | ||||
-rw-r--r-- | server/src/db/user_mention.rs | 4 | ||||
-rw-r--r-- | server/src/schema.rs | 2 | ||||
-rw-r--r-- | server/src/websocket/server.rs | 2 | ||||
-rw-r--r-- | ui/src/components/community.tsx | 4 | ||||
-rw-r--r-- | ui/src/components/listing-type-select.tsx | 68 | ||||
-rw-r--r-- | ui/src/components/main.tsx | 53 | ||||
-rw-r--r-- | ui/src/components/user.tsx | 64 | ||||
-rw-r--r-- | ui/src/interfaces.ts | 4 |
22 files changed, 220 insertions, 60 deletions
diff --git a/server/migrations/2019-10-21-011237_add_default_sorts/down.sql b/server/migrations/2019-10-21-011237_add_default_sorts/down.sql new file mode 100644 index 00000000..238c9e79 --- /dev/null +++ b/server/migrations/2019-10-21-011237_add_default_sorts/down.sql @@ -0,0 +1,2 @@ +alter table user_ drop column default_sort_type; +alter table user_ drop column default_listing_type; diff --git a/server/migrations/2019-10-21-011237_add_default_sorts/up.sql b/server/migrations/2019-10-21-011237_add_default_sorts/up.sql new file mode 100644 index 00000000..4bb96009 --- /dev/null +++ b/server/migrations/2019-10-21-011237_add_default_sorts/up.sql @@ -0,0 +1,2 @@ +alter table user_ add column default_sort_type smallint default 0 not null; +alter table user_ add column default_listing_type smallint default 1 not null; diff --git a/server/src/api/post.rs b/server/src/api/post.rs index d53d2064..5df42990 100644 --- a/server/src/api/post.rs +++ b/server/src/api/post.rs @@ -235,7 +235,7 @@ impl Perform<GetPostsResponse> for Oper<GetPosts> { None => false, }; - let type_ = PostListingType::from_str(&data.type_)?; + let type_ = ListingType::from_str(&data.type_)?; let sort = SortType::from_str(&data.sort)?; let posts = match PostView::list( diff --git a/server/src/api/site.rs b/server/src/api/site.rs index 40b1592d..618295fc 100644 --- a/server/src/api/site.rs +++ b/server/src/api/site.rs @@ -321,7 +321,7 @@ impl Perform<SearchResponse> for Oper<Search> { SearchType::Posts => { posts = PostView::list( &conn, - PostListingType::All, + ListingType::All, &sort, data.community_id, None, @@ -365,7 +365,7 @@ impl Perform<SearchResponse> for Oper<Search> { SearchType::All => { posts = PostView::list( &conn, - PostListingType::All, + ListingType::All, &sort, data.community_id, None, @@ -403,7 +403,7 @@ impl Perform<SearchResponse> for Oper<Search> { SearchType::Url => { posts = PostView::list( &conn, - PostListingType::All, + ListingType::All, &sort, data.community_id, None, diff --git a/server/src/api/user.rs b/server/src/api/user.rs index 563ae0a2..5ac2b432 100644 --- a/server/src/api/user.rs +++ b/server/src/api/user.rs @@ -22,6 +22,8 @@ pub struct Register { pub struct SaveUserSettings { show_nsfw: bool, theme: String, + default_sort_type: i16, + default_listing_type: i16, auth: String, } @@ -198,6 +200,8 @@ impl Perform<LoginResponse> for Oper<Register> { banned: false, show_nsfw: data.show_nsfw, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; // Create the user @@ -289,6 +293,8 @@ impl Perform<LoginResponse> for Oper<SaveUserSettings> { banned: read_user.banned, show_nsfw: data.show_nsfw, theme: data.theme.to_owned(), + default_sort_type: data.default_sort_type, + default_listing_type: data.default_listing_type, }; let updated_user = match User_::update(&conn, user_id, &user_form) { @@ -346,7 +352,7 @@ impl Perform<GetUserDetailsResponse> for Oper<GetUserDetails> { let posts = if data.saved_only { PostView::list( &conn, - PostListingType::All, + ListingType::All, &sort, data.community_id, None, @@ -362,7 +368,7 @@ impl Perform<GetUserDetailsResponse> for Oper<GetUserDetails> { } else { PostView::list( &conn, - PostListingType::All, + ListingType::All, &sort, data.community_id, Some(user_details_id), @@ -453,6 +459,8 @@ impl Perform<AddAdminResponse> for Oper<AddAdmin> { banned: read_user.banned, show_nsfw: read_user.show_nsfw, theme: read_user.theme, + default_sort_type: read_user.default_sort_type, + default_listing_type: read_user.default_listing_type, }; match User_::update(&conn, data.user_id, &user_form) { @@ -512,6 +520,8 @@ impl Perform<BanUserResponse> for Oper<BanUser> { banned: data.ban, show_nsfw: read_user.show_nsfw, theme: read_user.theme, + default_sort_type: read_user.default_sort_type, + default_listing_type: read_user.default_listing_type, }; match User_::update(&conn, data.user_id, &user_form) { @@ -751,7 +761,7 @@ impl Perform<LoginResponse> for Oper<DeleteAccount> { // Posts let posts = PostView::list( &conn, - PostListingType::All, + ListingType::All, &SortType::New, None, Some(user_id), diff --git a/server/src/apub.rs b/server/src/apub.rs index 958a8df1..3c7202b2 100644 --- a/server/src/apub.rs +++ b/server/src/apub.rs @@ -55,6 +55,7 @@ impl User_ { #[cfg(test)] mod tests { use super::User_; + use crate::db::{ListingType, SortType}; use crate::naive_now; #[test] @@ -73,6 +74,8 @@ mod tests { updated: None, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let person = expected_user.person(); diff --git a/server/src/db/comment.rs b/server/src/db/comment.rs index 32aa4de9..64532b83 100644 --- a/server/src/db/comment.rs +++ b/server/src/db/comment.rs @@ -179,6 +179,8 @@ mod tests { updated: None, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let inserted_user = User_::create(&conn, &new_user).unwrap(); diff --git a/server/src/db/comment_view.rs b/server/src/db/comment_view.rs index 88190464..9f754473 100644 --- a/server/src/db/comment_view.rs +++ b/server/src/db/comment_view.rs @@ -264,6 +264,8 @@ mod tests { updated: None, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let inserted_user = User_::create(&conn, &new_user).unwrap(); diff --git a/server/src/db/community.rs b/server/src/db/community.rs index 53c238bd..bfc6089b 100644 --- a/server/src/db/community.rs +++ b/server/src/db/community.rs @@ -265,6 +265,8 @@ mod tests { updated: None, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let inserted_user = User_::create(&conn, &new_user).unwrap(); diff --git a/server/src/db/mod.rs b/server/src/db/mod.rs index ac3c3ae3..2045692d 100644 --- a/server/src/db/mod.rs +++ b/server/src/db/mod.rs @@ -107,6 +107,13 @@ pub enum SortType { } #[derive(EnumString, ToString, Debug, Serialize, Deserialize)] +pub enum ListingType { + All, + Subscribed, + Community, +} + +#[derive(EnumString, ToString, Debug, Serialize, Deserialize)] pub enum SearchType { All, Comments, diff --git a/server/src/db/moderator.rs b/server/src/db/moderator.rs index 82e0a497..b04c6c62 100644 --- a/server/src/db/moderator.rs +++ b/server/src/db/moderator.rs @@ -447,6 +447,8 @@ mod tests { updated: None, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let inserted_mod = User_::create(&conn, &new_mod).unwrap(); @@ -462,6 +464,8 @@ mod tests { updated: None, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let inserted_user = User_::create(&conn, &new_user).unwrap(); diff --git a/server/src/db/post.rs b/server/src/db/post.rs index 1bc6e11e..f185bd75 100644 --- a/server/src/db/post.rs +++ b/server/src/db/post.rs @@ -192,6 +192,8 @@ mod tests { updated: None, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let inserted_user = User_::create(&conn, &new_user).unwrap(); diff --git a/server/src/db/post_view.rs b/server/src/db/post_view.rs index 1180a770..51dea027 100644 --- a/server/src/db/post_view.rs +++ b/server/src/db/post_view.rs @@ -1,12 +1,5 @@ use super::*; -#[derive(EnumString, ToString, Debug, Serialize, Deserialize)] -pub enum PostListingType { - All, - Subscribed, - Community, -} - // The faked schema since diesel doesn't do views table! { post_view (id) { @@ -83,7 +76,7 @@ pub struct PostView { impl PostView { pub fn list( conn: &PgConnection, - type_: PostListingType, + type_: ListingType, sort: &SortType, for_community_id: Option<i32>, for_creator_id: Option<i32>, @@ -129,7 +122,7 @@ impl PostView { }; match type_ { - PostListingType::Subscribed => { + ListingType::Subscribed => { query = query.filter(subscribed.eq(true)); } _ => {} @@ -226,6 +219,8 @@ mod tests { banned: false, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let inserted_user = User_::create(&conn, &new_user).unwrap(); @@ -351,7 +346,7 @@ mod tests { let read_post_listings_with_user = PostView::list( &conn, - PostListingType::Community, + ListingType::Community, &SortType::New, Some(inserted_community.id), None, @@ -367,7 +362,7 @@ mod tests { .unwrap(); let read_post_listings_no_user = PostView::list( &conn, - PostListingType::Community, + ListingType::Community, &SortType::New, Some(inserted_community.id), None, diff --git a/server/src/db/user.rs b/server/src/db/user.rs index a37e19c4..a378d3c2 100644 --- a/server/src/db/user.rs +++ b/server/src/db/user.rs @@ -21,6 +21,8 @@ pub struct User_ { pub updated: Option<chrono::NaiveDateTime>, pub show_nsfw: bool, pub theme: String, + pub default_sort_type: i16, + pub default_listing_type: i16, } #[derive(Insertable, AsChangeset, Clone)] @@ -36,6 +38,8 @@ pub struct UserForm { pub updated: Option<chrono::NaiveDateTime>, pub show_nsfw: bool, pub theme: String, + pub default_sort_type: i16, + pub default_listing_type: i16, } impl Crud<UserForm> for User_ { @@ -77,6 +81,8 @@ pub struct Claims { pub iss: String, pub show_nsfw: bool, pub theme: String, + pub default_sort_type: i16, + pub default_listing_type: i16, } impl Claims { @@ -98,6 +104,8 @@ impl User_ { iss: self.fedi_name.to_owned(), show_nsfw: self.show_nsfw, theme: self.theme.to_owned(), + default_sort_type: self.default_sort_type, + default_listing_type: self.default_listing_type, }; encode( &Header::default(), @@ -146,6 +154,8 @@ mod tests { updated: None, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let inserted_user = User_::create(&conn, &new_user).unwrap(); @@ -164,6 +174,8 @@ mod tests { updated: None, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let read_user = User_::read(&conn, inserted_user.id).unwrap(); diff --git a/server/src/db/user_mention.rs b/server/src/db/user_mention.rs index d4dc0a51..668d28fc 100644 --- a/server/src/db/user_mention.rs +++ b/server/src/db/user_mention.rs @@ -73,6 +73,8 @@ mod tests { updated: None, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let inserted_user = User_::create(&conn, &new_user).unwrap(); @@ -88,6 +90,8 @@ mod tests { updated: None, show_nsfw: false, theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, }; let inserted_recipient = User_::create(&conn, &recipient_form).unwrap(); diff --git a/server/src/schema.rs b/server/src/schema.rs index 9111c8e3..e087e20e 100644 --- a/server/src/schema.rs +++ b/server/src/schema.rs @@ -255,6 +255,8 @@ table! { updated -> Nullable<Timestamp>, show_nsfw -> Bool, theme -> Varchar, + default_sort_type -> Int2, + default_listing_type -> Int2, } } diff --git a/server/src/websocket/server.rs b/server/src/websocket/server.rs index aeca8c0c..19274219 100644 --- a/server/src/websocket/server.rs +++ b/server/src/websocket/server.rs @@ -136,7 +136,7 @@ impl ChatServer { let conn = establish_connection(); let posts = PostView::list( &conn, - PostListingType::Community, + ListingType::Community, &SortType::New, Some(*community_id), None, diff --git a/ui/src/components/community.tsx b/ui/src/components/community.tsx index efeaa1b3..8f36178c 100644 --- a/ui/src/components/community.tsx +++ b/ui/src/components/community.tsx @@ -15,7 +15,7 @@ import { GetPostsResponse, CreatePostLikeResponse, } from '../interfaces'; -import { WebSocketService } from '../services'; +import { WebSocketService, UserService } from '../services'; import { PostListings } from './post-listings'; import { SortSelect } from './sort-select'; import { Sidebar } from './sidebar'; @@ -72,6 +72,8 @@ export class Community extends Component<any, State> { getSortTypeFromProps(props: any): SortType { return props.match.params.sort ? routeSortTypeToEnum(props.match.params.sort) + : UserService.Instance.user + ? UserService.Instance.user.default_sort_type : SortType.Hot; } diff --git a/ui/src/components/listing-type-select.tsx b/ui/src/components/listing-type-select.tsx new file mode 100644 index 00000000..d583b93c --- /dev/null +++ b/ui/src/components/listing-type-select.tsx @@ -0,0 +1,68 @@ +import { Component, linkEvent } from 'inferno'; +import { ListingType } from '../interfaces'; +import { UserService } from '../services'; + +import { i18n } from '../i18next'; + +interface ListingTypeSelectProps { + type_: ListingType; + onChange?(val: ListingType): any; +} + +interface ListingTypeSelectState { + type_: ListingType; +} + +export class ListingTypeSelect extends Component< + ListingTypeSelectProps, + ListingTypeSelectState +> { + private emptyState: ListingTypeSelectState = { + type_: this.props.type_, + }; + + constructor(props: any, context: any) { + super(props, context); + this.state = this.emptyState; + } + + render() { + return ( + <div class="btn-group btn-group-toggle"> + <label + className={`btn btn-sm btn-secondary + ${this.state.type_ == ListingType.Subscribed && 'active'} + ${UserService.Instance.user == undefined ? 'disabled' : 'pointer'} + `} + > + <input + type="radio" + value={ListingType.Subscribed} + checked={this.state.type_ == ListingType.Subscribed} + onChange={linkEvent(this, this.handleTypeChange)} + disabled={UserService.Instance.user == undefined} + /> + {i18n.t('subscribed')} + </label> + <label + className={`pointer btn btn-sm btn-secondary ${this.state.type_ == + ListingType.All && 'active'}`} + > + <input + type="radio" + value={ListingType.All} + checked={this.state.type_ == ListingType.All} + onChange={linkEvent(this, this.handleTypeChange)} + /> + {i18n.t('all')} + </label> + </div> + ); + } + + handleTypeChange(i: ListingTypeSelect, event: any) { + i.state.type_ = Number(event.target.value); + i.setState(i.state); + i.props.onChange(i.state.type_); + } +} diff --git a/ui/src/components/main.tsx b/ui/src/components/main.tsx index e4ff5a50..c871db72 100644 --- a/ui/src/components/main.tsx +++ b/ui/src/components/main.tsx @@ -21,6 +21,7 @@ import { import { WebSocketService, UserService } from '../services'; import { PostListings } from './post-listings'; import { SortSelect } from './sort-select'; +import { ListingTypeSelect } from './listing-type-select'; import { SiteForm } from './site-form'; import { msgOp, @@ -81,13 +82,15 @@ export class Main extends Component<any, MainState> { return props.match.params.type ? routeListingTypeToEnum(props.match.params.type) : UserService.Instance.user - ? ListingType.Subscribed + ? UserService.Instance.user.default_listing_type : ListingType.All; } getSortTypeFromProps(props: any): SortType { return props.match.params.sort ? routeSortTypeToEnum(props.match.params.sort) + : UserService.Instance.user + ? UserService.Instance.user.default_sort_type : SortType.Hot; } @@ -101,6 +104,7 @@ export class Main extends Component<any, MainState> { this.state = this.emptyState; this.handleEditCancel = this.handleEditCancel.bind(this); this.handleSortChange = this.handleSortChange.bind(this); + this.handleTypeChange = this.handleTypeChange.bind(this); this.subscription = WebSocketService.Instance.subject .pipe( @@ -423,35 +427,10 @@ export class Main extends Component<any, MainState> { selects() { return ( <div className="mb-3"> - <div class="btn-group btn-group-toggle"> - <label - className={`btn btn-sm btn-secondary - ${this.state.type_ == ListingType.Subscribed && 'active'} - ${UserService.Instance.user == undefined ? 'disabled' : 'pointer'} - `} - > - <input - type="radio" - value={ListingType.Subscribed} - checked={this.state.type_ == ListingType.Subscribed} - onChange={linkEvent(this, this.handleTypeChange)} - disabled={UserService.Instance.user == undefined} - /> - {i18n.t('subscribed')} - </label> - <label - className={`pointer btn btn-sm btn-secondary ${this.state.type_ == - ListingType.All && 'active'}`} - > - <input - type="radio" - value={ListingType.All} - checked={this.state.type_ == ListingType.All} - onChange={linkEvent(this, this.handleTypeChange)} - /> - {i18n.t('all')} - </label> - </div> + <ListingTypeSelect + type_={this.state.type_} + onChange={this.handleTypeChange} + /> <span class="ml-2"> <SortSelect sort={this.state.sort} onChange={this.handleSortChange} /> </span> @@ -527,13 +506,13 @@ export class Main extends Component<any, MainState> { window.scrollTo(0, 0); } - handleTypeChange(i: Main, event: any) { - i.state.type_ = Number(event.target.value); - i.state.page = 1; - i.state.loading = true; - i.setState(i.state); - i.updateUrl(); - i.fetchPosts(); + handleTypeChange(val: ListingType) { + this.state.type_ = val; + this.state.page = 1; + this.state.loading = true; + this.setState(this.state); + this.updateUrl(); + this.fetchPosts(); window.scrollTo(0, 0); } diff --git a/ui/src/components/user.tsx b/ui/src/components/user.tsx index 671997b9..3006afc4 100644 --- a/ui/src/components/user.tsx +++ b/ui/src/components/user.tsx @@ -9,6 +9,7 @@ import { CommunityUser, GetUserDetailsForm, SortType, + ListingType, UserDetailsResponse, UserView, CommentResponse, @@ -29,6 +30,7 @@ import { } from '../utils'; import { PostListing } from './post-listing'; import { SortSelect } from './sort-select'; +import { ListingTypeSelect } from './listing-type-select'; import { CommentNodes } from './comment-nodes'; import { MomentTime } from './moment-time'; import { i18n } from '../i18next'; @@ -90,6 +92,8 @@ export class User extends Component<any, UserState> { userSettingsForm: { show_nsfw: null, theme: null, + default_sort_type: null, + default_listing_type: null, auth: null, }, userSettingsLoading: null, @@ -105,6 +109,12 @@ export class User extends Component<any, UserState> { this.state = this.emptyState; this.handleSortChange = this.handleSortChange.bind(this); + this.handleUserSettingsSortTypeChange = this.handleUserSettingsSortTypeChange.bind( + this + ); + this.handleUserSettingsListingTypeChange = this.handleUserSettingsListingTypeChange.bind( + this + ); this.state.user_id = Number(this.props.match.params.id); this.state.username = this.props.match.params.username; @@ -403,6 +413,32 @@ export class User extends Component<any, UserState> { </select> </div> </div> + <form className="form-group"> + <div class="col-12"> + <label> + <T i18nKey="sort_type" class="mr-2"> + # + </T> + </label> + <ListingTypeSelect + type_={this.state.userSettingsForm.default_listing_type} + onChange={this.handleUserSettingsListingTypeChange} + /> + </div> + </form> + <form className="form-group"> + <div class="col-12"> + <label> + <T i18nKey="type" class="mr-2"> + # + </T> + </label> + <SortSelect + sort={this.state.userSettingsForm.default_sort_type} + onChange={this.handleUserSettingsSortTypeChange} + /> + </div> + </form> <div class="form-group"> <div class="col-12"> <div class="form-check"> @@ -421,9 +457,12 @@ export class User extends Component<any, UserState> { </div> </div> </div> - <div class="form-group row mb-0"> + <div class="form-group"> <div class="col-12"> - <button type="submit" class="btn btn-secondary mr-4"> + <button + type="submit" + class="btn btn-block btn-secondary mr-4" + > {this.state.userSettingsLoading ? ( <svg class="icon icon-spinner spin"> <use xlinkHref="#icon-spinner"></use> @@ -432,8 +471,13 @@ export class User extends Component<any, UserState> { capitalizeFirstLetter(i18n.t('save')) )} </button> + </div> + </div> + <hr /> + <div class="form-group mb-0"> + <div class="col-12"> <button - class="btn btn-danger" + class="btn btn-block btn-danger" onClick={linkEvent( this, this.handleDeleteAccountShowConfirmToggle @@ -620,6 +664,16 @@ export class User extends Component<any, UserState> { i.setState(i.state); } + handleUserSettingsSortTypeChange(val: SortType) { + this.state.userSettingsForm.default_sort_type = val; + this.setState(this.state); + } + + handleUserSettingsListingTypeChange(val: ListingType) { + this.state.userSettingsForm.default_listing_type = val; + this.setState(this.state); + } + handleUserSettingsSubmit(i: User, event: any) { event.preventDefault(); i.state.userSettingsLoading = true; @@ -670,6 +724,10 @@ export class User extends Component<any, UserState> { this.state.userSettingsForm.theme = UserService.Instance.user.theme ? UserService.Instance.user.theme : 'darkly'; + this.state.userSettingsForm.default_sort_type = + UserService.Instance.user.default_sort_type; + this.state.userSettingsForm.default_listing_type = + UserService.Instance.user.default_listing_type; } document.title = `/u/${this.state.user.name} - ${WebSocketService.Instance.site.name}`; window.scrollTo(0, 0); diff --git a/ui/src/interfaces.ts b/ui/src/interfaces.ts index 4056e05d..2f75efd9 100644 --- a/ui/src/interfaces.ts +++ b/ui/src/interfaces.ts @@ -75,6 +75,8 @@ export interface User { username: string; show_nsfw: boolean; theme: string; + default_sort_type: SortType; + default_listing_type: ListingType; } export interface UserView { @@ -463,6 +465,8 @@ export interface LoginResponse { export interface UserSettingsForm { show_nsfw: boolean; theme: string; + default_sort_type: SortType; + default_listing_type: ListingType; auth: string; } |