]> cat aescling's git repositories - mastodon.git/commitdiff
Merge upstream 2.0ish #165
authorkibigo! <marrus-sh@users.noreply.github.com>
Wed, 11 Oct 2017 17:43:10 +0000 (10:43 -0700)
committerkibigo! <marrus-sh@users.noreply.github.com>
Wed, 11 Oct 2017 17:43:10 +0000 (10:43 -0700)
44 files changed:
1  2 
app/javascript/mastodon/actions/compose.js
app/javascript/mastodon/components/column_header.js
app/javascript/mastodon/components/media_gallery.js
app/javascript/mastodon/components/status.js
app/javascript/mastodon/components/status_content.js
app/javascript/mastodon/components/status_list.js
app/javascript/mastodon/containers/mastodon.js
app/javascript/mastodon/features/compose/components/compose_form.js
app/javascript/mastodon/features/compose/components/search_results.js
app/javascript/mastodon/features/compose/index.js
app/javascript/mastodon/features/home_timeline/index.js
app/javascript/mastodon/features/notifications/components/notification.js
app/javascript/mastodon/features/notifications/containers/notification_container.js
app/javascript/mastodon/features/notifications/index.js
app/javascript/mastodon/features/status/components/detailed_status.js
app/javascript/mastodon/features/status/index.js
app/javascript/mastodon/features/ui/components/column_link.js
app/javascript/mastodon/features/ui/components/modal_root.js
app/javascript/mastodon/features/ui/index.js
app/javascript/mastodon/features/ui/util/async-components.js
app/javascript/mastodon/locales/defaultMessages.json
app/javascript/mastodon/reducers/compose.js
app/javascript/mastodon/reducers/notifications.js
app/javascript/mastodon/reducers/settings.js
app/javascript/packs/public.js
app/javascript/styles/accounts.scss
app/javascript/styles/components.scss
app/lib/feed_manager.rb
app/lib/user_settings_decorator.rb
app/models/account.rb
app/models/media_attachment.rb
app/models/mute.rb
app/models/status.rb
app/models/stream_entry.rb
app/services/mute_service.rb
app/views/about/more.html.haml
app/views/about/show.html.haml
app/views/layouts/error.html.haml
config/application.rb
config/environments/production.rb
config/routes.rb
config/webpack/loaders/babel.js
config/webpack/shared.js
db/schema.rb

index e0042b055a0f64b338826574b4b4aad774f014e0,e4fa8fa7a7f5caa4f9a7592a199a6ca85a3f04ec..c47296a516e6a7f4608cf1fe398d706017ca15c6
@@@ -173,34 -135,17 +173,34 @@@ export default class ColumnHeader exten
  
      return (
        <div className={wrapperClassName}>
-         <h1 tabIndex={focusable && '0'} role='button' className={buttonClassName} aria-label={title} onClick={this.handleTitleClick}>
+         <h1 tabIndex={focusable ? 0 : null} role='button' className={buttonClassName} aria-label={title} onClick={this.handleTitleClick}>
            <i className={`fa fa-fw fa-${icon} column-header__icon`} />
            {title}
 -
            <div className='column-header__buttons'>
              {backButton}
 +            { notifCleaning ? (
 +              <button
 +                aria-label={msgEnterNotifCleaning}
 +                title={msgEnterNotifCleaning}
 +                onClick={this.onEnterCleaningMode}
 +                className={notifCleaningButtonClassName}
 +              >
 +                <i className='fa fa-eraser' />
 +              </button>
 +            ) : null}
              {collapseButton}
            </div>
          </h1>
  
-         <div className={collapsibleClassName} tabIndex={collapsed && -1} onTransitionEnd={this.handleTransitionEnd}>
 +        { notifCleaning ? (
 +          <div className={notifCleaningDrawerClassName} onTransitionEnd={this.handleTransitionEndNCD}>
 +            <div className='column-header__collapsible-inner nopad-drawer'>
 +              {(notifCleaningActive || animatingNCD) ? (<NotificationPurgeButtonsContainer />) : null }
 +            </div>
 +          </div>
 +        ) : null}
 +
+         <div className={collapsibleClassName} tabIndex={collapsed ? -1 : null} onTransitionEnd={this.handleTransitionEnd}>
            <div className='column-header__collapsible-inner'>
              {(!collapsed || animating) && collapsedContent}
            </div>
index cae4ca412a5cfefdddbe4342d7312e7498b7b19c,8350d20a5b41c04914aadbc22dc7a6bb1b637c76..a3e68643feb8e11a7ded2075d3a7ad4ae8449189
@@@ -2,8 -2,8 +2,8 @@@ import React from 'react'
  import ImmutablePropTypes from 'react-immutable-proptypes';
  import { FormattedMessage } from 'react-intl';
  import AccountContainer from '../../../containers/account_container';
 -import StatusContainer from '../../../containers/status_container';
 +import StatusContainer from '../../../../glitch/components/status/container';
- import Link from 'react-router-dom/Link';
+ import { Link } from 'react-router-dom';
  import ImmutablePureComponent from 'react-immutable-pure-component';
  
  export default class SearchResults extends ImmutablePureComponent {
index f0bce1e408fe11eade8e4dfe2ecaf9b43d9aeaaa,6166fce3cbd34f951a8ffd09f1f1d61a95c690cc..9068648bdb2437eb490e9106e71ae8bf3a8c03e7
@@@ -5,9 -5,7 +5,9 @@@ import PropTypes from 'prop-types'
  import ImmutablePropTypes from 'react-immutable-proptypes';
  import { connect } from 'react-redux';
  import { mountCompose, unmountCompose } from '../../actions/compose';
- import Link from 'react-router-dom/Link';
 +import { openModal } from '../../actions/modal';
 +import { changeLocalSetting } from '../../../glitch/actions/local_settings';
+ import { Link } from 'react-router-dom';
  import { injectIntl, defineMessages } from 'react-intl';
  import SearchContainer from './containers/search_container';
  import Motion from 'react-motion/lib/Motion';
index 232eccf7016c090d400f6d33e9e3ed47ceaf2d7a,4fd1c2ec0befe9ad3aebd3d7c373ce912d510f8a..816f83e45cc840706dd49381ee56a321e87303f1
@@@ -3,11 -3,10 +3,11 @@@ import PropTypes from 'prop-types'
  import ImmutablePropTypes from 'react-immutable-proptypes';
  import Avatar from '../../../components/avatar';
  import DisplayName from '../../../components/display_name';
 -import StatusContent from '../../../components/status_content';
 -import MediaGallery from '../../../components/media_gallery';
 +import StatusContent from '../../../../glitch/components/status/content';
 +import StatusGallery from '../../../../glitch/components/status/gallery';
 +import StatusPlayer from '../../../../glitch/components/status/player';
  import AttachmentList from '../../../components/attachment_list';
- import Link from 'react-router-dom/Link';
+ import { Link } from 'react-router-dom';
  import { FormattedDate, FormattedNumber } from 'react-intl';
  import CardContainer from '../containers/card_container';
  import ImmutablePureComponent from 'react-immutable-pure-component';
index fc45d5f211a00127b3b487ad4ad270accb3f22df,eed8ea2602ab0b3231fa1a573353609b01cd7032..fff5f529ce0bfc3fd9a3271731e2cc32af52e743
@@@ -183,30 -284,33 +286,34 @@@ export default class Status extends Imm
          <ColumnBackButton />
  
          <ScrollContainer scrollKey='thread'>
-           <div className='scrollable detailed-status__wrapper'>
+           <div className='scrollable detailed-status__wrapper' ref={this.setRef}>
              {ancestors}
  
-             <DetailedStatus
-               status={status}
-               settings={settings}
-               autoPlayGif={autoPlayGif}
-               me={me}
-               onOpenVideo={this.handleOpenVideo}
-               onOpenMedia={this.handleOpenMedia}
-             />
-             <ActionBar
-               status={status}
-               me={me}
-               onReply={this.handleReplyClick}
-               onFavourite={this.handleFavouriteClick}
-               onReblog={this.handleReblogClick}
-               onDelete={this.handleDeleteClick}
-               onMention={this.handleMentionClick}
-               onReport={this.handleReport}
-               onPin={this.handlePin}
-               onEmbed={this.handleEmbed}
-             />
+             <HotKeys handlers={handlers}>
+               <div className='focusable' tabIndex='0'>
+                 <DetailedStatus
+                   status={status}
++                  settings={settings}
+                   autoPlayGif={autoPlayGif}
+                   me={me}
+                   onOpenVideo={this.handleOpenVideo}
+                   onOpenMedia={this.handleOpenMedia}
+                 />
+                 <ActionBar
+                   status={status}
+                   me={me}
+                   onReply={this.handleReplyClick}
+                   onFavourite={this.handleFavouriteClick}
+                   onReblog={this.handleReblogClick}
+                   onDelete={this.handleDeleteClick}
+                   onMention={this.handleMentionClick}
+                   onReport={this.handleReport}
+                   onPin={this.handlePin}
+                   onEmbed={this.handleEmbed}
+                 />
+               </div>
+             </HotKeys>
  
              {descendants}
            </div>
index 62aab9a230fedcf5b4ab617d80199707d79d8dd0,5425219c4daf238dc44e761884c3fe27c6b919b1..b845d18957ded1e74089613439f43200bc553225
@@@ -1,8 -1,8 +1,8 @@@
  import React from 'react';
  import PropTypes from 'prop-types';
- import Link from 'react-router-dom/Link';
+ import { Link } from 'react-router-dom';
  
 -const ColumnLink = ({ icon, text, to, href, method }) => {
 +const ColumnLink = ({ icon, text, to, onClick, href, method }) => {
    if (href) {
      return (
        <a href={href} className='column-link' data-method={method}>
index 73bd23432dc35cd5125cb440a01b13dbf9e1013a,70e451373dff214cb3bbb7699d7dcc3c2825b676..14a5f62244264c333a7c0e18cfc79b67cca65ea8
@@@ -41,13 -41,10 +42,14 @@@ import { HotKeys } from 'react-hotkeys'
  
  // Dummy import, to make sure that <Status /> ends up in the application bundle.
  // Without this it ends up in ~8 very commonly used bundles.
 -import '../../components/status';
 +import '../../../glitch/components/status';
  
  const mapStateToProps = state => ({
 +  systemFontUi: state.getIn(['meta', 'system_font_ui']),
 +  layout: state.getIn(['local_settings', 'layout']),
 +  isWide: state.getIn(['local_settings', 'stretch']),
 +  navbarUnder: state.getIn(['local_settings', 'navbar_under']),
+   me: state.getIn(['meta', 'me']),
    isComposing: state.getIn(['compose', 'is_composing']),
  });
  
@@@ -62,11 -85,8 +90,12 @@@ export default class UI extends React.C
    static propTypes = {
      dispatch: PropTypes.func.isRequired,
      children: PropTypes.node,
 +    layout: PropTypes.string,
 +    isWide: PropTypes.bool,
 +    systemFontUi: PropTypes.bool,
 +    navbarUnder: PropTypes.bool,
      isComposing: PropTypes.bool,
+     me: PropTypes.string,
      location: PropTypes.object,
    };
  
  
    render () {
      const { width, draggingOver } = this.state;
 -    const { children } = this.props;
 +    const { children, layout, isWide, navbarUnder } = this.props;
 +
 +    const columnsClass = layout => {
 +      switch (layout) {
 +      case 'single':
 +        return 'single-column';
 +      case 'multiple':
 +        return 'multi-columns';
 +      default:
 +        return 'auto-columns';
 +      }
 +    };
 +
 +    const className = classNames('ui', columnsClass(layout), {
 +      'wide': isWide,
 +      'system-font': this.props.systemFontUi,
 +      'navbar-under': navbarUnder,
 +    });
  
+     const handlers = {
+       new: this.handleHotkeyNew,
+       search: this.handleHotkeySearch,
+       forceNew: this.handleHotkeyForceNew,
+       focusColumn: this.handleHotkeyFocusColumn,
+       back: this.handleHotkeyBack,
+       goToHome: this.handleHotkeyGoToHome,
+       goToNotifications: this.handleHotkeyGoToNotifications,
+       goToLocal: this.handleHotkeyGoToLocal,
+       goToFederated: this.handleHotkeyGoToFederated,
+       goToStart: this.handleHotkeyGoToStart,
+       goToFavourites: this.handleHotkeyGoToFavourites,
+       goToPinned: this.handleHotkeyGoToPinned,
+       goToProfile: this.handleHotkeyGoToProfile,
+       goToBlocked: this.handleHotkeyGoToBlocked,
+       goToMuted: this.handleHotkeyGoToMuted,
+     };
      return (
-       <div className={className} ref={this.setRef}>
-         {navbarUnder ? null : (<TabsBar />)}
-         <ColumnsAreaContainer ref={this.setColumnsAreaRef} singleColumn={isMobile(width, layout)}>
-           <WrappedSwitch>
-             <Redirect from='/' to='/getting-started' exact />
-             <WrappedRoute path='/getting-started' component={GettingStarted} content={children} />
-             <WrappedRoute path='/timelines/home' component={HomeTimeline} content={children} />
-             <WrappedRoute path='/timelines/public' exact component={PublicTimeline} content={children} />
-             <WrappedRoute path='/timelines/public/local' component={CommunityTimeline} content={children} />
-             <WrappedRoute path='/timelines/tag/:id' component={HashtagTimeline} content={children} />
-             <WrappedRoute path='/notifications' component={Notifications} content={children} />
-             <WrappedRoute path='/favourites' component={FavouritedStatuses} content={children} />
-             <WrappedRoute path='/pinned' component={PinnedStatuses} content={children} />
-             <WrappedRoute path='/statuses/new' component={Compose} content={children} />
-             <WrappedRoute path='/statuses/:statusId' exact component={Status} content={children} />
-             <WrappedRoute path='/statuses/:statusId/reblogs' component={Reblogs} content={children} />
-             <WrappedRoute path='/statuses/:statusId/favourites' component={Favourites} content={children} />
-             <WrappedRoute path='/accounts/:accountId' exact component={AccountTimeline} content={children} />
-             <WrappedRoute path='/accounts/:accountId/followers' component={Followers} content={children} />
-             <WrappedRoute path='/accounts/:accountId/following' component={Following} content={children} />
-             <WrappedRoute path='/accounts/:accountId/media' component={AccountGallery} content={children} />
-             <WrappedRoute path='/follow_requests' component={FollowRequests} content={children} />
-             <WrappedRoute path='/blocks' component={Blocks} content={children} />
-             <WrappedRoute path='/mutes' component={Mutes} content={children} />
-             <WrappedRoute component={GenericNotFound} content={children} />
-           </WrappedSwitch>
-         </ColumnsAreaContainer>
-         <NotificationsContainer />
-         {navbarUnder ? (<TabsBar />) : null}
-         <LoadingBarContainer className='loading-bar' />
-         <ModalContainer />
-         <UploadArea active={draggingOver} onClose={this.closeUploadModal} />
-       </div>
+       <HotKeys keyMap={keyMap} handlers={handlers} ref={this.setHotkeysRef}>
 -        <div className='ui' ref={this.setRef}>
 -          <TabsBar />
++        <div className={className} ref={this.setRef}>
++              {navbarUnder ? null : (<TabsBar />)}
 -          <ColumnsAreaContainer ref={this.setColumnsAreaRef} singleColumn={isMobile(width)}>
++          <ColumnsAreaContainer ref={this.setColumnsAreaRef} singleColumn={isMobile(width, layout)}>
+             <WrappedSwitch>
+               <Redirect from='/' to='/getting-started' exact />
+               <WrappedRoute path='/getting-started' component={GettingStarted} content={children} />
+               <WrappedRoute path='/timelines/home' component={HomeTimeline} content={children} />
+               <WrappedRoute path='/timelines/public' exact component={PublicTimeline} content={children} />
+               <WrappedRoute path='/timelines/public/local' component={CommunityTimeline} content={children} />
+               <WrappedRoute path='/timelines/tag/:id' component={HashtagTimeline} content={children} />
+               <WrappedRoute path='/notifications' component={Notifications} content={children} />
+               <WrappedRoute path='/favourites' component={FavouritedStatuses} content={children} />
+               <WrappedRoute path='/pinned' component={PinnedStatuses} content={children} />
+               <WrappedRoute path='/statuses/new' component={Compose} content={children} />
+               <WrappedRoute path='/statuses/:statusId' exact component={Status} content={children} />
+               <WrappedRoute path='/statuses/:statusId/reblogs' component={Reblogs} content={children} />
+               <WrappedRoute path='/statuses/:statusId/favourites' component={Favourites} content={children} />
+               <WrappedRoute path='/accounts/:accountId' exact component={AccountTimeline} content={children} />
+               <WrappedRoute path='/accounts/:accountId/followers' component={Followers} content={children} />
+               <WrappedRoute path='/accounts/:accountId/following' component={Following} content={children} />
+               <WrappedRoute path='/accounts/:accountId/media' component={AccountGallery} content={children} />
+               <WrappedRoute path='/follow_requests' component={FollowRequests} content={children} />
+               <WrappedRoute path='/blocks' component={Blocks} content={children} />
+               <WrappedRoute path='/mutes' component={Mutes} content={children} />
+               <WrappedRoute component={GenericNotFound} content={children} />
+             </WrappedSwitch>
+           </ColumnsAreaContainer>
+           <NotificationsContainer />
++              {navbarUnder ? (<TabsBar />) : null}
+           <LoadingBarContainer className='loading-bar' />
+           <ModalContainer />
+           <UploadArea active={draggingOver} onClose={this.closeUploadModal} />
+         </div>
+       </HotKeys>
      );
    }
  
index ecce8dcb6e7eb2f71a353516e9df6492734c4929,cccf00a1f74a4ccb44141282e742ee12e0516a29..48850ab01050292f2c0344d2616a62d50690eda6
@@@ -8,14 -8,11 +8,17 @@@ import 
    NOTIFICATIONS_EXPAND_FAIL,
    NOTIFICATIONS_CLEAR,
    NOTIFICATIONS_SCROLL_TOP,
 +  NOTIFICATIONS_DELETE_MARKED_REQUEST,
 +  NOTIFICATIONS_DELETE_MARKED_SUCCESS,
 +  NOTIFICATION_MARK_FOR_DELETE,
 +  NOTIFICATIONS_DELETE_MARKED_FAIL,
 +  NOTIFICATIONS_ENTER_CLEARING_MODE,
 +  NOTIFICATIONS_MARK_ALL_FOR_DELETE,
  } from '../actions/notifications';
- import { ACCOUNT_BLOCK_SUCCESS } from '../actions/accounts';
+ import {
+   ACCOUNT_BLOCK_SUCCESS,
+   ACCOUNT_MUTE_SUCCESS,
+ } from '../actions/accounts';
  import { TIMELINE_DELETE } from '../actions/timelines';
  import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
  
index 1bdee73561c47bac6f788e56b05bdb4db59fefa8,a9f3f95296f14f7e3d56bd48a66c1055283113ff..0c0dae388d3cd82b3e5bfbd9a9bb4100baada0f1
@@@ -5,9 -6,12 +6,13 @@@ import { Map as ImmutableMap, fromJS } 
  import uuid from '../uuid';
  
  const initialState = ImmutableMap({
+   saved: true,
    onboarded: false,
 +  layout: 'auto',
  
+   skinTone: 1,
    home: ImmutableMap({
      shows: ImmutableMap({
        reblog: true,
Simple merge
Simple merge
index 2f02af09813397a03d775a9509009bbb990134bd,b6da70c913153eb4684c3fae41ab9d0c1b944417..8ecc0b91bb9dd0dcae1a317717b4ce3d34c066c4
  }
  
  .status__prepend-icon-wrapper {
 -  left: -26px;
 -  position: absolute;
 +  float: left;
 +  margin: 0 10px 0 -58px;
 +  width: 48px;
 +  text-align: right;
 +}
 +
 +.notif-cleaning {
 +  .status, .notification-follow {
 +    padding-right: ($dismiss-overlay-width + 0.5rem);
 +  }
 +}
 +
 +.notification-follow {
 +  position: relative;
 +
 +  // same like Status
 +  border-bottom: 1px solid lighten($ui-base-color, 8%);
 +
 +  .account {
 +    border-bottom: 0 none;
 +  }
  }
  
+ .focusable {
+   &:focus {
+     outline: 0;
+     background: lighten($ui-base-color, 4%);
+     &.status-direct {
+       background: lighten($ui-base-color, 12%);
+     }
+     .detailed-status,
+     .detailed-status__action-bar {
+       background: lighten($ui-base-color, 8%);
+     }
+   }
+ }
  .status {
    padding: 8px 10px;
 -  padding-left: 68px;
    position: relative;
 +  height: auto;
    min-height: 48px;
    border-bottom: 1px solid lighten($ui-base-color, 8%);
    cursor: default;
    }
  }
  
 -.status__display-name,
 -.reply-indicator__display-name,
 -.detailed-status__display-name,
 -.account__display-name {
 -  &:hover strong {
 -    text-decoration: underline;
 -  }
 -}
 -
+ .muted {
+   .emojione {
+     opacity: 0.5;
+   }
+ }
  .account__display-name strong {
    display: block;
+   overflow: hidden;
+   text-overflow: ellipsis;
  }
  
  .detailed-status__application,
Simple merge
Simple merge
Simple merge
index 65ff893a802c7826898c823d86e72dfac497f04a,60380198b34e2c4422c5ca82f3303eccaa272264..f6c8879c5fdaaebe6c4bdcabb7fc659d3801331b
@@@ -157,9 -139,13 +160,13 @@@ class MediaAttachment < ApplicationReco
      end
    end
  
+   def prepare_description
+     self.description = description.strip[0...420] unless description.nil?
+   end
    def set_type_and_extension
 -    self.type = VIDEO_MIME_TYPES.include?(file_content_type) ? :video : :image
 -    extension = appropriate_extension
 +    self.type = VIDEO_MIME_TYPES.include?(file_content_type) ? :video : AUDIO_MIME_TYPES.include?(file_content_type) ? :audio : :image
 +    extension = AUDIO_MIME_TYPES.include?(file_content_type) ? '.mp4' : appropriate_extension
      basename  = Paperclip::Interpolations.basename(file, :original)
      file.instance_write :file_name, [basename, extension].delete_if(&:blank?).join('.')
    end
index 0d597a2752bbeb107686e55708afa3acc05adc2b,6e64848c7661c6fc05bb00f4c9c939479d8444f2..bcd3d247c8f97cee8b1590aa299a6145629cf30c
@@@ -3,12 -3,11 +3,12 @@@
  #
  # Table name: mutes
  #
- #  id                 :integer          not null, primary key
- #  account_id         :integer          not null
- #  target_account_id  :integer          not null
 -#  created_at        :datetime         not null
 -#  updated_at        :datetime         not null
 -#  account_id        :integer          not null
 -#  id                :integer          not null, primary key
 -#  target_account_id :integer          not null
 +#  created_at         :datetime         not null
 +#  updated_at         :datetime         not null
++#  account_id         :integer          not null
++#  id                 :integer          not null, primary key
++#  target_account_id  :integer          not null
 +#  hide_notifications :boolean          default(TRUE), not null
  #
  
  class Mute < ApplicationRecord
Simple merge
Simple merge
index 56cbebd5dc61a102b94df7145c2c41fa3f48ba2f,132369484d7101d698e50c5532acda62d46f75d8..a9a02937e52077dd3133c5e61b1b541e6e62a372
@@@ -1,9 -1,10 +1,10 @@@
  # frozen_string_literal: true
  
  class MuteService < BaseService
 -  def call(account, target_account)
 +  def call(account, target_account, notifications: nil)
      return if account.id == target_account.id
-     FeedManager.instance.clear_from_timeline(account, target_account)
 -    mute = account.mute!(target_account)
 +    account.mute!(target_account, notifications: notifications)
+     BlockWorker.perform_async(account.id, target_account.id)
+     mute
    end
  end
Simple merge
Simple merge
index 8b260c619218779c251af091880df0d3b6f8370d,37359b89b95dc1eea11f04d69863ada25d676c78..d0eae44346c67bf43dce0f378232d9754605a5a6
@@@ -3,12 -3,12 +3,12 @@@
    %head
      %meta{ content: 'text/html; charset=UTF-8', 'http-equiv' => 'Content-Type' }/
      %meta{ charset: 'utf-8' }/
-     %title= safe_join([yield(:page_title), title], ' - ')
+     %title= safe_join([yield(:page_title), Setting.default_settings['site_title']], ' - ')
      %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/
      = stylesheet_pack_tag 'common', media: 'all'
 -    = stylesheet_pack_tag Setting.default_settings['theme'], media: 'all'
 +    = stylesheet_pack_tag 'application', integrity: true, media: 'all'
    %body.error
      .dialog
-       %img{ alt: title, src: '/oops.gif' }/
+       %img{ alt: Setting.default_settings['site_title'], src: '/oops.gif' }/
        %div
          %h1= yield :content
index db53b8c84065100f0545ac860ae401280c2ea351,4860a08a1e8d4725d54b2869b4c21099e950ea76..4e8a5875dc62a91303b72587fa42faa34c3013bd
@@@ -9,7 -9,7 +9,8 @@@ Bundler.require(*Rails.groups
  require_relative '../app/lib/exceptions'
  require_relative '../lib/paperclip/gif_transcoder'
  require_relative '../lib/paperclip/video_transcoder'
 +require_relative '../lib/paperclip/audio_transcoder'
+ require_relative '../lib/mastodon/snowflake'
  require_relative '../lib/mastodon/version'
  
  Dotenv::Railtie.load
index dc1ce5ed66a64715fa0a47918aed5c94893570a1,5705ffcfe9e4bdfe472b6bc6e9e21b63f4df4292..e0ee393c1224985b6c906e3cf1b8da838c7862c3
@@@ -90,18 -90,10 +90,13 @@@ Rails.application.configure d
  
    config.action_mailer.delivery_method = ENV.fetch('SMTP_DELIVERY_METHOD', 'smtp').to_sym
  
-   config.to_prepare do
-     StatsD.backend = StatsD::Instrument::Backends::NullBackend.new if ENV['STATSD_ADDR'].blank?
-     Sidekiq::Logging.logger.level = Logger::WARN
-   end
    config.action_dispatch.default_headers = {
 -    'Server'                 => 'Mastodon',
 -    'X-Frame-Options'        => 'DENY',
 -    'X-Content-Type-Options' => 'nosniff',
 -    'X-XSS-Protection'       => '1; mode=block',
 +    'Server'                  => 'Mastodon',
 +    'X-Frame-Options'         => 'DENY',
 +    'X-Content-Type-Options'  => 'nosniff',
 +    'X-XSS-Protection'        => '1; mode=block',
 +    'Content-Security-Policy' => "frame-ancestors 'none'; object-src 'none'; script-src 'self' https://dev-static.glitch.social 'unsafe-inline'; base-uri 'none';" , 
 +    'Referrer-Policy'         => 'no-referrer, strict-origin-when-cross-origin',
 +    'Strict-Transport-Security' => 'max-age=63072000; includeSubDomains; preload'
    }
  end
index 2c41c24e9402cd0770d262f2c963466525bcac0e,5a6351f7795a5aaf00b04719c23aab0af8e39681..9ed081e508cf971f01a81aa68011a8b7a0d89ae8
@@@ -193,14 -204,9 +204,13 @@@ Rails.application.routes.draw d
        get '/search', to: 'search#index', as: :search
  
        resources :follows,    only: [:create]
-       resources :media,      only: [:create]
-       resources :apps,       only: [:create]
+       resources :media,      only: [:create, :update]
        resources :blocks,     only: [:index]
 -      resources :mutes,      only: [:index]
 +      resources :mutes,      only: [:index] do
 +        collection do 
 +          get 'details'
 +        end
 +      end
        resources :favourites, only: [:index]
        resources :reports,    only: [:index, :create]
  
index 989a87dcfe7fde50b1ea6b539e1294972ea1e154,e17d2fa7013ba5fc6812379ff253245654804185..770c89aa703d3d36c2c32808ef0d3a0e3d60fc56
@@@ -4,15 -4,10 +4,11 @@@ const env = process.env.NODE_ENV || 'de
  
  module.exports = {
    test: /\.js$/,
-   // include react-intl because transform-react-remove-prop-types needs to apply to it
-   exclude: {
-     test: /node_modules/,
-     exclude: /react-intl[\/\\](?!locale-data)/,
-   },
+   exclude: /node_modules/,
    loader: 'babel-loader',
    options: {
 -    forceEnv: env,
 +    forceEnv: process.env.NODE_ENV || 'development',
 +    sourceRoot: 'app/javascript',
      cacheDirectory: env === 'development' ? false : resolve(__dirname, '..', '..', '..', 'tmp', 'cache', 'babel-loader'),
    },
  };
index 99f4dec1a970f93613232f14520207d88f657056,cd642a28ab30dd0212f48a01f57024b8771e9ec9..e3a1fc379a2da76e619eae620d888bd29e434040
@@@ -50,10 -48,14 +50,17 @@@ module.exports = 
  
    plugins: [
      new webpack.EnvironmentPlugin(JSON.parse(JSON.stringify(env))),
 -    new ExtractTextPlugin(env.NODE_ENV === 'production' ? '[name]-[hash].css' : '[name].css'),
+     new webpack.NormalModuleReplacementPlugin(
+       /^history\//, (resource) => {
+         // temporary fix for https://github.com/ReactTraining/react-router/issues/5576
+         // to reduce bundle size
+         resource.request = resource.request.replace(/^history/, 'history/es');
+       }
+     ),
 +    new ExtractTextPlugin({
 +      filename: env.NODE_ENV === 'production' ? '[name]-[hash].css' : '[name].css',
 +      allChunks: true,
 +    }),
      new ManifestPlugin({
        publicPath: output.publicPath,
        writeToFileEmit: true,
diff --cc db/schema.rb
index 6b73ebb943322cec3a65a0a75f1c9313c99e0fe3,f9722ccda0f958655708d3acb8295e46222587a5..128f51ee7e58430035fc8bb858079795d22b9bbd
@@@ -176,11 -196,10 +196,11 @@@ ActiveRecord::Schema.define(version: 20
    end
  
    create_table "mutes", force: :cascade do |t|
-     t.bigint "account_id", null: false
-     t.bigint "target_account_id", null: false
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
 +    t.boolean "hide_notifications", default: true, null: false
+     t.bigint "account_id", null: false
+     t.bigint "target_account_id", null: false
      t.index ["account_id", "target_account_id"], name: "index_mutes_on_account_id_and_target_account_id", unique: true
    end
  
This page took 0.162808 seconds and 3 git commands to generate.