mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/DiscussionTools
synced 2024-11-28 10:11:45 +00:00
2f1e2f80e0
For logged out users we store their test state and an anonymous identifier in local storage. So long as the test is enabled, we include these in any logging that occurs. This is done entirely client-side, to avoid any cache issues caused by state depending on cookies from PHP for logged out users. Bug: T291307 Change-Id: Ib39e2f2146cdfdac9df5690ee3de75718f0f2731
79 lines
2.5 KiB
JavaScript
79 lines
2.5 KiB
JavaScript
var controller = require( './controller.js' ),
|
|
config = require( './config.json' ),
|
|
uri = new mw.Uri();
|
|
|
|
/**
|
|
* @class mw.dt
|
|
* @singleton
|
|
*/
|
|
mw.dt = {};
|
|
|
|
mw.dt.initState = {};
|
|
|
|
// New Topic A/B test for logged out users:
|
|
var tokenData = mw.storage.getObject( 'DTNewTopicABToken' );
|
|
if ( tokenData && tokenData.expires < Date.now() ) {
|
|
mw.storage.remove( 'DTNewTopicABToken' );
|
|
tokenData = null;
|
|
}
|
|
if ( mw.user.isAnon() && mw.config.get( 'wgDiscussionToolsABTest' ) ) {
|
|
if ( !tokenData ) {
|
|
tokenData = {
|
|
token: mw.user.generateRandomSessionId(),
|
|
// 90 days
|
|
expires: Date.now() + 90 * 24 * 60 * 60 * 1000
|
|
};
|
|
mw.storage.setObject( 'DTNewTopicABToken', tokenData );
|
|
}
|
|
mw.config.set( 'wgDiscussionToolsAnonymousUserId', tokenData.token );
|
|
var anonid = parseInt( tokenData.token.slice( 0, 8 ), 16 );
|
|
var abstate = anonid % 2 === 0 ? 'test' : 'control';
|
|
mw.config.set( 'wgDiscussionToolsABTestBucket', abstate );
|
|
var featuresEnabled = mw.config.get( 'wgDiscussionToolsFeaturesEnabled' ) || {};
|
|
if ( abstate === 'test' ) {
|
|
$( document.body ).addClass( 'ext-discussiontools-newtopictool-enabled' );
|
|
featuresEnabled.newtopictool = true;
|
|
} else {
|
|
$( document.body ).removeClass( 'ext-discussiontools-newtopictool-enabled' );
|
|
featuresEnabled.newtopictool = false;
|
|
}
|
|
}
|
|
|
|
if ( uri.query.dtrepliedto ) {
|
|
// If we had to reload the page to highlight the new comment, extract that data from the URL and
|
|
// clean it up.
|
|
mw.dt.initState.repliedTo = uri.query.dtrepliedto;
|
|
if ( window.history.replaceState ) {
|
|
delete uri.query.dtrepliedto;
|
|
window.history.replaceState( {}, '', uri.toString() );
|
|
}
|
|
}
|
|
|
|
mw.dt.init = function ( $container ) {
|
|
if ( $container.is( '#mw-content-text' ) || $container.find( '#mw-content-text' ).length ) {
|
|
// eslint-disable-next-line no-jquery/no-global-selector
|
|
controller.init( $( '#mw-content-text' ), mw.dt.initState );
|
|
// Reset for next init
|
|
mw.dt.initState = {};
|
|
}
|
|
};
|
|
|
|
if ( uri.query.dtdebug ) {
|
|
mw.loader.load( 'ext.discussionTools.debug' );
|
|
} else {
|
|
// Don't use an anonymous function, because ReplyWidget needs to be able to remove this handler
|
|
mw.hook( 'wikipage.content' ).add( mw.dt.init );
|
|
}
|
|
|
|
module.exports = {
|
|
controller: controller,
|
|
Parser: require( './Parser.js' ),
|
|
modifier: require( './modifier.js' ),
|
|
ThreadItem: require( './ThreadItem.js' ),
|
|
HeadingItem: require( './HeadingItem.js' ),
|
|
CommentItem: require( './CommentItem.js' ),
|
|
utils: require( './utils.js' ),
|
|
logger: require( './logger.js' ),
|
|
config: config
|
|
};
|