Merge remote-tracking branch 'origin/develop' into develop
						commit
						f899c75d0c
					
				|  | @ -1,32 +0,0 @@ | |||
| --- | ||||
| name: Redesign Issue | ||||
| about: Bugs, feedback or feature requests specifically associated with the Redesign | ||||
|   project (https://riot.im/experimental) | ||||
| title: '' | ||||
| labels: redesign | ||||
| assignees: '' | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| <!-- Thanks for providing feedback on the redesign! By filling out the sections with your information, you will help the us to process your issue. | ||||
| --> | ||||
| 
 | ||||
| - **Browser**: Chrome, Safari, Firefox? which version? | ||||
| - **OS**: Windows, macOS, Ubuntu, Arch Linux, etc? | ||||
| 
 | ||||
| ### Description | ||||
| 
 | ||||
| Describe here the problem that you are experiencing, or the feature you are requesting. | ||||
| Include screenshots if possible: you can drag and drop images below. | ||||
| 
 | ||||
| ### Steps to reproduce | ||||
| 
 | ||||
| - For bugs, list the steps | ||||
| - that reproduce the bug | ||||
| - using hyphens as bullet points | ||||
| 
 | ||||
| Describe how what happens differs from what you expected. | ||||
| 
 | ||||
| Log: sent/not sent?    <!-- You can send us the app's logs via the 'Report bug' | ||||
| link on the 'Settings' page. Very important for hard-to-reproduce bugs. Please | ||||
| file a bug here too! --> | ||||
							
								
								
									
										110
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										110
									
								
								CHANGELOG.md
								
								
								
								
							|  | @ -1,3 +1,113 @@ | |||
| Changes in [1.0.1](https://github.com/vector-im/riot-web/releases/tag/v1.0.1) (2019-02-15) | ||||
| ========================================================================================== | ||||
| [Full Changelog](https://github.com/vector-im/riot-web/compare/v1.0.0...v1.0.1) | ||||
| 
 | ||||
| 
 | ||||
| Changes in [1.0.0](https://github.com/vector-im/riot-web/releases/tag/v1.0.0) (2019-02-14) | ||||
| ========================================================================================== | ||||
| [Full Changelog](https://github.com/vector-im/riot-web/compare/v1.0.0-rc.2...v1.0.0) | ||||
| 
 | ||||
|  * Add snipping lines to welcome page without guests | ||||
|    [\#8634](https://github.com/vector-im/riot-web/pull/8634) | ||||
|  * Add home page to fix loading tests | ||||
|    [\#8625](https://github.com/vector-im/riot-web/pull/8625) | ||||
| 
 | ||||
| Changes in [1.0.0-rc.2](https://github.com/vector-im/riot-web/releases/tag/v1.0.0-rc.2) (2019-02-14) | ||||
| ==================================================================================================== | ||||
| [Full Changelog](https://github.com/vector-im/riot-web/compare/v1.0.0-rc.1...v1.0.0-rc.2) | ||||
| 
 | ||||
|  * Update from Weblate. | ||||
|    [\#8615](https://github.com/vector-im/riot-web/pull/8615) | ||||
|  * Replace favicon assets to ones with transparent backgrounds | ||||
|    [\#8600](https://github.com/vector-im/riot-web/pull/8600) | ||||
|  * Refreshed icons | ||||
|    [\#8594](https://github.com/vector-im/riot-web/pull/8594) | ||||
|  * Fix order of fetch-develop-deps / npm install | ||||
|    [\#8566](https://github.com/vector-im/riot-web/pull/8566) | ||||
|  * Revive building dark theme | ||||
|    [\#8540](https://github.com/vector-im/riot-web/pull/8540) | ||||
|  * Update from Weblate. | ||||
|    [\#8546](https://github.com/vector-im/riot-web/pull/8546) | ||||
|  * Repair app loading tests after welcome page | ||||
|    [\#8525](https://github.com/vector-im/riot-web/pull/8525) | ||||
|  * Support configurable welcome background and logo | ||||
|    [\#8528](https://github.com/vector-im/riot-web/pull/8528) | ||||
|  * Update from Weblate. | ||||
|    [\#8518](https://github.com/vector-im/riot-web/pull/8518) | ||||
|  * Document `embeddedPages` configuration | ||||
|    [\#8514](https://github.com/vector-im/riot-web/pull/8514) | ||||
|  * README.md : Syntax Coloring | ||||
|    [\#8502](https://github.com/vector-im/riot-web/pull/8502) | ||||
| 
 | ||||
| Changes in [1.0.0-rc.1](https://github.com/vector-im/riot-web/releases/tag/v1.0.0-rc.1) (2019-02-08) | ||||
| ==================================================================================================== | ||||
| [Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.9...v1.0.0-rc.1) | ||||
| 
 | ||||
|  * Update from Weblate. | ||||
|    [\#8475](https://github.com/vector-im/riot-web/pull/8475) | ||||
|  * Add configurable welcome page | ||||
|    [\#8466](https://github.com/vector-im/riot-web/pull/8466) | ||||
|  * fix app tests after force enabling lazy loading + removing feature flag | ||||
|    [\#8464](https://github.com/vector-im/riot-web/pull/8464) | ||||
|  * Allow Electron to zoom with CommandOrControl+= | ||||
|    [\#8381](https://github.com/vector-im/riot-web/pull/8381) | ||||
|  * Hide sign in / create account for logged in users | ||||
|    [\#8368](https://github.com/vector-im/riot-web/pull/8368) | ||||
|  * Fix home page link target | ||||
|    [\#8365](https://github.com/vector-im/riot-web/pull/8365) | ||||
|  * Add auth background image and update Riot logo | ||||
|    [\#8364](https://github.com/vector-im/riot-web/pull/8364) | ||||
|  * New homepage | ||||
|    [\#8363](https://github.com/vector-im/riot-web/pull/8363) | ||||
|  * Spell homeserver correctly | ||||
|    [\#8358](https://github.com/vector-im/riot-web/pull/8358) | ||||
|  * Merge redesign into develop | ||||
|    [\#8321](https://github.com/vector-im/riot-web/pull/8321) | ||||
|  * Disable room directory test because it doesn't work | ||||
|    [\#8318](https://github.com/vector-im/riot-web/pull/8318) | ||||
|  * Tweak auth overflow on Windows and Linux | ||||
|    [\#8307](https://github.com/vector-im/riot-web/pull/8307) | ||||
|  * Clean up Custom Server Help dialog | ||||
|    [\#8296](https://github.com/vector-im/riot-web/pull/8296) | ||||
|  * Cache-bust olm.wasm | ||||
|    [\#8283](https://github.com/vector-im/riot-web/pull/8283) | ||||
|  * Completely disable other themes for now (#8277) | ||||
|    [\#8280](https://github.com/vector-im/riot-web/pull/8280) | ||||
|  * Remove support for team servers | ||||
|    [\#8271](https://github.com/vector-im/riot-web/pull/8271) | ||||
|  * Add target="_blank" to footer links | ||||
|    [\#8248](https://github.com/vector-im/riot-web/pull/8248) | ||||
|  * Fix device names on desktop | ||||
|    [\#8241](https://github.com/vector-im/riot-web/pull/8241) | ||||
|  * Fix literal </> in notifications | ||||
|    [\#8238](https://github.com/vector-im/riot-web/pull/8238) | ||||
|  * Fix registration nextLink on desktop | ||||
|    [\#8239](https://github.com/vector-im/riot-web/pull/8239) | ||||
|  * Add returns to fetch-develop-deps | ||||
|    [\#8233](https://github.com/vector-im/riot-web/pull/8233) | ||||
|  * Update electron builder | ||||
|    [\#8231](https://github.com/vector-im/riot-web/pull/8231) | ||||
|  * Try fetching more branches for PRs | ||||
|    [\#8225](https://github.com/vector-im/riot-web/pull/8225) | ||||
|  * Use content hashing for font and image URLs | ||||
|    [\#8159](https://github.com/vector-im/riot-web/pull/8159) | ||||
|  * Develop->Experimental | ||||
|    [\#8156](https://github.com/vector-im/riot-web/pull/8156) | ||||
|  * Update from Weblate. | ||||
|    [\#8150](https://github.com/vector-im/riot-web/pull/8150) | ||||
|  * Correct the copying of e-mail addresses in the electron app | ||||
|    [\#8124](https://github.com/vector-im/riot-web/pull/8124) | ||||
|  * Start documenting keyboard shortcuts | ||||
|    [\#7165](https://github.com/vector-im/riot-web/pull/7165) | ||||
|  * Update issue templates | ||||
|    [\#7948](https://github.com/vector-im/riot-web/pull/7948) | ||||
|  * Added new colour var to all themes | ||||
|    [\#7927](https://github.com/vector-im/riot-web/pull/7927) | ||||
|  * Redesign: apply changes from dharma theme to status theme | ||||
|    [\#7541](https://github.com/vector-im/riot-web/pull/7541) | ||||
|  * Redesign: ignore setting and always show dharma theme for now | ||||
|    [\#7540](https://github.com/vector-im/riot-web/pull/7540) | ||||
| 
 | ||||
| Changes in [0.17.9](https://github.com/vector-im/riot-web/releases/tag/v0.17.9) (2019-01-22) | ||||
| ============================================================================================ | ||||
| [Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.9-rc.1...v0.17.9) | ||||
|  |  | |||
							
								
								
									
										27
									
								
								README.md
								
								
								
								
							
							
						
						
									
										27
									
								
								README.md
								
								
								
								
							|  | @ -116,17 +116,24 @@ config.json | |||
| You can configure the app by copying `config.sample.json` to | ||||
| `config.json` and customising it: | ||||
| 
 | ||||
| For a good example, see https://riot.im/develop/config.json | ||||
| For a good example, see https://riot.im/develop/config.json. | ||||
| 
 | ||||
| 1. `default_hs_url` is the default homeserver url. | ||||
| 1. `default_is_url` is the default identity server url (this is the server used | ||||
|    for verifying third party identifiers like email addresses). If this is blank, | ||||
|    registering with an email address, adding an email address to your account, | ||||
|    or inviting users via email address will not work.  Matrix identity servers are | ||||
|    very simple web services which map third party identifiers (currently only email | ||||
|    addresses) to matrix IDs: see http://matrix.org/docs/spec/identity_service/unstable.html | ||||
|    for more details.  Currently the only public matrix identity servers are https://matrix.org | ||||
|    and https://vector.im.  In future identity servers will be decentralised. | ||||
| 1. `default_server_name` sets the default server name to use for authentication. | ||||
|    This will trigger Riot to ask | ||||
|    `https://<server_name>/.well-known/matrix/client` for the homeserver and | ||||
|    identity server URLs to use. This is the recommended approach for setting a | ||||
|    default server. However, it is also possible to use the following to directly | ||||
|    configure each of the URLs: | ||||
|    * `default_hs_url` sets the default homeserver URL. | ||||
|    * `default_is_url` sets the default identity server URL (this is the server used | ||||
|       for verifying third party identifiers like email addresses). If this is blank, | ||||
|       registering with an email address, adding an email address to your account, | ||||
|       or inviting users via email address will not work.  Matrix identity servers are | ||||
|       very simple web services which map third party identifiers (currently only email | ||||
|       addresses) to matrix IDs: see http://matrix.org/docs/spec/identity_service/unstable.html | ||||
|       for more details.  Currently the only public matrix identity servers are https://matrix.org | ||||
|       and https://vector.im.  In the future, identity servers will be decentralised. | ||||
|    * Riot will report an error if you accidentally configure both `default_server_name` _and_ `default_hs_url` since it's unclear which should take priority. | ||||
| 1. `features`: Lookup of optional features that may be `enable`d, `disable`d, or exposed to the user | ||||
|    in the `labs` section of settings.  The available optional experimental features vary from | ||||
|    release to release. | ||||
|  |  | |||
|  | @ -2,11 +2,12 @@ | |||
|   "name": "riot-web", | ||||
|   "productName": "Riot", | ||||
|   "main": "src/electron-main.js", | ||||
|   "version": "0.17.9", | ||||
|   "version": "1.0.1", | ||||
|   "description": "A feature-rich client for Matrix.org", | ||||
|   "author": "New Vector Ltd.", | ||||
|   "dependencies": { | ||||
|     "auto-launch": "^5.0.1", | ||||
|     "electron-store": "^2.0.0", | ||||
|     "electron-window-state": "^4.1.0", | ||||
|     "minimist": "^1.2.0", | ||||
|     "png-to-ico": "^1.0.2" | ||||
|  |  | |||
|  | @ -35,6 +35,7 @@ const updater = require('./updater'); | |||
| const { migrateFromOldOrigin } = require('./originMigrator'); | ||||
| 
 | ||||
| const windowStateKeeper = require('electron-window-state'); | ||||
| const Store = require('electron-store'); | ||||
| 
 | ||||
| // boolean flag set whilst we are doing one-time origin migration
 | ||||
| // We only serve the origin migration script while we're actually
 | ||||
|  | @ -55,8 +56,11 @@ try { | |||
|     // Continue with the defaults (ie. an empty config)
 | ||||
| } | ||||
| 
 | ||||
| const store = new Store(); | ||||
| 
 | ||||
| let mainWindow = null; | ||||
| global.appQuitting = false; | ||||
| global.minimizeToTray = store.get('minimizeToTray', true); | ||||
| 
 | ||||
| 
 | ||||
| // handle uncaught errors otherwise it displays
 | ||||
|  | @ -136,6 +140,12 @@ ipcMain.on('ipcCall', async function(ev, payload) { | |||
|                 launcher.disable(); | ||||
|             } | ||||
|             break; | ||||
|         case 'getMinimizeToTrayEnabled': | ||||
|             ret = global.minimizeToTray; | ||||
|             break; | ||||
|         case 'setMinimizeToTrayEnabled': | ||||
|             store.set('minimizeToTray', global.minimizeToTray = args[0]); | ||||
|             break; | ||||
|         case 'getAppVersion': | ||||
|             ret = app.getVersion(); | ||||
|             break; | ||||
|  | @ -147,6 +157,7 @@ ipcMain.on('ipcCall', async function(ev, payload) { | |||
|             } else { | ||||
|                 mainWindow.focus(); | ||||
|             } | ||||
|             break; | ||||
|         case 'origin_migrate': | ||||
|             migratingOrigin = true; | ||||
|             await migrateFromOldOrigin(); | ||||
|  | @ -262,10 +273,12 @@ app.on('ready', () => { | |||
|             path: absTarget, | ||||
|         }); | ||||
|     }, (error) => { | ||||
|         if (error) console.error('Failed to register protocol') | ||||
|         if (error) console.error('Failed to register protocol'); | ||||
|     }); | ||||
| 
 | ||||
|     if (vectorConfig['update_base_url']) { | ||||
|     if (argv['no-update']) { | ||||
|         console.log('Auto update disabled via command line flag "--no-update"'); | ||||
|     } else if (vectorConfig['update_base_url']) { | ||||
|         console.log(`Starting auto update with base URL: ${vectorConfig['update_base_url']}`); | ||||
|         updater.start(vectorConfig['update_base_url']); | ||||
|     } else { | ||||
|  | @ -331,7 +344,7 @@ app.on('ready', () => { | |||
|         mainWindow = global.mainWindow = null; | ||||
|     }); | ||||
|     mainWindow.on('close', (e) => { | ||||
|         if (!global.appQuitting && (tray.hasTray() || process.platform === 'darwin')) { | ||||
|         if (global.minimizeToTray && !global.appQuitting && (tray.hasTray() || process.platform === 'darwin')) { | ||||
|             // On Mac, closing the window just hides it
 | ||||
|             // (this is generally how single-window Mac apps
 | ||||
|             // behave, eg. Mail.app)
 | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "riot-web", | ||||
|   "version": "0.17.8", | ||||
|   "version": "1.0.1", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
|   "name": "riot-web", | ||||
|   "productName": "Riot", | ||||
|   "main": "electron_app/src/electron-main.js", | ||||
|   "version": "0.17.9", | ||||
|   "version": "1.0.1", | ||||
|   "description": "A feature-rich client for Matrix.org", | ||||
|   "author": "New Vector Ltd.", | ||||
|   "repository": { | ||||
|  | @ -70,8 +70,8 @@ | |||
|     "gemini-scrollbar": "github:matrix-org/gemini-scrollbar#b302279", | ||||
|     "gfm.css": "^1.1.2", | ||||
|     "highlight.js": "^9.13.1", | ||||
|     "matrix-js-sdk": "0.14.3", | ||||
|     "matrix-react-sdk": "0.14.8", | ||||
|     "matrix-js-sdk": "1.0.0", | ||||
|     "matrix-react-sdk": "1.0.1", | ||||
|     "modernizr": "^3.6.0", | ||||
|     "prop-types": "^15.6.2", | ||||
|     "react": "^15.6.0", | ||||
|  | @ -102,7 +102,7 @@ | |||
|     "cross-env": "^4.0.0", | ||||
|     "css-loader": "^2.1.0", | ||||
|     "electron-builder": "^20.38.5", | ||||
|     "electron-builder-squirrel-windows": "^11.6.1", | ||||
|     "electron-builder-squirrel-windows": "^20.38.5", | ||||
|     "electron-devtools-installer": "^2.2.4", | ||||
|     "emojione": "^2.2.7", | ||||
|     "eslint": "^5.8.0", | ||||
|  | @ -125,6 +125,7 @@ | |||
|     "karma-spec-reporter": "0.0.31", | ||||
|     "karma-summary-reporter": "^1.5.1", | ||||
|     "karma-webpack": "4.0.0-beta.0", | ||||
|     "loader-utils": "^1.2.3", | ||||
|     "matrix-mock-request": "^1.2.2", | ||||
|     "matrix-react-test-utils": "^0.2.0", | ||||
|     "minimist": "^1.2.0", | ||||
|  |  | |||
|  | @ -0,0 +1,16 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # script to clean up the deployments made by redeploy.py for vectorwebdev and vectorwebexp | ||||
| set -e | ||||
| 
 | ||||
| # currently live deployment (full path) | ||||
| live=`dirname $(readlink -f "$HOME/live")` | ||||
| 
 | ||||
| # currently live bundle (just the name of the bundle) | ||||
| live_bundle=`grep 'script src="bundles' live/index.html | sed -e 's#.*bundles/##' -e 's#/.*##'` | ||||
| 
 | ||||
| # clean up 'extracted': find things which are older than 7 days, exclude the current live one, and remove | ||||
| find $HOME/extracted -maxdepth 1 -type d -ctime +7 \! -path "$live" -exec rm -r {} \; | ||||
| 
 | ||||
| # clean up 'bundles': ditto | ||||
| find $HOME/bundles -maxdepth 1 -type d -ctime +7 \! -name "$live_bundle" -exec rm -r {} \; | ||||
|  | @ -1,5 +1,7 @@ | |||
| #!/usr/bin/env node
 | ||||
| 
 | ||||
| const loaderUtils = require("loader-utils"); | ||||
| 
 | ||||
| // copies the resources into the webapp directory.
 | ||||
| //
 | ||||
| 
 | ||||
|  | @ -61,12 +63,6 @@ const COPY_LIST = [ | |||
|     ["./config.json", "webapp", { directwatch: 1 }], | ||||
| ]; | ||||
| 
 | ||||
| INCLUDE_LANGS.forEach(function(l) { | ||||
|     COPY_LIST.push([ | ||||
|         l.value, "webapp/i18n/", { lang: 1 }, | ||||
|     ]); | ||||
| }); | ||||
| 
 | ||||
| const parseArgs = require('minimist'); | ||||
| const Cpx = require('cpx'); | ||||
| const chokidar = require('chokidar'); | ||||
|  | @ -77,8 +73,8 @@ const argv = parseArgs( | |||
|     process.argv.slice(2), {} | ||||
| ); | ||||
| 
 | ||||
| var watch = argv.w; | ||||
| var verbose = argv.v; | ||||
| const watch = argv.w; | ||||
| const verbose = argv.v; | ||||
| 
 | ||||
| function errCheck(err) { | ||||
|     if (err) { | ||||
|  | @ -136,39 +132,11 @@ function next(i, err) { | |||
|                 .on('change', copy) | ||||
|                 .on('ready', cb) | ||||
|                 .on('error', errCheck); | ||||
|         } else if (opts.lang) { | ||||
|             const reactSdkFile = 'node_modules/matrix-react-sdk/src/i18n/strings/' + source + '.json'; | ||||
|             const riotWebFile = 'src/i18n/strings/' + source + '.json'; | ||||
| 
 | ||||
|             // XXX: Use a debounce because for some reason if we read the language
 | ||||
|             // file immediately after the FS event is received, the file contents
 | ||||
|             // appears empty. Possibly https://github.com/nodejs/node/issues/6112
 | ||||
|             let makeLangDebouncer; | ||||
|             const makeLang = () => { | ||||
|                 if (makeLangDebouncer) { | ||||
|                     clearTimeout(makeLangDebouncer); | ||||
|                 } | ||||
|                 makeLangDebouncer = setTimeout(() => { | ||||
|                     genLangFile(source, dest); | ||||
|                 }, 500); | ||||
|             }; | ||||
| 
 | ||||
|             [reactSdkFile, riotWebFile].forEach(function(f) { | ||||
|                 chokidar.watch(f) | ||||
|                     .on('add', makeLang) | ||||
|                     .on('change', makeLang) | ||||
|                     //.on('ready', cb)  We'd have to do this when both files are ready
 | ||||
|                     .on('error', errCheck); | ||||
|             }); | ||||
|             next(i + 1, err); | ||||
|         } else { | ||||
|             cpx.on('watch-ready', cb); | ||||
|             cpx.on("watch-error", cb); | ||||
|             cpx.watch(); | ||||
|         } | ||||
|     } else if (opts.lang) { | ||||
|         genLangFile(source, dest); | ||||
|         next(i + 1, err); | ||||
|     } else { | ||||
|         cpx.copy(cb); | ||||
|     } | ||||
|  | @ -195,21 +163,28 @@ function genLangFile(lang, dest) { | |||
| 
 | ||||
|     translations = weblateToCounterpart(translations); | ||||
| 
 | ||||
|     fs.writeFileSync(dest + lang + '.json', JSON.stringify(translations, null, 4)); | ||||
|     const json = JSON.stringify(translations, null, 4); | ||||
|     const jsonBuffer = Buffer.from(json); | ||||
|     const digest = loaderUtils.getHashDigest(jsonBuffer, null, null, 7); | ||||
|     const filename = `${lang}.${digest}.json`; | ||||
| 
 | ||||
|     fs.writeFileSync(dest + filename, json); | ||||
|     if (verbose) { | ||||
|         console.log("Generated language file: " + lang); | ||||
|         console.log("Generated language file: " + filename); | ||||
|     } | ||||
| 
 | ||||
|     return filename; | ||||
| } | ||||
| 
 | ||||
| function genLangList() { | ||||
| function genLangList(langFileMap) { | ||||
|     const languages = {}; | ||||
|     INCLUDE_LANGS.forEach(function(lang) { | ||||
|         const normalizedLanguage = lang.value.toLowerCase().replace("_", "-"); | ||||
|         const languageParts = normalizedLanguage.split('-'); | ||||
|         if (languageParts.length == 2 && languageParts[0] == languageParts[1]) { | ||||
|             languages[languageParts[0]] = {'fileName': lang.value + '.json', 'label': lang.label}; | ||||
|             languages[languageParts[0]] = {'fileName': langFileMap[lang.value], 'label': lang.label}; | ||||
|         } else { | ||||
|             languages[normalizedLanguage] = {'fileName': lang.value + '.json', 'label': lang.label}; | ||||
|             languages[normalizedLanguage] = {'fileName': langFileMap[lang.value], 'label': lang.label}; | ||||
|         } | ||||
|     }); | ||||
|     fs.writeFile('webapp/i18n/languages.json', JSON.stringify(languages, null, 4), function(err) { | ||||
|  | @ -257,5 +232,50 @@ function weblateToCounterpart(inTrs) { | |||
|     return outTrs; | ||||
| } | ||||
| 
 | ||||
| genLangList(); | ||||
| /** | ||||
| watch the input files for a given language, | ||||
| regenerate the file, adding its content-hashed filename to langFileMap | ||||
| and regenerating languages.json with the new filename | ||||
| */ | ||||
| function watchLanguage(lang, dest, langFileMap) { | ||||
|     const reactSdkFile = 'node_modules/matrix-react-sdk/src/i18n/strings/' + lang + '.json'; | ||||
|     const riotWebFile = 'src/i18n/strings/' + lang + '.json'; | ||||
| 
 | ||||
|     // XXX: Use a debounce because for some reason if we read the language
 | ||||
|     // file immediately after the FS event is received, the file contents
 | ||||
|     // appears empty. Possibly https://github.com/nodejs/node/issues/6112
 | ||||
|     let makeLangDebouncer; | ||||
|     const makeLang = () => { | ||||
|         if (makeLangDebouncer) { | ||||
|             clearTimeout(makeLangDebouncer); | ||||
|         } | ||||
|         makeLangDebouncer = setTimeout(() => { | ||||
|             const filename = genLangFile(lang, dest); | ||||
|             langFileMap[lang]=filename; | ||||
|             genLangList(langFileMap); | ||||
|         }, 500); | ||||
|     }; | ||||
| 
 | ||||
|     [reactSdkFile, riotWebFile].forEach(function(f) { | ||||
|         chokidar.watch(f) | ||||
|             .on('add', makeLang) | ||||
|             .on('change', makeLang) | ||||
|             .on('error', errCheck); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| // language resources
 | ||||
| const I18N_DEST = "webapp/i18n/"; | ||||
| const I18N_FILENAME_MAP = INCLUDE_LANGS.reduce((m, l) => { | ||||
|     const filename = genLangFile(l.value, I18N_DEST); | ||||
|     m[l.value] = filename; | ||||
|     return m; | ||||
| }, {}); | ||||
| genLangList(I18N_FILENAME_MAP); | ||||
| 
 | ||||
| if (watch) { | ||||
|     INCLUDE_LANGS.forEach(l => watchLanguage(l.value, I18N_DEST, I18N_FILENAME_MAP)); | ||||
| } | ||||
| 
 | ||||
| // non-language resources
 | ||||
| next(0); | ||||
|  |  | |||
|  | @ -104,10 +104,12 @@ cp $distdir/*.dmg "$pubdir/install/macos/" | |||
| 
 | ||||
| # Windows installers go to the dist dir because they need signing | ||||
| mkdir -p "$pubdir/install/win32/ia32/" | ||||
| cp $distdir/win-ia32/*.exe "$projdir/electron_app/dist/unsigned/" | ||||
| mkdir -p "$projdir/electron_app/dist/unsigned/ia32/" | ||||
| cp $distdir/squirrel-windows-ia32/*.exe "$projdir/electron_app/dist/unsigned/ia32/" | ||||
| 
 | ||||
| mkdir -p "$pubdir/install/win32/x64/" | ||||
| cp $distdir/win/*.exe "$projdir/electron_app/dist/unsigned/" | ||||
| mkdir -p "$projdir/electron_app/dist/unsigned/x64/" | ||||
| cp $distdir/squirrel-windows/*.exe "$projdir/electron_app/dist/unsigned/x64/" | ||||
| 
 | ||||
| # Packages for auto-update | ||||
| mkdir -p "$pubdir/update/macos" | ||||
|  | @ -115,12 +117,12 @@ cp $distdir/*-mac.zip "$pubdir/update/macos/" | |||
| echo "$vername" > "$pubdir/update/macos/latest" | ||||
| 
 | ||||
| mkdir -p "$pubdir/update/win32/ia32/" | ||||
| cp $distdir/win-ia32/*.nupkg "$pubdir/update/win32/ia32/" | ||||
| cp $distdir/win-ia32/RELEASES "$pubdir/update/win32/ia32/" | ||||
| cp $distdir/squirrel-windows-ia32/*.nupkg "$pubdir/update/win32/ia32/" | ||||
| cp $distdir/squirrel-windows-ia32/RELEASES "$pubdir/update/win32/ia32/" | ||||
| 
 | ||||
| mkdir -p "$pubdir/update/win32/x64/" | ||||
| cp $distdir/win/*.nupkg "$pubdir/update/win32/x64/" | ||||
| cp $distdir/win/RELEASES "$pubdir/update/win32/x64/" | ||||
| cp $distdir/squirrel-windows/*.nupkg "$pubdir/update/win32/x64/" | ||||
| cp $distdir/squirrel-windows/RELEASES "$pubdir/update/win32/x64/" | ||||
| 
 | ||||
| # Move the debs to the main project dir's dist folder | ||||
| cp $distdir/*.deb "$projdir/electron_app/dist/" | ||||
|  |  | |||
|  | @ -1,4 +1,10 @@ | |||
| #!/bin/bash | ||||
| # | ||||
| # Converts an svg logo into the various image resources required by | ||||
| # the various platforms deployments. | ||||
| # | ||||
| # On debian-based systems you need these deps: | ||||
| #   apt-get install xmlstarlet python3-cairosvg icnsutils | ||||
| 
 | ||||
| if [ $# != 1 ] | ||||
| then | ||||
|  | @ -52,7 +58,23 @@ cp "$tmpdir/256.png" "$tmpdir/Riot.iconset/icon_256x256.png" | |||
| cp "$tmpdir/512.png" "$tmpdir/Riot.iconset/icon_256x256@2x.png" | ||||
| cp "$tmpdir/512.png" "$tmpdir/Riot.iconset/icon_512x512.png" | ||||
| cp "$tmpdir/1024.png" "$tmpdir/Riot.iconset/icon_512x512@2x.png" | ||||
| iconutil -c icns -o electron_app/build/icon.icns "$tmpdir/Riot.iconset" | ||||
| 
 | ||||
| if [ -x "$(command -v iconutil)" ]; then | ||||
|   # available on macos | ||||
|   iconutil -c icns -o electron_app/build/icon.icns "$tmpdir/Riot.iconset" | ||||
| elif [ -x "$(command -v png2icns)" ]; then | ||||
|   # available on linux | ||||
|   # png2icns is more finicky about its input than iconutil | ||||
|   # 1. it doesn't support a 64x64 (aka 32x32@2x) | ||||
|   # 2. it doesn't like duplicates (128x128@2x == 256x256) | ||||
|   rm "$tmpdir/Riot.iconset/icon_128x128@2x.png" | ||||
|   rm "$tmpdir/Riot.iconset/icon_256x256@2x.png" | ||||
|   rm "$tmpdir/Riot.iconset/icon_16x16@2x.png" | ||||
|   rm "$tmpdir/Riot.iconset/icon_32x32@2x.png" | ||||
|   png2icns electron_app/build/icon.icns "$tmpdir"/Riot.iconset/*png | ||||
| else | ||||
|   echo "WARNING: Unsupported platform. Skipping icns build" | ||||
| fi | ||||
| 
 | ||||
| cp "$tmpdir/36.png" "res/vector-icons/android-chrome-36x36.png" | ||||
| cp "$tmpdir/48.png" "res/vector-icons/android-chrome-48x48.png" | ||||
|  |  | |||
|  | @ -14,7 +14,11 @@ else | |||
| fi | ||||
| 
 | ||||
| npm run clean | ||||
| npm run build$dev | ||||
| # riot-web is at `workspace`. | ||||
| # matrix-react-sdk is at `workspace/node_modules/matrix-react-sdk`, but this is | ||||
| # symlinked to a repo at `workspace/matrix-react-sdk`. | ||||
| # To get from `workspace/matrix-react-sdk/lib` up to the lang file, we use: | ||||
| RIOT_LANGUAGES_FILE="../../webapp/i18n/languages.json" npm run build$dev | ||||
| 
 | ||||
| # include the sample config in the tarball. Arguably this should be done by | ||||
| # `npm run build`, but it's just too painful. | ||||
|  |  | |||
|  | @ -3,22 +3,22 @@ | |||
|   <head> | ||||
|     <meta charset="utf-8"> | ||||
|     <title>Riot</title> | ||||
|     <link rel="apple-touch-icon" sizes="57x57" href="vector-icons/apple-touch-icon-57x57.png"> | ||||
|     <link rel="apple-touch-icon" sizes="60x60" href="vector-icons/apple-touch-icon-60x60.png"> | ||||
|     <link rel="apple-touch-icon" sizes="72x72" href="vector-icons/apple-touch-icon-72x72.png"> | ||||
|     <link rel="apple-touch-icon" sizes="76x76" href="vector-icons/apple-touch-icon-76x76.png"> | ||||
|     <link rel="apple-touch-icon" sizes="114x114" href="vector-icons/apple-touch-icon-114x114.png"> | ||||
|     <link rel="apple-touch-icon" sizes="120x120" href="vector-icons/apple-touch-icon-120x120.png"> | ||||
|     <link rel="apple-touch-icon" sizes="144x144" href="vector-icons/apple-touch-icon-144x144.png"> | ||||
|     <link rel="apple-touch-icon" sizes="152x152" href="vector-icons/apple-touch-icon-152x152.png"> | ||||
|     <link rel="apple-touch-icon" sizes="180x180" href="vector-icons/apple-touch-icon-180x180.png"> | ||||
|     <link rel="apple-touch-icon" sizes="57x57" href="<%= require('../../res/vector-icons/apple-touch-icon-57x57.png') %>"> | ||||
|     <link rel="apple-touch-icon" sizes="60x60" href="<%= require('../../res/vector-icons/apple-touch-icon-60x60.png') %>"> | ||||
|     <link rel="apple-touch-icon" sizes="72x72" href="<%= require('../../res/vector-icons/apple-touch-icon-72x72.png') %>"> | ||||
|     <link rel="apple-touch-icon" sizes="76x76" href="<%= require('../../res/vector-icons/apple-touch-icon-76x76.png') %>"> | ||||
|     <link rel="apple-touch-icon" sizes="114x114" href="<%= require('../../res/vector-icons/apple-touch-icon-114x114.png') %>"> | ||||
|     <link rel="apple-touch-icon" sizes="120x120" href="<%= require('../../res/vector-icons/apple-touch-icon-120x120.png') %>"> | ||||
|     <link rel="apple-touch-icon" sizes="144x144" href="<%= require('../../res/vector-icons/apple-touch-icon-144x144.png') %>"> | ||||
|     <link rel="apple-touch-icon" sizes="152x152" href="<%= require('../../res/vector-icons/apple-touch-icon-152x152.png') %>"> | ||||
|     <link rel="apple-touch-icon" sizes="180x180" href="<%= require('../../res/vector-icons/apple-touch-icon-180x180.png') %>"> | ||||
|     <link rel="manifest" href="manifest.json"> | ||||
|     <link rel="shortcut icon" href="vector-icons/favicon.ico"> | ||||
|     <link rel="shortcut icon" href="<%= require('../../res/vector-icons/favicon.ico') %>"> | ||||
|     <meta name="apple-mobile-web-app-title" content="Riot"> | ||||
|     <meta name="application-name" content="Riot"> | ||||
|     <meta name="msapplication-TileColor" content="#da532c"> | ||||
|     <meta name="msapplication-TileImage" content="vector-icons/mstile-144x144.png"> | ||||
|     <meta name="msapplication-config" content="vector-icons/browserconfig.xml"> | ||||
|     <meta name="msapplication-TileImage" content="<%= require('../../res/vector-icons/mstile-144x144.png') %>"> | ||||
|     <meta name="msapplication-config" content="<%= require('../../res/vector-icons/browserconfig.xml') %>"> | ||||
|     <meta name="theme-color" content="#ffffff"> | ||||
|     <meta property="og:image" content="<%= htmlWebpackPlugin.options.vars.og_image_url %>" /> | ||||
|     <% for (var i=0; i < htmlWebpackPlugin.files.css.length; i++) { | ||||
|  |  | |||
|  | @ -174,18 +174,30 @@ export default class ElectronPlatform extends VectorBasePlatform { | |||
|         return await this._ipcCall('getAppVersion'); | ||||
|     } | ||||
| 
 | ||||
|     supportsAutoLaunch() { | ||||
|     supportsAutoLaunch(): boolean { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     async getAutoLaunchEnabled() { | ||||
|     async getAutoLaunchEnabled(): boolean { | ||||
|         return await this._ipcCall('getAutoLaunchEnabled'); | ||||
|     } | ||||
| 
 | ||||
|     async setAutoLaunchEnabled(enabled) { | ||||
|     async setAutoLaunchEnabled(enabled: boolean): void { | ||||
|         return await this._ipcCall('setAutoLaunchEnabled', enabled); | ||||
|     } | ||||
| 
 | ||||
|     supportsMinimizeToTray(): boolean { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     async getMinimizeToTrayEnabled(): boolean { | ||||
|         return await this._ipcCall('getMinimizeToTrayEnabled'); | ||||
|     } | ||||
| 
 | ||||
|     async setMinimizeToTrayEnabled(enabled: boolean): void { | ||||
|         return await this._ipcCall('setMinimizeToTrayEnabled', enabled); | ||||
|     } | ||||
| 
 | ||||
|     async canSelfUpdate(): boolean { | ||||
|         const feedUrl = await this._ipcCall('getUpdateFeedUrl'); | ||||
|         return Boolean(feedUrl); | ||||
|  |  | |||
|  | @ -88,19 +88,6 @@ export default class VectorBasePlatform extends BasePlatform { | |||
|         this._updateFavicon(); | ||||
|     } | ||||
| 
 | ||||
|     supportsAutoLaunch() { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     // XXX: Surely this should be a setting like any other?
 | ||||
|     async getAutoLaunchEnabled() { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     async setAutoLaunchEnabled(enabled) { | ||||
|         throw new Error("Unimplemented"); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Begin update polling, if applicable | ||||
|      */ | ||||
|  |  | |||
|  | @ -6,6 +6,12 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); | |||
| let og_image_url = process.env.RIOT_OG_IMAGE_URL; | ||||
| if (!og_image_url) og_image_url = 'https://riot.im/app/themes/riot/img/logos/riot-im-logo-black-text.png'; | ||||
| 
 | ||||
| // relative to languageHandler.js in matrix-react-sdk
 | ||||
| let RIOT_LANGUAGES_FILE = process.env.RIOT_LANGUAGES_FILE; | ||||
| if (!RIOT_LANGUAGES_FILE) { | ||||
|     RIOT_LANGUAGES_FILE = "../../riot-web/webapp/i18n/languages.json"; | ||||
| } | ||||
| 
 | ||||
| module.exports = { | ||||
|     entry: { | ||||
|         // Load babel-polyfill first to avoid issues where some imports (namely react)
 | ||||
|  | @ -61,7 +67,17 @@ module.exports = { | |||
|                 }), | ||||
|             }, | ||||
|             { | ||||
|                 test: /\.(gif|png|svg|ttf)$/, | ||||
|                 // cache-bust languages.json file placed in
 | ||||
|                 // riot-web/webapp/i18n during build by copy-res.js
 | ||||
|                 test: /\.*languages.json$/, | ||||
|                 type: "javascript/auto", | ||||
|                 loader: 'file-loader', | ||||
|                 options: { | ||||
|                     name: 'i18n/[name].[hash:7].[ext]', | ||||
|                 }, | ||||
|             }, | ||||
|             { | ||||
|                 test: /\.(gif|png|svg|ttf|xml|ico)$/, | ||||
|                 // Use a content-based hash in the name so that we can set a long cache
 | ||||
|                 // lifetime for assets while still delivering changes quickly.
 | ||||
|                 oneOf: [ | ||||
|  | @ -148,8 +164,8 @@ module.exports = { | |||
|             'process.env': { | ||||
|                 NODE_ENV: JSON.stringify(process.env.NODE_ENV), | ||||
|             }, | ||||
|             'LANGUAGES_FILE': JSON.stringify(RIOT_LANGUAGES_FILE), | ||||
|         }), | ||||
| 
 | ||||
|         new ExtractTextPlugin("bundles/[hash]/[name].css", { | ||||
|             allChunks: true, | ||||
|         }), | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Weblate
						Weblate