@ -2,7 +2,10 @@ import { importFetchedStatus, importFetchedStatuses } from './importer';
import api , { getLinks } from 'flavours/glitch/util/api' ;
import api , { getLinks } from 'flavours/glitch/util/api' ;
import { Map as ImmutableMap , List as ImmutableList } from 'immutable' ;
import { Map as ImmutableMap , List as ImmutableList } from 'immutable' ;
import compareId from 'flavours/glitch/util/compare_id' ;
import compareId from 'flavours/glitch/util/compare_id' ;
import { usePendingItems as preferPendingItems } from 'flavours/glitch/util/initial_state' ;
import { me , usePendingItems as preferPendingItems } from 'flavours/glitch/util/initial_state' ;
import { getFiltersRegex } from 'flavours/glitch/selectors' ;
const domParser = new DOMParser ( ) ;
export const TIMELINE _UPDATE = 'TIMELINE_UPDATE' ;
export const TIMELINE _UPDATE = 'TIMELINE_UPDATE' ;
export const TIMELINE _DELETE = 'TIMELINE_DELETE' ;
export const TIMELINE _DELETE = 'TIMELINE_DELETE' ;
@ -17,17 +20,31 @@ export const TIMELINE_LOAD_PENDING = 'TIMELINE_LOAD_PENDING';
export const TIMELINE _DISCONNECT = 'TIMELINE_DISCONNECT' ;
export const TIMELINE _DISCONNECT = 'TIMELINE_DISCONNECT' ;
export const TIMELINE _CONNECT = 'TIMELINE_CONNECT' ;
export const TIMELINE _CONNECT = 'TIMELINE_CONNECT' ;
const searchTextFromRawStatus = ( status ) => {
const spoilerText = status . spoiler _text || '' ;
const searchContent = ( [ spoilerText , status . content ] . concat ( ( status . poll && status . poll . options ) ? status . poll . options . map ( option => option . title ) : [ ] ) ) . join ( '\n\n' ) . replace ( /<br\s*\/?>/g , '\n' ) . replace ( /<\/p><p>/g , '\n\n' ) ;
return domParser . parseFromString ( searchContent , 'text/html' ) . documentElement . textContent ;
}
export const loadPending = timeline => ( {
export const loadPending = timeline => ( {
type : TIMELINE _LOAD _PENDING ,
type : TIMELINE _LOAD _PENDING ,
timeline ,
timeline ,
} ) ;
} ) ;
export function updateTimeline ( timeline , status , accept ) {
export function updateTimeline ( timeline , status , accept ) {
return dispatch => {
return ( dispatch , getState ) => {
if ( typeof accept === 'function' && ! accept ( status ) ) {
if ( typeof accept === 'function' && ! accept ( status ) ) {
return ;
return ;
}
}
const dropRegex = getFiltersRegex ( getState ( ) , { contextType : timeline } ) [ 0 ] ;
if ( dropRegex && status . account . id !== me ) {
if ( dropRegex . test ( searchTextFromRawStatus ( status ) ) ) {
return ;
}
}
dispatch ( importFetchedStatus ( status ) ) ;
dispatch ( importFetchedStatus ( status ) ) ;
dispatch ( {
dispatch ( {
@ -96,8 +113,13 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) {
api ( getState ) . get ( path , { params } ) . then ( response => {
api ( getState ) . get ( path , { params } ) . then ( response => {
const next = getLinks ( response ) . refs . find ( link => link . rel === 'next' ) ;
const next = getLinks ( response ) . refs . find ( link => link . rel === 'next' ) ;
dispatch ( importFetchedStatuses ( response . data ) ) ;
dispatch ( expandTimelineSuccess ( timelineId , response . data , next ? next . uri : null , response . status === 206 , isLoadingRecent , isLoadingMore , isLoadingRecent && preferPendingItems ) ) ;
const dropRegex = getFiltersRegex ( getState ( ) , { contextType : timelineId } ) [ 0 ] ;
const statuses = dropRegex ? response . data . filter ( status => status . account . id === me || ! dropRegex . test ( searchTextFromRawStatus ( status ) ) ) : response . data ;
dispatch ( importFetchedStatuses ( statuses ) ) ;
dispatch ( expandTimelineSuccess ( timelineId , statuses , next ? next . uri : null , response . status === 206 , isLoadingRecent , isLoadingMore , isLoadingRecent && preferPendingItems ) ) ;
done ( ) ;
done ( ) ;
} ) . catch ( error => {
} ) . catch ( error => {
dispatch ( expandTimelineFail ( timelineId , error , isLoadingMore ) ) ;
dispatch ( expandTimelineFail ( timelineId , error , isLoadingMore ) ) ;