Merge remote-tracking branch 'upstream/master' into glitch-soc/merge-upstream
Conflicts: - Gemfile.lock - config/webpack/rules/css.js - package.json - yarn.lock
This commit is contained in:
		
							
								
								
									
										2
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Gemfile
									
									
									
									
									
								
							| @@ -131,7 +131,7 @@ group :development do | ||||
|   gem 'letter_opener', '~> 1.7' | ||||
|   gem 'letter_opener_web', '~> 1.3' | ||||
|   gem 'memory_profiler' | ||||
|   gem 'rubocop', '~> 0.70', require: false | ||||
|   gem 'rubocop', '~> 0.71', require: false | ||||
|   gem 'brakeman', '~> 4.5', require: false | ||||
|   gem 'bundler-audit', '~> 0.6', require: false | ||||
|   gem 'scss_lint', '~> 0.58', require: false | ||||
|   | ||||
							
								
								
									
										10
									
								
								Gemfile.lock
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								Gemfile.lock
									
									
									
									
									
								
							| @@ -481,7 +481,7 @@ GEM | ||||
|     rdf-normalize (0.3.3) | ||||
|       rdf (>= 2.2, < 4.0) | ||||
|     redcarpet (3.4.0) | ||||
|     redis (4.1.1) | ||||
|     redis (4.1.2) | ||||
|     redis-actionpack (5.0.2) | ||||
|       actionpack (>= 4.0, < 6) | ||||
|       redis-rack (>= 1, < 3) | ||||
| @@ -530,14 +530,14 @@ GEM | ||||
|       rspec-core (~> 3.0, >= 3.0.0) | ||||
|       sidekiq (>= 2.4.0) | ||||
|     rspec-support (3.8.0) | ||||
|     rubocop (0.70.0) | ||||
|     rubocop (0.71.0) | ||||
|       jaro_winkler (~> 1.5.1) | ||||
|       parallel (~> 1.10) | ||||
|       parser (>= 2.6) | ||||
|       rainbow (>= 2.2.2, < 4.0) | ||||
|       ruby-progressbar (~> 1.7) | ||||
|       unicode-display_width (>= 1.4.0, < 1.7) | ||||
|     ruby-progressbar (1.10.0) | ||||
|     ruby-progressbar (1.10.1) | ||||
|     ruby-saml (1.9.0) | ||||
|       nokogiri (>= 1.5.10) | ||||
|     rufus-scheduler (3.5.2) | ||||
| @@ -636,7 +636,7 @@ GEM | ||||
|       addressable (>= 2.3.6) | ||||
|       crack (>= 0.3.2) | ||||
|       hashdiff | ||||
|     webpacker (4.0.4) | ||||
|     webpacker (4.0.6) | ||||
|       activesupport (>= 4.2) | ||||
|       rack-proxy (>= 0.6.1) | ||||
|       railties (>= 4.2) | ||||
| @@ -750,7 +750,7 @@ DEPENDENCIES | ||||
|   rqrcode (~> 0.10) | ||||
|   rspec-rails (~> 3.8) | ||||
|   rspec-sidekiq (~> 3.0) | ||||
|   rubocop (~> 0.70) | ||||
|   rubocop (~> 0.71) | ||||
|   sanitize (~> 5.0) | ||||
|   scss_lint (~> 0.58) | ||||
|   sidekiq (~> 5.2) | ||||
|   | ||||
| @@ -189,7 +189,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { | ||||
|   } | ||||
|  | ||||
|   render () { | ||||
|     const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus } = this.props; | ||||
|     const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, children } = this.props; | ||||
|     const { suggestionsHidden } = this.state; | ||||
|     const style = { direction: 'ltr' }; | ||||
|  | ||||
| @@ -197,34 +197,38 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { | ||||
|       style.direction = 'rtl'; | ||||
|     } | ||||
|  | ||||
|     return ( | ||||
|       <div className='autosuggest-textarea'> | ||||
|         <label> | ||||
|           <span style={{ display: 'none' }}>{placeholder}</span> | ||||
|  | ||||
|           <Textarea | ||||
|             inputRef={this.setTextarea} | ||||
|             className='autosuggest-textarea__textarea' | ||||
|             disabled={disabled} | ||||
|             placeholder={placeholder} | ||||
|             autoFocus={autoFocus} | ||||
|             value={value} | ||||
|             onChange={this.onChange} | ||||
|             onKeyDown={this.onKeyDown} | ||||
|             onKeyUp={onKeyUp} | ||||
|             onFocus={this.onFocus} | ||||
|             onBlur={this.onBlur} | ||||
|             onPaste={this.onPaste} | ||||
|             style={style} | ||||
|             aria-autocomplete='list' | ||||
|           /> | ||||
|         </label> | ||||
|     return [ | ||||
|       <div className='compose-form__autosuggest-wrapper'> | ||||
|         <div className='autosuggest-textarea'> | ||||
|           <label> | ||||
|             <span style={{ display: 'none' }}>{placeholder}</span> | ||||
|  | ||||
|             <Textarea | ||||
|               inputRef={this.setTextarea} | ||||
|               className='autosuggest-textarea__textarea' | ||||
|               disabled={disabled} | ||||
|               placeholder={placeholder} | ||||
|               autoFocus={autoFocus} | ||||
|               value={value} | ||||
|               onChange={this.onChange} | ||||
|               onKeyDown={this.onKeyDown} | ||||
|               onKeyUp={onKeyUp} | ||||
|               onFocus={this.onFocus} | ||||
|               onBlur={this.onBlur} | ||||
|               onPaste={this.onPaste} | ||||
|               style={style} | ||||
|               aria-autocomplete='list' | ||||
|             /> | ||||
|           </label> | ||||
|         </div> | ||||
|         {children} | ||||
|       </div>, | ||||
|       <div className='autosuggest-textarea__suggestions-wrapper'> | ||||
|         <div className={`autosuggest-textarea__suggestions ${suggestionsHidden || suggestions.isEmpty() ? '' : 'autosuggest-textarea__suggestions--visible'}`}> | ||||
|           {suggestions.map(this.renderSuggestion)} | ||||
|         </div> | ||||
|       </div> | ||||
|     ); | ||||
|       </div>, | ||||
|     ]; | ||||
|   } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -201,29 +201,29 @@ class ComposeForm extends ImmutablePureComponent { | ||||
|           /> | ||||
|         </div> | ||||
|  | ||||
|         <div className='compose-form__autosuggest-wrapper'> | ||||
|           <AutosuggestTextarea | ||||
|             ref={this.setAutosuggestTextarea} | ||||
|             placeholder={intl.formatMessage(messages.placeholder)} | ||||
|             disabled={disabled} | ||||
|             value={this.props.text} | ||||
|             onChange={this.handleChange} | ||||
|             suggestions={this.props.suggestions} | ||||
|             onKeyDown={this.handleKeyDown} | ||||
|             onSuggestionsFetchRequested={this.onSuggestionsFetchRequested} | ||||
|             onSuggestionsClearRequested={this.onSuggestionsClearRequested} | ||||
|             onSuggestionSelected={this.onSuggestionSelected} | ||||
|             onPaste={onPaste} | ||||
|             autoFocus={!showSearch && !isMobile(window.innerWidth)} | ||||
|           /> | ||||
|  | ||||
|         <div className='emoji-picker-wrapper'> | ||||
|           <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} /> | ||||
|         </div> | ||||
|  | ||||
|         <div className='compose-form__modifiers'> | ||||
|           <UploadFormContainer /> | ||||
|           <PollFormContainer /> | ||||
|         </div> | ||||
|         <AutosuggestTextarea | ||||
|           ref={this.setAutosuggestTextarea} | ||||
|           placeholder={intl.formatMessage(messages.placeholder)} | ||||
|           disabled={disabled} | ||||
|           value={this.props.text} | ||||
|           onChange={this.handleChange} | ||||
|           suggestions={this.props.suggestions} | ||||
|           onKeyDown={this.handleKeyDown} | ||||
|           onSuggestionsFetchRequested={this.onSuggestionsFetchRequested} | ||||
|           onSuggestionsClearRequested={this.onSuggestionsClearRequested} | ||||
|           onSuggestionSelected={this.onSuggestionSelected} | ||||
|           onPaste={onPaste} | ||||
|           autoFocus={!showSearch && !isMobile(window.innerWidth)} | ||||
|         > | ||||
|           <div className='compose-form__modifiers'> | ||||
|             <UploadFormContainer /> | ||||
|             <PollFormContainer /> | ||||
|           </div> | ||||
|         </AutosuggestTextarea> | ||||
|  | ||||
|         <div className='compose-form__buttons-wrapper'> | ||||
|           <div className='compose-form__buttons'> | ||||
|   | ||||
| @@ -9,9 +9,6 @@ const ComposePanel = () => ( | ||||
|     <SearchContainer openInRoute /> | ||||
|     <NavigationContainer /> | ||||
|     <ComposeFormContainer /> | ||||
|  | ||||
|     <div className='flex-spacer' /> | ||||
|  | ||||
|     <LinkFooter withHotkeys /> | ||||
|   </div> | ||||
| ); | ||||
|   | ||||
| @@ -68,6 +68,7 @@ | ||||
|         margin: 0; | ||||
|         border-radius: 4px; | ||||
|         background: darken($ui-base-color, 8%); | ||||
|         object-fit: cover; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -333,14 +333,15 @@ | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .emoji-picker-dropdown { | ||||
|     position: absolute; | ||||
|     top: 5px; | ||||
|     right: 5px; | ||||
|     z-index: 1; | ||||
|   } | ||||
|  | ||||
|   .compose-form__autosuggest-wrapper { | ||||
|     position: relative; | ||||
|  | ||||
|     .emoji-picker-dropdown { | ||||
|       position: absolute; | ||||
|       right: 5px; | ||||
|       top: 5px; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .autosuggest-textarea, | ||||
| @@ -355,7 +356,8 @@ | ||||
|     opacity: 0.0; | ||||
|  | ||||
|     &.spoiler-input--visible { | ||||
|       height: 47px; | ||||
|       height: 36px; | ||||
|       margin-bottom: 11px; | ||||
|       opacity: 1.0; | ||||
|     } | ||||
|   } | ||||
| @@ -406,6 +408,12 @@ | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .emoji-picker-wrapper, | ||||
|   .autosuggest-textarea__suggestions-wrapper { | ||||
|     position: relative; | ||||
|     height: 0; | ||||
|   } | ||||
|  | ||||
|   .autosuggest-textarea__suggestions { | ||||
|     box-sizing: border-box; | ||||
|     display: none; | ||||
| @@ -566,6 +574,7 @@ | ||||
|     border-radius: 0 0 4px 4px; | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     flex: 0 0 auto; | ||||
|  | ||||
|     .compose-form__buttons { | ||||
|       display: flex; | ||||
| @@ -614,6 +623,7 @@ | ||||
|     display: flex; | ||||
|     justify-content: flex-end; | ||||
|     min-width: 0; | ||||
|     flex: 0 0 auto; | ||||
|  | ||||
|     .compose-form__publish-button-wrapper { | ||||
|       overflow: hidden; | ||||
| @@ -644,6 +654,9 @@ | ||||
|   margin-bottom: 10px; | ||||
|   background: $ui-primary-color; | ||||
|   padding: 10px; | ||||
|   min-height: 23px; | ||||
|   overflow-y: auto; | ||||
|   flex: 0 2 auto; | ||||
| } | ||||
|  | ||||
| .reply-indicator__header { | ||||
| @@ -1794,7 +1807,6 @@ a.account__display-name { | ||||
|     height: 100%; | ||||
|  | ||||
|     &__pane { | ||||
|       flex: 1 1 auto; | ||||
|       height: 100%; | ||||
|       overflow: hidden; | ||||
|       pointer-events: none; | ||||
| @@ -2185,7 +2197,8 @@ a.account__display-name { | ||||
|   margin-top: 10px; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   height: 100%; | ||||
|   height: calc(100% - 10px); | ||||
|   overflow-y: hidden; | ||||
|  | ||||
|   .search__input { | ||||
|     line-height: 18px; | ||||
| @@ -2201,14 +2214,33 @@ a.account__display-name { | ||||
|   .navigation-bar { | ||||
|     padding-top: 20px; | ||||
|     padding-bottom: 20px; | ||||
|     flex: 0 1 48px; | ||||
|     min-height: 20px; | ||||
|   } | ||||
|  | ||||
|   .flex-spacer { | ||||
|     background: transparent; | ||||
|   } | ||||
|  | ||||
|   .compose-form { | ||||
|     flex: 1; | ||||
|     overflow-y: hidden; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     min-height: 310px; | ||||
|     padding-bottom: 71px; | ||||
|     margin-bottom: -71px; | ||||
|   } | ||||
|  | ||||
|   .compose-form__autosuggest-wrapper { | ||||
|     overflow-y: auto; | ||||
|     background-color: $white; | ||||
|     border-radius: 4px 4px 0 0; | ||||
|     flex: 0 1 auto; | ||||
|   } | ||||
|  | ||||
|   .autosuggest-textarea__textarea { | ||||
|     max-height: 200px; | ||||
|     overflow-y: hidden; | ||||
|   } | ||||
|  | ||||
|   .compose-form__upload-thumbnail { | ||||
| @@ -2218,6 +2250,9 @@ a.account__display-name { | ||||
|  | ||||
| .navigation-panel { | ||||
|   margin-top: 10px; | ||||
|   margin-bottom: 10px; | ||||
|   height: calc(100% - 20px); | ||||
|   overflow-y: auto; | ||||
|  | ||||
|   hr { | ||||
|     border: 0; | ||||
|   | ||||
| @@ -49,7 +49,7 @@ sk: | ||||
|       few: Sledovateľov | ||||
|       one: Sledovateľ | ||||
|       other: Sledovatelia | ||||
|     following: Sledovaní | ||||
|     following: Následujem | ||||
|     joined: Pridal/a sa v %{date} | ||||
|     last_active: naposledy aktívny | ||||
|     link_verified_on: Vlastníctvo tohto odkazu bolo skontrolované %{date} | ||||
| @@ -214,7 +214,7 @@ sk: | ||||
|         silence_account: "%{name} utíšil/a účet %{target}" | ||||
|         suspend_account: "%{name} zablokoval/a účet používateľa %{target}" | ||||
|         unassigned_report: "%{name} odobral/a report od %{target}" | ||||
|         unsilence_account: "%{name} zrušil/a utíšenie účtu používateľa %{target}" | ||||
|         unsilence_account: "%{name} zrušil/a stíšenie účtu používateľa %{target}" | ||||
|         unsuspend_account: "%{name} zrušil/a blokovanie účtu používateľa %{target}" | ||||
|         update_custom_emoji: "%{name} aktualizoval/a emoji %{target}" | ||||
|         update_status: "%{name} aktualizoval/a status pre %{target}" | ||||
|   | ||||
| @@ -35,7 +35,7 @@ defaults: &defaults | ||||
|   flavour: 'glitch' | ||||
|   skin: 'default' | ||||
|   aggregate_reblogs: true | ||||
|   advanced_layout: true | ||||
|   advanced_layout: false | ||||
|   notification_emails: | ||||
|     follow: false | ||||
|     reblog: false | ||||
|   | ||||
| @@ -22,7 +22,6 @@ module.exports = { | ||||
|       loader: 'sass-loader', | ||||
|       options: { | ||||
|         includePaths: ['app/javascript'], | ||||
|         fiber: require('fibers'), | ||||
|         implementation: require('sass'), | ||||
|         sourceMap: true, | ||||
|       }, | ||||
|   | ||||
| @@ -8,6 +8,6 @@ class CreateAccountModerationNotes < ActiveRecord::Migration[5.1] | ||||
|       t.timestamps | ||||
|     end | ||||
|  | ||||
|     add_foreign_key :account_moderation_notes, :accounts, column: :target_account_id | ||||
|     safety_assured { add_foreign_key :account_moderation_notes, :accounts, column: :target_account_id } | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| class AddForeignKeyToAccountModerationNotes < ActiveRecord::Migration[5.1] | ||||
|   def change | ||||
|     add_foreign_key :account_moderation_notes, :accounts | ||||
|     safety_assured { add_foreign_key :account_moderation_notes, :accounts } | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| class AddMovedToAccountIdToAccounts < ActiveRecord::Migration[5.1] | ||||
|   def change | ||||
|     add_column :accounts, :moved_to_account_id, :bigint, null: true, default: nil | ||||
|     add_foreign_key :accounts, :accounts, column: :moved_to_account_id, on_delete: :nullify | ||||
|     safety_assured { add_foreign_key :accounts, :accounts, column: :moved_to_account_id, on_delete: :nullify } | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -0,0 +1,17 @@ | ||||
| class PreserveOldLayoutForExistingUsers < ActiveRecord::Migration[5.2] | ||||
|   disable_ddl_transaction! | ||||
|  | ||||
|   def up | ||||
|     # Assume that currently active users are already using the layout that they | ||||
|     # want to use, therefore ensure that it is saved explicitly and not based | ||||
|     # on the to-be-changed default | ||||
|  | ||||
|     User.where(User.arel_table[:current_sign_in_at].gteq(1.month.ago)).find_each do |user| | ||||
|       next if Setting.unscoped.where(thing_type: 'User', thing_id: user.id, var: 'advanced_layout').exists? | ||||
|       user.settings.advanced_layout = true | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   def down | ||||
|   end | ||||
| end | ||||
| @@ -10,7 +10,7 @@ | ||||
| # | ||||
| # It's strongly recommended that you check this file into your version control system. | ||||
|  | ||||
| ActiveRecord::Schema.define(version: 2019_05_19_130537) do | ||||
| ActiveRecord::Schema.define(version: 2019_05_29_143559) do | ||||
|  | ||||
|   # These are extensions that must be enabled in order to support this database | ||||
|   enable_extension "plpgsql" | ||||
|   | ||||
							
								
								
									
										30
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								package.json
									
									
									
									
									
								
							| @@ -73,8 +73,8 @@ | ||||
|     "@clusterws/cws": "^0.14.0", | ||||
|     "array-includes": "^3.0.3", | ||||
|     "atrament": "^0.2.3", | ||||
|     "autoprefixer": "^9.4.10", | ||||
|     "axios": "^0.18.0", | ||||
|     "autoprefixer": "^9.5.1", | ||||
|     "axios": "^0.19.0", | ||||
|     "babel-loader": "^8.0.5", | ||||
|     "babel-plugin-lodash": "^3.3.4", | ||||
|     "babel-plugin-preval": "^3.0.1", | ||||
| @@ -88,18 +88,16 @@ | ||||
|     "css-loader": "^2.1.1", | ||||
|     "cssnano": "^4.1.10", | ||||
|     "detect-passive-events": "^1.0.2", | ||||
|     "dotenv": "^6.2.0", | ||||
|     "dotenv": "^8.0.0", | ||||
|     "emoji-mart": "Gargron/emoji-mart#build", | ||||
|     "es6-symbol": "^3.1.1", | ||||
|     "escape-html": "^1.0.3", | ||||
|     "exif-js": "^2.3.0", | ||||
|     "express": "^4.17.1", | ||||
|     "favico.js": "^0.3.10", | ||||
|     "fibers": "^3.1.1", | ||||
|     "file-loader": "^3.0.1", | ||||
|     "font-awesome": "^4.7.0", | ||||
|     "glob": "^7.1.1", | ||||
|     "history": "^4.7.2", | ||||
|     "http-link-header": "^1.0.2", | ||||
|     "immutable": "^3.8.2", | ||||
|     "imports-loader": "^0.8.0", | ||||
| @@ -117,15 +115,15 @@ | ||||
|     "npmlog": "^4.1.2", | ||||
|     "object-assign": "^4.1.1", | ||||
|     "object-fit-images": "^3.2.3", | ||||
|     "object.values": "^1.0.4", | ||||
|     "offline-plugin": "^5.0.6", | ||||
|     "object.values": "^1.1.0", | ||||
|     "offline-plugin": "^5.0.7", | ||||
|     "path-complete-extname": "^1.0.0", | ||||
|     "pg": "^6.4.0", | ||||
|     "postcss-loader": "^3.0.0", | ||||
|     "postcss-object-fit-images": "^1.1.2", | ||||
|     "prop-types": "^15.5.10", | ||||
|     "punycode": "^2.1.0", | ||||
|     "rails-ujs": "^5.2.2", | ||||
|     "rails-ujs": "^5.2.3", | ||||
|     "react": "^16.7.0", | ||||
|     "react-dom": "^16.7.0", | ||||
|     "react-hotkeys": "^1.1.4", | ||||
| @@ -140,7 +138,7 @@ | ||||
|     "react-redux-loading-bar": "^4.0.8", | ||||
|     "react-router-dom": "^4.1.1", | ||||
|     "react-router-scroll-4": "^1.0.0-beta.1", | ||||
|     "react-select": "^2.2.0", | ||||
|     "react-select": "^2.4.4", | ||||
|     "react-sparklines": "^1.7.0", | ||||
|     "react-swipeable-views": "^0.13.0", | ||||
|     "react-textarea-autosize": "^7.1.0", | ||||
| @@ -153,7 +151,7 @@ | ||||
|     "requestidlecallback": "^0.3.0", | ||||
|     "reselect": "^4.0.0", | ||||
|     "rimraf": "^2.6.3", | ||||
|     "sass": "^1.17.2", | ||||
|     "sass": "^1.20.1", | ||||
|     "sass-loader": "^7.0.3", | ||||
|     "stringz": "^1.0.0", | ||||
|     "substring-trie": "^1.0.2", | ||||
| @@ -164,25 +162,25 @@ | ||||
|     "webpack": "^4.29.6", | ||||
|     "webpack-assets-manifest": "^3.1.1", | ||||
|     "webpack-bundle-analyzer": "^3.1.0", | ||||
|     "webpack-cli": "^3.2.3", | ||||
|     "webpack-cli": "^3.3.2", | ||||
|     "webpack-merge": "^4.2.1", | ||||
|     "websocket.js": "^0.1.12" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "babel-eslint": "^10.0.1", | ||||
|     "babel-jest": "^24.5.0", | ||||
|     "babel-jest": "^24.8.0", | ||||
|     "enzyme": "^3.8.0", | ||||
|     "enzyme-adapter-react-16": "^1.7.1", | ||||
|     "eslint": "^5.11.1", | ||||
|     "eslint-plugin-import": "~2.14.0", | ||||
|     "eslint-plugin-jsx-a11y": "~6.1.2", | ||||
|     "eslint-plugin-promise": "~4.0.1", | ||||
|     "eslint-plugin-jsx-a11y": "~6.2.1", | ||||
|     "eslint-plugin-promise": "~4.1.1", | ||||
|     "eslint-plugin-react": "~7.12.1", | ||||
|     "jest": "^24.5.0", | ||||
|     "jest": "^24.8.0", | ||||
|     "raf": "^3.4.1", | ||||
|     "react-intl-translations-manager": "^5.0.3", | ||||
|     "react-test-renderer": "^16.7.0", | ||||
|     "webpack-dev-server": "^3.2.1", | ||||
|     "webpack-dev-server": "^3.5.1", | ||||
|     "yargs": "^12.0.5" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -105,7 +105,7 @@ RSpec.describe NotifyService, type: :service do | ||||
|     end | ||||
|  | ||||
|     it 'shows reblogs when disabled' do | ||||
|       recipient.follow!(sender, reblogs: true) | ||||
|       recipient.follow!(sender, reblogs: false) | ||||
|       is_expected.to change(Notification, :count) | ||||
|     end | ||||
|   end | ||||
|   | ||||
		Reference in New Issue
	
	Block a user