Merge remote-tracking branch 'origin/develop' into develop

This commit is contained in:
Weblate 2019-02-27 17:33:01 +00:00
commit f899c75d0c
16 changed files with 310 additions and 131 deletions

View file

@ -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! -->

View file

@ -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 &lt/&gt 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) 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) [Full Changelog](https://github.com/vector-im/riot-web/compare/v0.17.9-rc.1...v0.17.9)

View file

@ -116,17 +116,24 @@ config.json
You can configure the app by copying `config.sample.json` to You can configure the app by copying `config.sample.json` to
`config.json` and customising it: `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_server_name` sets the default server name to use for authentication.
1. `default_is_url` is the default identity server url (this is the server used 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, for verifying third party identifiers like email addresses). If this is blank,
registering with an email address, adding an email address to your account, 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 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 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 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 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. 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 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 in the `labs` section of settings. The available optional experimental features vary from
release to release. release to release.

View file

@ -2,11 +2,12 @@
"name": "riot-web", "name": "riot-web",
"productName": "Riot", "productName": "Riot",
"main": "src/electron-main.js", "main": "src/electron-main.js",
"version": "0.17.9", "version": "1.0.1",
"description": "A feature-rich client for Matrix.org", "description": "A feature-rich client for Matrix.org",
"author": "New Vector Ltd.", "author": "New Vector Ltd.",
"dependencies": { "dependencies": {
"auto-launch": "^5.0.1", "auto-launch": "^5.0.1",
"electron-store": "^2.0.0",
"electron-window-state": "^4.1.0", "electron-window-state": "^4.1.0",
"minimist": "^1.2.0", "minimist": "^1.2.0",
"png-to-ico": "^1.0.2" "png-to-ico": "^1.0.2"

View file

@ -35,6 +35,7 @@ const updater = require('./updater');
const { migrateFromOldOrigin } = require('./originMigrator'); const { migrateFromOldOrigin } = require('./originMigrator');
const windowStateKeeper = require('electron-window-state'); const windowStateKeeper = require('electron-window-state');
const Store = require('electron-store');
// boolean flag set whilst we are doing one-time origin migration // boolean flag set whilst we are doing one-time origin migration
// We only serve the origin migration script while we're actually // We only serve the origin migration script while we're actually
@ -55,8 +56,11 @@ try {
// Continue with the defaults (ie. an empty config) // Continue with the defaults (ie. an empty config)
} }
const store = new Store();
let mainWindow = null; let mainWindow = null;
global.appQuitting = false; global.appQuitting = false;
global.minimizeToTray = store.get('minimizeToTray', true);
// handle uncaught errors otherwise it displays // handle uncaught errors otherwise it displays
@ -136,6 +140,12 @@ ipcMain.on('ipcCall', async function(ev, payload) {
launcher.disable(); launcher.disable();
} }
break; break;
case 'getMinimizeToTrayEnabled':
ret = global.minimizeToTray;
break;
case 'setMinimizeToTrayEnabled':
store.set('minimizeToTray', global.minimizeToTray = args[0]);
break;
case 'getAppVersion': case 'getAppVersion':
ret = app.getVersion(); ret = app.getVersion();
break; break;
@ -147,6 +157,7 @@ ipcMain.on('ipcCall', async function(ev, payload) {
} else { } else {
mainWindow.focus(); mainWindow.focus();
} }
break;
case 'origin_migrate': case 'origin_migrate':
migratingOrigin = true; migratingOrigin = true;
await migrateFromOldOrigin(); await migrateFromOldOrigin();
@ -262,10 +273,12 @@ app.on('ready', () => {
path: absTarget, path: absTarget,
}); });
}, (error) => { }, (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']}`); console.log(`Starting auto update with base URL: ${vectorConfig['update_base_url']}`);
updater.start(vectorConfig['update_base_url']); updater.start(vectorConfig['update_base_url']);
} else { } else {
@ -331,7 +344,7 @@ app.on('ready', () => {
mainWindow = global.mainWindow = null; mainWindow = global.mainWindow = null;
}); });
mainWindow.on('close', (e) => { 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 // On Mac, closing the window just hides it
// (this is generally how single-window Mac apps // (this is generally how single-window Mac apps
// behave, eg. Mail.app) // behave, eg. Mail.app)

2
package-lock.json generated
View file

@ -1,6 +1,6 @@
{ {
"name": "riot-web", "name": "riot-web",
"version": "0.17.8", "version": "1.0.1",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {

View file

@ -2,7 +2,7 @@
"name": "riot-web", "name": "riot-web",
"productName": "Riot", "productName": "Riot",
"main": "electron_app/src/electron-main.js", "main": "electron_app/src/electron-main.js",
"version": "0.17.9", "version": "1.0.1",
"description": "A feature-rich client for Matrix.org", "description": "A feature-rich client for Matrix.org",
"author": "New Vector Ltd.", "author": "New Vector Ltd.",
"repository": { "repository": {
@ -70,8 +70,8 @@
"gemini-scrollbar": "github:matrix-org/gemini-scrollbar#b302279", "gemini-scrollbar": "github:matrix-org/gemini-scrollbar#b302279",
"gfm.css": "^1.1.2", "gfm.css": "^1.1.2",
"highlight.js": "^9.13.1", "highlight.js": "^9.13.1",
"matrix-js-sdk": "0.14.3", "matrix-js-sdk": "1.0.0",
"matrix-react-sdk": "0.14.8", "matrix-react-sdk": "1.0.1",
"modernizr": "^3.6.0", "modernizr": "^3.6.0",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react": "^15.6.0", "react": "^15.6.0",
@ -102,7 +102,7 @@
"cross-env": "^4.0.0", "cross-env": "^4.0.0",
"css-loader": "^2.1.0", "css-loader": "^2.1.0",
"electron-builder": "^20.38.5", "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", "electron-devtools-installer": "^2.2.4",
"emojione": "^2.2.7", "emojione": "^2.2.7",
"eslint": "^5.8.0", "eslint": "^5.8.0",
@ -125,6 +125,7 @@
"karma-spec-reporter": "0.0.31", "karma-spec-reporter": "0.0.31",
"karma-summary-reporter": "^1.5.1", "karma-summary-reporter": "^1.5.1",
"karma-webpack": "4.0.0-beta.0", "karma-webpack": "4.0.0-beta.0",
"loader-utils": "^1.2.3",
"matrix-mock-request": "^1.2.2", "matrix-mock-request": "^1.2.2",
"matrix-react-test-utils": "^0.2.0", "matrix-react-test-utils": "^0.2.0",
"minimist": "^1.2.0", "minimist": "^1.2.0",

16
scripts/cleanup.sh Executable file
View file

@ -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 {} \;

View file

@ -1,5 +1,7 @@
#!/usr/bin/env node #!/usr/bin/env node
const loaderUtils = require("loader-utils");
// copies the resources into the webapp directory. // copies the resources into the webapp directory.
// //
@ -61,12 +63,6 @@ const COPY_LIST = [
["./config.json", "webapp", { directwatch: 1 }], ["./config.json", "webapp", { directwatch: 1 }],
]; ];
INCLUDE_LANGS.forEach(function(l) {
COPY_LIST.push([
l.value, "webapp/i18n/", { lang: 1 },
]);
});
const parseArgs = require('minimist'); const parseArgs = require('minimist');
const Cpx = require('cpx'); const Cpx = require('cpx');
const chokidar = require('chokidar'); const chokidar = require('chokidar');
@ -77,8 +73,8 @@ const argv = parseArgs(
process.argv.slice(2), {} process.argv.slice(2), {}
); );
var watch = argv.w; const watch = argv.w;
var verbose = argv.v; const verbose = argv.v;
function errCheck(err) { function errCheck(err) {
if (err) { if (err) {
@ -136,39 +132,11 @@ function next(i, err) {
.on('change', copy) .on('change', copy)
.on('ready', cb) .on('ready', cb)
.on('error', errCheck); .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 { } else {
cpx.on('watch-ready', cb); cpx.on('watch-ready', cb);
cpx.on("watch-error", cb); cpx.on("watch-error", cb);
cpx.watch(); cpx.watch();
} }
} else if (opts.lang) {
genLangFile(source, dest);
next(i + 1, err);
} else { } else {
cpx.copy(cb); cpx.copy(cb);
} }
@ -195,21 +163,28 @@ function genLangFile(lang, dest) {
translations = weblateToCounterpart(translations); 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) { if (verbose) {
console.log("Generated language file: " + lang); console.log("Generated language file: " + filename);
}
} }
function genLangList() { return filename;
}
function genLangList(langFileMap) {
const languages = {}; const languages = {};
INCLUDE_LANGS.forEach(function(lang) { INCLUDE_LANGS.forEach(function(lang) {
const normalizedLanguage = lang.value.toLowerCase().replace("_", "-"); const normalizedLanguage = lang.value.toLowerCase().replace("_", "-");
const languageParts = normalizedLanguage.split('-'); const languageParts = normalizedLanguage.split('-');
if (languageParts.length == 2 && languageParts[0] == languageParts[1]) { 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 { } 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) { fs.writeFile('webapp/i18n/languages.json', JSON.stringify(languages, null, 4), function(err) {
@ -257,5 +232,50 @@ function weblateToCounterpart(inTrs) {
return outTrs; 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); next(0);

View file

@ -104,10 +104,12 @@ cp $distdir/*.dmg "$pubdir/install/macos/"
# Windows installers go to the dist dir because they need signing # Windows installers go to the dist dir because they need signing
mkdir -p "$pubdir/install/win32/ia32/" 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/" 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 # Packages for auto-update
mkdir -p "$pubdir/update/macos" mkdir -p "$pubdir/update/macos"
@ -115,12 +117,12 @@ cp $distdir/*-mac.zip "$pubdir/update/macos/"
echo "$vername" > "$pubdir/update/macos/latest" echo "$vername" > "$pubdir/update/macos/latest"
mkdir -p "$pubdir/update/win32/ia32/" mkdir -p "$pubdir/update/win32/ia32/"
cp $distdir/win-ia32/*.nupkg "$pubdir/update/win32/ia32/" cp $distdir/squirrel-windows-ia32/*.nupkg "$pubdir/update/win32/ia32/"
cp $distdir/win-ia32/RELEASES "$pubdir/update/win32/ia32/" cp $distdir/squirrel-windows-ia32/RELEASES "$pubdir/update/win32/ia32/"
mkdir -p "$pubdir/update/win32/x64/" mkdir -p "$pubdir/update/win32/x64/"
cp $distdir/win/*.nupkg "$pubdir/update/win32/x64/" cp $distdir/squirrel-windows/*.nupkg "$pubdir/update/win32/x64/"
cp $distdir/win/RELEASES "$pubdir/update/win32/x64/" cp $distdir/squirrel-windows/RELEASES "$pubdir/update/win32/x64/"
# Move the debs to the main project dir's dist folder # Move the debs to the main project dir's dist folder
cp $distdir/*.deb "$projdir/electron_app/dist/" cp $distdir/*.deb "$projdir/electron_app/dist/"

View file

@ -1,4 +1,10 @@
#!/bin/bash #!/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 ] if [ $# != 1 ]
then 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_256x256@2x.png"
cp "$tmpdir/512.png" "$tmpdir/Riot.iconset/icon_512x512.png" cp "$tmpdir/512.png" "$tmpdir/Riot.iconset/icon_512x512.png"
cp "$tmpdir/1024.png" "$tmpdir/Riot.iconset/icon_512x512@2x.png" cp "$tmpdir/1024.png" "$tmpdir/Riot.iconset/icon_512x512@2x.png"
if [ -x "$(command -v iconutil)" ]; then
# available on macos
iconutil -c icns -o electron_app/build/icon.icns "$tmpdir/Riot.iconset" 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/36.png" "res/vector-icons/android-chrome-36x36.png"
cp "$tmpdir/48.png" "res/vector-icons/android-chrome-48x48.png" cp "$tmpdir/48.png" "res/vector-icons/android-chrome-48x48.png"

View file

@ -14,7 +14,11 @@ else
fi fi
npm run clean 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 # include the sample config in the tarball. Arguably this should be done by
# `npm run build`, but it's just too painful. # `npm run build`, but it's just too painful.

View file

@ -3,22 +3,22 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Riot</title> <title>Riot</title>
<link rel="apple-touch-icon" sizes="57x57" href="vector-icons/apple-touch-icon-57x57.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="vector-icons/apple-touch-icon-60x60.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="vector-icons/apple-touch-icon-72x72.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="vector-icons/apple-touch-icon-76x76.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="vector-icons/apple-touch-icon-114x114.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="vector-icons/apple-touch-icon-120x120.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="vector-icons/apple-touch-icon-144x144.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="vector-icons/apple-touch-icon-152x152.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="vector-icons/apple-touch-icon-180x180.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="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="apple-mobile-web-app-title" content="Riot">
<meta name="application-name" content="Riot"> <meta name="application-name" content="Riot">
<meta name="msapplication-TileColor" content="#da532c"> <meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-TileImage" content="vector-icons/mstile-144x144.png"> <meta name="msapplication-TileImage" content="<%= require('../../res/vector-icons/mstile-144x144.png') %>">
<meta name="msapplication-config" content="vector-icons/browserconfig.xml"> <meta name="msapplication-config" content="<%= require('../../res/vector-icons/browserconfig.xml') %>">
<meta name="theme-color" content="#ffffff"> <meta name="theme-color" content="#ffffff">
<meta property="og:image" content="<%= htmlWebpackPlugin.options.vars.og_image_url %>" /> <meta property="og:image" content="<%= htmlWebpackPlugin.options.vars.og_image_url %>" />
<% for (var i=0; i < htmlWebpackPlugin.files.css.length; i++) { <% for (var i=0; i < htmlWebpackPlugin.files.css.length; i++) {

View file

@ -174,18 +174,30 @@ export default class ElectronPlatform extends VectorBasePlatform {
return await this._ipcCall('getAppVersion'); return await this._ipcCall('getAppVersion');
} }
supportsAutoLaunch() { supportsAutoLaunch(): boolean {
return true; return true;
} }
async getAutoLaunchEnabled() { async getAutoLaunchEnabled(): boolean {
return await this._ipcCall('getAutoLaunchEnabled'); return await this._ipcCall('getAutoLaunchEnabled');
} }
async setAutoLaunchEnabled(enabled) { async setAutoLaunchEnabled(enabled: boolean): void {
return await this._ipcCall('setAutoLaunchEnabled', enabled); 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 { async canSelfUpdate(): boolean {
const feedUrl = await this._ipcCall('getUpdateFeedUrl'); const feedUrl = await this._ipcCall('getUpdateFeedUrl');
return Boolean(feedUrl); return Boolean(feedUrl);

View file

@ -88,19 +88,6 @@ export default class VectorBasePlatform extends BasePlatform {
this._updateFavicon(); 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 * Begin update polling, if applicable
*/ */

View file

@ -6,6 +6,12 @@ const HtmlWebpackPlugin = require('html-webpack-plugin');
let og_image_url = process.env.RIOT_OG_IMAGE_URL; 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'; 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 = { module.exports = {
entry: { entry: {
// Load babel-polyfill first to avoid issues where some imports (namely react) // 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 // Use a content-based hash in the name so that we can set a long cache
// lifetime for assets while still delivering changes quickly. // lifetime for assets while still delivering changes quickly.
oneOf: [ oneOf: [
@ -148,8 +164,8 @@ module.exports = {
'process.env': { 'process.env': {
NODE_ENV: JSON.stringify(process.env.NODE_ENV), NODE_ENV: JSON.stringify(process.env.NODE_ENV),
}, },
'LANGUAGES_FILE': JSON.stringify(RIOT_LANGUAGES_FILE),
}), }),
new ExtractTextPlugin("bundles/[hash]/[name].css", { new ExtractTextPlugin("bundles/[hash]/[name].css", {
allChunks: true, allChunks: true,
}), }),