Add languages to client side state, and add "current" to json repr

This commit is contained in:
Samy Pesse
2016-10-14 23:05:37 +02:00
parent b63b0cc50d
commit f262a7cd89
10 changed files with 94 additions and 5 deletions
+2 -2
View File
@@ -35,7 +35,7 @@ class File extends Record(DEFAULTS) {
/**
* Return true if file is an instance of File
* @param {Mixed} file
* @return {Boolean}
* @return {Boolean} isFile
*/
static is(file) {
return (file instanceof File);
@@ -44,7 +44,7 @@ class File extends Record(DEFAULTS) {
/**
* Create a file instance
* @param {Mixed|File} file
* @return {File}
* @return {File} file
*/
static create(file) {
return File.is(file) ?
@@ -0,0 +1,12 @@
const { Record } = require('immutable');
const DEFAULTS = {
id: null,
title: null
};
class Language extends Record(DEFAULTS) {
}
module.exports = Language;
@@ -0,0 +1,40 @@
const { Record, List } = require('immutable');
const Language = require('./Language');
const File = require('./File');
const DEFAULTS = {
current: String(),
file: new File(),
list: List()
};
class Languages extends Record(DEFAULTS) {
constructor(spec = {}) {
super({
...spec,
file: File.create(spec.file),
list: List(spec.list).map(lang => new Language(lang))
});
}
/**
* Return true if file is an instance of Languages
* @param {Mixed} langs
* @return {Boolean}
*/
static is(langs) {
return (langs instanceof Languages);
}
/**
* Create a Languages instance
* @param {Mixed|Languages} langs
* @return {Languages}
*/
static create(langs) {
return Languages.is(langs) ?
langs : new Languages(langs);
}
}
module.exports = Languages;
+2 -1
View File
@@ -10,5 +10,6 @@ module.exports = composeReducer(
createReducer('file', require('./file')),
createReducer('page', require('./page')),
createReducer('summary', require('./summary')),
createReducer('readme', require('./readme'))
createReducer('readme', require('./readme')),
createReducer('languages', require('./languages'))
);
@@ -0,0 +1,12 @@
const Languages = require('../models/Languages');
module.exports = (state, action) => {
state = Languages.create(state);
switch (action.type) {
default:
return state;
}
};
@@ -0,0 +1,7 @@
const React = require('react');
const { string, shape } = React.PropTypes;
module.exports = shape({
id: string.isRequired,
title: string.isRequired
});
@@ -0,0 +1,12 @@
const React = require('react');
const { listOf } = require('react-immutable-proptypes');
const { shape, string } = React.PropTypes;
const fileShape = require('./File');
const languageShape = require('./Language');
module.exports = shape({
current: string.isRequired,
file: fileShape.isRequired,
list: listOf(languageShape).isRequired
});
@@ -9,6 +9,8 @@ module.exports = {
Page: require('./Page'),
File: require('./File'),
History: require('./History'),
Language: require('./Language'),
Languages: require('./Languages'),
Location: require('./Location'),
Readme: require('./Readme'),
Summary: require('./Summary'),
+3 -1
View File
@@ -4,15 +4,17 @@ const encodeFile = require('./encodeFile');
* Encode a languages listing to JSON
*
* @param {Languages} languages
* @param {String} currentLanguage
* @param {URIIndex} urls
* @return {JSON} json
*/
function encodeLanguages(languages, urls) {
function encodeLanguages(languages, currentLanguage, urls) {
const file = languages.getFile();
const list = languages.getList();
return {
file: encodeFile(file, urls),
current: currentLanguage,
list: list
.valueSeq()
.map(function(lang) {
+2 -1
View File
@@ -31,7 +31,8 @@ function encodeStateToJSON(output, page) {
glossary: encodeGlossary(book.getGlossary(), urls),
readme: encodeReadme(book.getReadme(), urls),
config: book.getConfig().getValues().toJS(),
languages: book.isMultilingual() ? encodeLanguages(book.getLanguages(), urls) : undefined,
languages: book.isMultilingual() ?
encodeLanguages(book.getLanguages(), book.getLanguage(), urls) : undefined,
page: page ? encodePage(page, book.getSummary(), urls) : undefined,
file: page ? encodeFile(page.getFile(), urls) : undefined