Put I18n directly into view controllers
This commit is contained in:
parent
b1843c688c
commit
c243928d23
|
@ -1,7 +1,10 @@
|
||||||
|
import { I18n } from '../i18n';
|
||||||
|
|
||||||
export class ViewController {
|
export class ViewController {
|
||||||
constructor(state, viewName, defaultState = {}) {
|
constructor(state, viewName, defaultState = {}) {
|
||||||
// Store the global app state so it's accessible but out of the way.
|
// Store the global app state so it's accessible but out of the way.
|
||||||
this.appState = state;
|
this.appState = state;
|
||||||
|
this.i18n = new I18n(this.appState);
|
||||||
|
|
||||||
// Give this view its own state within the appState.
|
// Give this view its own state within the appState.
|
||||||
if (!this.appState.viewStates.hasOwnProperty(viewName)) {
|
if (!this.appState.viewStates.hasOwnProperty(viewName)) {
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
import html from 'choo/html';
|
import html from 'choo/html';
|
||||||
|
|
||||||
import { I18n } from '../../i18n';
|
|
||||||
import './styles.scss'; // Creates a separate CSS file, but allows better code splitting.
|
import './styles.scss'; // Creates a separate CSS file, but allows better code splitting.
|
||||||
// We'll see if code splitting is worth it in the end or if we should combine everything into `src/index.scss`
|
// We'll see if code splitting is worth it in the end or if we should combine everything into `src/index.scss`
|
||||||
import { HomeController } from './controller'; // The controller for this view, where processing should happen.
|
import { HomeController } from './controller'; // The controller for this view, where processing should happen.
|
||||||
|
|
||||||
// This is the view function that is exported and used in the view manager.
|
// This is the view function that is exported and used in the view manager.
|
||||||
export const homeView = (state, emit) => {
|
export const homeView = (state, emit) => {
|
||||||
const i18n = new I18n(state);
|
|
||||||
const controller = new HomeController(state);
|
const controller = new HomeController(state);
|
||||||
|
const { i18n } = controller;
|
||||||
|
|
||||||
// Returning an array in a view allows non-shared parent HTML elements.
|
// Returning an array in a view allows non-shared parent HTML elements.
|
||||||
// This one doesn't have the problem right now, but it's good to remember.
|
// This one doesn't have the problem right now, but it's good to remember.
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
import { ViewController } from '../controller';
|
||||||
|
|
||||||
|
export class LoginController extends ViewController {
|
||||||
|
constructor(state) {
|
||||||
|
// Super passes state, view name, and default state to ViewController,
|
||||||
|
// which stores state in this.appState and the view controller's state to this.state
|
||||||
|
super(state, 'login', {});
|
||||||
|
|
||||||
|
// If using controller methods in an input's onchange or onclick instance,
|
||||||
|
// either bind the class's 'this' instance to the method first...
|
||||||
|
// or use `onclick=${() => controller.submit()}` to maintain the 'this' of the class instead.
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,10 @@
|
||||||
import html from 'choo/html';
|
import html from 'choo/html';
|
||||||
|
|
||||||
import { I18n } from '../../i18n';
|
import { LoginController } from './controller';
|
||||||
|
|
||||||
export const loginView = (state, emit) => {
|
export const loginView = (state, emit) => {
|
||||||
const i18n = new I18n(state);
|
const controller = new LoginController(state);
|
||||||
|
const { i18n } = controller;
|
||||||
|
|
||||||
return html`<section>
|
return html`<section>
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
import html from 'choo/html';
|
import html from 'choo/html';
|
||||||
|
|
||||||
import { I18n } from '../../i18n';
|
|
||||||
import { SearchController } from './controller'; // The controller for this view, where processing should happen.
|
import { SearchController } from './controller'; // The controller for this view, where processing should happen.
|
||||||
import { resultDetails } from './resultDetails';
|
import { resultDetails } from './resultDetails';
|
||||||
|
|
||||||
// This is the view function that is exported and used in the view manager.
|
// This is the view function that is exported and used in the view manager.
|
||||||
export const searchView = (state, emit) => {
|
export const searchView = (state, emit) => {
|
||||||
const i18n = new I18n(state);
|
|
||||||
const controller = new SearchController(state);
|
const controller = new SearchController(state);
|
||||||
|
const { i18n } = controller;
|
||||||
|
|
||||||
if (controller.state.lastSearch !== state.query.for) {
|
if (controller.state.lastSearch !== state.query.for) {
|
||||||
console.log('searching!');
|
console.log('searching!');
|
||||||
|
@ -38,7 +37,6 @@ export const searchView = (state, emit) => {
|
||||||
<div class="third-500">
|
<div class="third-500">
|
||||||
${resultDetails(
|
${resultDetails(
|
||||||
controller,
|
controller,
|
||||||
i18n,
|
|
||||||
result,
|
result,
|
||||||
[
|
[
|
||||||
html`<span data-tooltip=${i18n.__('interaction.heart')}>
|
html`<span data-tooltip=${i18n.__('interaction.heart')}>
|
||||||
|
|
|
@ -2,7 +2,8 @@ import html from 'choo/html';
|
||||||
|
|
||||||
import { modal } from '../partials/modal';
|
import { modal } from '../partials/modal';
|
||||||
|
|
||||||
export const resultDetails = (searchController, i18n, result, buttonHTML) => {
|
export const resultDetails = (searchController, result, buttonHTML) => {
|
||||||
|
const { i18n } = searchController;
|
||||||
const modalId = `result_${result.uri}}`;
|
const modalId = `result_${result.uri}}`;
|
||||||
const modalContent = html`<article>
|
const modalContent = html`<article>
|
||||||
<span class="tooltip-left" data-tooltip=${i18n.__('search.see_details_tooltip')}>
|
<span class="tooltip-left" data-tooltip=${i18n.__('search.see_details_tooltip')}>
|
||||||
|
|
Loading…
Reference in New Issue