forked from nutomic/lemmy
Merge branch 'dev' into richardj-feature/frontend-a11y
This commit is contained in:
commit
e09e3b6a92
17 changed files with 1061 additions and 90 deletions
2
README.md
vendored
2
README.md
vendored
|
@ -175,7 +175,7 @@ es | 100% | old
|
|||
fi | 100% | old
|
||||
fr | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
||||
it | 84% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
||||
nl | 92% | create_private_message,send_secure_message,send_message,message,old,message_sent,messages,matrix_user_id,private_message_disclaimer,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
||||
nl | 100% |
|
||||
ru | 72% | cross_posts,cross_post,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
||||
sv | 83% | create_private_message,send_secure_message,send_message,message,avatar,upload_avatar,show_avatars,archive_link,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,donate_to_lemmy,donate,from,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
||||
zh | 70% | cross_posts,cross_post,users,number_of_communities,create_private_message,send_secure_message,send_message,message,preview,upload_image,avatar,upload_avatar,show_avatars,formatting_help,view_source,sticky,unsticky,archive_link,settings,stickied,delete_account,delete_account_confirm,banned,creator,number_online,old,docs,replies,mentions,message_sent,messages,old_password,forgot_password,reset_password_mail_sent,password_change,new_password,no_email_setup,matrix_user_id,private_message_disclaimer,send_notifications_to_email,language,browser_default,downvotes_disabled,enable_downvotes,open_registration,registration_closed,enable_nsfw,recent_comments,nsfw,show_nsfw,theme,donate_to_lemmy,donate,monero,by,to,from,transfer_community,transfer_site,are_you_sure,yes,no,logged_in,email_already_exists,couldnt_create_private_message,no_private_message_edit_allowed,couldnt_update_private_message
|
||||
|
|
2
ansible/templates/docker-compose.yml
vendored
2
ansible/templates/docker-compose.yml
vendored
|
@ -2,7 +2,7 @@ version: '3.3'
|
|||
|
||||
services:
|
||||
lemmy:
|
||||
image: dessalines/lemmy:v0.6.5
|
||||
image: dessalines/lemmy:v0.6.8
|
||||
ports:
|
||||
- "127.0.0.1:8536:8536"
|
||||
restart: always
|
||||
|
|
2
docker/prod/docker-compose.yml
vendored
2
docker/prod/docker-compose.yml
vendored
|
@ -11,7 +11,7 @@ services:
|
|||
- lemmy_db:/var/lib/postgresql/data
|
||||
restart: always
|
||||
lemmy:
|
||||
image: dessalines/lemmy:v0.6.7
|
||||
image: dessalines/lemmy:v0.6.8
|
||||
ports:
|
||||
- "127.0.0.1:8536:8536"
|
||||
restart: always
|
||||
|
|
2
server/migrations/2020-02-02-004806_add_case_insensitive_usernames/down.sql
vendored
Normal file
2
server/migrations/2020-02-02-004806_add_case_insensitive_usernames/down.sql
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
drop index idx_user_name_lower;
|
||||
drop index idx_user_email_lower;
|
29
server/migrations/2020-02-02-004806_add_case_insensitive_usernames/up.sql
vendored
Normal file
29
server/migrations/2020-02-02-004806_add_case_insensitive_usernames/up.sql
vendored
Normal file
|
@ -0,0 +1,29 @@
|
|||
-- Add case insensitive username and email uniqueness
|
||||
|
||||
-- An example of showing the dupes:
|
||||
-- select
|
||||
-- max(id) as id,
|
||||
-- lower(name) as lname,
|
||||
-- count(*)
|
||||
-- from user_
|
||||
-- group by lower(name)
|
||||
-- having count(*) > 1;
|
||||
|
||||
-- Delete username dupes, keeping the first one
|
||||
delete
|
||||
from user_
|
||||
where id not in (
|
||||
select min(id)
|
||||
from user_
|
||||
group by lower(name), lower(fedi_name)
|
||||
);
|
||||
|
||||
-- The user index
|
||||
create unique index idx_user_name_lower on user_ (lower(name));
|
||||
|
||||
-- Email lower
|
||||
create unique index idx_user_email_lower on user_ (lower(email));
|
||||
|
||||
-- Set empty emails properly to null
|
||||
update user_ set email = null where email = '';
|
||||
|
|
@ -1 +1 @@
|
|||
pub const VERSION: &str = "v0.6.7";
|
||||
pub const VERSION: &str = "v0.6.8";
|
||||
|
|
902
ui/assets/css/themes/_variables.bootstra_386-tmp.scss
vendored
Normal file
902
ui/assets/css/themes/_variables.bootstra_386-tmp.scss
vendored
Normal file
|
@ -0,0 +1,902 @@
|
|||
//
|
||||
// Variables
|
||||
// --------------------------------------------------
|
||||
|
||||
|
||||
//== Colors
|
||||
//
|
||||
//## Gray and brand colors for use across Bootstrap.
|
||||
|
||||
//// colors from bs-2
|
||||
// Grays
|
||||
// -------------------------
|
||||
$black: #000;
|
||||
$grayDark: #555;
|
||||
$gray: #bbb;
|
||||
$grayLight: #bbb;
|
||||
$white: #FFF;
|
||||
|
||||
|
||||
// Accent colors
|
||||
// -------------------------
|
||||
$blue: #5555Ff;
|
||||
$cyan: #55FFFF;
|
||||
$cyanDark: #00AAAA;
|
||||
$blueDark: #000084;
|
||||
$green: #55FF55;
|
||||
$greenDark: #00AA00;
|
||||
$magenta: #FF55FF;
|
||||
$magentaDark: #AA00AA;
|
||||
$red: #FF5555;
|
||||
$redDark: #AA0000;
|
||||
$yellow: #FEFE54;
|
||||
$brown: #AA5500;
|
||||
$orange: #A85400;
|
||||
$pink: #FE54FE;
|
||||
$purple: #FE5454;
|
||||
|
||||
// end colors
|
||||
|
||||
$gray-base: $gray;
|
||||
$gray-darker: $grayDark;
|
||||
$gray-dark: $grayDark;
|
||||
$gray-light: $grayLight;
|
||||
$gray-lighter: $grayLight;
|
||||
|
||||
$brand-primary: $gray;
|
||||
$brand-primary-bg: $cyanDark;
|
||||
$brand-success: $greenDark;
|
||||
$brand-info: $brown;
|
||||
$brand-warning: $magentaDark;
|
||||
$brand-danger: $redDark;
|
||||
|
||||
|
||||
//== Scaffolding
|
||||
//
|
||||
//## Settings for some of the most global styles.
|
||||
|
||||
//** Background color for `<body>`.
|
||||
$body-bg: $blueDark;
|
||||
//** Global text color on `<body>`.
|
||||
$text-color: $gray-light;
|
||||
|
||||
//** Global textual link color.
|
||||
$link-color: $brand-primary;
|
||||
//** Link hover color set via `darken()` function.
|
||||
$link-hover-color: $white;
|
||||
//** Link hover decoration.
|
||||
$link-hover-decoration: none;
|
||||
|
||||
|
||||
//== Typography
|
||||
//
|
||||
//## Font, line-height, and color for body text, headings, and more.
|
||||
|
||||
$font-family-sans-serif: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
|
||||
$font-family-serif: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
|
||||
//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
|
||||
$font-family-monospace: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
|
||||
$font-family-base: $font-family-sans-serif;
|
||||
|
||||
$baseWidth: 10px;
|
||||
$font-size-base: 18px;
|
||||
$font-size-large: $font-size-base;
|
||||
$font-size-small: $font-size-base;
|
||||
|
||||
$font-size-h1: $font-size-base;
|
||||
$font-size-h2: $font-size-base;
|
||||
$font-size-h3: $font-size-base;
|
||||
$font-size-h4: $font-size-base;
|
||||
$font-size-h5: $font-size-base;
|
||||
$font-size-h6: $font-size-base;
|
||||
|
||||
//** Unit-less `line-height` for use in components like buttons.
|
||||
$baseLineHeight: 19px;
|
||||
$line-height-base: $baseLineHeight;
|
||||
//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
|
||||
$line-height-computed: $line-height-base;
|
||||
|
||||
//** By default, this inherits from the `<body>`.
|
||||
$headings-font-family: inherit;
|
||||
$headings-font-weight: normal;
|
||||
$headings-line-height: $line-height-base;
|
||||
$headings-color: inherit;
|
||||
|
||||
$space: $baseWidth;
|
||||
$halfbaseLineHeight: ($baseLineHeight / 2);
|
||||
$borderWidth: 2px;
|
||||
$baseLineWidth: ($baseLineHeight / 2);
|
||||
$halfSpace: ($baseWidth / 2);
|
||||
$lhsNB: ($baseWidth / 2 + 1);
|
||||
$rhsNB: ($baseWidth / 2 - 1);
|
||||
$lhs: ($lhsNB - ($borderWidth));
|
||||
$rhs: ($rhsNB - ($borderWidth / 2));
|
||||
$tsNB: ($baseLineHeight / 2);
|
||||
$bsNB: $tsNB;
|
||||
$ts: ($tsNB - ($borderWidth / 2));
|
||||
$bs: $ts;
|
||||
$tsMargin: 3px;
|
||||
|
||||
|
||||
//== Iconography
|
||||
//
|
||||
//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
|
||||
|
||||
//** Load fonts from this directory.
|
||||
$icon-font-path: "../fonts/";
|
||||
//** File name for all font files.
|
||||
$icon-font-name: "glyphicons-halflings-regular";
|
||||
//** Element ID within SVG icon file.
|
||||
$icon-font-svg-id: "glyphicons_halflingsregular";
|
||||
|
||||
|
||||
//== Components
|
||||
//
|
||||
//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
|
||||
|
||||
$padding-base-vertical: 0px;
|
||||
$padding-base-horizontal: 0px;
|
||||
|
||||
$padding-large-vertical: 0px;
|
||||
$padding-large-horizontal: $halfSpace;
|
||||
|
||||
$padding-small-vertical: 0px;
|
||||
$padding-small-horizontal: 0px;
|
||||
|
||||
$padding-xs-vertical: 0px;
|
||||
$padding-xs-horizontal: 0px;
|
||||
|
||||
$line-height-large: $baseLineHeight;
|
||||
$line-height-small: $baseLineHeight;
|
||||
|
||||
$border-radius-base: 0;
|
||||
$border-radius-large: 0;
|
||||
$border-radius-small: 0;
|
||||
|
||||
//** Global color for active items (e.g., navs or dropdowns).
|
||||
$component-active-color: $white;
|
||||
//** Global background color for active items (e.g., navs or dropdowns).
|
||||
$component-active-bg: $black;
|
||||
|
||||
//** Width of the `border` for generating carets that indicator dropdowns.
|
||||
$caret-width-base: 4px;
|
||||
//** Carets increase slightly in size for larger components.
|
||||
$caret-width-large: 5px;
|
||||
|
||||
|
||||
//== Tables
|
||||
//
|
||||
//## Customizes the `.table` component with basic values, each used across all table variations.
|
||||
|
||||
//** Padding for `<th>`s and `<td>`s.
|
||||
$table-cell-padding: $ts $rhs $bs $lhs;
|
||||
//** Padding for cells in `.table-condensed`.
|
||||
$table-condensed-cell-padding: $ts $rhs $bs $lhs;
|
||||
|
||||
//** Default background color used for all tables.
|
||||
$table-bg: transparent;
|
||||
//** Background color used for `.table-striped`.
|
||||
$table-bg-accent: $black;
|
||||
//** Background color used for `.table-hover`.
|
||||
$table-bg-hover: #f5f5f5;
|
||||
$table-bg-active: $table-bg-hover;
|
||||
|
||||
//** Border color for table and cell borders.
|
||||
$table-border-color: $gray;
|
||||
|
||||
|
||||
//== Buttons
|
||||
//
|
||||
//## For each of Bootstrap's buttons, define text, background and border color.
|
||||
|
||||
$btn-font-weight: normal;
|
||||
|
||||
$btn-default-color: $black;
|
||||
$btn-default-bg: $grayLight;
|
||||
$btn-default-border: $grayLight;
|
||||
|
||||
$btn-primary-color: $black;
|
||||
$btn-primary-bg: $cyanDark;
|
||||
$btn-primary-border: $grayLight;
|
||||
|
||||
$btn-success-color: #fff;
|
||||
$btn-success-bg: $brand-success;
|
||||
$btn-success-border: $btn-success-bg;
|
||||
|
||||
$btn-info-color: #fff;
|
||||
$btn-info-bg: $brand-info;
|
||||
$btn-info-border: $btn-info-bg;
|
||||
|
||||
$btn-warning-color: #fff;
|
||||
$btn-warning-bg: $brand-warning;
|
||||
$btn-warning-border: $btn-warning-bg;
|
||||
|
||||
$btn-danger-color: #fff;
|
||||
$btn-danger-bg: $brand-danger;
|
||||
$btn-danger-border: $btn-danger-bg;
|
||||
|
||||
$btn-link-disabled-color: $gray-light;
|
||||
|
||||
|
||||
//== Forms
|
||||
//
|
||||
//##
|
||||
|
||||
//** `<input>` background color
|
||||
$input-bg: $cyanDark;
|
||||
//** `<input disabled>` background color
|
||||
$input-bg-disabled: $gray-lighter;
|
||||
|
||||
//** Text color for `<input>`s
|
||||
$input-color: $white;
|
||||
//** `<input>` border color
|
||||
$input-border: #ccc;
|
||||
|
||||
// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
|
||||
//** Default `.form-control` border radius
|
||||
// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.
|
||||
$input-border-radius: $border-radius-base;
|
||||
//** Large `.form-control` border radius
|
||||
$input-border-radius-large: $border-radius-large;
|
||||
//** Small `.form-control` border radius
|
||||
$input-border-radius-small: $border-radius-small;
|
||||
|
||||
//** Border color for inputs on focus
|
||||
$input-border-focus: $black;
|
||||
|
||||
//** Placeholder text color
|
||||
$input-color-placeholder: $black;
|
||||
|
||||
//** Default `.form-control` height
|
||||
$input-height-base: $line-height-computed;
|
||||
//** Large `.form-control` height
|
||||
$input-height-large: $input-height-base;
|
||||
//** Small `.form-control` height
|
||||
$input-height-small: $input-height-base;
|
||||
|
||||
$legend-color: $gray-dark;
|
||||
$legend-border-color: #e5e5e5;
|
||||
|
||||
//** Background color for textual input addons
|
||||
$input-group-addon-bg: $gray-lighter;
|
||||
//** Border color for textual input addons
|
||||
$input-group-addon-border-color: $input-border;
|
||||
|
||||
//** Disabled cursor for form controls and buttons.
|
||||
$cursor-disabled: not-allowed;
|
||||
|
||||
|
||||
//== Dropdowns
|
||||
//
|
||||
//## Dropdown menu container and contents.
|
||||
|
||||
//** Background for the dropdown menu.
|
||||
$dropdown-bg: $gray;
|
||||
//** Dropdown menu `border-color`.
|
||||
$dropdown-border: rgb(0,0,0);
|
||||
//** Dropdown menu `border-color` **for IE8**.
|
||||
$dropdown-fallback-border: #ccc;
|
||||
//** Divider color for between dropdown items.
|
||||
$dropdown-divider-bg: $black;
|
||||
|
||||
//** Dropdown link text color.
|
||||
$dropdown-link-color: $black;
|
||||
//** Hover color for dropdown links.
|
||||
$dropdown-link-hover-color: $gray;
|
||||
//** Hover background for dropdown links.
|
||||
$dropdown-link-hover-bg: $black;
|
||||
|
||||
//** Active dropdown menu item text color.
|
||||
$dropdown-link-active-color: $component-active-color;
|
||||
//** Active dropdown menu item background color.
|
||||
$dropdown-link-active-bg: $component-active-bg;
|
||||
|
||||
//** Disabled dropdown menu item background color.
|
||||
$dropdown-link-disabled-color: $gray-light;
|
||||
|
||||
//** Text color for headers within dropdown menus.
|
||||
$dropdown-header-color: $black;
|
||||
|
||||
//** Deprecated `$dropdown-caret-color` as of v3.1.0
|
||||
$dropdown-caret-color: #000;
|
||||
|
||||
|
||||
//-- Z-index master list
|
||||
//
|
||||
// Warning: Avoid customizing these values. They're used for a bird's eye view
|
||||
// of components dependent on the z-axis and are designed to all work together.
|
||||
//
|
||||
// Note: These variables are not generated into the Customizer.
|
||||
|
||||
$zindex-navbar: 1000;
|
||||
$zindex-dropdown: 1000;
|
||||
$zindex-popover: 1060;
|
||||
$zindex-tooltip: 1070;
|
||||
$zindex-navbar-fixed: 1030;
|
||||
$zindex-modal: 1040;
|
||||
|
||||
|
||||
//== Media queries breakpoints
|
||||
//
|
||||
//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
|
||||
|
||||
// Extra small screen / phone
|
||||
//** Deprecated `$screen-xs` as of v3.0.1
|
||||
$screen-xs: 480px;
|
||||
//** Deprecated `$screen-xs-min` as of v3.2.0
|
||||
$screen-xs-min: $screen-xs;
|
||||
//** Deprecated `$screen-phone` as of v3.0.1
|
||||
$screen-phone: $screen-xs-min;
|
||||
|
||||
// Small screen / tablet
|
||||
//** Deprecated `$screen-sm` as of v3.0.1
|
||||
$screen-sm: 768px;
|
||||
$screen-sm-min: $screen-sm;
|
||||
//** Deprecated `$screen-tablet` as of v3.0.1
|
||||
$screen-tablet: $screen-sm-min;
|
||||
|
||||
// Medium screen / desktop
|
||||
//** Deprecated `$screen-md` as of v3.0.1
|
||||
$screen-md: 992px;
|
||||
$screen-md-min: $screen-md;
|
||||
//** Deprecated `$screen-desktop` as of v3.0.1
|
||||
$screen-desktop: $screen-md-min;
|
||||
|
||||
// Large screen / wide desktop
|
||||
//** Deprecated `$screen-lg` as of v3.0.1
|
||||
$screen-lg: 1200px;
|
||||
$screen-lg-min: $screen-lg;
|
||||
//** Deprecated `$screen-lg-desktop` as of v3.0.1
|
||||
$screen-lg-desktop: $screen-lg-min;
|
||||
|
||||
// So media queries don't overlap when required, provide a maximum
|
||||
$screen-xs-max: ($screen-sm-min - 1);
|
||||
$screen-sm-max: ($screen-md-min - 1);
|
||||
$screen-md-max: ($screen-lg-min - 1);
|
||||
|
||||
|
||||
//== Grid system
|
||||
//
|
||||
//## Define your custom responsive grid.
|
||||
|
||||
//** Number of columns in the grid.
|
||||
$grid-columns: 12;
|
||||
//** Padding between columns. Gets divided in half for the left and right.
|
||||
$grid-gutter-width: ($baseWidth * 2);
|
||||
// Navbar collapse
|
||||
//** Point at which the navbar becomes uncollapsed.
|
||||
$grid-float-breakpoint: $screen-sm-min;
|
||||
//** Point at which the navbar begins collapsing.
|
||||
$grid-float-breakpoint-max: ($grid-float-breakpoint);
|
||||
|
||||
|
||||
//== Container sizes
|
||||
//
|
||||
//## Define the maximum width of `.container` for different screen sizes.
|
||||
|
||||
// Small screen / tablet
|
||||
$container-tablet: (720px + $grid-gutter-width);
|
||||
//** For `$screen-sm-min` and up.
|
||||
$container-sm: $container-tablet;
|
||||
|
||||
// Medium screen / desktop
|
||||
$container-desktop: (940px + $grid-gutter-width);
|
||||
//** For `$screen-md-min` and up.
|
||||
$container-md: $container-desktop;
|
||||
|
||||
// Large screen / wide desktop
|
||||
$container-large-desktop: (1140px + $grid-gutter-width);
|
||||
//** For `$screen-lg-min` and up.
|
||||
$container-lg: $container-large-desktop;
|
||||
|
||||
|
||||
//== Navbar
|
||||
//
|
||||
//##
|
||||
|
||||
// Basics of a navbar
|
||||
$navbar-height: 0px;
|
||||
$navbar-margin-bottom: $line-height-computed;
|
||||
$navbar-border-radius: $border-radius-base;
|
||||
$navbar-padding-horizontal: ($baseWidth * 2);
|
||||
$navbar-padding-vertical: 0;
|
||||
$navbar-collapse-max-height: 340px;
|
||||
|
||||
$navbar-default-color: $black;
|
||||
$navbar-default-bg: $grayLight;
|
||||
$navbar-default-border: $navbar-default-bg;
|
||||
|
||||
// Navbar links
|
||||
$navbar-default-link-color: $black;
|
||||
$navbar-default-link-hover-color: $white;
|
||||
$navbar-default-link-hover-bg: $black;
|
||||
$navbar-default-link-active-color: $white;
|
||||
$navbar-default-link-active-bg: $black;
|
||||
$navbar-default-link-disabled-color: $gray;
|
||||
$navbar-default-link-disabled-bg: transparent;
|
||||
|
||||
// Navbar brand label
|
||||
$navbar-default-brand-color: $navbar-default-link-color;
|
||||
$navbar-default-brand-hover-color: $navbar-default-brand-color;
|
||||
$navbar-default-brand-hover-bg: transparent;
|
||||
|
||||
// Navbar toggle
|
||||
$navbar-default-toggle-hover-bg: #ddd;
|
||||
$navbar-default-toggle-icon-bar-bg: #888;
|
||||
$navbar-default-toggle-border-color: #ddd;
|
||||
|
||||
|
||||
// Inverted navbar
|
||||
// Reset inverted navbar basics
|
||||
$navbar-inverse-color: $gray;
|
||||
$navbar-inverse-bg: $black;
|
||||
$navbar-inverse-border: $navbar-inverse-bg;
|
||||
|
||||
// Inverted navbar links
|
||||
$navbar-inverse-link-color: $gray-light;
|
||||
$navbar-inverse-link-hover-color: $black;
|
||||
$navbar-inverse-link-hover-bg: $grayLight;
|
||||
$navbar-inverse-link-active-color: $white;
|
||||
$navbar-inverse-link-active-bg: $grayDark;
|
||||
$navbar-inverse-link-disabled-color: $gray;
|
||||
$navbar-inverse-link-disabled-bg: transparent;
|
||||
|
||||
// Inverted navbar brand label
|
||||
$navbar-inverse-brand-color: $navbar-inverse-link-color;
|
||||
$navbar-inverse-brand-hover-color: #fff;
|
||||
$navbar-inverse-brand-hover-bg: transparent;
|
||||
|
||||
// Inverted navbar toggle
|
||||
$navbar-inverse-toggle-hover-bg: $grayLight;
|
||||
$navbar-inverse-toggle-icon-bar-bg: #fff;
|
||||
$navbar-inverse-toggle-border-color: #333;
|
||||
|
||||
|
||||
//== Navs
|
||||
//
|
||||
//##
|
||||
|
||||
//=== Shared nav styles
|
||||
$nav-link-padding: 0 $baseWidth;
|
||||
$nav-link-hover-bg: $gray-lighter;
|
||||
|
||||
$nav-disabled-link-color: $gray-light;
|
||||
$nav-disabled-link-hover-color: $gray-light;
|
||||
|
||||
//== Tabs
|
||||
$nav-tabs-border-color: #ddd;
|
||||
|
||||
$nav-tabs-link-hover-border-color: $gray-lighter;
|
||||
|
||||
$nav-tabs-active-link-hover-bg: $black;
|
||||
$nav-tabs-active-link-hover-color: $white;
|
||||
|
||||
$nav-tabs-justified-active-link-border-color: $body-bg;
|
||||
|
||||
//== Pills
|
||||
$nav-pills-border-radius: $border-radius-base;
|
||||
$nav-pills-active-link-hover-bg: $component-active-bg;
|
||||
$nav-pills-active-link-hover-color: $component-active-color;
|
||||
|
||||
|
||||
//== Pagination
|
||||
//
|
||||
//##
|
||||
|
||||
$pagination-color: $black;
|
||||
$pagination-bg: $gray;
|
||||
$pagination-border: #ddd;
|
||||
|
||||
$pagination-hover-color: $link-hover-color;
|
||||
$pagination-hover-bg: $gray-lighter;
|
||||
$pagination-hover-border: #ddd;
|
||||
|
||||
$pagination-active-color: #fff;
|
||||
$pagination-active-bg: $brand-primary;
|
||||
$pagination-active-border: $brand-primary;
|
||||
|
||||
$pagination-disabled-color: $gray-light;
|
||||
$pagination-disabled-bg: #fff;
|
||||
$pagination-disabled-border: #ddd;
|
||||
|
||||
|
||||
//== Pager
|
||||
//
|
||||
//##
|
||||
|
||||
$pager-bg: $pagination-bg;
|
||||
$pager-border: $pagination-border;
|
||||
$pager-border-radius: 0;
|
||||
|
||||
$pager-hover-bg: $pagination-hover-bg;
|
||||
|
||||
$pager-active-bg: $pagination-active-bg;
|
||||
$pager-active-color: $pagination-active-color;
|
||||
|
||||
$pager-disabled-color: $pagination-disabled-color;
|
||||
|
||||
|
||||
//== Jumbotron
|
||||
//
|
||||
//##
|
||||
|
||||
$jumbotron-padding: ($ts) ($rhs + $baseWidth) ($bs) ($lhs + $baseWidth);
|
||||
$jumbotron-color: $white;
|
||||
$jumbotron-bg: transparent;
|
||||
$jumbotron-heading-color: inherit;
|
||||
$jumbotron-font-size: $font-size-base;
|
||||
|
||||
|
||||
//== Form states and alerts
|
||||
//
|
||||
//## Define colors for form feedback states and, by default, alerts.
|
||||
|
||||
$state-success-text: $green;
|
||||
$state-success-bg: $greenDark;
|
||||
$state-success-border: $state-success-bg;
|
||||
|
||||
$state-info-text: $yellow;
|
||||
$state-info-bg: $brown;
|
||||
$state-info-border: $state-info-bg;
|
||||
|
||||
$state-warning-text: $magenta;
|
||||
$state-warning-bg: $magentaDark;
|
||||
$state-warning-border: $state-warning-bg;
|
||||
|
||||
$state-danger-text: $red;
|
||||
$state-danger-bg: $black;
|
||||
$state-danger-border: $state-danger-bg;
|
||||
|
||||
|
||||
//== Tooltips
|
||||
//
|
||||
//##
|
||||
|
||||
//** Tooltip max width
|
||||
$tooltip-max-width: ($baseWidth * 25);
|
||||
//** Tooltip text color
|
||||
$tooltip-color: $white;
|
||||
//** Tooltip background color
|
||||
$tooltip-bg: $grayDark;
|
||||
$tooltip-opacity: 1;
|
||||
|
||||
//** Tooltip arrow width
|
||||
$tooltip-arrow-width: 0px;
|
||||
//** Tooltip arrow color
|
||||
$tooltip-arrow-color: $tooltip-bg;
|
||||
|
||||
|
||||
//== Popovers
|
||||
//
|
||||
//##
|
||||
|
||||
//** Popover body background color
|
||||
$popover-bg: $gray;
|
||||
//** Popover maximum width
|
||||
$popover-max-width: ($baseWidth * 20);
|
||||
//** Popover border color
|
||||
$popover-border-color: rgb(0,0,0);
|
||||
//** Popover fallback border color
|
||||
$popover-fallback-border-color: #ccc;
|
||||
|
||||
//** Popover title background color
|
||||
$popover-title-bg: $greenDark;
|
||||
|
||||
//** Popover arrow width
|
||||
$popover-arrow-width: 10px;
|
||||
//** Popover arrow color
|
||||
$popover-arrow-color: $popover-bg;
|
||||
|
||||
//** Popover outer arrow width
|
||||
$popover-arrow-outer-width: ($popover-arrow-width + 1);
|
||||
//** Popover outer arrow color
|
||||
$popover-arrow-outer-color: $popover-border-color;
|
||||
//** Popover outer arrow fallback color
|
||||
$popover-arrow-outer-fallback-color: $popover-fallback-border-color;
|
||||
|
||||
|
||||
//== Labels
|
||||
//
|
||||
//##
|
||||
|
||||
//** Default label background color
|
||||
$label-default-bg: $gray-light;
|
||||
//** Primary label background color
|
||||
$label-primary-bg: $brand-primary-bg;
|
||||
//** Success label background color
|
||||
$label-success-bg: $brand-success;
|
||||
//** Info label background color
|
||||
$label-info-bg: $brand-info;
|
||||
//** Warning label background color
|
||||
$label-warning-bg: $brand-warning;
|
||||
//** Danger label background color
|
||||
$label-danger-bg: $brand-danger;
|
||||
|
||||
//** Default label text color
|
||||
$label-color: #fff;
|
||||
//** Default text color of a linked label
|
||||
$label-link-hover-color: #fff;
|
||||
|
||||
|
||||
//== Modals
|
||||
//
|
||||
//##
|
||||
|
||||
//** Padding applied to the modal body
|
||||
$modal-inner-padding: 0 $baseWidth;
|
||||
|
||||
//** Padding applied to the modal title
|
||||
$modal-title-padding: 0 $baseWidth;
|
||||
//** Modal title line-height
|
||||
$modal-title-line-height: $line-height-base;
|
||||
|
||||
//** Background color of modal content area
|
||||
$modal-content-bg: $gray;
|
||||
//** Modal content border color
|
||||
$modal-content-border-color: rgb(0,0,0);
|
||||
//** Modal content border color **for IE8**
|
||||
$modal-content-fallback-border-color: #999;
|
||||
|
||||
//** Modal backdrop background color
|
||||
$modal-backdrop-bg: #000;
|
||||
//** Modal backdrop opacity
|
||||
// $modal-backdrop-opacity: @include 5;
|
||||
//** Modal header border color
|
||||
$modal-header-border-color: #e5e5e5;
|
||||
//** Modal footer border color
|
||||
$modal-footer-border-color: $modal-header-border-color;
|
||||
|
||||
$modal-lg: 900px;
|
||||
$modal-md: 600px;
|
||||
$modal-sm: 300px;
|
||||
|
||||
|
||||
//== Alerts
|
||||
//
|
||||
//## Define alert colors, border radius, and padding.
|
||||
|
||||
$alert-padding: $line-height-base ($baseWidth * 2);
|
||||
$alert-border-radius: $border-radius-base;
|
||||
$alert-link-font-weight: normal;
|
||||
|
||||
$alert-success-bg: $state-success-bg;
|
||||
$alert-success-text: $state-success-text;
|
||||
$alert-success-border: $state-success-border;
|
||||
|
||||
$alert-info-bg: $state-info-bg;
|
||||
$alert-info-text: $state-info-text;
|
||||
$alert-info-border: $state-info-border;
|
||||
|
||||
$alert-warning-bg: $state-warning-bg;
|
||||
$alert-warning-text: $state-warning-text;
|
||||
$alert-warning-border: $state-warning-border;
|
||||
|
||||
$alert-danger-bg: $state-danger-bg;
|
||||
$alert-danger-text: $state-danger-text;
|
||||
$alert-danger-border: $state-danger-border;
|
||||
|
||||
|
||||
//== Progress bars
|
||||
//
|
||||
//##
|
||||
|
||||
//** Background color of the whole progress component
|
||||
$progress-bg: $black;
|
||||
//** Progress bar text color
|
||||
$progress-bar-color: $black;
|
||||
//** Variable for setting rounded corners on progress bar.
|
||||
$progress-border-radius: $border-radius-base;
|
||||
|
||||
//** Default progress bar color
|
||||
$progress-bar-bg: $brand-primary;
|
||||
//** Success progress bar color
|
||||
$progress-bar-success-bg: $brand-success;
|
||||
//** Warning progress bar color
|
||||
$progress-bar-warning-bg: $brand-warning;
|
||||
//** Danger progress bar color
|
||||
$progress-bar-danger-bg: $brand-danger;
|
||||
//** Info progress bar color
|
||||
$progress-bar-info-bg: $brand-info;
|
||||
|
||||
|
||||
//== List group
|
||||
//
|
||||
//##
|
||||
|
||||
//** Background color on `.list-group-item`
|
||||
$list-group-bg: $gray;
|
||||
//** `.list-group-item` border color
|
||||
$list-group-border: #ddd;
|
||||
//** List group border radius
|
||||
$list-group-border-radius: $border-radius-base;
|
||||
|
||||
//** Background color of single list items on hover
|
||||
$list-group-hover-bg: $black;
|
||||
//** Text color of active list items
|
||||
$list-group-active-color: $component-active-color;
|
||||
//** Background color of active list items
|
||||
$list-group-active-bg: $component-active-bg;
|
||||
//** Border color of active list elements
|
||||
$list-group-active-border: $list-group-active-bg;
|
||||
//** Text color for content within active list items
|
||||
$list-group-active-text-color: $component-active-color;
|
||||
|
||||
//** Text color of disabled list items
|
||||
$list-group-disabled-color: $gray-dark;
|
||||
//** Background color of disabled list items
|
||||
$list-group-disabled-bg: $gray-lighter;
|
||||
//** Text color for content within disabled list items
|
||||
$list-group-disabled-text-color: $list-group-disabled-color;
|
||||
|
||||
$list-group-link-color: $black;
|
||||
$list-group-link-hover-color: $list-group-link-color;
|
||||
$list-group-link-heading-color: #333;
|
||||
|
||||
|
||||
//== Panels
|
||||
//
|
||||
//##
|
||||
|
||||
$panel-bg: $gray;
|
||||
$panel-body-padding: 0 $rhsNB 0 $lhsNB;
|
||||
$panel-heading-padding: 0 $rhsNB 0 $lhsNB;
|
||||
$panel-footer-padding: $panel-heading-padding;
|
||||
$panel-border-radius: $border-radius-base;
|
||||
|
||||
//** Border color for elements within panels
|
||||
$panel-inner-border: #ddd;
|
||||
$panel-footer-bg: #f5f5f5;
|
||||
|
||||
$panel-default-text: $white;
|
||||
$panel-default-border: #ddd;
|
||||
$panel-default-heading-bg: $grayDark;
|
||||
|
||||
$panel-primary-text: $white;
|
||||
$panel-primary-border: $brand-primary;
|
||||
$panel-primary-heading-bg: $cyanDark;
|
||||
|
||||
$panel-success-text: $state-success-text;
|
||||
$panel-success-border: $state-success-border;
|
||||
$panel-success-heading-bg: $state-success-bg;
|
||||
|
||||
$panel-info-text: $state-info-text;
|
||||
$panel-info-border: $state-info-border;
|
||||
$panel-info-heading-bg: $state-info-bg;
|
||||
|
||||
$panel-warning-text: $state-warning-text;
|
||||
$panel-warning-border: $state-warning-border;
|
||||
$panel-warning-heading-bg: $state-warning-bg;
|
||||
|
||||
$panel-danger-text: $state-danger-text;
|
||||
$panel-danger-border: $state-danger-border;
|
||||
$panel-danger-heading-bg: $state-danger-bg;
|
||||
|
||||
|
||||
//== Thumbnails
|
||||
//
|
||||
//##
|
||||
|
||||
//** Padding around the thumbnail image
|
||||
$thumbnail-padding: 4px;
|
||||
//** Thumbnail background color
|
||||
$thumbnail-bg: $body-bg;
|
||||
//** Thumbnail border color
|
||||
$thumbnail-border: #ddd;
|
||||
//** Thumbnail border radius
|
||||
$thumbnail-border-radius: $border-radius-base;
|
||||
|
||||
//** Custom text color for thumbnail captions
|
||||
$thumbnail-caption-color: $text-color;
|
||||
//** Padding around the thumbnail caption
|
||||
$thumbnail-caption-padding: 9px;
|
||||
|
||||
|
||||
//== Wells
|
||||
//
|
||||
//##
|
||||
|
||||
$well-bg: $greenDark;
|
||||
$well-border: $well-bg;
|
||||
|
||||
|
||||
//== Badges
|
||||
//
|
||||
//##
|
||||
|
||||
$badge-color: $black;
|
||||
//** Linked badge text color on hover
|
||||
$badge-link-hover-color: #fff;
|
||||
$badge-bg: $gray-light;
|
||||
|
||||
//** Badge text color in active nav link
|
||||
$badge-active-color: $link-color;
|
||||
//** Badge background color in active nav link
|
||||
$badge-active-bg: $black;
|
||||
|
||||
$badge-font-weight: normal;
|
||||
$badge-line-height: $line-height-base;
|
||||
$badge-border-radius: 0;
|
||||
|
||||
|
||||
//== Breadcrumbs
|
||||
//
|
||||
//##
|
||||
|
||||
$breadcrumb-padding-vertical: 8px;
|
||||
$breadcrumb-padding-horizontal: 15px;
|
||||
//** Breadcrumb background color
|
||||
$breadcrumb-bg: #f5f5f5;
|
||||
//** Breadcrumb text color
|
||||
$breadcrumb-color: #ccc;
|
||||
//** Text color of current page in the breadcrumb
|
||||
$breadcrumb-active-color: $gray-light;
|
||||
//** Textual separator for between breadcrumb elements
|
||||
$breadcrumb-separator: "/";
|
||||
|
||||
|
||||
//== Carousel
|
||||
//
|
||||
//##
|
||||
|
||||
$carousel-text-shadow: none;
|
||||
|
||||
$carousel-control-color: #fff;
|
||||
$carousel-control-width: 15%;
|
||||
$carousel-control-opacity: 1;
|
||||
$carousel-control-font-size: $font-size-base;
|
||||
|
||||
$carousel-indicator-active-bg: #fff;
|
||||
$carousel-indicator-border-color: #fff;
|
||||
|
||||
$carousel-caption-color: #fff;
|
||||
|
||||
|
||||
//== Close
|
||||
//
|
||||
//##
|
||||
|
||||
$close-font-weight: normal;
|
||||
$close-color: #000;
|
||||
$close-text-shadow: none;
|
||||
|
||||
|
||||
//== Code
|
||||
//
|
||||
//##
|
||||
|
||||
$code-color: #c7254e;
|
||||
$code-bg: #f9f2f4;
|
||||
|
||||
$kbd-color: #fff;
|
||||
$kbd-bg: #333;
|
||||
|
||||
$pre-bg: #f5f5f5;
|
||||
$pre-color: $gray-dark;
|
||||
$pre-border-color: #ccc;
|
||||
$pre-scrollable-max-height: 340px;
|
||||
|
||||
|
||||
//== Type
|
||||
//
|
||||
//##
|
||||
|
||||
//** Horizontal offset for forms and lists.
|
||||
$component-offset-horizontal: 180px;
|
||||
//** Text muted color
|
||||
$text-muted: $gray-dark;
|
||||
//** Abbreviations and acronyms border color
|
||||
$abbr-border-color: $gray-light;
|
||||
//** Headings small color
|
||||
$headings-small-color: $gray-light;
|
||||
//** Blockquote small color
|
||||
$blockquote-small-color: $gray-light;
|
||||
//** Blockquote font size
|
||||
$blockquote-font-size: $font-size-base;
|
||||
//** Blockquote border color
|
||||
$blockquote-border-color: $gray-lighter;
|
||||
//** Page header border color
|
||||
$page-header-border-color: $gray-lighter;
|
||||
//** Width of horizontal description list titles
|
||||
$dl-horizontal-offset: $component-offset-horizontal;
|
||||
//** Horizontal line color.
|
||||
$hr-border: $black;
|
40
ui/assets/css/themes/_variables.i386.scss
vendored
Normal file
40
ui/assets/css/themes/_variables.i386.scss
vendored
Normal file
|
@ -0,0 +1,40 @@
|
|||
|
||||
$blue: #5555Ff;
|
||||
$cyan: #55FFFF;
|
||||
$green: #55FF55;
|
||||
$indigo: #FF55FF;
|
||||
$red: #FF5555;
|
||||
$yellow: #FEFE54;
|
||||
$orange: #A85400;
|
||||
$pink: #FE54FE;
|
||||
$purple: #FE5454;
|
||||
$primary: #FEFE54;
|
||||
$body-bg: #000084;
|
||||
$gray-300: #bbb;
|
||||
$body-color: $gray-300;
|
||||
$link-hover-color: $white;
|
||||
$font-family-sans-serif: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
|
||||
$font-family-monospace: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
|
||||
$navbar-dark-color: $gray-300;
|
||||
$navbar-light-brand-color: $gray-300;
|
||||
$success: #00AA00;
|
||||
$danger: #AA0000;
|
||||
$info: #00AAAA;
|
||||
$warning: #AA00AA;
|
||||
$navbar-dark-active-color: $gray-100;
|
||||
$enable-rounded: false;
|
||||
$input-color: $white;
|
||||
$input-bg: rgb(102, 102, 102);
|
||||
$input-disabled-bg: $gray-800;
|
||||
$nav-tabs-link-active-color: $gray-100;
|
||||
$navbar-dark-hover-color: rgba($gray-300, .75);
|
||||
$light: $gray-800;
|
||||
$navbar-light-disabled-color: $gray-800;
|
||||
$navbar-light-active-color: $gray-100;
|
||||
$navbar-light-hover-color: $gray-200;
|
||||
$navbar-light-color: $gray-300;
|
||||
$card-bg: $gray-800;
|
||||
$card-border-color: $white;
|
||||
$input-placeholder-color: $gray-500;
|
||||
$mark-bg: #463b00;
|
||||
$secondary: $gray-900;
|
1
ui/assets/css/themes/i386.min.css
vendored
Normal file
1
ui/assets/css/themes/i386.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
12
ui/assets/css/themes/materia.min.css
vendored
Normal file
12
ui/assets/css/themes/materia.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
ui/package.json
vendored
1
ui/package.json
vendored
|
@ -35,6 +35,7 @@
|
|||
"markdown-it-emoji": "^1.4.0",
|
||||
"moment": "^2.24.0",
|
||||
"prettier": "^1.18.2",
|
||||
"reconnecting-websocket": "^4.3.0",
|
||||
"rxjs": "^6.4.0",
|
||||
"terser": "^4.6.3",
|
||||
"toastify-js": "^1.6.2",
|
||||
|
|
4
ui/src/components/comment-node.tsx
vendored
4
ui/src/components/comment-node.tsx
vendored
|
@ -117,7 +117,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
|||
.viewOnly && 'no-click'}`}
|
||||
>
|
||||
<button
|
||||
className={`btn p-0 ${
|
||||
className={`btn btn-link p-0 ${
|
||||
node.comment.my_vote == 1 ? 'text-info' : 'text-muted'
|
||||
}`}
|
||||
onClick={linkEvent(node, this.handleCommentUpvote)}
|
||||
|
@ -137,7 +137,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
|
|||
</div>
|
||||
{WebSocketService.Instance.site.enable_downvotes && (
|
||||
<button
|
||||
className={`btn p-0 ${
|
||||
className={`btn btn-link p-0 ${
|
||||
node.comment.my_vote == -1 ? 'text-danger' : 'text-muted'
|
||||
}`}
|
||||
onClick={linkEvent(node, this.handleCommentDownvote)}
|
||||
|
|
4
ui/src/components/post-listing.tsx
vendored
4
ui/src/components/post-listing.tsx
vendored
|
@ -119,7 +119,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
|||
<div class="listing col-12">
|
||||
<div className={`vote-bar mr-2 float-left small text-center`}>
|
||||
<button
|
||||
className={`btn p-0 ${
|
||||
className={`btn btn-link p-0 ${
|
||||
post.my_vote == 1 ? 'text-info' : 'text-muted'
|
||||
}`}
|
||||
onClick={linkEvent(this, this.handlePostLike)}
|
||||
|
@ -137,7 +137,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
|
|||
<div class={`font-weight-bold text-muted`}>{post.score}</div>
|
||||
{WebSocketService.Instance.site.enable_downvotes && (
|
||||
<button
|
||||
className={`btn p-0 ${
|
||||
className={`btn btn-link p-0 ${
|
||||
post.my_vote == -1 ? 'text-danger' : 'text-muted'
|
||||
}`}
|
||||
onClick={linkEvent(this, this.handlePostDisLike)}
|
||||
|
|
139
ui/src/services/WebSocketService.ts
vendored
139
ui/src/services/WebSocketService.ts
vendored
|
@ -40,37 +40,33 @@ import {
|
|||
GetPrivateMessagesForm,
|
||||
MessageType,
|
||||
} from '../interfaces';
|
||||
import { webSocket } from 'rxjs/webSocket';
|
||||
import { Subject } from 'rxjs';
|
||||
import { retryWhen, delay } from 'rxjs/operators';
|
||||
import { UserService } from './';
|
||||
import { i18n } from '../i18next';
|
||||
import { toast } from '../utils';
|
||||
import { Observable } from 'rxjs';
|
||||
import { share } from 'rxjs/operators';
|
||||
import ReconnectingWebSocket from 'reconnecting-websocket';
|
||||
|
||||
export class WebSocketService {
|
||||
private static _instance: WebSocketService;
|
||||
public subject: Subject<any>;
|
||||
public ws: ReconnectingWebSocket;
|
||||
public subject: Observable<any>;
|
||||
|
||||
public site: Site;
|
||||
public admins: Array<UserView>;
|
||||
public banned: Array<UserView>;
|
||||
|
||||
private constructor() {
|
||||
this.subject = webSocket(wsUri);
|
||||
|
||||
// Necessary to not keep reconnecting
|
||||
this.subject
|
||||
.pipe(
|
||||
retryWhen(errors =>
|
||||
errors.pipe(
|
||||
delay(1000)
|
||||
// take(999)
|
||||
)
|
||||
)
|
||||
)
|
||||
.subscribe();
|
||||
|
||||
this.ws = new ReconnectingWebSocket(wsUri);
|
||||
this.ws.onopen = () => {
|
||||
console.log(`Connected to ${wsUri}`);
|
||||
};
|
||||
|
||||
this.subject = Observable.create((obs: any) => {
|
||||
this.ws.onmessage = e => {
|
||||
obs.next(JSON.parse(e.data));
|
||||
};
|
||||
}).pipe(share());
|
||||
}
|
||||
|
||||
public static get Instance() {
|
||||
|
@ -78,241 +74,223 @@ export class WebSocketService {
|
|||
}
|
||||
|
||||
public login(loginForm: LoginForm) {
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.Login, loginForm));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.Login, loginForm));
|
||||
}
|
||||
|
||||
public register(registerForm: RegisterForm) {
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.Register, registerForm));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.Register, registerForm));
|
||||
}
|
||||
|
||||
public createCommunity(communityForm: CommunityForm) {
|
||||
this.setAuth(communityForm);
|
||||
this.subject.next(
|
||||
this.ws.send(
|
||||
this.wsSendWrapper(UserOperation.CreateCommunity, communityForm)
|
||||
);
|
||||
}
|
||||
|
||||
public editCommunity(communityForm: CommunityForm) {
|
||||
this.setAuth(communityForm);
|
||||
this.subject.next(
|
||||
this.ws.send(
|
||||
this.wsSendWrapper(UserOperation.EditCommunity, communityForm)
|
||||
);
|
||||
}
|
||||
|
||||
public followCommunity(followCommunityForm: FollowCommunityForm) {
|
||||
this.setAuth(followCommunityForm);
|
||||
this.subject.next(
|
||||
this.ws.send(
|
||||
this.wsSendWrapper(UserOperation.FollowCommunity, followCommunityForm)
|
||||
);
|
||||
}
|
||||
|
||||
public listCommunities(form: ListCommunitiesForm) {
|
||||
this.setAuth(form, false);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.ListCommunities, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.ListCommunities, form));
|
||||
}
|
||||
|
||||
public getFollowedCommunities() {
|
||||
let form: GetFollowedCommunitiesForm = { auth: UserService.Instance.auth };
|
||||
this.subject.next(
|
||||
this.ws.send(
|
||||
this.wsSendWrapper(UserOperation.GetFollowedCommunities, form)
|
||||
);
|
||||
}
|
||||
|
||||
public listCategories() {
|
||||
this.subject.next(
|
||||
this.wsSendWrapper(UserOperation.ListCategories, {})
|
||||
);
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.ListCategories, {}));
|
||||
}
|
||||
|
||||
public createPost(postForm: PostForm) {
|
||||
this.setAuth(postForm);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.CreatePost, postForm));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.CreatePost, postForm));
|
||||
}
|
||||
|
||||
public getPost(form: GetPostForm) {
|
||||
this.setAuth(form, false);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.GetPost, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.GetPost, form));
|
||||
}
|
||||
|
||||
public getCommunity(form: GetCommunityForm) {
|
||||
this.setAuth(form, false);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.GetCommunity, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.GetCommunity, form));
|
||||
}
|
||||
|
||||
public createComment(commentForm: CommentForm) {
|
||||
this.setAuth(commentForm);
|
||||
this.subject.next(
|
||||
this.wsSendWrapper(UserOperation.CreateComment, commentForm)
|
||||
);
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.CreateComment, commentForm));
|
||||
}
|
||||
|
||||
public editComment(commentForm: CommentForm) {
|
||||
this.setAuth(commentForm);
|
||||
this.subject.next(
|
||||
this.wsSendWrapper(UserOperation.EditComment, commentForm)
|
||||
);
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.EditComment, commentForm));
|
||||
}
|
||||
|
||||
public likeComment(form: CommentLikeForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(
|
||||
this.wsSendWrapper(UserOperation.CreateCommentLike, form)
|
||||
);
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.CreateCommentLike, form));
|
||||
}
|
||||
|
||||
public saveComment(form: SaveCommentForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.SaveComment, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.SaveComment, form));
|
||||
}
|
||||
|
||||
public getPosts(form: GetPostsForm) {
|
||||
this.setAuth(form, false);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.GetPosts, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.GetPosts, form));
|
||||
}
|
||||
|
||||
public likePost(form: CreatePostLikeForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.CreatePostLike, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.CreatePostLike, form));
|
||||
}
|
||||
|
||||
public editPost(postForm: PostForm) {
|
||||
this.setAuth(postForm);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.EditPost, postForm));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.EditPost, postForm));
|
||||
}
|
||||
|
||||
public savePost(form: SavePostForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.SavePost, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.SavePost, form));
|
||||
}
|
||||
|
||||
public banFromCommunity(form: BanFromCommunityForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.BanFromCommunity, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.BanFromCommunity, form));
|
||||
}
|
||||
|
||||
public addModToCommunity(form: AddModToCommunityForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(
|
||||
this.wsSendWrapper(UserOperation.AddModToCommunity, form)
|
||||
);
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.AddModToCommunity, form));
|
||||
}
|
||||
|
||||
public transferCommunity(form: TransferCommunityForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(
|
||||
this.wsSendWrapper(UserOperation.TransferCommunity, form)
|
||||
);
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.TransferCommunity, form));
|
||||
}
|
||||
|
||||
public transferSite(form: TransferSiteForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.TransferSite, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.TransferSite, form));
|
||||
}
|
||||
|
||||
public banUser(form: BanUserForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.BanUser, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.BanUser, form));
|
||||
}
|
||||
|
||||
public addAdmin(form: AddAdminForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.AddAdmin, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.AddAdmin, form));
|
||||
}
|
||||
|
||||
public getUserDetails(form: GetUserDetailsForm) {
|
||||
this.setAuth(form, false);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.GetUserDetails, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.GetUserDetails, form));
|
||||
}
|
||||
|
||||
public getReplies(form: GetRepliesForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.GetReplies, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.GetReplies, form));
|
||||
}
|
||||
|
||||
public getUserMentions(form: GetUserMentionsForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.GetUserMentions, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.GetUserMentions, form));
|
||||
}
|
||||
|
||||
public editUserMention(form: EditUserMentionForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.EditUserMention, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.EditUserMention, form));
|
||||
}
|
||||
|
||||
public getModlog(form: GetModlogForm) {
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.GetModlog, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.GetModlog, form));
|
||||
}
|
||||
|
||||
public createSite(siteForm: SiteForm) {
|
||||
this.setAuth(siteForm);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.CreateSite, siteForm));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.CreateSite, siteForm));
|
||||
}
|
||||
|
||||
public editSite(siteForm: SiteForm) {
|
||||
this.setAuth(siteForm);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.EditSite, siteForm));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.EditSite, siteForm));
|
||||
}
|
||||
|
||||
public getSite() {
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.GetSite, {}));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.GetSite, {}));
|
||||
}
|
||||
|
||||
public search(form: SearchForm) {
|
||||
this.setAuth(form, false);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.Search, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.Search, form));
|
||||
}
|
||||
|
||||
public markAllAsRead() {
|
||||
let form = {};
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.MarkAllAsRead, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.MarkAllAsRead, form));
|
||||
}
|
||||
|
||||
public saveUserSettings(userSettingsForm: UserSettingsForm) {
|
||||
this.setAuth(userSettingsForm);
|
||||
this.subject.next(
|
||||
this.ws.send(
|
||||
this.wsSendWrapper(UserOperation.SaveUserSettings, userSettingsForm)
|
||||
);
|
||||
}
|
||||
|
||||
public deleteAccount(form: DeleteAccountForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.DeleteAccount, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.DeleteAccount, form));
|
||||
}
|
||||
|
||||
public passwordReset(form: PasswordResetForm) {
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.PasswordReset, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.PasswordReset, form));
|
||||
}
|
||||
|
||||
public passwordChange(form: PasswordChangeForm) {
|
||||
this.subject.next(this.wsSendWrapper(UserOperation.PasswordChange, form));
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.PasswordChange, form));
|
||||
}
|
||||
|
||||
public createPrivateMessage(form: PrivateMessageForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(
|
||||
this.wsSendWrapper(UserOperation.CreatePrivateMessage, form)
|
||||
);
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.CreatePrivateMessage, form));
|
||||
}
|
||||
|
||||
public editPrivateMessage(form: EditPrivateMessageForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(
|
||||
this.wsSendWrapper(UserOperation.EditPrivateMessage, form)
|
||||
);
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.EditPrivateMessage, form));
|
||||
}
|
||||
|
||||
public getPrivateMessages(form: GetPrivateMessagesForm) {
|
||||
this.setAuth(form);
|
||||
this.subject.next(
|
||||
this.wsSendWrapper(UserOperation.GetPrivateMessages, form)
|
||||
);
|
||||
this.ws.send(this.wsSendWrapper(UserOperation.GetPrivateMessages, form));
|
||||
}
|
||||
|
||||
private wsSendWrapper(op: UserOperation, data: MessageType) {
|
||||
let send = { op: UserOperation[op], data: data };
|
||||
console.log(send);
|
||||
return send;
|
||||
return JSON.stringify(send);
|
||||
}
|
||||
|
||||
private setAuth(obj: any, throwErr: boolean = true) {
|
||||
|
@ -325,6 +303,5 @@ export class WebSocketService {
|
|||
}
|
||||
|
||||
window.onbeforeunload = () => {
|
||||
WebSocketService.Instance.subject.unsubscribe();
|
||||
WebSocketService.Instance.subject = null;
|
||||
WebSocketService.Instance.ws.close();
|
||||
};
|
||||
|
|
2
ui/src/utils.ts
vendored
2
ui/src/utils.ts
vendored
|
@ -318,6 +318,7 @@ export function getMomentLanguage(): string {
|
|||
|
||||
export const themes = [
|
||||
'litera',
|
||||
'materia',
|
||||
'minty',
|
||||
'solar',
|
||||
'united',
|
||||
|
@ -327,6 +328,7 @@ export const themes = [
|
|||
'sketchy',
|
||||
'vaporwave',
|
||||
'vaporwave-dark',
|
||||
'i386',
|
||||
];
|
||||
|
||||
export function setTheme(theme: string = 'darkly') {
|
||||
|
|
2
ui/src/version.ts
vendored
2
ui/src/version.ts
vendored
|
@ -1 +1 @@
|
|||
export const version: string = 'v0.6.7';
|
||||
export const version: string = 'v0.6.8';
|
||||
|
|
5
ui/yarn.lock
vendored
5
ui/yarn.lock
vendored
|
@ -3753,6 +3753,11 @@ realm-utils@^1.0.9:
|
|||
app-root-path "^1.3.0"
|
||||
mkdirp "^0.5.1"
|
||||
|
||||
reconnecting-websocket@^4.3.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.3.0.tgz#aaefbc7629a89450aa45324b89aec2276e728cc5"
|
||||
integrity sha512-3eaHIEVYB9Zb0GfYy1xdEHKJLA2JaawAegByZ1AZ8Npb3AiRgUN5l89cvE2H+pHTsFcoC88t32ky9qET6DJ75Q==
|
||||
|
||||
regenerate-unicode-properties@^8.1.0:
|
||||
version "8.1.0"
|
||||
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e"
|
||||
|
|
Loading…
Reference in a new issue