Compare commits

..

601 Commits

Author SHA1 Message Date
Luke Barnard
3d56247ef3 StatusBarArea height of 50px when typing/calling
Change the height of the StatusBar (and for calls, typing) to 48px such that with the StatusAreaBox_line, they add to 50px.
2017-02-20 15:22:56 +00:00
Richard van der Hoff
5c87b8045a Merge remote-tracking branch 'origin/master' into develop 2017-02-20 09:14:22 +00:00
Richard van der Hoff
d8c877fe6e Update ISSUE_TEMPLATE.md 2017-02-20 09:14:01 +00:00
Matthew Hodgson
67a7ed1e34 fix spacing of permalinks to info events 2017-02-20 01:49:11 +02:00
Matthew Hodgson
eabe4f5c29 hopefully fix https://github.com/vector-im/riot-web/issues/3270 2017-02-20 01:48:10 +02:00
Matthew Hodgson
f91f5cb65e fix RTE dark theme 2017-02-20 01:27:05 +02:00
Matthew Hodgson
5951e8fb27 don't try to darktheme scalar for now 2017-02-20 01:18:48 +02:00
Matthew Hodgson
be79ccccf6 fix dark theme room join bar 2017-02-20 01:15:54 +02:00
Matthew Hodgson
aba121aab0 fix cursor 2017-02-19 04:13:29 +02:00
Matthew Hodgson
c146ddf29b turn on rageshake for desktop 2017-02-18 23:59:45 +02:00
Matthew Hodgson
5469270e41 spell out where the PGP key lives for releases 2017-02-18 23:48:58 +02:00
Matthew Hodgson
457b64037d renormalise ringtone to 66% amplitude 2017-02-18 23:04:38 +02:00
David Baker
a0f572c26e Don't hardcode home dir in jenkins script 2017-02-17 19:18:58 +00:00
David Baker
f51669664c Merge pull request #3250 from vector-im/dbkr/support_kick_ban_reasons
CSS for ban / kick reason prompt
2017-02-17 17:39:38 +00:00
David Baker
75f2ba6b19 CSS for ban / kick reason prompt
For https://github.com/matrix-org/matrix-react-sdk/pull/710
2017-02-17 17:29:57 +00:00
David Baker
e8d5e8c8ab Merge pull request #3246 from vector-im/dbkr/allow_forget_ban
Allow forgetting rooms you're banned from
2017-02-17 16:36:19 +00:00
David Baker
6aa5266029 Merge remote-tracking branch 'origin/develop' into dbkr/allow_forget_ban 2017-02-17 16:19:15 +00:00
David Baker
03dd25624f Allow forgetting rooms you're banned from
From the room tag context menu.

Also fix the room tag context menu, which was missing sdk and
modal imports. Switch over the import while we're at it.
2017-02-17 15:52:07 +00:00
David Baker
0d1c53285b Merge pull request #3245 from vector-im/dbkr/fix_manifest_icon_paths
Fix icon paths in manifest
2017-02-17 15:41:49 +00:00
David Baker
aad880b3b5 Fix icon paths in manifest
They are not at the root of the web server, they are at the same
path as the manifest
2017-02-17 15:31:28 +00:00
Kegsay
5c2049935a Merge pull request #3242 from vector-im/kegan/fix-tests-for-indexeddb
Fix broken tests caused by adding IndexedDB support
2017-02-17 14:54:56 +00:00
Kegan Dougal
d876e4482b Fix broken tests caused by adding IndexedDB support
This test assumed that `/sync` would be called immediately after rendering
`<MatrixChat />` but this isn't true in an IndexedDB world: it bounces via
`store.startup()` first.

It looks like the tests resolve this by adding `q.delay(1)` so that's what
I've done: in the future it would be better to extend `HttpBackend` to have
a `waitFor(req) Promise` function so we can removing timing from the tests.
2017-02-17 14:32:08 +00:00
Richard van der Hoff
75097471b6 Merge pull request #3227 from vector-im/dbkr/add_unban_button
CSS for un-ban button in RoomSettings
2017-02-17 12:46:13 +00:00
David Baker
8224d7fc60 Oops - remove empty CSS selector 2017-02-16 15:14:53 +00:00
Luke Barnard
f2654616eb Merge pull request #3239 from vector-im/luke/css-remove-avatar-initial-z-index
Remove z-index property on avatar initials
2017-02-16 13:45:45 +00:00
Luke Barnard
fc0e460222 Remove z-index property on avatar initials
This seemingly doesn't do anything and upsets things when avatars overlap (i.e. for the new typing avatars).

See https://github.com/matrix-org/matrix-react-sdk/pull/699
2017-02-16 11:42:32 +00:00
Luke Barnard
827692b9b0 Merge pull request #3233 from vector-im/luke/css-status-bar-icon-positioning
Reposition certain icons in the status bar
2017-02-15 15:56:41 +00:00
Luke Barnard
bfad7612c6 Re-position certain icons in the status bar
Also, make sure the typing avatars line up with the arrow to jump to the bottom of the timeline.
Also, get rid of any height jumps when a call starts. border 1px hidden does not add any height to an element, it is effectively the same as none.
2017-02-15 15:45:24 +00:00
David Baker
f1f54c95ab Copyright 2017-02-14 18:11:36 +00:00
David Baker
5ecf560675 CSS for un-ban button in RoomSettings 2017-02-14 17:56:42 +00:00
David Baker
b9dd419d04 Merge pull request #3224 from vector-im/dbkr/confirm_ban
CSS for kick/ban confirmation dialog
2017-02-14 17:31:44 +00:00
David Baker
324e596e28 CSS for kick/ban confirmation dialog 2017-02-14 13:42:06 +00:00
David Baker
1bc9ba46c7 Merge pull request #3217 from vector-im/dbkr/interactive_auth_nondialog
Style for split-out interactive auth
2017-02-14 10:55:01 +00:00
David Baker
c6ccfa0616 Copyright 2017-02-13 16:15:27 +00:00
David Baker
9e2793dfed Style for split-out interactive auth
For https://github.com/matrix-org/matrix-react-sdk/pull/691
2017-02-13 16:10:43 +00:00
Matthew Hodgson
6a7daaf6c4 remove GA, given it's increasingly useless given Riot/Desktop doesn't use it, plus it obviously has privacy implications. It may get re-added as opt-in in future, so we're not sailing entirely blind on how folks use the app, or we may switch to Piwik etc instead. 2017-02-10 17:21:02 +00:00
David Baker
b6741d9b10 Merge pull request #3196 from vector-im/luke/rts-thread-team-token
Use the teamToken threaded through from react sdk
2017-02-10 10:43:24 +00:00
Luke Barnard
78aaf6b47e Use the teamToken threaded through from react sdk
The bottom left menu now uses the same teamToken that the rest of the components use. This will require changes to react-sdk: https://github.com/matrix-org/matrix-react-sdk/pull/684
2017-02-10 09:56:15 +00:00
Matthew Hodgson
f2a6d2cc5a fix selector color 2017-02-09 12:01:00 +00:00
Matthew Hodgson
22b7b8efea tweak sending color some more 2017-02-09 11:02:42 +00:00
Matthew Hodgson
e392d6c16b fix CSS for import/export buttons 2017-02-09 02:00:23 +00:00
Matthew Hodgson
2eec9b10ef fix dark skin event sending color 2017-02-09 01:42:36 +00:00
Matthew Hodgson
64f0beb1eb fix https://github.com/vector-im/riot-web/issues/3136 2017-02-09 01:33:26 +00:00
Matthew Hodgson
f6b6673a41 fix selection text colour in dark theme 2017-02-09 01:20:30 +00:00
Matthew Hodgson
d8042b193b be more specific on flex 2017-02-09 00:10:57 +00:00
Matthew Hodgson
5f745ff733 hopefully fix TopRight layout bug 2017-02-09 00:10:45 +00:00
Matthew Hodgson
bac142ad26 fix tintability of home button 2017-02-08 23:28:30 +00:00
Matthew Hodgson
caa30a742b fix table visuals in dark skin 2017-02-08 23:19:05 +00:00
Richard van der Hoff
d7bc47c357 Merge pull request #3169 from vector-im/kegan/bugs-file-server
rageshake: Add file server with basic auth
2017-02-08 10:37:35 +00:00
Kegan Dougal
5f678eb838 Review comments: change realm name 2017-02-08 10:36:39 +00:00
Kegan Dougal
64eb1f08a9 rageshake: Add file server with basic auth
Set via environment variables on startup.
2017-02-08 09:59:41 +00:00
David Baker
85e6057598 Merge pull request #3162 from vector-im/luke/rts-fix-blm-team-token
Fix bug with home icon not appearing when logged in as team member
2017-02-08 09:54:33 +00:00
Richard van der Hoff
b080e5797b Merge remote-tracking branch 'origin/master' into develop 2017-02-07 21:46:08 +00:00
Richard van der Hoff
f629b2f631 CONTRIBUTING: s/vector/riot/ 2017-02-07 21:45:34 +00:00
Richard van der Hoff
c4ee47aa15 Merge branch 'master' into develop 2017-02-07 21:40:18 +00:00
Richard van der Hoff
0c7c31e3bb Merge branch 'master' into rav/issue_template 2017-02-07 21:29:35 +00:00
Richard van der Hoff
0442258865 More issue_template tweaks
Encourage rageshaking

don't insist on version for the web app
2017-02-07 21:25:58 +00:00
Richard van der Hoff
95f529f9a4 Tweak ISSUE_TEMPLATE 2017-02-07 20:35:14 +00:00
David Baker
be71da5657 Merge pull request #3150 from vector-im/kegan/dir-per-bug
Store bug reports in separate directories
2017-02-07 16:18:00 +00:00
Kegan Dougal
f16bb85f9b Review comments 2017-02-07 16:04:06 +00:00
Luke Barnard
5b239adfb8 Fix bug with home icon not appearing when logged in as team member 2017-02-07 14:58:25 +00:00
David Baker
2f54034afe Merge pull request #3103 from vector-im/luke/rts-welcome-pages
RTS Welcome Pages
2017-02-07 11:52:59 +00:00
Luke Barnard
fa552ad5af Merge branch 'develop' into luke/rts-welcome-pages 2017-02-07 12:41:52 +01:00
Luke Barnard
35bc384c51 Set team token in state on mount 2017-02-07 11:39:31 +00:00
Luke Barnard
d490bd8638 Use home.html rather than welcome.html 2017-02-07 11:35:17 +00:00
Luke Barnard
8d4f81ff67 Remove redundant inline style 2017-02-07 11:34:49 +00:00
Luke Barnard
648204b6f9 Use import 2017-02-07 11:34:34 +00:00
Luke Barnard
3f49f020cf Copyright 2017-02-07 11:19:01 +00:00
Kegan Dougal
678eccf33d Store bug reports in separate directories 2017-02-06 16:18:08 +00:00
Kegsay
1f0b4853be Merge pull request #3149 from vector-im/kegan/go-stds
rageshake: Abide by Go standards
2017-02-06 15:40:58 +00:00
Kegan Dougal
db31f0a087 Host API under /api. Use filepath.Join rather than string concatenation 2017-02-06 15:31:53 +00:00
Kegan Dougal
d4247e0179 Dump to bugs subdirectory 2017-02-06 14:56:06 +00:00
Richard van der Hoff
af765c7522 Merge branch 'master' into develop
(Keep react-sdk and js-sdk on develop)
2017-02-04 11:04:25 +00:00
Richard van der Hoff
dc1a0c554f v0.9.7 2017-02-04 10:55:46 +00:00
Richard van der Hoff
08cdf21aee Prepare changelog for v0.9.7 2017-02-04 10:55:46 +00:00
Richard van der Hoff
cd7bc3bfd3 Bump to js-sdk 0.7.5 and react-sdk 0.8.6 2017-02-04 10:52:41 +00:00
Kegsay
18ac71e8c0 Merge pull request #3072 from vector-im/kegan/rageshake-server
Bug report server script
2017-02-03 17:33:51 +00:00
Richard van der Hoff
dea557619c v0.9.7-rc.3 2017-02-03 15:44:37 +00:00
Richard van der Hoff
961f279a82 Prepare changelog for v0.9.7-rc.3 2017-02-03 15:44:37 +00:00
David Baker
e0be012737 Bump olm version
Looks like this is causing pickle errors on packaged builds.
2017-02-03 15:35:20 +00:00
Richard van der Hoff
d176e83e94 Bump matrix-js-sdk and react-sdk 2017-02-03 15:34:15 +00:00
Richard van der Hoff
541eb45e1a Jenkins: use default olm
... to stop us making a release and realising we forgot to bump the olm version
in vector-web.
2017-02-03 15:06:03 +00:00
Richard van der Hoff
53e5c7eebe Unpin js-sdk & react-sdk 2017-02-03 14:39:11 +00:00
Richard van der Hoff
640beeedda Merge pull request #3125 from vector-im/dbkr/olm_version
Bump olm version
2017-02-03 13:52:37 +00:00
David Baker
5285d56a45 Bump olm version
Looks like this is causing pickle errors on packaged builds.
2017-02-03 13:51:02 +00:00
David Baker
c2d2287541 v0.9.7-rc.2 2017-02-03 13:19:22 +00:00
David Baker
4d8bdfa07e Prepare changelog for v0.9.7-rc.2 2017-02-03 13:19:22 +00:00
David Baker
51de4a3347 Bump js-sdk & react-sdk 2017-02-03 13:08:20 +00:00
David Baker
3d45aa7455 v0.9.7-rc.1 2017-02-03 12:17:28 +00:00
David Baker
8f86cfa2d3 Prepare changelog for v0.9.7-rc.1 2017-02-03 12:17:28 +00:00
David Baker
cad2d72bfe Release js-sdk & react-sdk 2017-02-03 12:15:36 +00:00
Richard van der Hoff
0c8223da03 Merge branch 'rav/hotkey-ux' into develop 2017-02-03 12:01:50 +00:00
Richard van der Hoff
7ceaabb166 RightPanel: remove superfluous divs 2017-02-03 12:00:33 +00:00
Richard van der Hoff
67e14ff363 Merge branch 'develop' into rav/hotkey-ux 2017-02-03 11:43:32 +00:00
Richard van der Hoff
b20f6ff8c1 Silence webpack dev server
Configure the dev server not to spew module lists all over the console.

(Arguably the fact our module list is so long that I have to do this is a bug,
but my life is too short)
2017-02-03 11:40:07 +00:00
Matthew Hodgson
0050e1557d fix darktheme for close button 2017-02-03 02:06:50 +00:00
Matthew Hodgson
654a025a9f fix button width for unkdevdialog 2017-02-03 02:06:50 +00:00
Richard van der Hoff
5368c87dc1 Fix tests to run crypto code
Return a device_id from /login requests, so that all the crypto logic works.
2017-02-02 23:41:49 +00:00
Richard van der Hoff
1c2de1e483 Refactor karma config
- rename test:multi npm target to test-multi, for consistency with react-sdk
- base karma webpack config on the distribution one
- include Olm if we have it
- don't use the karma source loader - it's pointless given we webpack
  everything.
- turn off module listing in the webpack stats to shorten the console output
2017-02-02 23:33:12 +00:00
Richard van der Hoff
a64e1cb936 Merge pull request #3118 from vector-im/dbkr/network_dropdown_mxc
Allow mxc: URLs for icons in the NetworkDropdown
2017-02-02 19:53:46 +00:00
David Baker
3903954bf2 Allow mxc: URLs for icons in the NetworkDropdown
For https://github.com/vector-im/riot-web/issues/3086
2017-02-02 19:35:36 +00:00
David Baker
7c27153ec5 Merge pull request #3117 from vector-im/matthew/fix-top-right-menu
make TopRightMenu more intuitive
2017-02-02 18:48:14 +00:00
Matthew Hodgson
4c3a723aa8 make TopRightMenu more intuitive
should fix https://github.com/vector-im/riot-web/issues/2827
2017-02-02 18:42:03 +00:00
Matthew Hodgson
c4a590f6af CSS for empty timelinepanels 2017-02-02 16:18:20 +00:00
David Baker
00c26088b1 Merge pull request #3110 from vector-im/luke/css-reg-icons
Handle icons with width > height
2017-02-02 14:29:23 +00:00
Luke Barnard
e77709bc71 Merge branch 'develop' into luke/rts-welcome-pages
Conflicts:
	src/skins/vector/css/matrix-react-sdk/views/rooms/_RoomPreviewBar.scss
2017-02-02 14:03:21 +00:00
Luke Barnard
a2622a556c Remove SdkConfig dep 2017-02-02 14:01:12 +00:00
Luke Barnard
6a9e5deb7b Remove commented code 2017-02-02 14:00:21 +00:00
Luke Barnard
20a7e3adf9 Migrate existing pages over to RTS
See matrix-org/riot-team-server#14
2017-02-02 13:58:22 +00:00
Matthew Hodgson
c6def48fe0 try to make joining rooms more obvious 2017-02-02 13:32:36 +00:00
Luke Barnard
f2e62ff439 Use RTS URL passed through 2017-02-02 11:58:20 +00:00
Luke Barnard
874e32699a Handle icons with width > height
Icons with width > height will now only assume a max-height of 100% as opposed to a height of 100%. This is so they don't overflow the width of 300px.
2017-02-02 11:30:14 +00:00
Luke Barnard
4a34bee2dc Use localStorage mx_team_token to decide welcome page 2017-02-02 11:12:43 +00:00
Matthew Hodgson
b137c82a7a tweak CSS for UnknownDeviceDialog to support scrollable content 2017-02-02 00:25:18 +00:00
Matthew Hodgson
23060a6833 fix ugly blue border on roomtiles 2017-02-01 22:24:23 +00:00
David Baker
0db97b8f5b Merge pull request #3105 from vector-im/rav/fix_jenkins_build
Fix jenkins build
2017-02-01 16:28:47 +00:00
Richard van der Hoff
3404521d5d Fix jenkins build
Do `npm install` on js-sdk rather than `npm run build`, which will hopefully
mean that `browserify` gets installed before we try to run it.

The README says we should use `npm install` for the react-sdk too, so let's do
that, and bring the travis and jenkins builds into sync with the README.
2017-02-01 16:11:11 +00:00
Luke Barnard
40609d7da3 then->done 2017-02-01 11:39:23 +00:00
Luke Barnard
1f3ab4425a Merge branch 'develop' into matthew/homepages
Conflicts:
	src/component-index.js
	src/skins/vector/css/matrix-react-sdk/views/rooms/_RoomPreviewBar.scss
2017-02-01 11:34:24 +00:00
Matthew Hodgson
6369d76a74 poor man's dark theme for MD codeblocks 2017-01-27 18:18:23 +01:00
Luke Barnard
6374526f3c Merge pull request #3081 from vector-im/luke/css-login-support
Add CSS for a support box in login
2017-01-27 16:36:53 +00:00
Luke Barnard
78105bb4db Merge pull request #3082 from vector-im/luke/feature-optional-custom-login-logo
Allow a custom login logo to be displayed on login
2017-01-27 16:34:39 +00:00
Luke Barnard
87db89b67a Replace inline styles for logos with css
Also, give .mx_Login_logo a height so that if the image has not loaded yet, it will not change height (thanks @dbkr)
2017-01-27 16:30:44 +00:00
Luke Barnard
87f7324065 Merge pull request #3080 from vector-im/luke/css-fix-input-field-width
Fix the width of input fields within login/reg box
2017-01-27 16:15:00 +00:00
Luke Barnard
02d6a10f67 Allow a custom login logo to be displayed on login
This is to allow team logos to be shown when a user registers with a team email.
2017-01-27 16:08:14 +00:00
Luke Barnard
029602fc73 Fix the width of input fields within login/reg box
This is so they do not expand outside of the login area. (280px = 300px - 2px - 18px, 2px for borders, 18px for padding)
2017-01-27 16:04:24 +00:00
Luke Barnard
5aa9592c71 Add CSS for a support box in login
This box can be used to provide useful hints during registration/login.
2017-01-27 16:02:33 +00:00
David Baker
bb70622b55 Merge pull request #3057 from vector-im/luke/fix-avatar-image-background-colour
Set BaseAvatar_image bg colour = #fff
2017-01-26 16:34:01 +00:00
Kegan Dougal
b16fa4171a Close the dialog box after sending bugs 2017-01-26 13:42:37 +00:00
David Baker
7850f7e505 Fix badge spam: attempt 2 (#3073) 2017-01-26 12:58:29 +00:00
Kegan Dougal
22bb0f9d30 UTC please 2017-01-26 12:17:47 +00:00
Richard van der Hoff
f29e0bfe6d Revert "Merge pull request #3067 from vector-im/matthew/fix-badge-spam"
This reverts commit f9db7f017d, reversing
changes made to 71b149de76.

This caused `number is not defined`
2017-01-26 12:16:44 +00:00
Kegan Dougal
6a40ad8a20 Fail the request if we clash files
Rather than make the file names incredibly long (by adding ms),
just 500 it and expect the user to resend.
2017-01-26 11:57:56 +00:00
David Baker
f9db7f017d Merge pull request #3067 from vector-im/matthew/fix-badge-spam
only recalculate favicon if it changes
2017-01-26 11:44:11 +00:00
Kegan Dougal
aae62ff94e store logs 2017-01-26 11:44:07 +00:00
David Baker
71b149de76 Merge pull request #3064 from vector-im/dbkr/invite_look_up_emails
CSS tweak for email address lookup
2017-01-26 11:34:51 +00:00
Kegan Dougal
e8c51a0b54 gzip bug reports when storing on disk. Set max payload size 2017-01-26 11:28:38 +00:00
Kegan Dougal
646ace6e59 Merge branch 'develop' into kegan/rageshake-server 2017-01-26 10:48:40 +00:00
David Baker
baed5bec46 Don't lint the autogenned file 2017-01-26 10:18:24 +00:00
David Baker
3c91f90dc9 Tweak desktop instructions (#3069)
to make it clear you need to do all the things in 'building from
source', including the build-react-sdk dance if you're building
develop.
2017-01-26 09:47:01 +00:00
Matthew Hodgson
ba5e7d4013 fix event-encrypting-color in dark theme 2017-01-26 00:54:00 +01:00
Matthew Hodgson
9797c2fb4b fix electron too 2017-01-26 00:31:52 +01:00
Matthew Hodgson
972a391296 only recalculate favicon if it changes 2017-01-26 00:28:22 +01:00
David Baker
4e41accc56 CSS tweak for email address lookup
CSS tweak for https://github.com/matrix-org/matrix-react-sdk/pull/653
2017-01-25 18:52:21 +00:00
Kegan Dougal
9d034c77a5 Initial rageshake server 2017-01-25 17:27:07 +00:00
Kegsay
c1290fd24d Merge pull request #3061 from vector-im/kegan/rageshake-glue
Glue the dialog to rageshake: honour sendLogs flag.
2017-01-25 17:20:51 +00:00
Kegan Dougal
0a9f02abcc Glue the dialog to rageshake: honour sendLogs flag. 2017-01-25 16:51:26 +00:00
Luke Barnard
0021fb37f3 Set BaseAvatar_image bg colour = #fff 2017-01-25 14:27:25 +00:00
David Baker
527c988574 Merge pull request #3049 from vector-im/dbkr/dev_server_no_hash
Don't use hash-named directory for dev server
2017-01-25 13:47:25 +00:00
David Baker
1c926941d3 Add --output-chunk-file too 2017-01-25 11:28:59 +00:00
Kegsay
80c1ec0502 Merge pull request #3000 from vector-im/kegan/rageshake
Implement bug reporting logic
2017-01-25 10:34:05 +00:00
Kegan Dougal
eaff0abfb0 Add link to Chrome issue status for fixing line numbers 2017-01-25 10:28:13 +00:00
David Baker
2ca871a028 Don't use hash-named directory for dev server
Otherwise Chrome thinks you're working on a new file every time
you refresh and therefore closes source tabs and removes
breakpoints which is very annoying. It also allegedly makes
webpack-dev-server run out of memory because it has to remember
all the different files.
2017-01-24 18:18:56 +00:00
Kegan Dougal
e225d3e370 Preserve ordering of flush()es by not letting subsequent flush()es race 2017-01-24 17:05:01 +00:00
Kegsay
9a933e2ce5 Merge pull request #3045 from vector-im/kegan/rageshake-ui
Add css for bug report dialog
2017-01-24 15:47:49 +00:00
Kegan Dougal
efbea0e942 Add css for bug report dialog 2017-01-24 14:45:16 +00:00
David Baker
28939d3146 Merge pull request #3043 from vector-im/luke/fix-status-bar-chopped
Increase the max-height of the expanded status bar
2017-01-24 14:07:55 +00:00
Luke Barnard
307c4f3dd1 Increase the max-height of the expanded status bar
This will ensure that errors, unsent messages, etc. will be allowed enough height to display their contents from within the status bar without being chopped.

Fixes #3041
2017-01-24 14:02:44 +00:00
David Baker
536167a6c8 Merge pull request #3040 from vector-im/rav/fix_test_fail
Hopefully, fix intermittent test failure
2017-01-24 13:48:01 +00:00
Richard van der Hoff
fe64b04339 More test resilience
Give the tests more than one chance for the roomview to load.
2017-01-24 13:35:41 +00:00
David Baker
31878d8a44 Also need eslint-config-google 2017-01-24 13:07:34 +00:00
Kegan Dougal
6f3b70dbb0 Use Q promises and isPending to make logic simpler 2017-01-24 12:43:18 +00:00
Richard van der Hoff
597705716b Hopefully, fix intermittent test failure
This seeks to fix the intermittent failure of the "MatrixClient rehydrated from
stored credentials" tests.

The problem appears to be that the 'load_completed' is sometimes taking a while
to come through from the dispatcher - or rather, it is taking a long time to
get *sent* to the dispatcher: the chain of `q().then().catch().done()` in
componentDidMount can take a while to happen.

As a workaround, give the test a few goes when waiting for us to start
syncing. It's not ideal to be poking into the internal state of MatrixChat like
this, but it'll do for now.
2017-01-24 11:26:09 +00:00
David Baker
6db5329d9c Merge pull request #2971 from vector-im/dbkr/add_searching_known_users
CSS for 'searching known users'
2017-01-24 10:51:13 +00:00
Luke Barnard
ea82b90d35 Merge pull request #2981 from vector-im/luke/feature-animated-status-bar
Animate status bar max-height and margin-top
2017-01-23 23:08:23 +00:00
Matthew Hodgson
706ffbec3c add riot logos 2017-01-23 19:01:35 +01:00
Kegan Dougal
f3df86872b Fix tightlooping when flush()ing without any logs
The promise would resolve immediately, nulling out `flushPromise`. This would
then immediately be set from `new Promise((resolve, reject) => {...})` turning
it back into non-null `flushPromise`. The resolve handler was called so the
next `flush()` would see "oh yes, there is a non-null `flushPromise`" then
promptly try to set `flushAgainPromise` which chains off the resolved
`flushPromise` which relied on `flushPromise` being `null`ed out after
`resolve()`, causing the chained `flush()` to see "oh yes, there is a non-null
`flushPromise`" which... ad infinitum.

This PR fixes it by making the nulling out asynchronous but the fact it took
me this long to debug this issue indicates to me that this is a terrible piece
of code. Will re-write.
2017-01-23 17:37:57 +00:00
David Baker
4c3ea13413 Make jenkins run the linter 2017-01-23 15:42:50 +00:00
Richard van der Hoff
c31b65d093 Merge pull request #3032 from vector-im/dbkr/add_eslint_config
Add eslint config
2017-01-23 14:57:39 +00:00
David Baker
bc714ba3a0 Add eslint config
An early start that gets some linting in place.
2017-01-23 14:22:54 +00:00
Luke Barnard
b7204bf868 Use primary bg color on statusArea 2017-01-23 13:33:39 +00:00
Luke Barnard
c4d246cd72 Merge branch 'develop' into luke/feature-animated-status-bar 2017-01-23 13:31:48 +00:00
Luke Barnard
b582cf0a5f Remove CSS for StatusBar mid-timeline 2017-01-23 13:30:39 +00:00
David Baker
f025afc297 Merge pull request #3030 from vector-im/luke/fix-typing-avatars-alignment
Re-position typing avatars relative to "is typing"
2017-01-23 12:44:47 +00:00
Luke Barnard
57126efe86 Reposition typing avatars relative to "is typing" 2017-01-23 10:24:23 +00:00
Kegan Dougal
2ecf65f057 Keep the logs if no store exists 2017-01-23 09:28:48 +00:00
Matthew Hodgson
d907421ad4 crappy CSS for UnknownDeviceDialog 2017-01-22 01:25:32 +01:00
Matthew Hodgson
ef519231d6 fix mute button colors 2017-01-20 21:16:58 +00:00
Matthew Hodgson
83272f5cc5 fix badge color again 2017-01-20 21:11:28 +00:00
Matthew Hodgson
5b1fea46cb fix badge color 2017-01-20 21:09:49 +00:00
Matthew Hodgson
a9c575b4d0 fix a bunch of dark-theme buttons 2017-01-20 21:00:33 +00:00
Luke Barnard
a24b568b73 Merge pull request #2998 from vector-im/luke/css-typing-avatars
CSS for avatars that appear when users are typing
2017-01-20 17:43:36 +01:00
lukebarnard
afcf9de8d4 Handle avatars with initials 2017-01-20 17:35:01 +01:00
lukebarnard
9ffedf5e7d space after colons 2017-01-20 17:00:59 +01:00
lukebarnard
956deca844 Add bg-color border to typing avatars 2017-01-20 16:59:41 +01:00
Kegan Dougal
ea063ab8b0 Address race conditions when flushing logs 2017-01-20 14:46:19 +00:00
Kegan Dougal
378126e746 Add another store to keep last modified times
This makes it easier to get a list of all the log IDs. It also makes it possible
to order the logs by the *LAST* log line and not the first as was the case
previously, which is important in the case of long-running tabs.
2017-01-20 14:00:30 +00:00
Kegan Dougal
41c6294be2 Remove clearAll from consume(): we want duplicate logs on multiple reports 2017-01-20 13:02:57 +00:00
Kegan Dougal
ba1e166ac8 Line length 80 like we're still in the 80s 2017-01-20 12:02:48 +00:00
Kegan Dougal
ea860807c4 Add a monkeyPatch function rather than monkey-patching in the constructor 2017-01-20 11:56:11 +00:00
Richard van der Hoff
01d4846526 Merge pull request #3001 from vector-im/dbkr/carlos22_desktop_wmclass
Add StartupWMClass
2017-01-20 10:38:52 +00:00
Matthew Hodgson
9b70e2e25f fix RTE bg color 2017-01-20 02:34:45 +00:00
Matthew Hodgson
4d8f5d4df1 change selection color & fix MD bg 2017-01-20 02:29:56 +00:00
Matthew Hodgson
fa535996ae fix textarea bg 2017-01-20 02:22:11 +00:00
Matthew Hodgson
17e215036d Merge pull request #3002 from vector-im/rav/fix_eventmenu_icon
Fix link to image for event options menu
2017-01-19 18:48:52 +00:00
Richard van der Hoff
8ad0ff24f8 Fix link to image for event options menu
This has to be relative, because we don't know if riot is going to be mounted
at the top-level of the domain or not (it's not, on riot.im).

Links are relative to the final location of the CSS, which is under
bundles/<hash>, so need ../..
2017-01-19 18:35:43 +00:00
Richard van der Hoff
693285ac0e Merge pull request #2999 from vector-im/dbkr/carlos22_single_instance
Make riot desktop single instance
2017-01-19 18:04:09 +00:00
Kegan Dougal
53a16158c7 Remove logs when submitting bug reports 2017-01-19 17:41:08 +00:00
Kegan Dougal
beba4d2ae3 Add version and user agent to bug report 2017-01-19 17:40:21 +00:00
Richard van der Hoff
36450764f3 rethemendex fixes
- set cwd before doing cwd-specific operations
- don't include 'themes' directory, otherwise it's a bit circular.
2017-01-19 17:02:57 +00:00
Kegan Dougal
3996d23b19 Inject bug report endpoint URL from config.json 2017-01-19 16:49:25 +00:00
Kegan Dougal
bf887e82fe Swap to async/await rather than promise chains
Since we do in fact support coroutines!
2017-01-19 16:40:54 +00:00
David Baker
f5d7f3ca9f Add StartupWMClass
so GNOME doesn't get confused by the hidden windows
2017-01-19 16:21:43 +00:00
Richard van der Hoff
16bb75be66 Merge pull request #2997 from vector-im/dbkr/carlos22_electron_tray
Add electron tray icon
2017-01-19 16:04:12 +00:00
David Baker
537194608e Make riot desktop single instance
So launching a new instance will focus the old one, meaning that
if you have Riot minimised to the tray and launch it via the
desktop shortcut / start menu, you don't end up with more & more
copies of the app.

This doesn't really prevent you from running multiple copies of
the app to fake multi account support since they share a data
directory anyway.
2017-01-19 16:01:37 +00:00
lukebarnard
789c7b60cc CSS for avatars that appear when users are typing 2017-01-19 16:51:41 +01:00
Kegan Dougal
81d437ac1e POST reports to localhost for now. Also send live console logs 2017-01-19 15:47:55 +00:00
Richard van der Hoff
61c5253dbf Give the 'Light' theme link a title too
... mostly to make it appear on the Firefox style menu.
2017-01-19 15:41:58 +00:00
Kegan Dougal
608c1b0208 Finish implementing consume()
- Fetches all logs in order and concatenates correctly.
- Purges old logs correctly.
2017-01-19 15:03:47 +00:00
David Baker
d11bcdad5f Add electron tray icon
From https://github.com/vector-im/riot-web/pull/2960

Makes riot minimise to the tray on windows / linux.
2017-01-19 14:29:07 +00:00
Richard van der Hoff
686a3c693a Merge pull request #2994 from vector-im/dbkr/carlos22_notif_fixes
Fixes to electron desktop notifs
2017-01-19 14:03:02 +00:00
David Baker
bee4ca2b28 Fixes to electron desktop notifs
Merge the notification part of https://github.com/vector-im/riot-web/pull/2960

 * Show and focus the window when the notification is clicked,
   rather than just restoring it.
 * Implement requestNotificationPermission and return a resolved
   promise (although in practice it should never be called)
2017-01-19 13:25:56 +00:00
David Baker
231adbcd31 Add copyright header 2017-01-19 13:02:08 +00:00
Kegan Dougal
89d514a532 Query IndexedDB for all results with index=0 2017-01-19 12:02:19 +00:00
lukebarnard
6b1d138918 Make scrolling to bottom whilst expanded seem less weird inertially 2017-01-19 12:45:26 +01:00
Richard van der Hoff
5978aff632 Merge pull request #2975 from vector-im/dbkr/auto_hide_menu_bar
Auto-hide the electron menu bar
2017-01-19 11:44:36 +00:00
David Baker
92096c40ac Merge pull request #2987 from vector-im/rav/karma_tweaks
A couple of tweaks to the karma config
2017-01-19 11:40:02 +00:00
David Baker
6c4bf58ba5 Merge pull request #2974 from vector-im/rav/deploy_script
Deploy script
2017-01-19 11:32:46 +00:00
David Baker
5f8170f4cd Merge remote-tracking branch 'origin/develop' into dbkr/add_searching_known_users 2017-01-19 11:12:49 +00:00
lukebarnard
e08f97a549 Reduce animation time to 200ms 2017-01-19 11:52:15 +01:00
Richard van der Hoff
971314d75a Merge pull request #2990 from vector-im/rav/postcss-webpack-loader
Use the postcss-webpack-loader
2017-01-19 03:01:53 +00:00
Richard van der Hoff
c3fa6ff805 Use the postcss-webpack-loader
Use postcss-webpack-loader instead of webpack-cli to process the scss. Doing so
mostly means that we avoid the problem that webpack-dev-server fails to start
if we haven't already built the CSS. (It also simplifies package.json somewhat,
which is no bad thing)
2017-01-19 02:48:17 +00:00
Richard van der Hoff
d1fbbf90c0 Verify PGP signatures on tarballs when deploying 2017-01-18 22:58:04 +00:00
Matthew Hodgson
c5032ba1bc Update theming.md 2017-01-18 22:46:12 +00:00
Richard van der Hoff
237f4df08e A couple of tweaks to the karma config
* allow the imgs to be served from the karma server to avoid 404s
* Use the source-map-loader for js
2017-01-18 21:42:14 +00:00
Matthew Hodgson
5b95986705 fix various SCSS snafus 2017-01-18 20:05:18 +00:00
Matthew Hodgson
ec1a2f6abf fix CSS regression in searchbox 2017-01-18 19:29:53 +00:00
Kegan Dougal
811086ac8e Comment how we should consume logs 2017-01-18 17:18:02 +00:00
Matthew Hodgson
f20efc57f3 simple doc about theming 2017-01-18 17:05:13 +00:00
Matthew Hodgson
c0e5a1ba3b Merge pull request #2973 from vector-im/matthew/postcss
Switch CSS to using postcss, and implement a dark theme.
2017-01-18 16:46:53 +00:00
Kegan Dougal
5828ab1077 Generate unique IDs for each JS runtime to accomodate multiple tabs 2017-01-18 16:27:11 +00:00
Matthew Hodgson
acb85b7b72 f1x0r CSS comment 2017-01-18 16:06:02 +00:00
Kegan Dougal
e9884768f6 Persist console logs to an IndexedDB instance 2017-01-18 16:00:13 +00:00
lukebarnard
f10bc8eef1 Animate status bar max-height and margin-top
When collapsed, the max-height is set to 0px. When expanded, max-height is set to 50px, margin-top is set to 0px. When expanded and when the timeline is not scrolled down to the bottom, margin-top is set to -50px to offset the change in height, keeping it at the same scroll position.

Without the animation, there would be a jump when the user starts scrolling up from the bottom whilst the StatusBar is expanded.
2017-01-18 16:49:20 +01:00
Matthew Hodgson
708fd640f7 unbreak switching after vdh's webpack changes 2017-01-18 14:06:20 +00:00
Matthew Hodgson
14eec6d982 Merge branch 'develop' into matthew/postcss 2017-01-18 12:44:42 +00:00
Matthew Hodgson
69bedf0d37 review feedback 2017-01-18 12:42:48 +00:00
David Baker
83145e80e5 Auto-hide the electron menu bar
From https://github.com/vector-im/riot-web/issues/2962

This allows all the shortcuts to still work, and the menu bar can
be un-hidden with the alt key.
2017-01-18 10:39:59 +00:00
Richard van der Hoff
5206410f21 Deployment script
Factor some bits out of redeploy.py, so that they can be used in a deployment
script suitable for riot.im/app.
2017-01-17 22:43:23 +00:00
Matthew Hodgson
0cd895b417 kill the moofle 2017-01-17 19:19:30 +00:00
Matthew Hodgson
6c88201e23 use ye olde rel='alternate stylesheets' for theming 2017-01-17 19:14:16 +00:00
David Baker
7bcd9ff3d6 Retest 2017-01-17 15:02:31 +00:00
Richard van der Hoff
641a5c244c Merge pull request #2969 from vector-im/rav/keep_old_bundles
Update redeploy script to keep old bundles
2017-01-17 14:59:12 +00:00
David Baker
323c5d0732 CSS for 'searching known users' 2017-01-17 14:54:55 +00:00
David Baker
6257019926 Merge pull request #2967 from vector-im/dbkr/include_version_in_update_check
Include current version in update check explicitly
2017-01-17 14:42:03 +00:00
Matthew Hodgson
c9c58ab0ec fix up the contextual menu button 2017-01-17 14:10:09 +00:00
David Baker
cf92e7f64b Clarify comment 2017-01-17 14:04:42 +00:00
Richard van der Hoff
8371006d90 Update redeploy script to keep old bundles
... so that people using old versions of the master chunk can still load other
webpack chunks.
2017-01-17 13:55:33 +00:00
David Baker
3b109f7612 Include current version in update check explicitly
Hopefully fix https://github.com/vector-im/riot-web/issues/2847
2017-01-17 13:16:08 +00:00
David Baker
ebc2ad54d6 Merge pull request #2966 from vector-im/rav/move_bundle_again
Add another layer of directory to webpack chunks
2017-01-17 12:04:28 +00:00
Richard van der Hoff
4a1b04e57b Add another layer of directory to webpack chunks 2017-01-17 12:00:20 +00:00
David Baker
205676a97d Back to develop js-sdk & react-sdk 2017-01-17 11:30:59 +00:00
David Baker
0456cadff6 Merge branch 'master' into develop 2017-01-17 11:30:31 +00:00
Richard van der Hoff
aa6d584ae3 Merge pull request #2965 from vector-im/rav/fix_font_links
Fix links to fonts and images from CSS
2017-01-17 11:00:27 +00:00
Richard van der Hoff
ef07a6035e Fix links to fonts and images from CSS
https://github.com/vector-im/riot-web/pull/2961 put the CSS in a subdirectory,
which meant that links from CSS to images and fonts were broken. Fix them up.
2017-01-17 10:48:38 +00:00
David Baker
86b66120d0 Merge pull request #2961 from vector-im/rav/build_hash_in_filename
Put parent build hash in webpack output filenames
2017-01-17 09:58:27 +00:00
Matthew Hodgson
3bdb330f5b cheeky hack to get the ctxt menu colors right 2017-01-17 09:57:01 +00:00
Matthew Hodgson
4f8d3b0e2b more factoring 2017-01-17 02:00:34 +00:00
Matthew Hodgson
87fd136e21 factor out remaining # colours 2017-01-16 23:13:47 +00:00
Matthew Hodgson
cab5bf8849 fix a lone lost opera vendor prefix 2017-01-16 19:00:44 +00:00
Matthew Hodgson
d74dfc9ee7 strip out unneeded -ms- prefixes 2017-01-16 18:58:37 +00:00
Matthew Hodgson
c305b72b91 strip out unneeded -moz- prefixes 2017-01-16 18:58:02 +00:00
Matthew Hodgson
dc1563d916 strip out unneeded webkit prefixes now we're using autoprefixer 2017-01-16 18:55:29 +00:00
Matthew Hodgson
906d42688e make autoprefixer work by reordering it 2017-01-16 18:40:29 +00:00
Richard van der Hoff
b3bff92cc2 Put parent build hash in webpack output filenames
In order to better support a world where old build artifacts are available
(which is necessary to support bundle.js splitting), collect all the webpack
artifacts for the build into a single directory. Then we'll be able to clear
out old builds after a few weeks, knowing they won't be in use any more.
2017-01-16 18:01:25 +00:00
David Baker
ae7820e8f2 Fix merge 2017-01-16 13:37:18 +00:00
David Baker
3023ea5335 Merge branch 'release-v0.9.6' 2017-01-16 13:34:41 +00:00
David Baker
22060ac5a4 v0.9.6 2017-01-16 13:26:22 +00:00
David Baker
3f3a31e475 Prepare changelog for v0.9.6 2017-01-16 13:26:21 +00:00
David Baker
231306ea7c Update js-sdk & react-sdk 2017-01-16 13:24:44 +00:00
Matthew Hodgson
002339fb86 factor out some more colours 2017-01-16 02:10:45 +00:00
Matthew Hodgson
8b38a326cb merge package.json 2017-01-16 00:20:18 +00:00
Jani Mustonen
5edb5f6487 Turned divs to button-likes to comply with MDN's recommendations 2017-01-14 02:11:58 +02:00
Richard van der Hoff
61251d20c1 Merge pull request #2846 from uhoreg/patch-2
update README to point to new names/locations
2017-01-13 22:05:55 +00:00
Hubert Chathi
ccf7db7cc2 Fix a couple more references to vector-web in README.md 2017-01-13 15:06:29 -05:00
David Baker
e1c1937855 v0.9.6-rc.1 2017-01-13 11:21:08 +00:00
David Baker
9471c30f89 Prepare changelog for v0.9.6-rc.1 2017-01-13 11:21:08 +00:00
David Baker
40545bd48e Released react-sdk & js-sdk 2017-01-13 11:15:55 +00:00
David Baker
6b02bf8e8c Merge pull request #2920 from vector-im/dbkr/ci_build_js_sdk
Build the js-sdk in the CI script
2017-01-12 17:37:18 +00:00
David Baker
0d05e607f0 install js-sdk in travis too 2017-01-12 17:24:28 +00:00
David Baker
717aa94ba9 Merge pull request #2917 from vector-im/dbkr/fix_windows_shortcuts
Hopefully fix Windows shortcuts
2017-01-12 10:43:26 +00:00
David Baker
9caba57c14 Merge pull request #2921 from vector-im/dbkr/update_readme_for_js_sdk_transpiled
Update README now the js-sdk has a transpile step
2017-01-12 10:05:55 +00:00
David Baker
70f48343ee It's now just build 2017-01-11 19:03:52 +00:00
David Baker
f17f103d12 s/build/compile/ for js sdk 2017-01-11 18:19:44 +00:00
David Baker
27e311f7e8 Address PR comments 2017-01-11 18:15:06 +00:00
David Baker
5258bf9c84 Update README now the js-sdk has a transpile step 2017-01-11 17:25:58 +00:00
David Baker
10f0631487 Build the js-sdk in the CI script
now it's transpiled
2017-01-11 17:20:27 +00:00
David Baker
97fc92b1bb Update to electron 1.4.14
This pulls in the chrome change that broke geotrust ssl when the
build hit 10 weeks old, so let's get this one out before we hit
more disasters.
2017-01-11 16:53:01 +00:00
David Baker
06718c580e Hopefully fix Windows shortcuts
* Revert 79d164309f
   as it seems to break shortcuts altogether
 * Update electron-builder (and add the squirrel windows package
   that the newer version now requires: it's been split out). This
   uses a newer version of squirrel which has some fixes for
   shortcuts.

I'm unsure exactly what was going wrong originally in
https://github.com/vector-im/riot-web/issues/2775 but #79d1643
seems to break shortcut creation as far as I can see.
2017-01-11 16:27:40 +00:00
David Baker
15528ef8d7 Merge pull request #2915 from vector-im/dbkr/use_dev_tools_role
Use the role for 'toggle dev tools'
2017-01-11 14:50:15 +00:00
David Baker
b71f96e4e5 Use the role for 'toggle dev tools'
Let electron handle it rather than doing it ourselves
2017-01-11 10:28:04 +00:00
David Baker
278de1398b Merge pull request #2909 from vector-im/dbkr/enable_screen_sharing
Enable screen sharing easter-egg in desktop app
2017-01-11 10:12:57 +00:00
David Baker
c5459a2f19 Enable screen sharing easter-egg in desktop app 2017-01-10 18:39:21 +00:00
Matthew Hodgson
c1d4a0dd28 postcss experiment 2017-01-10 11:06:45 +00:00
Matthew Hodgson
691fe611d6 experimental postcss 2017-01-10 11:06:09 +00:00
Richard van der Hoff
6a1af891b7 Use a custom script to copy resources (#2893)
All of those cpx invocations were getting unwieldy, and I suspect the exotic
quoting needed to run them under parallelshell was breaking things on windows.

Replace the unwieldy cpx invocations with an unwieldy custom script.
2017-01-06 10:43:13 +00:00
Matthew Hodgson
35b3013386 fix up a few more colours 2016-12-31 14:27:44 +00:00
Hubert Chathi
d1a9695a35 update README to point to new names/locations 2016-12-28 20:57:31 -05:00
Matthew Hodgson
c6beaa1631 initial stab at an official dark theme via the magic of SASS.
SVGs are all broken, and some of the more exotic colours haven't been updated. There's been no attempt to use SASS to remove duplication from the CSS yet.
no attempt to switch it at runtime yet.
2016-12-28 04:06:10 +00:00
Matthew Hodgson
33f0eaada0 autogen _components.css 2016-12-28 02:02:23 +00:00
Matthew Hodgson
c5fa84cd28 autogenerate the _components.scss index 2016-12-28 02:02:05 +00:00
Matthew Hodgson
bacb284415 basic jig for SASS-based themed CSS (one bundle per theme) 2016-12-28 02:01:28 +00:00
Kevin McDonald
650269d356 Add ISSUE_TEMPLATE 2016-12-26 21:33:27 -07:00
Matthew Hodgson
b0319ec0f1 merge 2016-12-24 19:32:29 +00:00
Matthew Hodgson
6e0f83a298 Merge branch 'release-v0.9.5' 2016-12-24 19:29:42 +00:00
Matthew Hodgson
747408871d v0.9.5 2016-12-24 19:07:31 +00:00
Matthew Hodgson
0129da4dd6 Prepare changelog for v0.9.5 2016-12-24 19:07:30 +00:00
Matthew Hodgson
3f3772463b bump react dep 2016-12-24 19:04:00 +00:00
Matthew Hodgson
4de042bf58 empirically fix win32 shortcut in start menu 2016-12-24 19:03:46 +00:00
Matthew Hodgson
8c523be6f5 add gnu-tar to debian electron build deps 2016-12-24 19:03:46 +00:00
Matthew Hodgson
078493912c make electron send email validation URLs with a nextlink of riot.im rather than file:/// 2016-12-24 19:03:46 +00:00
Matthew Hodgson
cbf105f2a0 Revert "bump to dep on react-sdk 0.8.3-electron"
This reverts commit bba6664b1c.
2016-12-24 18:59:41 +00:00
Matthew Hodgson
bba6664b1c bump to dep on react-sdk 0.8.3-electron 2016-12-24 18:58:42 +00:00
Matthew Hodgson
b06d045188 Merge pull request #2808 from vector-im/matthew/electron-captcha2
make electron send email validation URLs with a nextlink of riot.im
2016-12-24 18:38:29 +00:00
Matthew Hodgson
79d164309f empirically fix win32 shortcut in start menu 2016-12-24 18:13:33 +00:00
Matthew Hodgson
f2afcc0bc8 add gnu-tar to debian electron build deps 2016-12-24 18:13:20 +00:00
Matthew Hodgson
43f82cd95d Merge pull request #2809 from k3vmcd/master
add Debian Stretch install steps to readme
2016-12-24 16:47:20 +00:00
Kevin McDonald
2b70cb436e add Debian Stretch install steps to readme 2016-12-23 22:32:16 -07:00
Matthew Hodgson
9a861f46d0 make electron send email validation URLs with a nextlink of riot.im rather than file:/// 2016-12-24 03:18:12 +00:00
Matthew Hodgson
bb28903c8e fix warning page 2016-12-24 01:36:00 +00:00
Matthew Hodgson
e8eadc5d20 Merge pull request #2793 from joelostblom/patch-1
Update desktop build instructions fixes #2792
2016-12-22 20:42:01 +00:00
joelostblom
e741a4f294 Update desktop build instructions fixes #2792
This is based on what I had to do to get the desktop app running, as per the advice in https://github.com/vector-im/riot-web/issues/2792. I am not familiar with `npm`, so please change this pull request if there is a more appropriate way of achieving the same result.
2016-12-22 14:53:03 -05:00
Richard van der Hoff
1678a25fd6 Merge branch 'master' into develop 2016-12-22 18:33:37 +00:00
Richard van der Hoff
ff70b0a2c8 v0.9.4 2016-12-22 18:24:04 +00:00
Richard van der Hoff
3803c64226 prep 0.9.4 changelog 2016-12-22 18:15:00 +00:00
Richard van der Hoff
35a541c824 Bump to olm 2.1.0 2016-12-22 17:23:27 +00:00
Richard van der Hoff
ab8420f5a9 Bump to olm 2.1.0 2016-12-22 16:30:14 +00:00
David Baker
fa46757830 Merge pull request #2784 from vector-im/dbkr/delete_threepid
CSS for the delete threepid button
2016-12-22 15:31:38 +00:00
David Baker
ed35a90cfb Back to develop js & react sdk 2016-12-22 14:36:05 +00:00
David Baker
d8bce0f202 v0.9.3 2016-12-22 14:18:23 +00:00
David Baker
e6f600bb47 Prepare changelog for v0.9.3 2016-12-22 14:18:22 +00:00
David Baker
519af6a5d0 Bump to matrix-react-sdk 0.8.3 2016-12-22 14:14:44 +00:00
Richard van der Hoff
c6c4aff8ae Redeploy script: put each build in a separate directory (#2790)
* Redeploy script: put each build in a separate directory

Hopefully this will fix the problem whereby we can overwrite the live
deployment.
2016-12-22 12:02:54 +00:00
Matthew Hodgson
6d4abac016 Merge pull request #2755 from Mikaela/readme-nativefier
README.md: fix GFMD for nativefier
2016-12-22 02:37:17 +00:00
David Baker
d34cb80b68 CSS for the delete threepid button 2016-12-21 18:50:35 +00:00
Matthew Hodgson
57641f7228 typo 2016-12-20 00:05:49 +00:00
Mikaela Suomalainen
9ae86f2585 README.md: fix GFMD for nativefier
GitHub Flavoured MarkDown parsed this as
`sudo npm install nativefier -g nativefier https://riot.im/app/` which
is incorrect.
2016-12-17 21:17:58 +02:00
David Baker
1e7e9d6101 v0.9.2 2016-12-16 17:44:22 +00:00
David Baker
8bbc16ed4b Prepare changelog for v0.9.2 2016-12-16 17:44:22 +00:00
David Baker
4745b3efeb released js-sdk & react-sdk 2016-12-16 17:40:37 +00:00
David Baker
09f79b94dd Merge pull request #2750 from vector-im/dbkr/roomdir_remove_client_filter
Remove the client side filtering from the room dir
2016-12-16 16:44:05 +00:00
David Baker
42357dee0b Typo 2016-12-16 16:36:24 +00:00
David Baker
2e73cd6c4d PR feedback 2016-12-16 16:24:24 +00:00
David Baker
161978ab05 Fix tests 2016-12-16 15:20:52 +00:00
David Baker
994bc9279f Remove the client side filtering from the room dir
This removes the ability for the client to filter remote room
directories by network, since the /thirdparty/protocols API does
not yet work for remote servers. They would only get the main list
now though anyway, so there is no point in us continuing to support
it.
2016-12-16 14:17:13 +00:00
David Baker
fb08910db3 Read the icon from the right place
Also don't define image widths in the HTML as it's done in the CSS.
2016-12-16 10:14:38 +00:00
Richard van der Hoff
e607f49ae6 Merge pull request #2745 from vector-im/rav/set_olm_heap_size
Configure olm memory size
2016-12-15 17:19:04 +00:00
David Baker
52cf1f6a4b Missed a wire_onclick 2016-12-15 16:36:14 +00:00
Richard van der Hoff
61f9966fe0 Merge pull request #2747 from vector-im/dbkr/third_party_filter
Support room dir 3rd party network filtering
2016-12-15 16:21:28 +00:00
David Baker
5f7cdb8d42 s/wire_onclick/handleClicks/
and actually pass handleClicks false as appropriate
2016-12-15 14:29:16 +00:00
David Baker
901c0e7e41 Remove unused event params 2016-12-15 14:24:55 +00:00
David Baker
98cad8779c Add instance_id to initial state 2016-12-15 10:42:11 +00:00
David Baker
fc597ba86e Underscore for private method 2016-12-15 10:41:22 +00:00
David Baker
f5bd8abfda Support room dir 3rd party network filtering
As per https://github.com/matrix-org/synapse/pull/1676

The existing local config system still exists and is used for
remote home server directories (since /thirdparty/protocols
doesn't support listing remote home servers, and also because
people are using it).
2016-12-14 15:41:15 +00:00
Richard van der Hoff
8be72e6c27 Configure olm memory size
16M is somewhat excessive: configure olm to use a bit less.

Requires changes to the olm library to do anything useful, but will be harmless
without them.

Partial fix to vector-im/riot-web#2726.
2016-12-14 11:59:37 +00:00
David Baker
2740013625 RELEASES is for update, not install 2016-12-13 10:24:32 +00:00
David Baker
119e03b64f Get the update base URL right
and update the text in the README.
2016-12-12 17:24:22 +00:00
David Baker
c6dbeee245 ico needs to be at least 256x256 2016-12-09 22:33:20 +00:00
David Baker
feb3a13a71 Get version after we've checked out... 2016-12-09 20:23:19 +00:00
David Baker
c80d1c15d2 dev js-sdk & react-sdk 2016-12-09 20:12:37 +00:00
David Baker
b9ba795cb0 v0.9.1 2016-12-09 20:05:41 +00:00
David Baker
598b841bf7 Prepare changelog for v0.9.1 2016-12-09 20:05:41 +00:00
David Baker
93b3857a9b Merge branch 'develop' into release-v0.9.1 2016-12-09 20:03:10 +00:00
David Baker
5414b5d189 Released js-sdk & react-sdk 2016-12-09 19:58:33 +00:00
David Baker
b4e362d700 Bump to electron 1.4.11 2016-12-09 19:14:59 +00:00
David Baker
eabb91da1e Merge pull request #2732 from vector-im/dbkr/desktop_readme
Update README to say how to build the desktop app
2016-12-09 19:06:14 +00:00
David Baker
fe574b008b Credit aviral & other options for native riot 2016-12-09 19:05:25 +00:00
David Baker
b8fe8a4363 Merge branch 'develop' of github.com:vector-im/riot-web into develop 2016-12-09 18:30:38 +00:00
David Baker
6acbdc442d Actually write latest version into latest 2016-12-09 18:29:54 +00:00
David Baker
f7cd5cb76f Update README to say how to build the desktop app 2016-12-09 18:29:06 +00:00
Richard van der Hoff
e2195de719 Merge pull request #2731 from vector-im/dbkr/signing_id
Add signing ID in release_config.yaml
2016-12-09 17:31:46 +00:00
David Baker
3921aa4e54 Merge pull request #2722 from vector-im/dbkr/icons
Makeover!
2016-12-09 17:18:27 +00:00
David Baker
48ca0254fe Add signing ID in release_config.yaml
Read by release script in js-sdk
2016-12-09 17:13:20 +00:00
David Baker
375a7605ae Merge remote-tracking branch 'origin/develop' into dbkr/icons 2016-12-09 15:45:21 +00:00
Richard van der Hoff
8097b150a0 Merge pull request #2730 from vector-im/dbkr/fix_test_breakage
Fix broken tests
2016-12-09 15:44:17 +00:00
David Baker
67cf4230ac Fix broken tests
Promises are now not being resolved within the same tick, so give
another tick for the UI to update after all the HTTP calls have
flushed through. This is fairly terrible, but I can't immediately
see a better way of doing this.
2016-12-09 14:27:41 +00:00
Richard van der Hoff
b06cff7928 Merge pull request #2727 from vector-im/dbkr/make_loading_tests_work_alone
Make the 'loading' tests work in isolation
2016-12-09 10:58:25 +00:00
David Baker
d65374f7f9 Make the 'loading' tests work in isolation
The 'loading' tests only worked when run with the other tests and
failed if you just ran the file by itself, because the skin was
loading in the 'joining' tests, but not here.
2016-12-09 10:31:26 +00:00
David Baker
f0b0999f65 Numeracy 2016-12-08 18:04:44 +00:00
David Baker
e55845ac52 Makeover!
Also add script for generating the PNGs and add pre-rendered PNGs
for the Linux electron build which means you don't need icns2png
to build it and the Linux icons are straight from the SVG rather
than resized bitmaps.
2016-12-08 16:22:34 +00:00
David Baker
229693dd71 gitignore .npmrc
(We now require a .npmrc in the riot-web dir to use the right
account when releasing)
2016-12-08 11:41:31 +00:00
David Baker
5e8e6f4c8b Add icon missed from #2708 2016-12-08 11:40:33 +00:00
David Baker
98f9e2f870 Merge remote-tracking branch 'origin/develop' into release-v0.9.1 2016-12-07 17:18:15 +00:00
Matthew Hodgson
2b51cda6da talk to jenkins via https for the /dev redeployer 2016-12-07 14:07:31 +00:00
Richard van der Hoff
65a31cc8a9 Merge pull request #2708 from vector-im/dbkr/png_icon_on_linux
Use a PNG for the icon on non-Windows
2016-12-07 11:23:10 +00:00
David Baker
737f912abb Use a PNG for the icon on non-Windows
MATE desktop env (and presumably other GNOMEs don't support ICOs,
so use a PNG.

Fixes https://github.com/vector-im/riot-web/issues/2705
2016-12-07 11:19:51 +00:00
Matthew Hodgson
f6957aa367 Merge pull request #2703 from uhoreg/patch-1
Add missing brackets to call to toUpperCase
2016-12-07 09:24:11 +00:00
Hubert Chathi
ad79f67ab6 Add missing brackets to call to toUpperCase 2016-12-06 22:36:42 -05:00
David Baker
a9fcf106ab v0.9.1-rc.2 2016-12-06 16:06:15 +00:00
David Baker
0f47c9956c Prepare changelog for v0.9.1-rc.2 2016-12-06 16:06:14 +00:00
David Baker
d4ac5f829f react-sdk rc.2 2016-12-06 16:04:46 +00:00
David Baker
d31a675ca8 Merge remote-tracking branch 'origin/develop' into release-v0.9.1 2016-12-06 16:02:26 +00:00
Richard van der Hoff
96f620829f Merge pull request #2700 from vector-im/dbkr/fix_notification_click
Fix clicking on notifications
2016-12-06 14:47:41 +00:00
David Baker
5fa0f62ccc Fix clicking on notifications
* Dismiss the notification when it's clicked
 * Accept the room object: we need it to view_room
 * Desktop app: Un-minimise when notification clicked
 * Desktop App: Set App User Model ID so notifications work on
   Windows 8!
2016-12-06 13:28:59 +00:00
Richard van der Hoff
b825862f95 Merge pull request #2697 from vector-im/dbkr/show_when_ready
Only show window when ready
2016-12-06 09:59:32 +00:00
David Baker
8d06b54091 Only show window when ready
Avoids it sitting there for a short period with no spinner while
it parses the js.
2016-12-06 09:45:31 +00:00
David Baker
df5143c818 v0.9.1-rc.1 2016-12-05 18:02:03 +00:00
David Baker
ca6a3a2ad9 Prepare changelog for v0.9.1-rc.1 2016-12-05 18:02:03 +00:00
David Baker
6934b7ed56 released js-sdk & react-sdk 2016-12-05 17:53:06 +00:00
David Baker
987822bd5a typo in cp destination 2016-12-05 17:27:30 +00:00
David Baker
189c8aca79 Remove redundant line getting version
As there is no latest.yml now
2016-12-05 17:15:48 +00:00
David Baker
b6aa7f430c Merge pull request #2653 from vector-im/dbkr/electron_dist_tweaks
Final bits to prepare electron distribtion:
2016-12-05 16:22:44 +00:00
David Baker
d8e772cfc4 Merge pull request #2692 from vector-im/dbkr/repo-rename-riot
Update name & repo to reflect renamed repository
2016-12-05 16:22:33 +00:00
David Baker
ec959f0052 Update name & repo to reflect renamed repository
Unsure whether we want to go through doing a complete
s/vector/riot/ - I'm not sure there's a whole lot of point.
2016-12-05 14:40:06 +00:00
David Baker
3d813e68e9 gitignore electron/pub 2016-12-05 14:20:26 +00:00
David Baker
37b4734bbe Also re-add installer spinner 2016-12-05 14:19:49 +00:00
David Baker
b613a742f5 Forgot to re-add squirrelhooks 2016-12-05 14:17:22 +00:00
David Baker
72de35a2a1 Switch back to Squirrel installer
which it turns out is by far the lesser of two evils.

 * Auto-update works with a proxy
 * The update process is reasonably atomic & faster, rather than
   running the uninstaller then the installer, leaving you with a
   broken install if you shut down your machine at the wrong time
 * Gets the update URL the same way as on mac, rather than baking
   it into the app at build time from package.json. We don't want
   it in package.json because only our builds want our update URL.
2016-12-05 14:08:27 +00:00
David Baker
970a029cea Merge remote-tracking branch 'origin/develop' into dbkr/electron_dist_tweaks 2016-12-02 14:32:31 +00:00
David Baker
d5a5abe202 Merge pull request #2680 from vector-im/dbkr/document_cross_origin_renderer_url
Document cross_origin_renderer_url
2016-12-02 14:31:45 +00:00
Richard van der Hoff
6ff253d0d8 Empty commit
to test Jenkins
2016-12-02 14:27:34 +00:00
David Baker
749d26c8f4 Link to the repo which it turns out is a thing 2016-12-02 14:25:20 +00:00
David Baker
f1998497f2 Put the riot.im config back in this repo 2016-12-02 14:21:33 +00:00
David Baker
d0c2ab4cf1 Document cross_origin_renderer_url 2016-12-02 13:43:41 +00:00
David Baker
7871a3edb5 Just rm dist in the clean step 2016-12-01 19:43:04 +00:00
David Baker
9f51e2c407 Auto-update & build process with NSIS for windows
Amalgamate the electron build packaging into one script.
Use update_base_url so we can compute the actual URL in the
script for windows (because we need to put it in the build) and
at runtime for mac os.
2016-12-01 19:33:42 +00:00
David Baker
2930a94c79 Change to update_base_url 2016-12-01 18:01:23 +00:00
Mark Haines
9026cc4977 Merge pull request #2659 from vector-im/markjh/attachment_iframe_css
Add css for the iframes for e2e attachments
2016-12-01 13:12:12 +00:00
David Baker
e3290c1117 Switch to new auto-update & add linux build
* Remove squirrel hooks (the installing & uninstalling is now
   done by the, er, installer)
 * Switch to electron-auto-update
 * Shorten initial update delay because we no longer need to wait
   for squirrel to release a lock file
 * Change update URLs because windows is now one installer for
   both 32 & 64 bit.
 * Update electron-builder to 10 where NSIS is now the default
   target for Windows.
 * Add linux to the target list, building a deb.
 * Remove sqirrel-specific installation spinner
 * Remove redundant !**/*  from files
2016-12-01 11:35:26 +00:00
Richard van der Hoff
bacd467b4c Merge pull request #2670 from vector-im/dbkr/fix_config_location
Fix config location in some more places
2016-12-01 10:04:20 +00:00
David Baker
4988f0603f Merge remote-tracking branch 'origin/develop' into dbkr/electron_dist_tweaks 2016-11-30 18:13:14 +00:00
David Baker
6a944d3e7d Fix config location in some more places 2016-11-30 18:09:51 +00:00
David Baker
0e18a12472 Merge pull request #2662 from vector-im/rav/s_block_blacklist
CSS updates for s/block/blacklist for e2e
2016-11-29 19:09:08 +00:00
Richard van der Hoff
f202197545 CSS updates for s/block/blacklist for e2e
CSS for https://github.com/matrix-org/matrix-react-sdk/pull/574
2016-11-29 18:49:23 +00:00
Richard van der Hoff
496f507684 Merge pull request #2660 from vector-im/dbkr/electron_1.4.8
Update to electron 1.4.8
2016-11-29 12:18:47 +00:00
David Baker
55062c7ec5 Update to electron 1.4.8
Which uses a new enough build of chromium that it accepts our SSL
certs.
2016-11-28 16:37:43 +00:00
Mark Haines
6c21391ff5 Merge branch 'develop' into markjh/attachment_iframe_css 2016-11-28 15:10:49 +00:00
David Baker
a1347e7bf1 Correct vector to webapp & platform update URLs 2016-11-25 20:09:21 +00:00
David Baker
c7635a362f Don't copy config, check update url 2016-11-25 20:08:45 +00:00
David Baker
97c0e2dfcd Delete electron config from here
It just has our update URL in it which only we care about
2016-11-25 20:08:05 +00:00
David Baker
dfa7c3b72e Animated install logo from Ben 2016-11-25 20:07:38 +00:00
David Baker
4073688ba6 Missed an x64 2016-11-25 20:07:12 +00:00
David Baker
693867f074 Final bits to prepare electron distribtion:
* Remove the config: nobody else wants our update URL so we'll
   keep it separately. Don't copy the config.
 * Script to yell at you if you've build a package with auto
   update turned off.
 * s/vector/webapp/ when looking for config
 * Use different update URLs for the various platforms
2016-11-25 19:57:08 +00:00
David Baker
f9afa79b01 Merge pull request #2644 from vector-im/dbkr/electron_config
Add electron config
2016-11-24 18:19:20 +00:00
David Baker
a870ea2389 Add electron config
Which has the update URL in it
2016-11-24 17:24:11 +00:00
David Baker
ac2911c222 Merge pull request #2643 from vector-im/dbkr/device_name_to_platform
Move getDefaultDeviceName into the Platforms
2016-11-24 16:57:01 +00:00
David Baker
c786980454 Move getDefaultDeviceName into the Platforms
So we can have a sensible device name on Electron
2016-11-24 16:46:15 +00:00
Richard van der Hoff
47534decb3 Merge pull request #2641 from vector-im/dbkr/add_freenode_mozilla_domains
Add Freenode & Mozilla domains
2016-11-24 16:27:56 +00:00
David Baker
0df242e0e9 Add Freenode & Mozilla domains
So the join button works for them
2016-11-24 16:20:58 +00:00
Richard van der Hoff
10650d2cd1 Unpin js-sdk and react-sdk 2016-11-22 22:14:05 +00:00
David Baker
186b4abfd8 Merge pull request #2614 from vector-im/rav/include_sample_config_in_tarball
Include config.sample.json in dist tarball
2016-11-21 11:02:31 +00:00
Richard van der Hoff
9ce2adceef Include config.sample.json in dist tarball
Fixes https://github.com/vector-im/vector-web/issues/2607
2016-11-21 10:40:35 +00:00
Matthew Hodgson
5cd4f88b8c v0.9.0 2016-11-19 02:04:32 +02:00
Matthew Hodgson
683ecb3326 Prepare changelog for v0.9.0 2016-11-19 02:04:31 +02:00
Richard van der Hoff
67c882648f Make sure we only pack one copy of react-dom (#2603)
Fixes https://github.com/vector-im/vector-web/issues/2601
2016-11-18 17:52:44 +00:00
Richard van der Hoff
8b0390f354 Fix a race which took us to the directory on load sometimes (#2602)
Sometimes window.onload would run before loadApp had finished (specifically, if
the browser had to wait for config.json to load). Avoid the race by moving all
of the onload logic into loadApp.
2016-11-18 17:32:01 +00:00
Richard van der Hoff
6d954ad7e0 Merge pull request #2596 from vector-im/rav/cachebust_version
Add a cachebuster to /version
2016-11-17 17:36:26 +00:00
Richard van der Hoff
646608bf8b Add a cachebuster to /version 2016-11-17 17:31:31 +00:00
Mark Haines
be90badc8d Add css for the iframes for e2e attachments 2016-11-17 11:36:46 +00:00
Matthew Hodgson
3155d79a7e chatbot summit stuff 2016-11-17 13:35:36 +02:00
David Baker
dace762a6c Merge pull request #2587 from vector-im/rav/view_clear_source
Add a 'View decrypted source' button
2016-11-17 11:24:39 +00:00
Richard van der Hoff
7577d2eb05 s/var/const/ 2016-11-17 10:51:09 +00:00
Richard van der Hoff
90019023c7 Merge branch 'develop' into rav/view_clear_source 2016-11-17 10:39:16 +00:00
Richard van der Hoff
5d02c72687 Bump to react 15.4
Add dependencies on react 15.4. Some of the things we pull in from
matrix-react-sdk won't work properly against 15.2 / 15.0.
2016-11-17 10:34:12 +00:00
Richard van der Hoff
81d70a921d Add a 'View decrypted source' button 2016-11-16 23:10:51 +00:00
Richard van der Hoff
363453fd06 Merge pull request #2577 from vector-im/dbkr/fix_update_bar_version_format
Fix changelog dialog to  read new version format
2016-11-14 14:15:14 +00:00
Matthew Hodgson
1599f3a666 make logo scale 2016-11-14 01:46:42 +00:00
David Baker
70d383fb1b Fix changelog dialog to read new version format
Remove the 'vector' from the start of the version (otherwise the
tarballs are called vector-vector-[...].tar.gz). The jenkins
script already creates these files, so update accordingly.
2016-11-13 23:06:57 +00:00
Matthew Hodgson
f911f0cfca geektime verbiage tweaks 2016-11-13 20:18:19 +00:00
Matthew Hodgson
1fb14d5a40 plug mobile apps 2016-11-13 14:32:00 +00:00
Matthew Hodgson
616c20fc1e fix img path 2016-11-13 14:26:54 +00:00
Matthew Hodgson
6cf14e6a2a fix room alias 2016-11-13 14:19:55 +00:00
Matthew Hodgson
9f812b7069 fix img path 2016-11-13 14:18:31 +00:00
Matthew Hodgson
efabf35613 make room previews more obvious 2016-11-13 14:13:32 +00:00
Matthew Hodgson
3f640139d2 quick and dirty support for custom welcome pages, with an example for geektime techfest 2016-11-13 14:10:33 +00:00
David Baker
b0c1097f86 Don't include two vector prefixes 2016-11-11 18:23:25 +00:00
David Baker
68a3505091 Fix packaging
* Package images & config in bundle:dev
 * Don't include two vector- prefixes
2016-11-11 18:18:51 +00:00
David Baker
6e47d2f1b5 It's '=' in sh, not '==' 2016-11-11 18:07:03 +00:00
David Baker
2bcb27b24f Merge pull request #2558 from vector-im/dbkr/build_vector_dir
Build all of the vector dir in the build process
2016-11-11 17:51:25 +00:00
David Baker
6ac5fe60d9 Empty commit to force jenkins 2016-11-11 17:41:24 +00:00
David Baker
8356ad7bfa Merge pull request #2553 from vector-im/dbkr/get_app_version
Support for get_app_version
2016-11-11 17:33:41 +00:00
Richard van der Hoff
69eee7ca0a Merge pull request #2565 from vector-im/luke/fix-add-css-for-mlist-truncation
Add CSS for mlist truncation
2016-11-11 11:01:31 +00:00
Luke Barnard
4f944cf01c Add CSS for mlist truncation
matrix-org/matrix-react-sdk#544
2016-11-10 17:15:30 +00:00
David Baker
8676481aab dist now, not packages 2016-11-08 17:37:49 +00:00
David Baker
e66e8b11cb Merge pull request #2560 from Half-Shot/msg-external-url
Add menu option for `external_url` if present
2016-11-08 17:20:21 +00:00
David Baker
1401de2e7d Move the jenkins / redeploy scripts to scripts
While we're breaking things anyway
2016-11-08 17:09:44 +00:00
Will Hunt
15c730a22a Add rel="noopener" to context menu links. 2016-11-08 17:08:50 +00:00
David Baker
3b06563960 Fix jenkins script / redeployer
and make them re-use the package script rather than doing their
own thing
2016-11-08 17:08:01 +00:00
Will Hunt
cf33ed58c1 Add menu option for external_url if present 2016-11-08 16:57:56 +00:00
David Baker
c8a6be1454 Update gitignore 2016-11-08 16:14:57 +00:00
David Baker
5b7f629996 Build to the 'webapp' directory instead
People may have config files in vector/ so it would be nonideal
if we started overwriting them / blowing them away.
2016-11-08 15:46:21 +00:00
David Baker
a4c16b896b Merge remote-tracking branch 'origin/develop' into dbkr/build_vector_dir 2016-11-08 15:44:27 +00:00
David Baker
d150ee0d05 Missed a -w 2016-11-08 15:30:19 +00:00
David Baker
7bf69d067a Another missed file from the windows fixes
This time the icon file for the window
2016-11-08 14:35:59 +00:00
David Baker
ccc43cc0ed Merge pull request #2555 from vector-im/dbkr/auto_update_config
Make auto-update configureable
2016-11-08 14:33:44 +00:00
David Baker
f7091d2fdd Merge pull request #2556 from vector-im/dbkr/windows_fixes_missed_files
Missed files electron windows fixes
2016-11-08 14:33:19 +00:00
David Baker
1e2cd9c2d1 Build all of the vector dir in the build process
So the whole vector/ directory can now be removed during the build
process and we don't ship random files that end up in the vector
directory.
2016-11-08 14:30:12 +00:00
David Baker
a2a3d7a0f9 Remove spurious log line 2016-11-08 11:45:11 +00:00
Luke Barnard
abc306be6c Merge pull request #2554 from vector-im/luke/feature-show-integration-error-popup
Add some CSS for  scalar error popup
2016-11-08 11:27:49 +00:00
David Baker
ccea483f4f Missed files electron windows fixes
Missed from https://github.com/vector-im/vector-web/pull/2551

 * squirrel hooks file for handling install / uninstall events
 * Install 'spinner' gif for windows (ours does not spin)
2016-11-08 11:20:47 +00:00
David Baker
84aac88677 Make auto-update configureable
Otherwise everyone that builds electron vector will end up with
their apps auto-updatin to our version when we release an update.

Coming next: A way to manage our electron release process to make
sure we never ship a build with auto-update disabled.
2016-11-08 11:07:36 +00:00
Luke Barnard
b30df2115c Add some CSS for an error popup that appears next to the Manage Integrations button if there was a problem contacting Scalar 2016-11-08 10:54:03 +00:00
David Baker
8d46077ac2 Support for get_app_version 2016-11-08 10:47:01 +00:00
Richard van der Hoff
0441fcf3df Merge pull request #2552 from vector-im/dbkr/electron_catch_unhandled_errors
Catch unhandled errors in the electron process
2016-11-07 15:22:11 +00:00
David Baker
b223d3b385 Catch unhandled errors in the electron process
Otherwise we pop up stack traces in dialog boxes if it fails to
to poll for updates or something.
2016-11-07 14:37:12 +00:00
David Baker
e033ce6c43 Merge pull request #2551 from vector-im/dbkr/electron_windows_fixes
Slight grab-bag of fixes for electron on Windows
2016-11-07 13:54:38 +00:00
David Baker
6681205337 Slight grab-bag of fixes for electron on Windows
* Implement the squirrel install / uninstall hooks (so we have
   a start menu entry / desktop shortcut)
 * Wait longer before checking for update
 * Set the window icon
 * Add a 'file' menu
 * Bump electron-builder
 * Add the icon url for the control panel entry
2016-11-07 11:41:41 +00:00
David Baker
6da1a1077d 0.8.4 has been released 2016-11-04 13:03:11 +00:00
David Baker
80bae0563d Merge pull request #2535 from vector-im/dbkr/electron_3
Electron app (take 3)
2016-11-04 10:56:59 +00:00
David Baker
9a00ec128c many semicolons 2016-11-04 10:46:51 +00:00
David Baker
bc092d5c77 Merge branch 'master' into develop 2016-11-04 10:18:30 +00:00
David Baker
1c9a78a2f1 v0.8.4 2016-11-04 10:13:23 +00:00
David Baker
11eb0a89eb Prepare changelog for v0.8.4 2016-11-04 10:13:23 +00:00
David Baker
d7d6b3b4a2 Released matrix-js-sdk & matrix-react-sdk 2016-11-04 10:12:21 +00:00
David Baker
f5d95f7314 Use an env var for the package version
Because supplying arguments to npm scripts is a bad idea: it just
appends the arguments blindly to whatever the command was. Thanks,
npm.
2016-11-04 09:40:24 +00:00
David Baker
a6d029c556 Fix copyright 2016-11-03 17:06:41 +00:00
David Baker
ed9c29d365 Use require so we can import conditionally 2016-11-03 15:45:12 +00:00
David Baker
527c390152 Merge remote-tracking branch 'origin/develop' into dbkr/electron_3 2016-11-03 15:35:45 +00:00
David Baker
a6c794cb11 Merge pull request #2542 from vector-im/rav/webpack-dev-server
Use webpack-dev-server instead of http-server
2016-11-03 15:35:17 +00:00
Richard van der Hoff
ff462580b0 Use webpack-dev-server instead of http-server
Advantages:
 * blocks while a rebuild is in progress so you're less likely to reload the
   old version

 * serves from memory rather than disk, so we no longer need to turn off the
   cachebuster to avoid filling the disk with bundles. Empirically, seems to
   last a plausible amount of time without OOMing; there's no real reason to
   believe it would use any more memory than webpack itself.

 * That in turn means we no longer need the hack to stop chrome caching old
   sourcemaps (because the sourcemap now has a cachebuster in its name).

 * one fewer process for parallelshell to (fail to) manage.

 * in future, we could consider the fancy hot-reload functionality.
2016-11-03 15:08:55 +00:00
David Baker
6869c679ef Merge remote-tracking branch 'origin/develop' into dbkr/electron_3 2016-11-03 14:58:12 +00:00
Richard van der Hoff
4dab36d3b2 Merge pull request #2541 from vector-im/dbkr/blank_config_3
Better support no-config when loading from file
2016-11-03 14:56:16 +00:00
David Baker
cfe63fa274 Better support no-config when loading from file
We should still error if given a 5xx with an empty body.
2016-11-03 14:43:10 +00:00
Richard van der Hoff
c1469f4e39 Merge pull request #2540 from vector-im/dbkr/fix_no_config
Fix loading with no config from HTTP
2016-11-03 14:20:30 +00:00
David Baker
3601b44429 Fix loading with no config from HTTP 2016-11-03 14:17:23 +00:00
David Baker
b3510d6973 Comment the menu stuff that we only do on mac 2016-11-03 13:37:40 +00:00
David Baker
d9780239b6 Make indenting consistent with rest of project 2016-11-03 13:33:49 +00:00
David Baker
fb3ca441ba Merge remote-tracking branch 'origin/develop' into dbkr/electron_3 2016-11-03 13:32:01 +00:00
David Baker
efd0dab316 Merge pull request #2532 from vector-im/dbkr/platform_version
Move 'new version' support into Platform
2016-11-03 13:30:19 +00:00
David Baker
f1b72dfa09 Fix copyright 2016-11-03 11:51:41 +00:00
David Baker
4d0b492ba0 Merge remote-tracking branch 'origin/develop' into dbkr/platform_version 2016-11-03 11:51:23 +00:00
David Baker
3bcb447e03 Fix copyright 2016-11-03 11:48:49 +00:00
David Baker
108af83ae8 Just bind the right function to the button
rather than deciding in onChangelogClicked
2016-11-03 11:43:50 +00:00
David Baker
275a55266b Merge remote-tracking branch 'origin/develop' into dbkr/electron_3 2016-11-02 19:46:02 +00:00
David Baker
18504ca14e Merge pull request #2533 from vector-im/dbkr/platform_notification
Add Notification support to the Web Platform
2016-11-02 19:43:17 +00:00
David Baker
6aba9f8eda Don't always claim we have notif support
Only if the browser has the Notification API
2016-11-02 19:26:07 +00:00
David Baker
e8494c3dc7 Split NewVersionBar release notes / changelog
and change the class to use React createClass syntax while I'm at
it, rather than a completely different third style we use nowhere
else in the project.
2016-11-02 19:20:11 +00:00
David Baker
caa3cb7d89 Electron support
From https://github.com/vector-im/vector-web/pull/2511 but with
just the actual electron changes
2016-11-02 18:49:28 +00:00
Richard van der Hoff
67dbd9fba9 Merge pull request #2534 from vector-im/dbkr/config_accept_blank
Use the defaults if given a blank config file
2016-11-02 18:42:39 +00:00
David Baker
19238b9326 Use the defaults if given a blank config file
This allows Vector to load from file:// URIs without breaking if
there is no config file (because we explicitly look for 404s, and
file:// URIs don't return 404s).
2016-11-02 17:57:27 +00:00
David Baker
8c3fed7559 CSS for changelogs 2016-11-02 17:48:47 +00:00
David Baker
17bb47676e Make VectorBasePlatform
For template methods that are only used from within vector (ie. new version
support)
2016-11-02 17:45:35 +00:00
David Baker
757604fd60 Add Notification support to the Web Platform
Except display notification which was already accidentally included in a
previous PR
2016-11-02 17:36:48 +00:00
Richard van der Hoff
c75118caa2 Merge branch 'develop' into dbkr/platform_version 2016-11-02 16:35:31 +00:00
David Baker
0b5085ecbb Merge pull request #2531 from vector-im/dbkr/platform
Implement Platforms
2016-11-02 16:21:14 +00:00
David Baker
64fdb290eb Move 'new version' support into Platform 2016-11-02 16:02:55 +00:00
David Baker
a714edbf2b Implement Platforms
Provide WebPlatform for functionality specific to the web version of vector.
2016-11-02 15:12:51 +00:00
David Baker
735c298de3 Merge branch 'release-v0.8.4' into develop 2016-11-02 12:01:30 +00:00
David Baker
db07ef7899 Update readme to point to github releases
not /packages
2016-11-02 12:01:01 +00:00
David Baker
03caaeef07 Back to develop js-sdk & react-sdk 2016-11-02 11:47:30 +00:00
David Baker
91793a7a8e v0.8.4-rc.2 2016-11-02 11:40:04 +00:00
David Baker
7323ae5bf5 Prepare changelog for v0.8.4-rc.2 2016-11-02 11:40:04 +00:00
David Baker
d04cc03c1c Take version from first arg, if given 2016-11-02 11:38:11 +00:00
David Baker
4fb273284d v0.8.4-rc.1 2016-11-02 11:17:36 +00:00
David Baker
3bfdbad5ba Prepare changelog for v0.8.4-rc.1 2016-11-02 11:17:36 +00:00
David Baker
890751951c Released js-sdk & react-sdk 2016-11-02 11:11:40 +00:00
David Baker
ba7e02c3b1 Merge pull request #2528 from vector-im/dbkr/package_is_now_dist
Rename the package script/output dir to 'dist'
2016-11-01 15:48:06 +00:00
David Baker
622ab27254 gitignore dist 2016-11-01 15:35:41 +00:00
David Baker
f17e851435 Rename the package script/output dir to 'dist'
To match conventions from other projects and match the release
script which expects releasde artefacts in dist/
2016-11-01 15:22:06 +00:00
Richard van der Hoff
5e84a6c39e Merge pull request #2518 from vector-im/rav/ignore_olm_if_missing
Avoid errors if olm is missing
2016-10-27 10:28:27 +01:00
Richard van der Hoff
a86f2720bc Avoid errors if olm is missing
If olm isn't installed, webpack prints out scary warnings (though it still
actually succeeds). Let's avoid scaring people by quietly removing it from the
list of things to process.
2016-10-27 10:16:10 +01:00
Richard van der Hoff
b174d49f9d Merge pull request #2515 from vector-im/rav/cache_busting
Put a cachebuster in the names of CSS and JS files
2016-10-26 16:58:27 +01:00
Richard van der Hoff
31ed719df1 webpack: Improve comment on HtmlWebpackPlugin 2016-10-26 16:52:26 +01:00
Richard van der Hoff
c19538d6ce Merge branch 'develop' into rav/cache_busting 2016-10-26 16:50:45 +01:00
Richard van der Hoff
3adf5fe3fd Merge pull request #2517 from vector-im/rav/upgrade_olm
Bump to olm 2.0.0
2016-10-26 16:50:22 +01:00
Richard van der Hoff
bd0e121f0e Merge pull request #2516 from vector-im/rav/no_pack_world
Don't include the world in the published packages
2016-10-26 16:48:22 +01:00
Richard van der Hoff
de1f7861d6 Bump to olm 2.0.0 2016-10-26 16:20:42 +01:00
Richard van der Hoff
5a58c8bda4 Don't include the world in the published packages
We ended up including all sorts of stuff in our published packages. Let's take
the opposite approach and include useful stuff rather than exclude unuseful
stuff.
2016-10-26 15:35:54 +01:00
Richard van der Hoff
6396c60645 Put a cachebuster in the names of CSS and JS files
This means that clients can do better caching of assets, as it will mean we are
no longer reliant on etags to ensure that clients get a fresh version.

We inhibit the cachebuster for `npm start`, so that we don't get millions of
copies of the bundles on dev boxes.
2016-10-26 15:20:59 +01:00
Richard van der Hoff
f700bb4efa Merge pull request #2514 from vector-im/rav/webpack_olm
Use webpack to copy olm.js
2016-10-26 15:18:27 +01:00
Richard van der Hoff
53e5894759 Merge branch 'develop' into rav/webpack_olm 2016-10-26 15:13:57 +01:00
Richard van der Hoff
8fe05fdff3 Correct path to components.css
Fix failure to find components.css which was introduced in e1919c5
(https://github.com/vector-im/vector-web/pull/2513)
2016-10-26 15:02:34 +01:00
David Baker
e002575eae Merge pull request #2513 from vector-im/rav/no_bundle_components_css
Don't include two copies of the CSS in the tarball
2016-10-26 14:52:29 +01:00
Richard van der Hoff
e1919c5ea3 Don't include two copies of the CSS in the tarball
Aggregate our CSS into build/components.css instead of vector/components.css, so
that it isn't included in the tarball.
2016-10-26 14:43:42 +01:00
Richard van der Hoff
fcf683c8a7 Use webpack to copy olm.js
Rather than copying olm.js ourselves in package.json, get webpack to do it for
us by declaring it as a second entry point.
2016-10-26 14:29:21 +01:00
Richard van der Hoff
e564d34ca8 Merge pull request #2512 from vector-im/dbkr/firefox_roomdir_align
Correct text alignment on room directory search
2016-10-26 10:49:59 +01:00
David Baker
61d7db6eb6 Correct text alignment on room directory search
Seemed to only be broken on firefox
2016-10-26 10:35:46 +01:00
Richard van der Hoff
5768f73bbd Merge pull request #2510 from vector-im/dbkr/ref-is-not-rel
Correct spelling of 'rel'
2016-10-25 14:51:30 +01:00
David Baker
df94dd7487 Update ChangelogDialog.js 2016-10-25 14:41:02 +01:00
Richard van der Hoff
4221781d9b Merge pull request #2507 from vector-im/rav/readme
readme tweaks
2016-10-25 11:29:51 +01:00
Richard van der Hoff
e0556789d2 readme tweaks
Note that Chrome requires https for voip (fixes #2506)

Remove lies about where issues are filed.
2016-10-25 11:20:23 +01:00
David Baker
9310d92605 document integrations config in README 2016-10-21 14:59:13 +01:00
Richard van der Hoff
8a2f57d234 Merge pull request #2491 from vector-im/rav/riot
s/vector/riot/ in the readme
2016-10-20 17:06:14 +01:00
Richard van der Hoff
d72323bfc5 typo 2016-10-20 17:05:44 +01:00
Richard van der Hoff
dfd0356609 s/vector/riot/ in the readme
Also remove the outdated "E2E" section

Fixes https://github.com/vector-im/vector-web/issues/2457
2016-10-20 16:54:30 +01:00
David Baker
20a7aa03ed Merge pull request #2480 from vector-im/dbkr/babelrc2
Switch to babel 6, again
2016-10-17 17:22:49 +01:00
David Baker
e02e0219a7 Add plugin that makes babel 6 not break everything 2016-10-17 16:28:14 +01:00
David Baker
d04201d069 Replace stage & es2017 with specific plugins
Also sort out regenerator runtime as it turns out importing
babel-polyfill in your code is insufficient if using webpack
because it's imported too late, so use both that and
regenerator-runtime. Sigh.
2016-10-17 16:28:14 +01:00
David Baker
82de2ca4ec Remove transform-runtime
We use instance methods (or at least, draft.js does) so we need
babel-polyfill instead.
2016-10-17 16:28:14 +01:00
David Baker
18450058d7 Remove presets from karma.conf
seemt o be picked up from .babelrc
2016-10-17 16:28:14 +01:00
David Baker
f20b2593bc move babelcheck.js to scripts/ 2016-10-17 16:28:14 +01:00
David Baker
4d51a5de7e shebang 2016-10-17 16:28:14 +01:00
David Baker
8e0b61ca35 Reminder to restore links + stage2, not stage 0 2016-10-17 16:28:13 +01:00
David Baker
61a543a694 Add babelcheck.js
As per 4bea0c0818
2016-10-17 16:28:13 +01:00
David Baker
5608e97719 Remove babel-polyfill
Should be no need for it if we're using transform-runtime (and
we definitely don't need it twice...)
2016-10-17 16:28:13 +01:00
Aviral Dasgupta
d6f27add66 Upgrade to babel6 and enable some presets. 2016-10-17 16:28:13 +01:00
David Baker
740ab7e479 Merge pull request #2472 from vector-im/revert-2461-aviraldg-babelrc
Revert "Switch to babel 6"
2016-10-14 18:51:02 +01:00
David Baker
ea09a25563 Revert "Switch to babel 6" 2016-10-14 18:50:22 +01:00
David Baker
5a08c62f1b Use the default integrations URLs in the sample
localhost is not a sensible default
2016-10-14 18:21:26 +01:00
David Baker
be1d7781c5 Merge pull request #2461 from vector-im/aviraldg-babelrc
Switch to babel 6
2016-10-14 18:19:43 +01:00
David Baker
40ac80a3e9 Replace stage & es2017 with specific plugins
Also sort out regenerator runtime as it turns out importing
babel-polyfill in your code is insufficient if using webpack
because it's imported too late, so use both that and
regenerator-runtime. Sigh.
2016-10-14 18:03:22 +01:00
David Baker
5f747e1a90 Remove transform-runtime
We use instance methods (or at least, draft.js does) so we need
babel-polyfill instead.
2016-10-13 10:57:10 +01:00
David Baker
0c3537ac1a Remove presets from karma.conf
seemt o be picked up from .babelrc
2016-10-13 09:51:10 +01:00
David Baker
e6caf9ece4 move babelcheck.js to scripts/ 2016-10-13 09:50:40 +01:00
David Baker
34c60c69d8 shebang 2016-10-13 09:41:09 +01:00
David Baker
5ff915476a Reminder to restore links + stage2, not stage 0 2016-10-12 18:08:52 +01:00
David Baker
e5d2ebc57c Add babelcheck.js
As per 4bea0c0818
2016-10-12 17:46:11 +01:00
David Baker
64815b1b0b Remove babel-polyfill
Should be no need for it if we're using transform-runtime (and
we definitely don't need it twice...)
2016-10-12 17:23:01 +01:00
David Baker
59120d3019 Merge branch 'babelrc' of https://github.com/aviraldg/vector-web into aviraldg-babelrc 2016-10-12 17:17:10 +01:00
David Baker
9245ab01f1 js-sdk & react-sdk develop 2016-10-12 11:52:18 +01:00
Aviral Dasgupta
9174b32ef1 Upgrade to babel6 and enable some presets. 2016-10-02 17:28:24 +05:30
243 changed files with 5177 additions and 1456 deletions

4
.babelrc Normal file
View File

@@ -0,0 +1,4 @@
{
"presets": ["react", "es2015", "es2016"],
"plugins": ["transform-class-properties", "transform-object-rest-spread", "transform-async-to-generator", "transform-runtime", "add-module-exports"]
}

2
.eslintignore Normal file
View File

@@ -0,0 +1,2 @@
src/vector/modernizr.js
src/component-index.js

3
.eslintrc.js Normal file
View File

@@ -0,0 +1,3 @@
module.exports = {
extends: ["./node_modules/matrix-react-sdk/.eslintrc.js"],
}

44
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,44 @@
<!-- This is a bug report template. By following the instructions below and
filling out the sections with your information, you will help the us to get all
the necessary data to fix your issue.
You can also preview your report before submitting it. You may remove sections
that aren't relevant to your particular case.
Text between <!-- and --> marks will be invisible in the report.
-->
### Description
Describe here the problem that you are experiencing, or the feature you are requesting.
### 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! -->
<!-- Include screenshots if possible: you can drag and drop images below. -->
### Version information
<!-- IMPORTANT: please answer the following questions, to help us narrow down the problem -->
- **Platform**: web (in-browser) or desktop?
For the web app:
- **Browser**: Chrome, Safari, Firefox? which version?
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
- **URL**: riot.im/develop / riot.im/app / somewhere else? If a private server, what version of riot-web?
For the desktop app:
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
- **Version**: 0.x.y <!-- check the user settings panel if unsure -->

12
.gitignore vendored
View File

@@ -1,12 +1,14 @@
/build
/cert.pem
/dist
/karma-reports
/key.pem
/lib
/node_modules
/packages/
/vector/bundle.*
/vector/components.css
/vector/emojione/
/vector/config.json
/vector/olm.js
/webapp
/.npmrc
.DS_Store
npm-debug.log
electron/dist
electron/pub

View File

@@ -1,3 +0,0 @@
example
examples
build/.module-cache

View File

@@ -3,4 +3,5 @@ node_js:
- 6 # node v6, to match jenkins
install:
- npm install
- (cd node_modules/matrix-react-sdk && npm run build)
- (cd node_modules/matrix-js-sdk && npm install)
- (cd node_modules/matrix-react-sdk && npm install)

View File

@@ -1,3 +1,324 @@
Changes in [0.9.7](https://github.com/vector-im/riot-web/releases/tag/v0.9.7) (2017-02-04)
==========================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.7-rc.3...v0.9.7)
* Update to matrix-js-sdk 0.7.5 (no changes from 0.7.5-rc.3)
* Update to matrix-react-sdk 0.8.6 (no changes from 0.8.6-rc.3)
Changes in [0.9.7-rc.3](https://github.com/vector-im/riot-web/releases/tag/v0.9.7-rc.3) (2017-02-03)
====================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.7-rc.2...v0.9.7-rc.3)
* Update to latest Olm to fix key import/export and use of megolm sessions
created on more recent versions
* Update to latest matrix-react-sdk and matrix-js-sdk to fix e2e device
handling
Changes in [0.9.7-rc.2](https://github.com/vector-im/riot-web/releases/tag/v0.9.7-rc.2) (2017-02-03)
====================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.7-rc.1...v0.9.7-rc.2)
* Update matrix-js-sdk to get new device change
notifications interface for more reliable e2e crypto
Changes in [0.9.7-rc.1](https://github.com/vector-im/riot-web/releases/tag/v0.9.7-rc.1) (2017-02-03)
====================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.6...v0.9.7-rc.1)
* Better user interface for screen readers and keyboard navigation
[\#2946](https://github.com/vector-im/riot-web/pull/2946)
* Allow mxc: URLs for icons in the NetworkDropdown
[\#3118](https://github.com/vector-im/riot-web/pull/3118)
* make TopRightMenu more intuitive
[\#3117](https://github.com/vector-im/riot-web/pull/3117)
* Handle icons with width > height
[\#3110](https://github.com/vector-im/riot-web/pull/3110)
* Fix jenkins build
[\#3105](https://github.com/vector-im/riot-web/pull/3105)
* Add CSS for a support box in login
[\#3081](https://github.com/vector-im/riot-web/pull/3081)
* Allow a custom login logo to be displayed on login
[\#3082](https://github.com/vector-im/riot-web/pull/3082)
* Fix the width of input fields within login/reg box
[\#3080](https://github.com/vector-im/riot-web/pull/3080)
* Set BaseAvatar_image bg colour = #fff
[\#3057](https://github.com/vector-im/riot-web/pull/3057)
* only recalculate favicon if it changes
[\#3067](https://github.com/vector-im/riot-web/pull/3067)
* CSS tweak for email address lookup
[\#3064](https://github.com/vector-im/riot-web/pull/3064)
* Glue the dialog to rageshake: honour sendLogs flag.
[\#3061](https://github.com/vector-im/riot-web/pull/3061)
* Don't use hash-named directory for dev server
[\#3049](https://github.com/vector-im/riot-web/pull/3049)
* Implement bug reporting logic
[\#3000](https://github.com/vector-im/riot-web/pull/3000)
* Add css for bug report dialog
[\#3045](https://github.com/vector-im/riot-web/pull/3045)
* Increase the max-height of the expanded status bar
[\#3043](https://github.com/vector-im/riot-web/pull/3043)
* Hopefully, fix intermittent test failure
[\#3040](https://github.com/vector-im/riot-web/pull/3040)
* CSS for 'searching known users'
[\#2971](https://github.com/vector-im/riot-web/pull/2971)
* Animate status bar max-height and margin-top
[\#2981](https://github.com/vector-im/riot-web/pull/2981)
* Add eslint config
[\#3032](https://github.com/vector-im/riot-web/pull/3032)
* Re-position typing avatars relative to "is typing"
[\#3030](https://github.com/vector-im/riot-web/pull/3030)
* CSS for avatars that appear when users are typing
[\#2998](https://github.com/vector-im/riot-web/pull/2998)
* Add StartupWMClass
[\#3001](https://github.com/vector-im/riot-web/pull/3001)
* Fix link to image for event options menu
[\#3002](https://github.com/vector-im/riot-web/pull/3002)
* Make riot desktop single instance
[\#2999](https://github.com/vector-im/riot-web/pull/2999)
* Add electron tray icon
[\#2997](https://github.com/vector-im/riot-web/pull/2997)
* Fixes to electron desktop notifs
[\#2994](https://github.com/vector-im/riot-web/pull/2994)
* Auto-hide the electron menu bar
[\#2975](https://github.com/vector-im/riot-web/pull/2975)
* A couple of tweaks to the karma config
[\#2987](https://github.com/vector-im/riot-web/pull/2987)
* Deploy script
[\#2974](https://github.com/vector-im/riot-web/pull/2974)
* Use the postcss-webpack-loader
[\#2990](https://github.com/vector-im/riot-web/pull/2990)
* Switch CSS to using postcss, and implement a dark theme.
[\#2973](https://github.com/vector-im/riot-web/pull/2973)
* Update redeploy script to keep old bundles
[\#2969](https://github.com/vector-im/riot-web/pull/2969)
* Include current version in update check explicitly
[\#2967](https://github.com/vector-im/riot-web/pull/2967)
* Add another layer of directory to webpack chunks
[\#2966](https://github.com/vector-im/riot-web/pull/2966)
* Fix links to fonts and images from CSS
[\#2965](https://github.com/vector-im/riot-web/pull/2965)
* Put parent build hash in webpack output filenames
[\#2961](https://github.com/vector-im/riot-web/pull/2961)
* update README to point to new names/locations
[\#2846](https://github.com/vector-im/riot-web/pull/2846)
Changes in [0.9.6](https://github.com/vector-im/riot-web/releases/tag/v0.9.6) (2017-01-16)
==========================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.6-rc.1...v0.9.6)
* Update to matrix-js-sdk 0.9.6 for video calling fix
Changes in [0.9.6-rc.1](https://github.com/vector-im/riot-web/releases/tag/v0.9.6-rc.1) (2017-01-13)
====================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.5...v0.9.6-rc.1)
* Build the js-sdk in the CI script
[\#2920](https://github.com/vector-im/riot-web/pull/2920)
* Hopefully fix Windows shortcuts
[\#2917](https://github.com/vector-im/riot-web/pull/2917)
* Update README now the js-sdk has a transpile step
[\#2921](https://github.com/vector-im/riot-web/pull/2921)
* Use the role for 'toggle dev tools'
[\#2915](https://github.com/vector-im/riot-web/pull/2915)
* Enable screen sharing easter-egg in desktop app
[\#2909](https://github.com/vector-im/riot-web/pull/2909)
* make electron send email validation URLs with a nextlink of riot.im
[\#2808](https://github.com/vector-im/riot-web/pull/2808)
* add Debian Stretch install steps to readme
[\#2809](https://github.com/vector-im/riot-web/pull/2809)
* Update desktop build instructions fixes #2792
[\#2793](https://github.com/vector-im/riot-web/pull/2793)
* CSS for the delete threepid button
[\#2784](https://github.com/vector-im/riot-web/pull/2784)
Changes in [0.9.5](https://github.com/vector-im/riot-web/releases/tag/v0.9.5) (2016-12-24)
==========================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.4...v0.9.5)
* make electron send email validation URLs with a nextlink of riot.im rather than file:///
* add gnu-tar to debian electron build deps
* fix win32 shortcut in start menu
Changes in [0.9.4](https://github.com/vector-im/riot-web/releases/tag/v0.9.4) (2016-12-22)
==========================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.3...v0.9.4)
* Update to libolm 2.1.0. This should help resolve a problem with browser
sessions being logged out ([\#2726](https://github.com/vector-im/riot-web/issues/2726)).
Changes in [0.9.3](https://github.com/vector-im/riot-web/releases/tag/v0.9.3) (2016-12-22)
==========================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.2...v0.9.3)
* (from matrix-react-sdk) Fix regression where the date separator would be displayed
at the wrong time of day.
* README.md: fix GFMD for nativefier
[\#2755](https://github.com/vector-im/riot-web/pull/2755)
Changes in [0.9.2](https://github.com/vector-im/riot-web/releases/tag/v0.9.2) (2016-12-16)
==========================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.1...v0.9.2)
* Remove the client side filtering from the room dir
[\#2750](https://github.com/vector-im/riot-web/pull/2750)
* Configure olm memory size
[\#2745](https://github.com/vector-im/riot-web/pull/2745)
* Support room dir 3rd party network filtering
[\#2747](https://github.com/vector-im/riot-web/pull/2747)
Changes in [0.9.1](https://github.com/vector-im/riot-web/releases/tag/v0.9.1) (2016-12-09)
==========================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.1-rc.2...v0.9.1)
* Update README to say how to build the desktop app
[\#2732](https://github.com/vector-im/riot-web/pull/2732)
* Add signing ID in release_config.yaml
[\#2731](https://github.com/vector-im/riot-web/pull/2731)
* Makeover!
[\#2722](https://github.com/vector-im/riot-web/pull/2722)
* Fix broken tests
[\#2730](https://github.com/vector-im/riot-web/pull/2730)
* Make the 'loading' tests work in isolation
[\#2727](https://github.com/vector-im/riot-web/pull/2727)
* Use a PNG for the icon on non-Windows
[\#2708](https://github.com/vector-im/riot-web/pull/2708)
* Add missing brackets to call to toUpperCase
[\#2703](https://github.com/vector-im/riot-web/pull/2703)
Changes in [0.9.1-rc.2](https://github.com/vector-im/riot-web/releases/tag/v0.9.1-rc.2) (2016-12-06)
====================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.1-rc.1...v0.9.1-rc.2)
* Fix clicking on notifications
[\#2700](https://github.com/vector-im/riot-web/pull/2700)
* Desktop app: Only show window when ready
[\#2697](https://github.com/vector-im/riot-web/pull/2697)
Changes in [0.9.1-rc.1](https://github.com/vector-im/riot-web/releases/tag/v0.9.1-rc.1) (2016-12-05)
====================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.0...v0.9.1-rc.1)
* Final bits to prepare electron distribtion:
[\#2653](https://github.com/vector-im/riot-web/pull/2653)
* Update name & repo to reflect renamed repository
[\#2692](https://github.com/vector-im/riot-web/pull/2692)
* Document cross_origin_renderer_url
[\#2680](https://github.com/vector-im/riot-web/pull/2680)
* Add css for the iframes for e2e attachments
[\#2659](https://github.com/vector-im/riot-web/pull/2659)
* Fix config location in some more places
[\#2670](https://github.com/vector-im/riot-web/pull/2670)
* CSS updates for s/block/blacklist for e2e
[\#2662](https://github.com/vector-im/riot-web/pull/2662)
* Update to electron 1.4.8
[\#2660](https://github.com/vector-im/riot-web/pull/2660)
* Add electron config
[\#2644](https://github.com/vector-im/riot-web/pull/2644)
* Move getDefaultDeviceName into the Platforms
[\#2643](https://github.com/vector-im/riot-web/pull/2643)
* Add Freenode & Mozilla domains
[\#2641](https://github.com/vector-im/riot-web/pull/2641)
* Include config.sample.json in dist tarball
[\#2614](https://github.com/vector-im/riot-web/pull/2614)
Changes in [0.9.0](https://github.com/vector-im/vector-web/releases/tag/v0.9.0) (2016-11-19)
============================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.8.4...v0.9.0)
* Add a cachebuster to /version
[\#2596](https://github.com/vector-im/vector-web/pull/2596)
* Add a 'View decrypted source' button
[\#2587](https://github.com/vector-im/vector-web/pull/2587)
* Fix changelog dialog to read new version format
[\#2577](https://github.com/vector-im/vector-web/pull/2577)
* Build all of the vector dir in the build process
[\#2558](https://github.com/vector-im/vector-web/pull/2558)
* Support for get_app_version
[\#2553](https://github.com/vector-im/vector-web/pull/2553)
* Add CSS for mlist truncation
[\#2565](https://github.com/vector-im/vector-web/pull/2565)
* Add menu option for `external_url` if present
[\#2560](https://github.com/vector-im/vector-web/pull/2560)
* Make auto-update configureable
[\#2555](https://github.com/vector-im/vector-web/pull/2555)
* Missed files electron windows fixes
[\#2556](https://github.com/vector-im/vector-web/pull/2556)
* Add some CSS for scalar error popup
[\#2554](https://github.com/vector-im/vector-web/pull/2554)
* Catch unhandled errors in the electron process
[\#2552](https://github.com/vector-im/vector-web/pull/2552)
* Slight grab-bag of fixes for electron on Windows
[\#2551](https://github.com/vector-im/vector-web/pull/2551)
* Electron app (take 3)
[\#2535](https://github.com/vector-im/vector-web/pull/2535)
* Use webpack-dev-server instead of http-server
[\#2542](https://github.com/vector-im/vector-web/pull/2542)
* Better support no-config when loading from file
[\#2541](https://github.com/vector-im/vector-web/pull/2541)
* Fix loading with no config from HTTP
[\#2540](https://github.com/vector-im/vector-web/pull/2540)
* Move 'new version' support into Platform
[\#2532](https://github.com/vector-im/vector-web/pull/2532)
* Add Notification support to the Web Platform
[\#2533](https://github.com/vector-im/vector-web/pull/2533)
* Use the defaults if given a blank config file
[\#2534](https://github.com/vector-im/vector-web/pull/2534)
* Implement Platforms
[\#2531](https://github.com/vector-im/vector-web/pull/2531)
Changes in [0.8.4](https://github.com/vector-im/vector-web/releases/tag/v0.8.4) (2016-11-04)
============================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.8.4-rc.2...v0.8.4)
* No changes
Changes in [0.8.4-rc.2](https://github.com/vector-im/vector-web/releases/tag/v0.8.4-rc.2) (2016-11-02)
======================================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.8.4-rc.1...v0.8.4-rc.2)
* Fix the version in the generated distribution package
Changes in [0.8.4-rc.1](https://github.com/vector-im/vector-web/releases/tag/v0.8.4-rc.1) (2016-11-02)
======================================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.8.3...v0.8.4-rc.1)
Breaking Changes
----------------
* End-to-end encryption now requires one-time keys to be
signed, so end-to-end encryption will not interoperate
with previous releases of vector-web. End-to-end encryption
remains in beta.
Other Changes
-------------
* Rename the package script/output dir to 'dist'
[\#2528](https://github.com/vector-im/vector-web/pull/2528)
* Avoid errors if olm is missing
[\#2518](https://github.com/vector-im/vector-web/pull/2518)
* Put a cachebuster in the names of CSS and JS files
[\#2515](https://github.com/vector-im/vector-web/pull/2515)
* Bump to olm 2.0.0
[\#2517](https://github.com/vector-im/vector-web/pull/2517)
* Don't include the world in the published packages
[\#2516](https://github.com/vector-im/vector-web/pull/2516)
* Use webpack to copy olm.js
[\#2514](https://github.com/vector-im/vector-web/pull/2514)
* Don't include two copies of the CSS in the tarball
[\#2513](https://github.com/vector-im/vector-web/pull/2513)
* Correct text alignment on room directory search
[\#2512](https://github.com/vector-im/vector-web/pull/2512)
* Correct spelling of 'rel'
[\#2510](https://github.com/vector-im/vector-web/pull/2510)
* readme tweaks
[\#2507](https://github.com/vector-im/vector-web/pull/2507)
* s/vector/riot/ in the readme
[\#2491](https://github.com/vector-im/vector-web/pull/2491)
* Switch to babel 6, again
[\#2480](https://github.com/vector-im/vector-web/pull/2480)
* Revert "Switch to babel 6"
[\#2472](https://github.com/vector-im/vector-web/pull/2472)
* Switch to babel 6
[\#2461](https://github.com/vector-im/vector-web/pull/2461)
Changes in [0.8.3](https://github.com/vector-im/vector-web/releases/tag/v0.8.3) (2016-10-12)
============================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.8.2...v0.8.3)

View File

@@ -1,4 +1,4 @@
Contributing code to Vector
===========================
Contributing code to Riot
=========================
Vector follows the same pattern as https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.rst
Riot follows the same pattern as https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.rst.

253
README.md
View File

@@ -1,67 +1,89 @@
Vector/Web
==========
Riot
====
Vector is a Matrix web client built using the Matrix React SDK (https://github.com/matrix-org/matrix-react-sdk).
Riot (formerly known as Vector) is a Matrix web client built using the Matrix
React SDK (https://github.com/matrix-org/matrix-react-sdk).
Getting Started
===============
The easiest way to test Vector is to just use the hosted copy at https://vector.im/beta.
The develop branch is continuously deployed by Jenkins at https://vector.im/develop for
those who like living dangerously.
The easiest way to test Riot is to just use the hosted copy at
https://riot.im/app. The develop branch is continuously deployed by Jenkins at
https://riot.im/develop for those who like living dangerously.
To host your own copy of Vector, the quickest bet is to use a pre-built released version
of Vector:
To host your own copy of Riot, the quickest bet is to use a pre-built
released version of Riot:
1. Download the latest version from https://vector.im/packages/
1. Download the latest version from https://github.com/vector-im/riot-web/releases
1. Untar the tarball on your web server
1. Move (or symlink) the vector-x.x.x directory to an appropriate name
1. If desired, copy `config.sample.json` to `config.json` and edit it
as desired. See below for details.
1. Enter the URL into your browser and log into vector!
1. Enter the URL into your browser and log into Riot!
Releases are signed by PGP, and can be checked against the public key
at https://riot.im/packages/keys/riot-master.asc
Note that Chrome does not allow microphone or webcam access for sites served
over http (except localhost), so for working VoIP you will need to serve Riot
over https.
### Installation Steps for Debian Stretch
1. Add the repository to your sources.list using either of the following two options:
- Directly to sources.list: `echo "deb https://riot.im/packages/debian/ stretch main" | sudo tee -a /etc/apt/sources.list`
- As a separate entry in sources.list.d: `echo "deb https://riot.im/packages/debian/ stretch main" | sudo tee /etc/apt/sources.list.d/riot.list`
2. Add the gpg signing key for the riot repository: `curl -s https://riot.im/packages/debian/repo-key.asc | sudo apt-key add -`
3. Update your package lists: `sudo apt-get update`
4. Install Riot: `sudo apt-get install riot-web`
Important Security Note
=======================
We do not recommend running Vector from the same domain name as your Matrix
homeserver. The reason is the risk of XSS (cross-site-scripting) vulnerabilities
that could occur if someone caused Vector to load and render malicious user generated
content from a Matrix API which then had trusted access to Vector (or other apps) due
to sharing the same domain.
We do not recommend running Riot from the same domain name as your Matrix
homeserver. The reason is the risk of XSS (cross-site-scripting)
vulnerabilities that could occur if someone caused Riot to load and render
malicious user generated content from a Matrix API which then had trusted
access to Riot (or other apps) due to sharing the same domain.
We have put some coarse mitigations into place to try to protect against this situation,
but it's still not good practice to do it in the first place.
See https://github.com/vector-im/vector-web/issues/1977 for more details.
We have put some coarse mitigations into place to try to protect against this
situation, but it's still not good practice to do it in the first place. See
https://github.com/vector-im/riot-web/issues/1977 for more details.
Building From Source
====================
Vector is a modular webapp built with modern ES6 and requires a npm build system to build.
Riot is a modular webapp built with modern ES6 and requires a npm build system
to build.
1. Install or update `node.js` so that your `npm` is at least at version `2.0.0`
1. Clone the repo: `git clone https://github.com/vector-im/vector-web.git`
1. Switch to the vector directory: `cd vector-web`
1. Clone the repo: `git clone https://github.com/vector-im/riot-web.git`
1. Switch to the riot-web directory: `cd riot-web`
1. Install the prerequisites: `npm install`
1. If you are using the `develop` branch of vector, you will probably need to
rebuild one of the dependencies, due to https://github.com/npm/npm/issues/3055:
`(cd node_modules/matrix-react-sdk && npm install)`
1. Configure the app by copying `config.sample.json` to `config.json` and modifying
it (see below for details)
1. `npm run package` to build a tarball to deploy. Untaring this file will give
1. If you are using the `develop` branch of vector-web, you will probably need
to rebuild some of the dependencies, due to
https://github.com/npm/npm/issues/3055:
```
(cd node_modules/matrix-js-sdk && npm install)
(cd node_modules/matrix-react-sdk && npm install)
```
1. Configure the app by copying `config.sample.json` to `config.json` and
modifying it (see below for details)
1. `npm run dist` to build a tarball to deploy. Untaring this file will give
a version-specific directory containing all the files that need to go on your
web server.
Note that `npm run package` is not supported on Windows, so Windows users can run `npm
run build`, which will build all the necessary files into the `vector`
directory. The version of Vector will not appear in Settings without
using the package script. You can then mount the vector directory on your
Note that `npm run dist` is not supported on Windows, so Windows users can run `npm
run build`, which will build all the necessary files into the `webapp`
directory. The version of Riot will not appear in Settings without
using the dist script. You can then mount the `webapp` directory on your
webserver to actually serve up the app, which is entirely static content.
config.json
===========
You can configure the app by copying `vector/config.sample.json` to
`vector/config.json` and customising it:
You can configure the app by copying `config.sample.json` to
`config.json` and customising it:
1. `default_hs_url` is the default home server url.
1. `default_is_url` is the default identity server url (this is the server used
@@ -72,62 +94,83 @@ You can configure the app by copying `vector/config.sample.json` to
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. `roomDirectory`: config for the public room directory. This section encodes behaviour
on the room directory screen for filtering the list by server / network type and joining
third party networks. This config section will disappear once APIs are available to
get this information for home servers. This section is optional.
1. `integrations_ui_url`: URL to the web interface for the integrations server.
1. `integrations_rest_url`: URL to the REST interface for the integrations server.
1. `roomDirectory`: config for the public room directory. This section is optional.
1. `roomDirectory.servers`: List of other Home Servers' directories to include in the drop
down list. Optional.
1. `roomDirectory.serverConfig`: Config for each server in `roomDirectory.servers`. Optional.
1. `roomDirectory.serverConfig.<server_name>.networks`: List of networks (named
in `roomDirectory.networks`) to include for this server. Optional.
1. `roomDirectory.networks`: config for each network type. Optional.
1. `roomDirectory.<network_type>.name`: Human-readable name for the network. Required.
1. `roomDirectory.<network_type>.protocol`: Protocol as given by the server in
`/_matrix/client/unstable/thirdparty/protocols` response. Required to be able to join
this type of third party network.
1. `roomDirectory.<network_type>.domain`: Domain as given by the server in
`/_matrix/client/unstable/thirdparty/protocols` response, if present. Required to be
able to join this type of third party network, if present in `thirdparty/protocols`.
1. `roomDirectory.<network_type>.portalRoomPattern`: Regular expression matching aliases
for portal rooms to locations on this network. Required.
1. `roomDirectory.<network_type>.icon`: URL to an icon to be displayed for this network. Required.
1. `roomDirectory.<network_type>.example`: Textual example of a location on this network,
eg. '#channel' for an IRC network. Optional.
1. `roomDirectory.<network_type>.nativePattern`: Regular expression that matches a
valid location on this network. This is used as a hint to the user to indicate
when a valid location has been entered so it's not necessary for this to be
exactly correct. Optional.
1. `update_base_url` (electron app only): HTTPS URL to a web server to download
updates from. This should be the path to the directory containing `macos`
and `win32` (for update packages, not installer packages).
1. `cross_origin_renderer_url`: URL to a static HTML page hosting code to help display
encrypted file attachments. This MUST be hosted on a completely separate domain to
anything else since it is used to isolate the privileges of file attachments to this
domain. Default: `usercontent.riot.im`. This needs to contain v1.html from
https://github.com/matrix-org/usercontent/blob/master/v1.html
Running as a Desktop app
========================
In future we'll do an official distribution of Vector as an desktop app. Meanwhile,
there are a few options:
Riot can also be run as a desktop app, wrapped in electron. You can download a
pre-built version from https://riot.im/desktop.html or, if you prefer,
built it yourself.
@asdf:matrix.org points out that you can use nativefier and it just works(tm):
To run as a desktop app:
1. Follow the instructions in 'Building From Source' above
2. Install electron and run it:
```
npm install electron
node_modules/.bin/electron .
```
To build packages, use electron-builder. This is configured to output:
* dmg + zip for macOS
* exe + nupkg for Windows
* deb for Linux
But this can be customised by editing the `build` section of package.json
as per https://github.com/electron-userland/electron-builder/wiki/Options
See https://github.com/electron-userland/electron-builder/wiki/Multi-Platform-Build
for dependencies required for building packages for various platforms.
The only platform that can build packages for all three platforms is macOS:
```
brew install wine --without-x11
brew install mono
brew install gnu-tar
npm install
npm run build:electron
```
For other packages, use electron-builder manually. For example, to build a package
for 64 bit Linux:
1. Follow the instructions in 'Building From Source' above
2. `node_modules/.bin/build -l --x64`
All electron packages go into `electron/dist/`
Many thanks to @aviraldg for the initial work on the electron integration.
Other options for running as a desktop app:
* https://github.com/krisak/vector-electron-desktop
* @asdf:matrix.org points out that you can use nativefier and it just works(tm)
```
sudo npm install nativefier -g
nativefier https://vector.im/beta/
nativefier https://riot.im/app/
```
krisa has a dedicated electron project at https://github.com/krisak/vector-electron-desktop
(although you should swap out the 'vector' folder for the latest vector tarball you want to run.
Get a tarball from https://vector.im/packages or build your own - see Building From Source
above).
There's also a (much) older electron distribution at https://github.com/stevenhammerton/vector-desktop
Development
===========
Before attempting to develop on Vector you **must** read the developer guide
Before attempting to develop on Riot you **must** read the developer guide
for `matrix-react-sdk` at https://github.com/matrix-org/matrix-react-sdk, which
also defines the design, architecture and style for Vector too.
also defines the design, architecture and style for Riot too.
The idea of Vector is to be a relatively lightweight "skin" of customisations on
The idea of Riot is to be a relatively lightweight "skin" of customisations on
top of the underlying `matrix-react-sdk`. `matrix-react-sdk` provides both the
higher and lower level React components useful for building Matrix communication
apps using React.
@@ -136,26 +179,26 @@ After creating a new component you must run `npm run reskindex` to regenerate
the `component-index.js` for the app (used in future for skinning)
**However, as of July 2016 this layering abstraction is broken due to rapid
development on Vector forcing `matrix-react-sdk` to move fast at the expense of
maintaining a clear abstraction between the two.** Hacking on Vector inevitably
development on Riot forcing `matrix-react-sdk` to move fast at the expense of
maintaining a clear abstraction between the two.** Hacking on Riot inevitably
means hacking equally on `matrix-react-sdk`, and there are bits of
`matrix-react-sdk` behaviour incorrectly residing in the `vector-web` project
(e.g. matrix-react-sdk specific CSS), and a bunch of Vector specific behaviour
in the `matrix-react-sdk` (grep for Vector). This separation problem will be
solved asap once development on Vector (and thus matrix-react-sdk) has
`matrix-react-sdk` behaviour incorrectly residing in the `riot-web` project
(e.g. matrix-react-sdk specific CSS), and a bunch of Riot specific behaviour
in the `matrix-react-sdk` (grep for `vector` / `riot`). This separation problem will be
solved asap once development on Riot (and thus matrix-react-sdk) has
stabilised. Until then, the two projects should basically be considered as a
single unit. In particular, `matrix-react-sdk` issues are currently filed
against `vector-web` in github.
against `riot-web` in github.
Please note that Vector is intended to run correctly without access to the public
Please note that Riot is intended to run correctly without access to the public
internet. So please don't depend on resources (JS libs, CSS, images, fonts)
hosted by external CDNs or servers but instead please package all dependencies
into Vector itself.
into Riot itself.
Setting up a dev environment
============================
Much of the functionality in Vector is actually in the `matrix-react-sdk` and
Much of the functionality in Riot is actually in the `matrix-react-sdk` and
`matrix-js-sdk` modules. It is possible to set these up in a way that makes it
easy to track the `develop` branches in git and to make local changes without
having to manually rebuild each time.
@@ -178,10 +221,10 @@ Then similarly with `matrix-react-sdk`:
1. `rm -r node_modules/matrix-js-sdk; ln -s ../../matrix-js-sdk node_modules/`
1. `popd`
Finally, build and start vector itself:
Finally, build and start Riot itself:
1. `git clone git@github.com:vector-im/vector-web.git`
1. `cd vector-web`
1. `git clone git@github.com:vector-im/riot-web.git`
1. `cd riot-web`
1. `git checkout develop`
1. `npm install`
1. `rm -r node_modules/matrix-js-sdk; ln -s ../../matrix-js-sdk node_modules/`
@@ -203,25 +246,19 @@ Finally, build and start vector itself:
Remember, the command will not terminate since it runs the web server
and rebuilds source files when they change. This development server also
disables caching, so do NOT use it in production.
1. Open http://127.0.0.1:8080/ in your browser to see your newly built Vector.
1. Open http://127.0.0.1:8080/ in your browser to see your newly built Riot.
When you make changes to `matrix-react-sdk`, you will need to run `npm run
build` in the relevant directory. You can do this automatically by instead
running `npm start` in the directory, to start a development builder which
will watch for changes to the files and rebuild automatically.
When you make changes to `matrix-react-sdk` or `matrix-js-sdk`, you will need
to run `npm run build` in the relevant directory. You can do this automatically
by instead running `npm start` in the directory, to start a development builder
which will watch for changes to the files and rebuild automatically.
If you add or remove any components from the Vector skin, you will need to rebuild
If you add or remove any components from the Riot skin, you will need to rebuild
the skin's index by running, `npm run reskindex`.
If any of these steps error with, `file table overflow`, you are probably on a mac
which has a very low limit on max open files. Run `ulimit -Sn 1024` and try again.
You'll need to do this in each new terminal you open before building vector.
Filing issues
=============
All issues for Vector-web and Matrix-react-sdk should be filed at
https://github.com/matrix-org/matrix-react-sdk/issues
You'll need to do this in each new terminal you open before building Riot.
Triaging issues
===============
@@ -247,23 +284,3 @@ bug or feature:
* network (specific to network conditions)
* platform (platform specific)
Enabling encryption
===================
End-to-end encryption in Vector and Matrix is not yet considered ready for
day-to-day use; it is experimental and should be considered only as a
proof-of-concept. See https://matrix.org/jira/browse/SPEC-162 for an overview
of the current progress.
To enable the (very experimental) support, check the 'End-to-End Encryption'
box in the 'Labs' section of the user settings (note that the labs are disabled
on http://vector.im/beta: you will need to use http://vector.im/develop or your
own deployment of vector). The Room Settings dialog will then show an
'Encryption' setting; rooms for which you are an administrator will offer you
the option of enabling encryption. Any messages sent in that room will then be
encrypted.
Note that historical encrypted messages cannot currently be decoded - history
is therefore lost when the page is reloaded.

14
config.sample.json Normal file
View File

@@ -0,0 +1,14 @@
{
"default_hs_url": "https://matrix.org",
"default_is_url": "https://vector.im",
"brand": "Riot",
"integrations_ui_url": "https://scalar.vector.im/",
"integrations_rest_url": "https://scalar.vector.im/api",
"bug_report_endpoint_url": "https://vector.im/bugs",
"enableLabs": true,
"roomDirectory": {
"servers": [
"matrix.org"
]
}
}

25
docs/theming.md Normal file
View File

@@ -0,0 +1,25 @@
Theming Riot
============
Themes are a very basic way of providing simple alternative look & feels to the
riot-web app via CSS & custom imagery.
They are *NOT* co be confused with 'skins', which describe apps which sit on top
of matrix-react-sdk - e.g. in theory Riot itself is a react-sdk skin.
As of Jan 2017, skins are not fully supported; riot is the only available skin.
To define a theme for Riot:
1. Pick a name, e.g. `teal`. at time of writing we have `light` and `dark`.
2. Fork `src/skins/vector/css/themes/dark.scss` to be teal.scss
3. Fork `src/skins/vector/css/themes/_base.scss` to be _teal.scss
4. Override variables in _teal.scss as desired. You may wish to delete ones
which don't differ from _base.scss, to make it clear which are being
overridden. If every single colour is being changed (as per _dark.scss)
then you might as well keep them all.
5. Add the theme to the list of entrypoints in webpack.config.js
6. Add the theme to the list of themes in matrix-react-sdk's UserSettings.js
7. Sit back and admire your handywork.
In future, the assets for a theme will probably be gathered together into a
single directory tree.

BIN
electron/build/icon.icns Normal file

Binary file not shown.

BIN
electron/build/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
electron/img/riot.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

4
electron/riot.im/README Normal file
View File

@@ -0,0 +1,4 @@
This directory contains the config file for the official riot.im distribution
of Riot Desktop. You probably do not want to build with this config unless
you're building the official riot.im distribution, or you'll find your builds
will replace themselves with the riot.im build.

View File

@@ -1,9 +1,11 @@
{
"update_base_url": "https://riot.im/download/desktop/update/",
"default_hs_url": "https://matrix.org",
"default_is_url": "https://vector.im",
"brand": "Riot",
"integrations_ui_url": "http://localhost:8081/",
"integrations_rest_url": "http://localhost:5050",
"integrations_ui_url": "https://scalar.vector.im/",
"integrations_rest_url": "https://scalar.vector.im/api",
"bug_report_endpoint_url": "https://riot.im/bugreports/submit",
"enableLabs": true,
"roomDirectory": {
"servers": [
@@ -26,21 +28,25 @@
"protocol": "gitter",
"portalRoomPattern": "#gitter_.*:matrix.org",
"name": "Gitter",
"icon": "//gitter.im/favicon.ico",
"icon": "https://gitter.im/favicon.ico",
"example": "org/community",
"nativePattern": "[^\\s]+/[^\\s]+$"
},
"irc:freenode": {
"protocol": "irc",
"domain": "chat.freenode.net",
"portalRoomPattern": "#freenode_.*:matrix.org",
"name": "Freenode",
"icon": "//matrix.org/_matrix/media/v1/download/matrix.org/DHLHpDDgWNNejFmrewvwEAHX",
"icon": "https://matrix.org/_matrix/media/v1/download/matrix.org/DHLHpDDgWNNejFmrewvwEAHX",
"example": "#channel",
"nativePattern": "^#[^\\s]+$"
},
"irc:mozilla": {
"protocol": "irc",
"domain": "chat.freenode.net",
"portalRoomPattern": "#mozilla_.*:matrix.org",
"name": "Mozilla",
"icon": "//matrix.org/_matrix/media/v1/download/matrix.org/DHLHpDDgWNNejFmrewvwEAHX",
"icon": "https://matrix.org/_matrix/media/v1/download/matrix.org/DHLHpDDgWNNejFmrewvwEAHX",
"example": "#channel",
"nativePattern": "^#[^\\s]+$"
},
@@ -49,7 +55,7 @@
"domain": "ipv6-irc.snoonet.org",
"portalRoomPattern": "#_snoonet_.*:matrix.org",
"name": "Snoonet",
"icon": "//matrix.org/_matrix/media/v1/download/matrix.org/DHLHpDDgWNNejFmrewvwEAHX",
"icon": "https://matrix.org/_matrix/media/v1/download/matrix.org/DHLHpDDgWNNejFmrewvwEAHX",
"example": "#channel",
"nativePattern": "^#[^\\s]+$"
},
@@ -58,7 +64,7 @@
"domain": "irc.oftc.net",
"portalRoomPattern": "#_oftc_.*:matrix.org",
"name": "OFTC",
"icon": "//matrix.org/_matrix/media/v1/download/matrix.org/DHLHpDDgWNNejFmrewvwEAHX",
"icon": "https://matrix.org/_matrix/media/v1/download/matrix.org/DHLHpDDgWNNejFmrewvwEAHX",
"example": "#channel",
"nativePattern": "^#[^\\s]+$"
}

View File

@@ -0,0 +1,247 @@
// @flow
/*
Copyright 2016 Aviral Dasgupta
Copyright 2016 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Squirrel on windows starts the app with various flags
// as hooks to tell us when we've been installed/uninstalled
// etc.
const check_squirrel_hooks = require('./squirrelhooks');
if (check_squirrel_hooks()) return;
const electron = require('electron');
const url = require('url');
const tray = require('./tray');
const VectorMenu = require('./vectormenu');
let vectorConfig = {};
try {
vectorConfig = require('../../webapp/config.json');
} catch (e) {
// it would be nice to check the error code here and bail if the config
// is unparseable, but we get MODULE_NOT_FOUND in the case of a missing
// file or invalid json, so node is just very unhelpful.
// Continue with the defaults (ie. an empty config)
}
const PERMITTED_URL_SCHEMES = [
'http:',
'https:',
'mailto:',
];
const UPDATE_POLL_INTERVAL_MS = 60 * 60 * 1000;
const INITIAL_UPDATE_DELAY_MS = 30 * 1000;
let mainWindow = null;
let appQuitting = false;
function safeOpenURL(target) {
// openExternal passes the target to open/start/xdg-open,
// so put fairly stringent limits on what can be opened
// (for instance, open /bin/sh does indeed open a terminal
// with a shell, albeit with no arguments)
const parsed_url = url.parse(target);
if (PERMITTED_URL_SCHEMES.indexOf(parsed_url.protocol) > -1) {
// explicitly use the URL re-assembled by the url library,
// so we know the url parser has understood all the parts
// of the input string
const new_target = url.format(parsed_url);
electron.shell.openExternal(new_target);
}
}
function onWindowOrNavigate(ev, target) {
// always prevent the default: if something goes wrong,
// we don't want to end up opening it in the electron
// app, as we could end up opening any sort of random
// url in a window that has node scripting access.
ev.preventDefault();
safeOpenURL(target);
}
function onLinkContextMenu(ev, params) {
const popup_menu = new electron.Menu();
popup_menu.append(new electron.MenuItem({
label: params.linkURL,
click() {
safeOpenURL(params.linkURL);
},
}));
popup_menu.popup();
ev.preventDefault();
}
function installUpdate() {
// for some reason, quitAndInstall does not fire the
// before-quit event, so we need to set the flag here.
appQuitting = true;
electron.autoUpdater.quitAndInstall();
}
function pollForUpdates() {
try {
electron.autoUpdater.checkForUpdates();
} catch (e) {
console.log("Couldn't check for update", e);
}
}
function startAutoUpdate(update_base_url) {
if (update_base_url.slice(-1) !== '/') {
update_base_url = update_base_url + '/';
}
try {
// For reasons best known to Squirrel, the way it checks for updates
// is completely different between macOS and windows. On macOS, it
// hits a URL that either gives it a 200 with some json or
// 204 No Content. On windows it takes a base path and looks for
// files under that path.
if (process.platform == 'darwin') {
// include the current version in the URL we hit. Electron doesn't add
// it anywhere (apart from the User-Agent) so it's up to us. We could
// (and previously did) just use the User-Agent, but this doesn't
// rely on NSURLConnection setting the User-Agent to what we expect,
// and also acts as a convenient cache-buster to ensure that when the
// app updates it always gets a fresh value to avoid update-looping.
electron.autoUpdater.setFeedURL(
update_base_url +
'macos/?localVersion=' + encodeURIComponent(electron.app.getVersion())
);
} else if (process.platform == 'win32') {
electron.autoUpdater.setFeedURL(update_base_url + 'win32/' + process.arch + '/');
} else {
// Squirrel / electron only supports auto-update on these two platforms.
// I'm not even going to try to guess which feed style they'd use if they
// implemented it on Linux, or if it would be different again.
console.log("Auto update not supported on this platform");
}
// We check for updates ourselves rather than using 'updater' because we need to
// do it in the main process (and we don't really need to check every 10 minutes:
// every hour should be just fine for a desktop app)
// However, we still let the main window listen for the update events.
// We also wait a short time before checking for updates the first time because
// of squirrel on windows and it taking a small amount of time to release a
// lock file.
setTimeout(pollForUpdates, INITIAL_UPDATE_DELAY_MS);
setInterval(pollForUpdates, UPDATE_POLL_INTERVAL_MS);
} catch (err) {
// will fail if running in debug mode
console.log("Couldn't enable update checking", err);
}
}
// handle uncaught errors otherwise it displays
// stack traces in popup dialogs, which is terrible (which
// it will do any time the auto update poke fails, and there's
// no other way to catch this error).
// Assuming we generally run from the console when developing,
// this is far preferable.
process.on('uncaughtException', function (error) {
console.log("Unhandled exception", error);
});
electron.ipcMain.on('install_update', installUpdate);
electron.app.commandLine.appendSwitch('--enable-usermedia-screen-capturing');
const shouldQuit = electron.app.makeSingleInstance((commandLine, workingDirectory) => {
// Someone tried to run a second instance, we should focus our window.
if (mainWindow) {
if (!mainWindow.isVisible()) mainWindow.show();
if (mainWindow.isMinimized()) mainWindow.restore();
mainWindow.focus();
}
});
if (shouldQuit) {
electron.app.quit()
}
electron.app.on('ready', () => {
if (vectorConfig.update_base_url) {
console.log("Starting auto update with base URL: " + vectorConfig.update_base_url);
startAutoUpdate(vectorConfig.update_base_url);
} else {
console.log("No update_base_url is defined: auto update is disabled");
}
const icon_path = `${__dirname}/../img/riot.` + (
process.platform == 'win32' ? 'ico' : 'png'
);
mainWindow = new electron.BrowserWindow({
icon: icon_path,
width: 1024, height: 768,
show: false,
autoHideMenuBar: true,
});
mainWindow.loadURL(`file://${__dirname}/../../webapp/index.html`);
electron.Menu.setApplicationMenu(VectorMenu);
// Create trayIcon icon
tray.create(mainWindow, {
icon_path: icon_path,
brand: vectorConfig.brand || 'Riot'
});
mainWindow.once('ready-to-show', () => {
mainWindow.show();
});
mainWindow.on('closed', () => {
mainWindow = null;
});
mainWindow.on('close', (e) => {
if (!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)
e.preventDefault();
mainWindow.hide();
return false;
}
});
mainWindow.webContents.on('new-window', onWindowOrNavigate);
mainWindow.webContents.on('will-navigate', onWindowOrNavigate);
mainWindow.webContents.on('context-menu', function(ev, params) {
if (params.linkURL) {
onLinkContextMenu(ev, params);
}
});
});
electron.app.on('window-all-closed', () => {
electron.app.quit();
});
electron.app.on('activate', () => {
mainWindow.show();
});
electron.app.on('before-quit', () => {
appQuitting = true;
});
// Set the App User Model ID to match what the squirrel
// installer uses for the shortcut icon.
// This makes notifications work on windows 8.1 (and is
// a noop on other platforms).
electron.app.setAppUserModelId('com.squirrel.riot-web.Riot');

View File

@@ -0,0 +1,51 @@
/*
Copyright 2017 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
const path = require('path');
const spawn = require('child_process').spawn;
const app = require('electron').app;
function run_update_exe(args, done) {
// Invokes Squirrel's Update.exe which will do things for us like create shortcuts
// Note that there's an Update.exe in the app-x.x.x directory and one in the parent
// directory: we need to run the one in the parent directory, because it discovers
// information about the app by inspecting the directory it's run from.
const updateExe = path.resolve(path.dirname(process.execPath), '..', 'Update.exe');
console.log('Spawning `%s` with args `%s`', updateExe, args);
spawn(updateExe, args, {
detached: true
}).on('close', done);
};
function check_squirrel_hooks() {
if (process.platform != 'win32') return false;
const cmd = process.argv[1];
const target = path.basename(process.execPath);
if (cmd === '--squirrel-install' || cmd === '--squirrel-updated') {
run_update_exe(['--createShortcut=' + target + ''], app.quit);
return true;
} else if (cmd === '--squirrel-uninstall') {
run_update_exe(['--removeShortcut=' + target + ''], app.quit);
return true;
} else if (cmd === '--squirrel-obsolete') {
app.quit();
return true;
}
return false;
}
module.exports = check_squirrel_hooks;

67
electron/src/tray.js Normal file
View File

@@ -0,0 +1,67 @@
/*
Copyright 2017 Karl Glatz <karl@glatz.biz>
Copyright 2017 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
const path = require('path');
const electron = require('electron');
const app = electron.app;
const Tray = electron.Tray;
const MenuItem = electron.MenuItem;
let trayIcon = null;
exports.hasTray = function hasTray() {
return (trayIcon !== null);
}
exports.create = function (win, config) {
// no trays on darwin
if (process.platform === 'darwin' || trayIcon) {
return;
}
const toggleWin = function () {
if (win.isVisible() && !win.isMinimized()) {
win.hide();
} else {
if (win.isMinimized()) win.restore();
if (!win.isVisible()) win.show();
win.focus();
}
};
const contextMenu = electron.Menu.buildFromTemplate([
{
label: 'Show/Hide ' + config.brand,
click: toggleWin
},
{
type: 'separator'
},
{
label: 'Quit',
click: function () {
app.quit();
}
}
]);
trayIcon = new Tray(config.icon_path);
trayIcon.setToolTip(config.brand);
trayIcon.setContextMenu(contextMenu);
trayIcon.on('click', toggleWin);
};

197
electron/src/vectormenu.js Normal file
View File

@@ -0,0 +1,197 @@
/*
Copyright 2016 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
const electron = require('electron');
// Menu template from http://electron.atom.io/docs/api/menu/, edited
const template = [
{
label: 'Edit',
submenu: [
{
role: 'undo'
},
{
role: 'redo'
},
{
type: 'separator'
},
{
role: 'cut'
},
{
role: 'copy'
},
{
role: 'paste'
},
{
role: 'pasteandmatchstyle'
},
{
role: 'delete'
},
{
role: 'selectall'
}
]
},
{
label: 'View',
submenu: [
{
type: 'separator'
},
{
role: 'resetzoom'
},
{
role: 'zoomin'
},
{
role: 'zoomout'
},
{
type: 'separator'
},
{
role: 'togglefullscreen'
},
{
role: 'toggledevtools'
}
]
},
{
role: 'window',
submenu: [
{
role: 'minimize'
},
{
role: 'close'
}
]
},
{
role: 'help',
submenu: [
{
label: 'riot.im',
click () { electron.shell.openExternal('https://riot.im/') }
}
]
}
];
// macOS has specific menu conventions...
if (process.platform === 'darwin') {
// first macOS menu is the name of the app
const name = electron.app.getName()
template.unshift({
label: name,
submenu: [
{
role: 'about'
},
{
type: 'separator'
},
{
role: 'services',
submenu: []
},
{
type: 'separator'
},
{
role: 'hide'
},
{
role: 'hideothers'
},
{
role: 'unhide'
},
{
type: 'separator'
},
{
role: 'quit'
}
]
})
// Edit menu.
// This has a 'speech' section on macOS
template[1].submenu.push(
{
type: 'separator'
},
{
label: 'Speech',
submenu: [
{
role: 'startspeaking'
},
{
role: 'stopspeaking'
}
]
}
)
// Window menu.
// This also has specific functionality on macOS
template[3].submenu = [
{
label: 'Close',
accelerator: 'CmdOrCtrl+W',
role: 'close'
},
{
label: 'Minimize',
accelerator: 'CmdOrCtrl+M',
role: 'minimize'
},
{
label: 'Zoom',
role: 'zoom'
},
{
type: 'separator'
},
{
label: 'Bring All to Front',
role: 'front'
}
]
} else {
template.unshift({
label: 'File',
submenu: [
// For some reason, 'about' does not seem to work on windows.
/*{
role: 'about'
},*/
{
role: 'quit'
}
]
});
}
module.exports = electron.Menu.buildFromTemplate(template)

View File

@@ -2,13 +2,14 @@
var path = require('path');
var webpack = require('webpack');
var webpack_config = require('./webpack.config');
/*
* We use webpack to build our tests. It's a pain to have to wait for webpack
* to build everything; however it's the easiest way to load our dependencies
* from node_modules.
*
* If you run karma in multi-run mode (with `npm run test:multi`), it will watch
* If you run karma in multi-run mode (with `npm run test-multi`), it will watch
* the tests for changes, and webpack will rebuild using a cache. This is much quicker
* than a clean rebuild.
*/
@@ -19,8 +20,41 @@ var testFile = process.env.KARMA_TEST_FILE || 'test/all-tests.js';
process.env.PHANTOMJS_BIN = 'node_modules/.bin/phantomjs';
process.env.Q_DEBUG = 1;
/* the webpack config is based on the real one, to (a) try to simulate the
* deployed environment as closely as possible, and (b) to avoid a shedload of
* cut-and-paste.
*/
// find out if we're shipping olm, and where it is, if so.
const olm_entry = webpack_config.entry['olm'];
// remove the default entries - karma provides its own (via the 'files' and
// 'preprocessors' config below)
delete webpack_config['entry'];
// add ./test as a search path for js
webpack_config.module.loaders.unshift({
test: /\.js$/, loader: "babel",
include: [path.resolve('./src'), path.resolve('./test')],
});
// disable parsing for sinon, because it
// tries to do voodoo with 'require' which upsets
// webpack (https://github.com/webpack/webpack/issues/304)
webpack_config.module.noParse.push(/sinon\/pkg\/sinon\.js$/);
// ?
webpack_config.resolve.alias['sinon'] = 'sinon/pkg/sinon.js';
webpack_config.resolve.root = [
path.resolve('./src'),
path.resolve('./test'),
];
webpack_config.devtool = 'inline-source-map';
module.exports = function (config) {
config.set({
const myconfig = {
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['mocha'],
@@ -29,19 +63,29 @@ module.exports = function (config) {
files: [
'node_modules/babel-polyfill/browser.js',
testFile,
{pattern: 'vector/img/*', watched: false, included: false, served: true, nocache: false},
// make the images available via our httpd. They will be avaliable
// below http://localhost:[PORT]/base/. See also `proxies` which
// defines alternative URLs for them.
//
// This isn't required by any of the tests, but it stops karma
// logging warnings when it serves a 404 for them.
{
pattern: 'src/skins/vector/img/*',
watched: false, included: false, served: true, nocache: false,
},
],
// redirect img links to the karma server
proxies: {
"/img/": "/base/vector/img/",
// redirect img links to the karma server. See above.
"/img/": "/base/src/skins/vector/img/",
},
// preprocess matching files before serving them to the browser
// available preprocessors:
// https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
'test/**/*.js': ['webpack', 'sourcemap']
'{src,test}/**/*.js': ['webpack'],
},
// test results reporter to use
@@ -84,59 +128,20 @@ module.exports = function (config) {
outputDir: 'karma-reports',
},
webpack: {
module: {
loaders: [
{ test: /\.json$/, loader: "json" },
{
test: /\.js$/, loader: "babel",
include: [path.resolve('./src'),
path.resolve('./test'),
],
query: {
// we're using babel 5, for consistency with
// the release build, which doesn't use the
// presets.
// presets: ['react', 'es2015'],
},
},
],
noParse: [
// don't parse the languages within highlight.js. They
// cause stack overflows
// (https://github.com/webpack/webpack/issues/1721), and
// there is no need for webpack to parse them - they can
// just be included as-is.
/highlight\.js\/lib\/languages/,
webpack: webpack_config,
// also disable parsing for sinon, because it
// tries to do voodoo with 'require' which upsets
// webpack (https://github.com/webpack/webpack/issues/304)
/sinon\/pkg\/sinon\.js$/,
],
webpackMiddleware: {
stats: {
// don't fill the console up with a mahoosive list of modules
chunks: false,
},
resolve: {
alias: {
// alias any requires to the react module to the one in our path, otherwise
// we tend to get the react source included twice when using npm link.
react: path.resolve('./node_modules/react'),
// same goes for js-sdk
"matrix-js-sdk": path.resolve('./node_modules/matrix-js-sdk'),
sinon: 'sinon/pkg/sinon.js',
},
root: [
path.resolve('./src'),
path.resolve('./test'),
],
},
plugins: [
// olm may not be installed, so avoid webpack warnings by
// ignoring it.
new webpack.IgnorePlugin(/^olm$/),
],
devtool: 'inline-source-map',
},
});
};
// include the olm loader if we have it.
if (olm_entry) {
myconfig.files.unshift(olm_entry);
}
config.set(myconfig);
};

View File

@@ -1,76 +1,109 @@
{
"name": "vector-web",
"version": "0.8.3",
"description": "Vector webapp",
"author": "matrix.org",
"name": "riot-web",
"productName": "Riot",
"main": "electron/src/electron-main.js",
"version": "0.9.7",
"description": "A feature-rich client for Matrix.org",
"author": "Vector Creations Ltd.",
"repository": {
"type": "git",
"url": "https://github.com/vector-im/vector-web"
"url": "https://github.com/vector-im/riot-web"
},
"license": "Apache-2.0",
"files": [
"AUTHORS.rst",
"CONTRIBUTING.rst",
"deploy",
"docs",
"karma.conf.js",
"lib",
"release.sh",
"scripts",
"src",
"test",
"webpack.config.js"
],
"style": "bundle.css",
"matrix-react-parent": "matrix-react-sdk",
"scripts": {
"reskindex": "reskindex -h src/header",
"build:emojione": "cpx \"node_modules/emojione/assets/svg/*\" vector/emojione/svg/",
"build:res": "node scripts/copy-res.js",
"build:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js",
"build:css": "catw \"src/skins/vector/css/**/*.css\" -o vector/components.css --no-watch",
"build:compile": "babel --source-maps -d lib src",
"build:bundle": "NODE_ENV=production webpack -p lib/vector/index.js vector/bundle.js",
"build:bundle:dev": "webpack --optimize-occurence-order lib/vector/index.js vector/bundle.js",
"build:staticfiles": "cpx -v node_modules/olm/olm.js vector/",
"build": "npm run build:staticfiles && npm run build:emojione && npm run build:css && npm run build:compile && npm run build:bundle",
"build:dev": "npm run build:staticfiles && npm run build:emojione && npm run build:css && npm run build:compile && npm run build:bundle:dev",
"package": "scripts/package.sh",
"start:emojione": "cpx \"node_modules/emojione/assets/svg/*\" vector/emojione/svg/ -w",
"start:js": "webpack -w src/vector/index.js vector/bundle.js",
"start:js:prod": "NODE_ENV=production webpack -w src/vector/index.js vector/bundle.js",
"start:skins:css": "catw \"src/skins/vector/css/**/*.css\" -o vector/components.css",
"start:staticfiles": "cpx -Lwv node_modules/olm/olm.js vector/",
"//cache": "Note the -c 1 below due to https://code.google.com/p/chromium/issues/detail?id=508270",
"start": "parallelshell \"npm run start:staticfiles\" \"npm run start:emojione\" \"npm run start:js\" \"npm run start:skins:css\" \"http-server -c 1 vector\"",
"start:prod": "parallelshell \"npm run start:staticfiles\" \"npm run start:emojione\" \"npm run start:js:prod\" \"npm run start:skins:css\" \"http-server -c 1 vector\"",
"clean": "rimraf lib vector/olm.js vector/bundle.css vector/bundle.js vector/bundle.js.map vector/webpack.css* vector/emojione",
"prepublish": "npm run build:css && npm run build:compile",
"build:bundle": "NODE_ENV=production webpack -p --progress",
"build:bundle:dev": "webpack --optimize-occurence-order --progress",
"build:electron": "npm run clean && npm run build && build -wml --ia32 --x64",
"build": "node scripts/babelcheck.js && npm run build:res && npm run build:bundle",
"build:dev": "node scripts/babelcheck.js && npm run build:res && npm run build:bundle:dev",
"dist": "scripts/package.sh",
"start:res": "node scripts/copy-res.js -w",
"start:js": "webpack-dev-server --output-filename=bundles/_dev_/[name].js --output-chunk-file=bundles/_dev_/[name].js -w --progress",
"start:js:prod": "NODE_ENV=production webpack-dev-server -w --progress",
"start": "node scripts/babelcheck.js && parallelshell \"npm run start:res\" \"npm run start:js\"",
"start:prod": "parallelshell \"npm run start:res\" \"npm run start:js:prod\"",
"lint": "eslint src/",
"lintall": "eslint src/ test/",
"clean": "rimraf lib webapp electron/dist",
"prepublish": "npm run build:compile",
"test": "karma start --single-run=true --autoWatch=false --browsers PhantomJS --colors=false",
"test:multi": "karma start"
"test-multi": "karma start"
},
"dependencies": {
"babel-polyfill": "^6.5.0",
"babel-runtime": "^6.11.6",
"browser-request": "^0.3.3",
"classnames": "^2.1.2",
"draft-js": "^0.8.1",
"extract-text-webpack-plugin": "^0.9.1",
"favico.js": "^0.3.10",
"filesize": "^3.1.2",
"flux": "~2.0.3",
"gemini-scrollbar": "matrix-org/gemini-scrollbar#b302279",
"gfm.css": "^1.1.1",
"highlight.js": "^9.0.0",
"linkifyjs": "^2.1.3",
"matrix-js-sdk": "0.6.3",
"matrix-react-sdk": "0.7.4",
"matrix-js-sdk": "matrix-org/matrix-js-sdk#develop",
"matrix-react-sdk": "matrix-org/matrix-react-sdk#develop",
"modernizr": "^3.1.0",
"q": "^1.4.1",
"react": "^15.2.1",
"react": "^15.4.0",
"react-dnd": "^2.1.4",
"react-dnd-html5-backend": "^2.1.2",
"react-dom": "^15.2.1",
"react-dom": "^15.4.0",
"react-gemini-scrollbar": "matrix-org/react-gemini-scrollbar#5e97aef",
"sanitize-html": "^1.11.1",
"ua-parser-js": "^0.7.10",
"url": "^0.11.0"
},
"devDependencies": {
"babel": "^5.8.23",
"babel-core": "^5.8.25",
"babel-loader": "^5.3.2",
"catw": "^1.0.1",
"autoprefixer": "^6.6.0",
"babel-cli": "^6.5.2",
"babel-core": "^6.14.0",
"babel-eslint": "^6.1.0",
"babel-loader": "^6.2.5",
"babel-plugin-add-module-exports": "^0.2.1",
"babel-plugin-transform-async-to-generator": "^6.16.0",
"babel-plugin-transform-class-properties": "^6.16.0",
"babel-plugin-transform-object-rest-spread": "^6.16.0",
"babel-plugin-transform-runtime": "^6.15.0",
"babel-preset-es2015": "^6.16.0",
"babel-preset-es2016": "^6.16.0",
"babel-preset-es2017": "^6.16.0",
"babel-preset-react": "^6.16.0",
"babel-preset-stage-2": "^6.17.0",
"chokidar": "^1.6.1",
"cpx": "^1.3.2",
"css-raw-loader": "^0.1.1",
"electron-builder": "^11.2.4",
"electron-builder-squirrel-windows": "^11.2.1",
"emojione": "^2.2.3",
"eslint": "^3.14.0",
"eslint-config-google": "^0.7.1",
"eslint-plugin-flowtype": "^2.30.0",
"eslint-plugin-react": "^6.9.0",
"expect": "^1.16.0",
"fs-extra": "^0.30.0",
"http-server": "^0.8.4",
"html-webpack-plugin": "^2.24.0",
"json-loader": "^0.5.3",
"karma": "^0.13.22",
"karma-chrome-launcher": "^0.2.3",
@@ -78,18 +111,57 @@
"karma-junit-reporter": "^0.4.1",
"karma-mocha": "^0.2.2",
"karma-phantomjs-launcher": "^1.0.0",
"karma-sourcemap-loader": "^0.3.7",
"karma-webpack": "^1.7.0",
"minimist": "^1.2.0",
"mkdirp": "^0.5.1",
"mocha": "^2.4.5",
"parallelshell": "^1.2.0",
"phantomjs-prebuilt": "^2.1.7",
"react-addons-perf": "^15.0",
"react-addons-test-utils": "^15.0.1",
"postcss-extend": "^1.0.5",
"postcss-import": "^9.0.0",
"postcss-loader": "^1.2.2",
"postcss-mixins": "^5.4.1",
"postcss-nested": "^1.0.0",
"postcss-scss": "^0.4.0",
"postcss-simple-vars": "^3.0.0",
"postcss-strip-inline-comments": "^0.1.5",
"react-addons-perf": "^15.4.0",
"react-addons-test-utils": "^15.4.0",
"rimraf": "^2.4.3",
"source-map-loader": "^0.1.5",
"webpack": "^1.12.14"
"webpack": "^1.12.14",
"webpack-dev-server": "^1.16.2"
},
"optionalDependencies": {
"olm": "https://matrix.org/packages/npm/olm/olm-1.3.0.tgz"
"olm": "https://matrix.org/packages/npm/olm/olm-2.2.1.tgz"
},
"build": {
"appId": "im.riot.app",
"category": "Network",
"electronVersion": "1.4.14",
"//asar=false": "https://github.com/electron-userland/electron-builder/issues/675",
"asar": false,
"dereference": true,
"//files": "We bundle everything, so we only need to include webapp/",
"files": [
"electron/src/**",
"electron/img/**",
"webapp/**",
"package.json"
],
"linux": {
"target": "deb",
"maintainer": "support@riot.im",
"desktop": {
"StartupWMClass": "riot-web"
}
},
"win": {
"target": "squirrel"
}
},
"directories": {
"buildResources": "electron/build",
"output": "electron/dist"
}
}

13
postcss.config.js Normal file
View File

@@ -0,0 +1,13 @@
module.exports = {
plugins: [
require("postcss-import")(),
require("autoprefixer")(),
require("postcss-simple-vars")(),
require("postcss-extend")(),
require("postcss-nested")(),
require("postcss-mixins")(),
require("postcss-strip-inline-comments")(),
],
"parser": "postcss-scss",
"local-plugins": true,
};

1
release_config.yaml Normal file
View File

@@ -0,0 +1 @@
signing_id: packages@riot.im

BIN
res/media/ring.mp3 Normal file

Binary file not shown.

BIN
res/media/ring.ogg Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

View File

@@ -2,37 +2,37 @@
"name": "Riot",
"icons": [
{
"src": "\/icons\/android-chrome-36x36.png",
"src": "android-chrome-36x36.png",
"sizes": "36x36",
"type": "image\/png",
"density": "0.75"
},
{
"src": "\/icons\/android-chrome-48x48.png",
"src": "android-chrome-48x48.png",
"sizes": "48x48",
"type": "image\/png",
"density": "1.0"
},
{
"src": "\/icons\/android-chrome-72x72.png",
"src": "android-chrome-72x72.png",
"sizes": "72x72",
"type": "image\/png",
"density": "1.5"
},
{
"src": "\/icons\/android-chrome-96x96.png",
"src": "android-chrome-96x96.png",
"sizes": "96x96",
"type": "image\/png",
"density": "2.0"
},
{
"src": "\/icons\/android-chrome-144x144.png",
"src": "android-chrome-144x144.png",
"sizes": "144x144",
"type": "image\/png",
"density": "3.0"
},
{
"src": "\/icons\/android-chrome-192x192.png",
"src": "android-chrome-192x192.png",
"sizes": "192x192",
"type": "image\/png",
"density": "4.0"

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

26
scripts/babelcheck.js Normal file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env node
var exec = require('child_process').exec;
// Makes sure the babel executable in the path is babel 6 (or greater), not
// babel 5, which it is if you upgrade from an older version of react-sdk and
// run 'npm install' since the package has changed to babel-cli, so 'babel'
// remains installed and the executable in node_modules/.bin remains as babel
// 5.
// This script is duplicated from matrix-react-sdk because it can't reliably
// be pulled in from react-sdk while npm install is failing, as it will do
// if the environment is in the erroneous state this script checks for.
exec("babel -V", function (error, stdout, stderr) {
if ((error && error.code) || parseInt(stdout.substr(0,1), 10) < 6) {
console.log("\033[31m\033[1m"+
'*****************************************\n'+
'* vector-web has moved to babel 6 *\n'+
'* Please "rm -rf node_modules && npm i" *\n'+
'* then restore links as appropriate *\n'+
'*****************************************\n'+
"\033[91m");
process.exit(1);
}
});

81
scripts/copy-res.js Executable file
View File

@@ -0,0 +1,81 @@
#!/usr/bin/env node
// copies the resources into the webapp directory.
//
// cpx includes globbed parts of the filename in the destination, but excludes
// common parents. Hence, "res/{a,b}/**": the output will be "dest/a/..." and
// "dest/b/...".
const COPY_LIST = [
["res/{media,vector-icons}/**", "webapp"],
["src/skins/vector/{fonts,img}/**", "webapp"],
["node_modules/emojione/assets/svg/*", "webapp/emojione/svg/"],
["./config.json", "webapp", {directwatch: 1}],
];
const parseArgs = require('minimist');
const Cpx = require('cpx');
const chokidar = require('chokidar');
const argv = parseArgs(
process.argv.slice(2), {}
);
var watch = argv.w;
var verbose = argv.v;
function errCheck(err) {
if (err) {
console.error(err.message);
process.exit(1);
}
}
function next(i, err) {
errCheck(err);
if (i >= COPY_LIST.length) {
return;
}
const ent = COPY_LIST[i];
const source = ent[0];
const dest = ent[1];
const opts = ent[2] || {};
const cpx = new Cpx.Cpx(source, dest);
if (verbose) {
cpx.on("copy", (event) => {
console.log(`Copied: ${event.srcPath} --> ${event.dstPath}`);
});
cpx.on("remove", (event) => {
console.log(`Removed: ${event.path}`);
});
}
const cb = (err) => {next(i+1, err)};
if (watch) {
if (opts.directwatch) {
// cpx -w creates a watcher for the parent of any files specified,
// which in the case of config.json is '.', which inevitably takes
// ages to crawl. So we create our own watcher on the files
// instead.
const copy = () => {cpx.copy(errCheck)};
chokidar.watch(source)
.on('add', copy)
.on('change', copy)
.on('ready', cb)
.on('error', errCheck);
} else {
cpx.on('watch-ready', cb);
cpx.on("watch-error", cb);
cpx.watch();
}
} else {
cpx.copy(cb);
}
}
next(0);

183
scripts/deploy.py Executable file
View File

@@ -0,0 +1,183 @@
#!/usr/bin/env python
#
# download and unpack a riot-web tarball.
#
# Allows `bundles` to be extracted to a common directory, and a link to
# config.json to be added.
from __future__ import print_function
import argparse
import os
import os.path
import subprocess
import sys
import tarfile
try:
# python3
from urllib.request import urlretrieve
except ImportError:
# python2
from urllib import urlretrieve
class DeployException(Exception):
pass
def create_relative_symlink(linkname, target):
relpath = os.path.relpath(target, os.path.dirname(linkname))
print ("Symlink %s -> %s" % (linkname, relpath))
os.symlink(relpath, linkname)
def move_bundles(source, dest):
"""Move the contents of the 'bundles' directory to a common dir
We check that we will not be overwriting anything before we proceed.
Args:
source (str): path to 'bundles' within the extracted tarball
dest (str): target common directory
"""
if not os.path.isdir(dest):
os.mkdir(dest)
# build a map from source to destination, checking for non-existence as we go.
renames = {}
for f in os.listdir(source):
dst = os.path.join(dest, f)
if os.path.exists(dst):
raise DeployException(
"Not deploying. The bundle includes '%s' which we have previously deployed."
% f
)
renames[os.path.join(source, f)] = dst
for (src, dst) in renames.iteritems():
print ("Move %s -> %s" % (src, dst))
os.rename(src, dst)
class Deployer:
def __init__(self):
self.packages_path = "."
self.bundles_path = None
self.should_clean = False
self.config_location = None
self.verify_signature = True
def deploy(self, tarball, extract_path):
"""Download a tarball if necessary, and unpack it
Returns:
(str) the path to the unpacked deployment
"""
print("Deploying %s to %s" % (tarball, extract_path))
name_str = os.path.basename(tarball).replace(".tar.gz", "")
extracted_dir = os.path.join(extract_path, name_str)
if os.path.exists(extracted_dir):
raise DeployException('Cannot unpack %s: %s already exists' % (
tarball, extracted_dir))
downloaded = False
if tarball.startswith("http://") or tarball.startswith("https://"):
tarball = self.download_and_verify(tarball)
print("Downloaded file: %s" % tarball)
downloaded = True
try:
with tarfile.open(tarball) as tar:
tar.extractall(extract_path)
finally:
if self.should_clean and downloaded:
os.remove(tarball)
print ("Extracted into: %s" % extracted_dir)
if self.config_location:
create_relative_symlink(
target=self.config_location,
linkname=os.path.join(extracted_dir, 'config.json')
)
if self.bundles_path:
extracted_bundles = os.path.join(extracted_dir, 'bundles')
move_bundles(source=extracted_bundles, dest=self.bundles_path)
# replace the (hopefully now empty) extracted_bundles dir with a
# symlink to the common dir.
os.rmdir(extracted_bundles)
create_relative_symlink(
target=self.bundles_path,
linkname=extracted_bundles,
)
return extracted_dir
def download_and_verify(self, url):
tarball = self.download_file(url)
if self.verify_signature:
sigfile = self.download_file(url + ".asc")
subprocess.check_call(["gpg", "--verify", sigfile, tarball])
return tarball
def download_file(self, url):
if not os.path.isdir(self.packages_path):
os.mkdir(self.packages_path)
local_filename = os.path.join(self.packages_path,
url.split('/')[-1])
sys.stdout.write("Downloading %s -> %s..." % (url, local_filename))
sys.stdout.flush()
urlretrieve(url, local_filename)
print ("Done")
return local_filename
if __name__ == "__main__":
parser = argparse.ArgumentParser("Deploy a Riot build on a web server.")
parser.add_argument(
"-p", "--packages-dir", default="./packages", help=(
"The directory to download the tarball into. (Default: '%(default)s')"
)
)
parser.add_argument(
"-e", "--extract-path", default="./deploys", help=(
"The location to extract .tar.gz files to. (Default: '%(default)s')"
)
)
parser.add_argument(
"-b", "--bundles-dir", nargs='?', default="./bundles", help=(
"A directory to move the contents of the 'bundles' directory to. A \
symlink to the bundles directory will also be written inside the \
extracted tarball. Example: './bundles'. \
(Default: '%(default)s')"
)
)
parser.add_argument(
"-c", "--clean", action="store_true", default=False, help=(
"Remove .tar.gz files after they have been downloaded and extracted. \
(Default: %(default)s)"
)
)
parser.add_argument(
"--config", nargs='?', default='./config.json', help=(
"Write a symlink at config.json in the extracted tarball to this \
location. (Default: '%(default)s')"
)
)
parser.add_argument(
"tarball", help=(
"filename of tarball, or URL to download."
),
)
args = parser.parse_args()
deployer = Deployer()
deployer.packages_path = args.packages_dir
deployer.bundles_path = args.bundles_dir
deployer.should_clean = args.clean
deployer.config_location = args.config
deployer.deploy(args.tarball, args.extract_path)

130
scripts/electron-package.sh Executable file
View File

@@ -0,0 +1,130 @@
#!/bin/bash
set -e
usage() {
echo "Usage: $0 -v <version> -c <config file> [-n]"
echo
echo "version: commit-ish to check out and build"
echo "config file: a path to a json config file to"
echo "ship with the build. In addition, update_base_url:"
echo "from this file is used to set up auto-update."
echo "-n: build with no config file."
echo
echo "Values may also be passed as environment variables"
}
conffile=
version=
skipcfg=0
while getopts "c:v:n" opt; do
case $opt in
c)
conffile=$OPTARG
;;
v)
version=$OPTARG
;;
n)
skipcfg=1
;;
\?)
echo "Invalid option: -$OPTARG" >&2
usage
exit
;;
esac
done
if [ -z "$version" ]; then
echo "No version supplied"
usage
exit
fi
if [ -z "$conffile" ] && [ "$skipcfg" = 0 ]; then
echo "No config file given. Use -c to supply a config file or"
echo "-n to build with no config file (and no auto update)."
exit
fi
if [ -n "$conffile" ]; then
update_base_url=`jq -r .update_base_url $conffile`
if [ -z "$update_base_url" ]; then
echo "No update URL supplied. Use update_base_url: null if you really"
echo "want a build with no auto-update."
usage
exit
fi
# Make sure the base URL ends in a slash if it doesn't already
update_base_url=`echo $update_base_url | sed -e 's#\([^\/]\)$#\1\/#'`
fi
if [ ! -f package.json ]; then
echo "No package.json found. This script must be run from"
echo "the vector-web directory."
exit
fi
echo "Building $version using Update base URL $update_base_url"
projdir=`pwd`
builddir=`mktemp -d 2>/dev/null || mktemp -d -t 'buildtmp'`
pushd "$builddir"
git clone "$projdir" .
git checkout "$version"
# Figure out what version we're building
vername=`jq -r .version package.json`
if [ -n "$conffile" ]; then
popd
cp "$conffile" "$builddir/"
pushd "$builddir"
fi
npm install
npm run build:electron
popd
distdir="$builddir/electron/dist"
pubdir="$projdir/electron/pub"
rm -r "$pubdir" || true
mkdir -p "$pubdir"
# Install packages: what the user downloads the first time,
# (DMGs for mac, exe installer for windows)
mkdir -p "$pubdir/install/macos"
cp $distdir/mac/*.dmg "$pubdir/install/macos/"
mkdir -p "$pubdir/install/win32/ia32/"
cp $distdir/win-ia32/*.exe "$pubdir/install/win32/ia32/"
mkdir -p "$pubdir/install/win32/x64/"
cp $distdir/win/*.exe "$pubdir/install/win32/x64/"
# Packages for auto-update
mkdir -p "$pubdir/update/macos"
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/"
mkdir -p "$pubdir/update/win32/x64/"
cp $distdir/win/*.nupkg "$pubdir/update/win32/x64/"
cp $distdir/win/RELEASES "$pubdir/update/win32/x64/"
# Move the debs to the main project dir's dist folder
rm -r "$projdir/electron/dist" || true
mkdir -p "$projdir/electron/dist"
cp $distdir/*.deb "$projdir/electron/dist/"
rm -rf "$builddir"
echo "Riot Desktop is ready to go in $pubdir: this directory can be hosted on your web server."
echo "deb archives are in electron/dist/ - these should be added into your debian repository"

View File

@@ -2,7 +2,7 @@
set -e
export NVM_DIR="/home/jenkins/.nvm"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
nvm use 6
@@ -11,25 +11,30 @@ set -x
npm install
# apparently npm 3.10.3 on node 6.4.0 doesn't upgrade #develop target with npm install unless explicitly asked.
npm install matrix-react-sdk matrix-js-sdk
npm install matrix-react-sdk matrix-js-sdk olm
# install olm. A naive 'npm i ./olm/olm-*.tgz' fails because it uses the url
# from our package.json (or even matrix-js-sdk's) in preference.
tar -C olm -xz < olm/olm-*.tgz
rm -r node_modules/olm
cp -r olm/package node_modules/olm
#
# disabled for now, to avoid the annoying scenario of a release doing something
# different to /develop. Instead, add it to the 'npm install' list above.
# -- rav 2016/02/03
#tar -C olm -xz < olm/olm-*.tgz
#rm -r node_modules/olm
#cp -r olm/package node_modules/olm
# we may be using a dev branch of react-sdk, in which case we need to build it
(cd node_modules/matrix-react-sdk && npm run build)
# we may be using dev branches of js-sdk and react-sdk, in which case we need to build them
(cd node_modules/matrix-js-sdk && npm install)
(cd node_modules/matrix-react-sdk && npm install)
# run the mocha tests
npm run test
# build our artifacts; dumps them in ./vector
npm run build:dev
# run eslint
npm run lintall -- -f checkstyle -o eslint.xml || true
# gzip up ./vector
rm vector-*.tar.gz || true # rm previous artifacts without failing if it doesn't exist
rm dist/vector-*.tar.gz || true # rm previous artifacts without failing if it doesn't exist
# node_modules deps from 'npm install' don't have a .git dir so can't
# rev-parse; but they do set the commit in package.json under 'gitHead' which
@@ -39,4 +44,4 @@ JSSDK_SHA=$(grep 'gitHead' node_modules/matrix-js-sdk/package.json | cut -d \" -
VECTOR_SHA=$(git rev-parse --short=12 HEAD) # use the ACTUAL SHA rather than assume develop
tar -zcvhf vector-$VECTOR_SHA-react-$REACT_SHA-js-$JSSDK_SHA.tar.gz vector #g[z]ip, [c]reate archive, [v]erbose, [f]ilename, [h]ard-dereference (do not archive symlinks)
DIST_VERSION=$VECTOR_SHA-react-$REACT_SHA-js-$JSSDK_SHA scripts/package.sh -d

93
scripts/make-icons.sh Executable file
View File

@@ -0,0 +1,93 @@
#!/bin/bash
if [ $# != 1 ]
then
echo "Usage: $0 <svg file>"
exit
fi
set -e
set -x
tmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'icontmp'`
for i in 1024 512 310 256 192 180 152 150 144 128 120 114 96 76 72 70 64 60 57 48 36 32 24 16
do
#convert -background none -density 1000 -resize $i -extent $i -gravity center "$1" "$tmpdir/$i.png"
# Above is the imagemagick command to render an svg to png. Unfortunately, its support for SVGs
# with CSS isn't very good (with rsvg and even moreso the built in renderer) so we use cairosvg.
# This can be installed with:
# pip install cairosvg==1.0.22 # Version 2 doesn't support python 2
# pip install tinycss
# pip install cssselect # These are necessary for CSS support
# You'll also need xmlstarlet from your favourite package manager
#
# Cairosvg doesn't suport rendering at a specific size (https://github.com/Kozea/CairoSVG/issues/83#issuecomment-215720176)
# so we have to 'resize the svg' first (add width and height attributes to the svg element) to make it render at the
# size we need.
# XXX: This will break if the svg already has width and height attributes
cp "$1" "$tmpdir/tmp.svg"
xmlstarlet ed -N x="http://www.w3.org/2000/svg" --insert "/x:svg" --type attr -n width -v $i "$tmpdir/tmp.svg" > "$tmpdir/tmp2.svg"
xmlstarlet ed -N x="http://www.w3.org/2000/svg" --insert "/x:svg" --type attr -n height -v $i "$tmpdir/tmp2.svg" > "$tmpdir/tmp3.svg"
cairosvg -f png -o "$tmpdir/$i.png" "$tmpdir/tmp3.svg"
rm "$tmpdir/tmp.svg" "$tmpdir/tmp2.svg" "$tmpdir/tmp3.svg"
done
# one more for the non-square mstile
cp "$1" "$tmpdir/tmp.svg"
xmlstarlet ed -N x="http://www.w3.org/2000/svg" --insert "/x:svg" --type attr -n width -v 310 "$tmpdir/tmp.svg" > "$tmpdir/tmp2.svg"
xmlstarlet ed -N x="http://www.w3.org/2000/svg" --insert "/x:svg" --type attr -n height -v 150 "$tmpdir/tmp2.svg" > "$tmpdir/tmp3.svg"
cairosvg -f png -o "$tmpdir/310x150.png" "$tmpdir/tmp3.svg"
rm "$tmpdir/tmp.svg" "$tmpdir/tmp2.svg" "$tmpdir/tmp3.svg"
mkdir "$tmpdir/Riot.iconset"
cp "$tmpdir/16.png" "$tmpdir/Riot.iconset/icon_16x16.png"
cp "$tmpdir/32.png" "$tmpdir/Riot.iconset/icon_16x16@2x.png"
cp "$tmpdir/32.png" "$tmpdir/Riot.iconset/icon_32x32.png"
cp "$tmpdir/64.png" "$tmpdir/Riot.iconset/icon_32x32@2x.png"
cp "$tmpdir/128.png" "$tmpdir/Riot.iconset/icon_128x128.png"
cp "$tmpdir/256.png" "$tmpdir/Riot.iconset/icon_128x128@2x.png"
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/build/icon.icns "$tmpdir/Riot.iconset"
cp "$tmpdir/36.png" "res/vector-icons/android-chrome-36x36.png"
cp "$tmpdir/48.png" "res/vector-icons/android-chrome-48x48.png"
cp "$tmpdir/72.png" "res/vector-icons/android-chrome-72x72.png"
cp "$tmpdir/96.png" "res/vector-icons/android-chrome-96x96.png"
cp "$tmpdir/144.png" "res/vector-icons/android-chrome-144x144.png"
cp "$tmpdir/192.png" "res/vector-icons/android-chrome-192x192.png"
cp "$tmpdir/180.png" "res/vector-icons/apple-touch-icon.png"
cp "$tmpdir/180.png" "res/vector-icons/apple-touch-icon-precomposed.png"
cp "$tmpdir/57.png" "res/vector-icons/apple-touch-icon-57x57.png"
cp "$tmpdir/60.png" "res/vector-icons/apple-touch-icon-60x60.png"
cp "$tmpdir/72.png" "res/vector-icons/apple-touch-icon-72x72.png"
cp "$tmpdir/76.png" "res/vector-icons/apple-touch-icon-76x76.png"
cp "$tmpdir/114.png" "res/vector-icons/apple-touch-icon-114x114.png"
cp "$tmpdir/120.png" "res/vector-icons/apple-touch-icon-120x120.png"
cp "$tmpdir/144.png" "res/vector-icons/apple-touch-icon-144x144.png"
cp "$tmpdir/152.png" "res/vector-icons/apple-touch-icon-152x152.png"
cp "$tmpdir/180.png" "res/vector-icons/apple-touch-icon-180x180.png"
cp "$tmpdir/16.png" "res/vector-icons/favicon-16x16.png"
cp "$tmpdir/32.png" "res/vector-icons/favicon-32x32.png"
cp "$tmpdir/96.png" "res/vector-icons/favicon-96x96.png"
cp "$tmpdir/70.png" "res/vector-icons/mstile-70x70.png"
cp "$tmpdir/144.png" "res/vector-icons/mstile-144x144.png"
cp "$tmpdir/150.png" "res/vector-icons/mstile-150x150.png"
cp "$tmpdir/310.png" "res/vector-icons/mstile-310x310.png"
cp "$tmpdir/310x150.png" "res/vector-icons/mstile-310x150.png"
convert "$tmpdir/16.png" "$tmpdir/32.png" "$tmpdir/64.png" "$tmpdir/128.png" "$tmpdir/256.png" "res/vector-icons/favicon.ico"
cp "res/vector-icons/favicon.ico" "electron/build/icon.ico"
# https://github.com/electron-userland/electron-builder/blob/3f97b86993d4ea5172e562b182230a194de0f621/src/targets/LinuxTargetHelper.ts#L127
for i in 24 96 16 48 64 128 256 512
do
cp "$tmpdir/$i.png" "electron/build/icons/${i}x${i}.png"
done
rm -r "$tmpdir"

View File

@@ -2,14 +2,29 @@
set -e
version=`git describe --dirty --tags || echo unknown`
dev=""
if [ "$1" = '-d' ]; then
dev=":dev"
fi
npm run build
mkdir -p packages
cp -r vector vector-$version
if [ -n "$DIST_VERSION" ]; then
version=$DIST_VERSION
else
version=`git describe --dirty --tags || echo unknown`
fi
npm run clean
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.
cp config.sample.json webapp/
mkdir -p dist
cp -r webapp vector-$version
echo $version > vector-$version/version
tar chvzf packages/vector-$version.tar.gz vector-$version
tar chvzf dist/vector-$version.tar.gz vector-$version
rm -r vector-$version
echo
echo "Packaged packages/vector-$version.tar.gz"
echo "Packaged dist/vector-$version.tar.gz"

146
scripts/rageshake.go Normal file
View File

@@ -0,0 +1,146 @@
// Run a web server capable of dumping bug reports sent by Riot.
// Requires Go 1.5+
// Usage: BUGS_USER=user BUGS_PASS=password go run rageshake.go PORT
// Example: BUGS_USER=alice BUGS_PASS=secret go run rageshake.go 8080
package main
import (
"bytes"
"compress/gzip"
"crypto/subtle"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"path/filepath"
"strconv"
"time"
)
var maxPayloadSize = 1024 * 1024 * 55 // 55 MB
type LogEntry struct {
ID string `json:"id"`
Lines string `json:"lines"`
}
type Payload struct {
Text string `json:"text"`
Version string `json:"version"`
UserAgent string `json:"user_agent"`
Logs []LogEntry `json:"logs"`
}
func respond(code int, w http.ResponseWriter) {
w.WriteHeader(code)
w.Write([]byte("{}"))
}
func gzipAndSave(data []byte, dirname, fpath string) error {
_ = os.MkdirAll(filepath.Join("bugs", dirname), os.ModePerm)
fpath = filepath.Join("bugs", dirname, fpath)
if _, err := os.Stat(fpath); err == nil {
return fmt.Errorf("file already exists") // the user can just retry
}
var b bytes.Buffer
gz := gzip.NewWriter(&b)
if _, err := gz.Write(data); err != nil {
return err
}
if err := gz.Flush(); err != nil {
return err
}
if err := gz.Close(); err != nil {
return err
}
if err := ioutil.WriteFile(fpath, b.Bytes(), 0644); err != nil {
return err
}
return nil
}
func basicAuth(handler http.Handler, username, password, realm string) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
user, pass, ok := r.BasicAuth() // pull creds from the request
// check user and pass securely
if !ok || subtle.ConstantTimeCompare([]byte(user), []byte(username)) != 1 || subtle.ConstantTimeCompare([]byte(pass), []byte(password)) != 1 {
w.Header().Set("WWW-Authenticate", `Basic realm="`+realm+`"`)
w.WriteHeader(401)
w.Write([]byte("Unauthorised.\n"))
return
}
handler.ServeHTTP(w, r)
})
}
func main() {
http.HandleFunc("/api/submit", func(w http.ResponseWriter, req *http.Request) {
if req.Method != "POST" && req.Method != "OPTIONS" {
respond(405, w)
return
}
// Set CORS
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS")
w.Header().Set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
if req.Method == "OPTIONS" {
respond(200, w)
return
}
if length, err := strconv.Atoi(req.Header.Get("Content-Length")); err != nil || length > maxPayloadSize {
respond(413, w)
return
}
var p Payload
if err := json.NewDecoder(req.Body).Decode(&p); err != nil {
respond(400, w)
return
}
// Dump bug report to disk as form:
// "bugreport-20170115-112233.log.gz" => user text, version, user agent, # logs
// "bugreport-20170115-112233-0.log.gz" => most recent log
// "bugreport-20170115-112233-1.log.gz" => ...
// "bugreport-20170115-112233-N.log.gz" => oldest log
t := time.Now().UTC()
prefix := t.Format("2006-01-02/150405")
summary := fmt.Sprintf(
"%s\n\nNumber of logs: %d\nVersion: %s\nUser-Agent: %s\n", p.Text, len(p.Logs), p.Version, p.UserAgent,
)
if err := gzipAndSave([]byte(summary), prefix, "details.log.gz"); err != nil {
respond(500, w)
return
}
for i, log := range p.Logs {
if err := gzipAndSave([]byte(log.Lines), prefix, fmt.Sprintf("logs-%d.log.gz", i)); err != nil {
respond(500, w)
return // TODO: Rollback?
}
}
respond(200, w)
})
// Make sure bugs directory exists
_ = os.Mkdir("bugs", os.ModePerm)
// serve files under "bugs"
fs := http.FileServer(http.Dir("bugs"))
fs = http.StripPrefix("/api/listing/", fs)
// set auth if env vars exist
usr := os.Getenv("BUGS_USER")
pass := os.Getenv("BUGS_PASS")
if usr == "" || pass == "" {
fmt.Println("BUGS_USER and BUGS_PASS env vars not found. No authentication is running for /api/listing")
} else {
fs = basicAuth(fs, usr, pass, "Riot bug reports")
}
http.Handle("/api/listing/", fs)
port := os.Args[1]
log.Fatal(http.ListenAndServe(":"+port, nil))
}

View File

@@ -1,26 +1,30 @@
#!/usr/bin/env python
#
# auto-deploy script for https://riot.im/develop
#
# Listens for HTTP hits. When it gets one, downloads the artifact from jenkins
# and deploys it as the new version.
#
# Requires the following python packages:
#
# - requests
# - flask
#
from __future__ import print_function
import json, requests, tarfile, argparse, os, errno
import time
from urlparse import urljoin
from flask import Flask, jsonify, request, abort
from deploy import Deployer, DeployException
app = Flask(__name__)
arg_jenkins_url, arg_extract_path, arg_should_clean, arg_symlink, arg_config_location = (
None, None, None, None, None
)
def download_file(url):
local_filename = url.split('/')[-1]
r = requests.get(url, stream=True)
with open(local_filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
return local_filename
def untar_to(tarball, dest):
with tarfile.open(tarball) as tar:
tar.extractall(dest)
arg_jenkins_url = None
deployer = None
arg_extract_path = None
arg_symlink = None
def create_symlink(source, linkname):
try:
@@ -57,6 +61,9 @@ def on_receive_jenkins_poke():
abort(400, "Missing or bad build number")
return
return fetch_jenkins_build(job_name, build_num)
def fetch_jenkins_build(job_name, build_num):
artifact_url = urljoin(
arg_jenkins_url, "job/%s/%s/api/json" % (job_name, build_num)
)
@@ -106,31 +113,45 @@ def on_receive_jenkins_poke():
arg_jenkins_url, "job/%s/%s/artifact/%s" % (job_name, build_num, tar_gz_path)
)
print("Retrieving .tar.gz file: %s" % tar_gz_url)
filename = download_file(tar_gz_url)
print("Downloaded file: %s" % filename)
name_str = filename.replace(".tar.gz", "")
untar_location = os.path.join(arg_extract_path, name_str)
untar_to(filename, untar_location)
# we extract into a directory based on the build number. This avoids the
# problem of multiple builds building the same git version and thus having
# the same tarball name. That would lead to two potential problems:
# (a) sometimes jenkins serves corrupted artifacts; we would replace
# a good deploy with a bad one
# (b) we'll be overwriting the live deployment, which means people might
# see half-written files.
build_dir = os.path.join(arg_extract_path, "%s-#%s" % (job_name, build_num))
try:
extracted_dir = deploy_tarball(tar_gz_url, build_dir)
except DeployException as e:
abort(400, e.message)
if arg_should_clean:
os.remove(filename)
# stamp the version somewhere JS can get to it
with open(os.path.join(untar_location, "vector/version"), "w") as stamp_file:
stamp_file.write(name_str)
create_symlink(source=os.path.join(untar_location, "vector"), linkname=arg_symlink)
if arg_config_location:
create_symlink(source=arg_config_location, linkname=os.path.join(untar_location, "vector", 'config.json'))
create_symlink(source=extracted_dir, linkname=arg_symlink)
return jsonify({})
def deploy_tarball(tar_gz_url, build_dir):
"""Download a tarball from jenkins and unpack it
Returns:
(str) the path to the unpacked deployment
"""
if os.path.exists(build_dir):
raise DeployException(
"Not deploying. We have previously deployed this build."
)
os.mkdir(build_dir)
# we rely on the fact that flask only serves one request at a time to
# ensure that we do not overwrite a tarball from a concurrent request.
return deployer.deploy(tar_gz_url, build_dir)
if __name__ == "__main__":
parser = argparse.ArgumentParser("Runs a Vector redeployment server.")
parser.add_argument(
"-j", "--jenkins", dest="jenkins", default="http://matrix.org/jenkins/", help=(
"-j", "--jenkins", dest="jenkins", default="https://matrix.org/jenkins/", help=(
"The base URL of the Jenkins web server. This will be hit to get the\
built artifacts (the .gz file) for redeploying."
)
@@ -145,6 +166,13 @@ if __name__ == "__main__":
"The location to extract .tar.gz files to."
)
)
parser.add_argument(
"-b", "--bundles-dir", dest="bundles_dir", help=(
"A directory to move the contents of the 'bundles' directory to. A \
symlink to the bundles directory will also be written inside the \
extracted tarball. Example: './bundles'."
)
)
parser.add_argument(
"-c", "--clean", dest="clean", action="store_true", default=False, help=(
"Remove .tar.gz files after they have been downloaded and extracted."
@@ -163,18 +191,47 @@ if __name__ == "__main__":
To this location."
)
)
parser.add_argument(
"--test", dest="tarball_uri", help=(
"Don't start an HTTP listener. Instead download a build from Jenkins \
immediately."
),
)
args = parser.parse_args()
if args.jenkins.endswith("/"): # important for urljoin
arg_jenkins_url = args.jenkins
else:
arg_jenkins_url = args.jenkins + "/"
arg_extract_path = args.extract
arg_should_clean = args.clean
arg_symlink = args.symlink
arg_config_location = args.config
print(
"Listening on port %s. Extracting to %s%s. Symlinking to %s. Jenkins URL: %s. Config location: %s" %
(args.port, arg_extract_path,
" (clean after)" if arg_should_clean else "", arg_symlink, arg_jenkins_url, arg_config_location)
)
app.run(host="0.0.0.0", port=args.port, debug=True)
if not os.path.isdir(arg_extract_path):
os.mkdir(arg_extract_path)
deployer = Deployer()
deployer.bundles_path = args.bundles_dir
deployer.should_clean = args.clean
deployer.config_location = args.config
# we don't pgp-sign jenkins artifacts; instead we rely on HTTPS access to
# the jenkins server (and the jenkins server not being compromised and/or
# github not serving it compromised source). If that's not good enough for
# you, don't use riot.im/develop.
deployer.verify_signature = False
if args.tarball_uri is not None:
build_dir = os.path.join(arg_extract_path, "test-%i" % (time.time()))
deploy_tarball(args.tarball_uri, build_dir)
else:
print(
"Listening on port %s. Extracting to %s%s. Symlinking to %s. Jenkins URL: %s. Config location: %s" %
(args.port,
arg_extract_path,
" (clean after)" if deployer.should_clean else "",
arg_symlink,
arg_jenkins_url,
deployer.config_location,
)
)
app.run(host="0.0.0.0", port=args.port, debug=True)

View File

@@ -26,32 +26,65 @@ limitations under the License.
module.exports.components = require('matrix-react-sdk/lib/component-index').components;
module.exports.components['structures.BottomLeftMenu'] = require('./components/structures/BottomLeftMenu');
module.exports.components['structures.CompatibilityPage'] = require('./components/structures/CompatibilityPage');
module.exports.components['structures.LeftPanel'] = require('./components/structures/LeftPanel');
module.exports.components['structures.RightPanel'] = require('./components/structures/RightPanel');
module.exports.components['structures.RoomDirectory'] = require('./components/structures/RoomDirectory');
module.exports.components['structures.RoomSubList'] = require('./components/structures/RoomSubList');
module.exports.components['structures.SearchBox'] = require('./components/structures/SearchBox');
module.exports.components['structures.ViewSource'] = require('./components/structures/ViewSource');
module.exports.components['views.context_menus.MessageContextMenu'] = require('./components/views/context_menus/MessageContextMenu');
module.exports.components['views.context_menus.NotificationStateContextMenu'] = require('./components/views/context_menus/NotificationStateContextMenu');
module.exports.components['views.context_menus.RoomTagContextMenu'] = require('./components/views/context_menus/RoomTagContextMenu');
module.exports.components['views.dialogs.ChangelogDialog'] = require('./components/views/dialogs/ChangelogDialog');
module.exports.components['views.directory.NetworkDropdown'] = require('./components/views/directory/NetworkDropdown');
module.exports.components['views.elements.ImageView'] = require('./components/views/elements/ImageView');
module.exports.components['views.elements.Spinner'] = require('./components/views/elements/Spinner');
module.exports.components['views.globals.GuestWarningBar'] = require('./components/views/globals/GuestWarningBar');
module.exports.components['views.globals.MatrixToolbar'] = require('./components/views/globals/MatrixToolbar');
module.exports.components['views.globals.NewVersionBar'] = require('./components/views/globals/NewVersionBar');
module.exports.components['views.login.VectorCustomServerDialog'] = require('./components/views/login/VectorCustomServerDialog');
module.exports.components['views.login.VectorLoginFooter'] = require('./components/views/login/VectorLoginFooter');
module.exports.components['views.login.VectorLoginHeader'] = require('./components/views/login/VectorLoginHeader');
module.exports.components['views.messages.DateSeparator'] = require('./components/views/messages/DateSeparator');
module.exports.components['views.messages.MessageTimestamp'] = require('./components/views/messages/MessageTimestamp');
module.exports.components['views.rooms.DNDRoomTile'] = require('./components/views/rooms/DNDRoomTile');
module.exports.components['views.rooms.RoomDropTarget'] = require('./components/views/rooms/RoomDropTarget');
module.exports.components['views.rooms.RoomTooltip'] = require('./components/views/rooms/RoomTooltip');
module.exports.components['views.rooms.SearchBar'] = require('./components/views/rooms/SearchBar');
module.exports.components['views.settings.IntegrationsManager'] = require('./components/views/settings/IntegrationsManager');
module.exports.components['views.settings.Notifications'] = require('./components/views/settings/Notifications');
import structures$BottomLeftMenu from './components/structures/BottomLeftMenu';
structures$BottomLeftMenu && (module.exports.components['structures.BottomLeftMenu'] = structures$BottomLeftMenu);
import structures$CompatibilityPage from './components/structures/CompatibilityPage';
structures$CompatibilityPage && (module.exports.components['structures.CompatibilityPage'] = structures$CompatibilityPage);
import structures$LeftPanel from './components/structures/LeftPanel';
structures$LeftPanel && (module.exports.components['structures.LeftPanel'] = structures$LeftPanel);
import structures$RightPanel from './components/structures/RightPanel';
structures$RightPanel && (module.exports.components['structures.RightPanel'] = structures$RightPanel);
import structures$HomePage from './components/structures/HomePage';
structures$HomePage && (module.exports.components['structures.HomePage'] = structures$HomePage);
import structures$RoomDirectory from './components/structures/RoomDirectory';
structures$RoomDirectory && (module.exports.components['structures.RoomDirectory'] = structures$RoomDirectory);
import structures$RoomSubList from './components/structures/RoomSubList';
structures$RoomSubList && (module.exports.components['structures.RoomSubList'] = structures$RoomSubList);
import structures$SearchBox from './components/structures/SearchBox';
structures$SearchBox && (module.exports.components['structures.SearchBox'] = structures$SearchBox);
import structures$ViewSource from './components/structures/ViewSource';
structures$ViewSource && (module.exports.components['structures.ViewSource'] = structures$ViewSource);
import views$context_menus$MessageContextMenu from './components/views/context_menus/MessageContextMenu';
views$context_menus$MessageContextMenu && (module.exports.components['views.context_menus.MessageContextMenu'] = views$context_menus$MessageContextMenu);
import views$context_menus$NotificationStateContextMenu from './components/views/context_menus/NotificationStateContextMenu';
views$context_menus$NotificationStateContextMenu && (module.exports.components['views.context_menus.NotificationStateContextMenu'] = views$context_menus$NotificationStateContextMenu);
import views$context_menus$RoomTagContextMenu from './components/views/context_menus/RoomTagContextMenu';
views$context_menus$RoomTagContextMenu && (module.exports.components['views.context_menus.RoomTagContextMenu'] = views$context_menus$RoomTagContextMenu);
import views$dialogs$BugReportDialog from './components/views/dialogs/BugReportDialog';
views$dialogs$BugReportDialog && (module.exports.components['views.dialogs.BugReportDialog'] = views$dialogs$BugReportDialog);
import views$dialogs$ChangelogDialog from './components/views/dialogs/ChangelogDialog';
views$dialogs$ChangelogDialog && (module.exports.components['views.dialogs.ChangelogDialog'] = views$dialogs$ChangelogDialog);
import views$directory$NetworkDropdown from './components/views/directory/NetworkDropdown';
views$directory$NetworkDropdown && (module.exports.components['views.directory.NetworkDropdown'] = views$directory$NetworkDropdown);
import views$elements$ImageView from './components/views/elements/ImageView';
views$elements$ImageView && (module.exports.components['views.elements.ImageView'] = views$elements$ImageView);
import views$elements$Spinner from './components/views/elements/Spinner';
views$elements$Spinner && (module.exports.components['views.elements.Spinner'] = views$elements$Spinner);
import views$globals$GuestWarningBar from './components/views/globals/GuestWarningBar';
views$globals$GuestWarningBar && (module.exports.components['views.globals.GuestWarningBar'] = views$globals$GuestWarningBar);
import views$globals$MatrixToolbar from './components/views/globals/MatrixToolbar';
views$globals$MatrixToolbar && (module.exports.components['views.globals.MatrixToolbar'] = views$globals$MatrixToolbar);
import views$globals$NewVersionBar from './components/views/globals/NewVersionBar';
views$globals$NewVersionBar && (module.exports.components['views.globals.NewVersionBar'] = views$globals$NewVersionBar);
import views$login$VectorCustomServerDialog from './components/views/login/VectorCustomServerDialog';
views$login$VectorCustomServerDialog && (module.exports.components['views.login.VectorCustomServerDialog'] = views$login$VectorCustomServerDialog);
import views$login$VectorLoginFooter from './components/views/login/VectorLoginFooter';
views$login$VectorLoginFooter && (module.exports.components['views.login.VectorLoginFooter'] = views$login$VectorLoginFooter);
import views$login$VectorLoginHeader from './components/views/login/VectorLoginHeader';
views$login$VectorLoginHeader && (module.exports.components['views.login.VectorLoginHeader'] = views$login$VectorLoginHeader);
import views$messages$DateSeparator from './components/views/messages/DateSeparator';
views$messages$DateSeparator && (module.exports.components['views.messages.DateSeparator'] = views$messages$DateSeparator);
import views$messages$MessageTimestamp from './components/views/messages/MessageTimestamp';
views$messages$MessageTimestamp && (module.exports.components['views.messages.MessageTimestamp'] = views$messages$MessageTimestamp);
import views$rooms$DNDRoomTile from './components/views/rooms/DNDRoomTile';
views$rooms$DNDRoomTile && (module.exports.components['views.rooms.DNDRoomTile'] = views$rooms$DNDRoomTile);
import views$rooms$RoomDropTarget from './components/views/rooms/RoomDropTarget';
views$rooms$RoomDropTarget && (module.exports.components['views.rooms.RoomDropTarget'] = views$rooms$RoomDropTarget);
import views$rooms$RoomTooltip from './components/views/rooms/RoomTooltip';
views$rooms$RoomTooltip && (module.exports.components['views.rooms.RoomTooltip'] = views$rooms$RoomTooltip);
import views$rooms$SearchBar from './components/views/rooms/SearchBar';
views$rooms$SearchBar && (module.exports.components['views.rooms.SearchBar'] = views$rooms$SearchBar);
import views$settings$IntegrationsManager from './components/views/settings/IntegrationsManager';
views$settings$IntegrationsManager && (module.exports.components['views.settings.IntegrationsManager'] = views$settings$IntegrationsManager);
import views$settings$Notifications from './components/views/settings/Notifications';
views$settings$Notifications && (module.exports.components['views.settings.Notifications'] = views$settings$Notifications);

View File

@@ -20,18 +20,21 @@ var React = require('react');
var ReactDOM = require('react-dom');
var sdk = require('matrix-react-sdk')
var dis = require('matrix-react-sdk/lib/dispatcher');
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
module.exports = React.createClass({
displayName: 'BottomLeftMenu',
propTypes: {
collapsed: React.PropTypes.bool.isRequired,
teamToken: React.PropTypes.string,
},
getInitialState: function() {
return({
directoryHover : false,
roomsHover : false,
homeHover: false,
peopleHover : false,
settingsHover : false,
});
@@ -62,6 +65,19 @@ module.exports = React.createClass({
this.setState({ roomsHover: false });
},
// Home button events
onHomeClick: function() {
dis.dispatch({ action: 'view_home_page' });
},
onHomeMouseEnter: function() {
this.setState({ homeHover: true });
},
onHomeMouseLeave: function() {
this.setState({ homeHover: false });
},
// People events
onPeopleClick: function() {
dis.dispatch({ action: 'view_create_chat' });
@@ -98,25 +114,37 @@ module.exports = React.createClass({
render: function() {
var TintableSvg = sdk.getComponent('elements.TintableSvg');
var homeButton;
if (this.props.teamToken) {
homeButton = (
<AccessibleButton className="mx_BottomLeftMenu_homePage" onClick={ this.onHomeClick } onMouseEnter={ this.onHomeMouseEnter } onMouseLeave={ this.onHomeMouseLeave } >
<TintableSvg src="img/icons-home.svg" width="25" height="25" />
{ this.getLabel("Welcome page", this.state.homeHover) }
</AccessibleButton>
);
}
return (
<div className="mx_BottomLeftMenu">
<div className="mx_BottomLeftMenu_options">
<div className="mx_BottomLeftMenu_people" onClick={ this.onPeopleClick } onMouseEnter={ this.onPeopleMouseEnter } onMouseLeave={ this.onPeopleMouseLeave } >
{ homeButton }
<AccessibleButton className="mx_BottomLeftMenu_people" onClick={ this.onPeopleClick } onMouseEnter={ this.onPeopleMouseEnter } onMouseLeave={ this.onPeopleMouseLeave } >
<TintableSvg src="img/icons-people.svg" width="25" height="25" />
{ this.getLabel("Start chat", this.state.peopleHover) }
</div>
<div className="mx_BottomLeftMenu_directory" onClick={ this.onDirectoryClick } onMouseEnter={ this.onDirectoryMouseEnter } onMouseLeave={ this.onDirectoryMouseLeave } >
</AccessibleButton>
<AccessibleButton className="mx_BottomLeftMenu_directory" onClick={ this.onDirectoryClick } onMouseEnter={ this.onDirectoryMouseEnter } onMouseLeave={ this.onDirectoryMouseLeave } >
<TintableSvg src="img/icons-directory.svg" width="25" height="25"/>
{ this.getLabel("Room directory", this.state.directoryHover) }
</div>
<div className="mx_BottomLeftMenu_createRoom" onClick={ this.onRoomsClick } onMouseEnter={ this.onRoomsMouseEnter } onMouseLeave={ this.onRoomsMouseLeave } >
</AccessibleButton>
<AccessibleButton className="mx_BottomLeftMenu_createRoom" onClick={ this.onRoomsClick } onMouseEnter={ this.onRoomsMouseEnter } onMouseLeave={ this.onRoomsMouseLeave } >
<TintableSvg src="img/icons-create-room.svg" width="25" height="25" />
{ this.getLabel("Create new room", this.state.roomsHover) }
</div>
<div className="mx_BottomLeftMenu_settings" onClick={ this.onSettingsClick } onMouseEnter={ this.onSettingsMouseEnter } onMouseLeave={ this.onSettingsMouseLeave } >
</AccessibleButton>
<AccessibleButton className="mx_BottomLeftMenu_settings" onClick={ this.onSettingsClick } onMouseEnter={ this.onSettingsMouseEnter } onMouseLeave={ this.onSettingsMouseLeave } >
<TintableSvg src="img/icons-settings.svg" width="25" height="25" />
{ this.getLabel("Settings", this.state.settingsHover) }
</div>
</AccessibleButton>
</div>
</div>
);

View File

@@ -45,10 +45,8 @@ module.exports = React.createClass({
available or experimental in your current browser.
</p>
<p>
Please install <a href="https://www.google.com/chrome">Chrome</a> or
<a href="https://getfirefox.com">Firefox</a> for the best experience.
<a href="http://apple.com/safari">Safari</a> and
<a href="http://opera.com">Opera</a> work too.
Please install <a href="https://www.google.com/chrome">Chrome</a> or <a href="https://getfirefox.com">Firefox</a> for
the best experience. <a href="http://apple.com/safari">Safari</a> and <a href="http://opera.com">Opera</a> work too.
</p>
<p>
With your current browser, the look and feel of the application may

View File

@@ -0,0 +1,40 @@
/*
Copyright 2016 OpenMarket Ltd
Copyright 2017 Vector Creations Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
'use strict';
import React from 'react';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import sdk from 'matrix-react-sdk';
module.exports = React.createClass({
displayName: 'HomePage',
propTypes: {
teamServerUrl: React.PropTypes.string.isRequired,
teamToken: React.PropTypes.string.isRequired,
collapsedRhs: React.PropTypes.bool,
},
render: function() {
return (
<div className="mx_HomePage">
<iframe src={`${this.props.teamServerUrl}/static/${this.props.teamToken}/home.html`}/>
</div>
);
}
});

View File

@@ -28,6 +28,11 @@ var CallHandler = require("matrix-react-sdk/lib/CallHandler");
var LeftPanel = React.createClass({
displayName: 'LeftPanel',
propTypes: {
collapsed: React.PropTypes.bool.isRequired,
teamToken: React.PropTypes.string,
},
getInitialState: function() {
return {
showCallElement: null,
@@ -124,7 +129,7 @@ var LeftPanel = React.createClass({
collapsed={this.props.collapsed}
searchFilter={this.state.searchFilter}
ConferenceHandler={VectorConferenceHandler} />
<BottomLeftMenu collapsed={this.props.collapsed}/>
<BottomLeftMenu collapsed={this.props.collapsed} teamToken={this.props.teamToken}/>
</aside>
);
}

View File

@@ -23,6 +23,7 @@ var dis = require('matrix-react-sdk/lib/dispatcher');
var MatrixClientPeg = require("matrix-react-sdk/lib/MatrixClientPeg");
var rate_limited_func = require('matrix-react-sdk/lib/ratelimitedfunc');
var Modal = require('matrix-react-sdk/lib/Modal');
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
module.exports = React.createClass({
displayName: 'RightPanel',
@@ -69,45 +70,21 @@ module.exports = React.createClass({
},
onMemberListButtonClick: function() {
if (this.props.collapsed || this.state.phase !== this.Phase.MemberList) {
this.setState({ phase: this.Phase.MemberList });
dis.dispatch({
action: 'show_right_panel',
});
}
else {
dis.dispatch({
action: 'hide_right_panel',
});
}
this.setState({ phase: this.Phase.MemberList });
},
onFileListButtonClick: function() {
if (this.props.collapsed || this.state.phase !== this.Phase.FilePanel) {
this.setState({ phase: this.Phase.FilePanel });
dis.dispatch({
action: 'show_right_panel',
});
}
else {
dis.dispatch({
action: 'hide_right_panel',
});
}
this.setState({ phase: this.Phase.FilePanel });
},
onNotificationListButtonClick: function() {
if (this.props.collapsed || this.state.phase !== this.Phase.NotificationPanel) {
this.setState({ phase: this.Phase.NotificationPanel });
dis.dispatch({
action: 'show_right_panel',
});
}
else {
dis.dispatch({
action: 'hide_right_panel',
});
}
this.setState({ phase: this.Phase.NotificationPanel });
},
onCollapseClick: function() {
dis.dispatch({
action: 'hide_right_panel',
});
},
onInviteButtonClick: function() {
@@ -207,12 +184,12 @@ module.exports = React.createClass({
if (user_is_in_room) {
inviteGroup =
<div className="mx_RightPanel_invite" onClick={ this.onInviteButtonClick } >
<AccessibleButton className="mx_RightPanel_invite" onClick={ this.onInviteButtonClick } >
<div className="mx_RightPanel_icon" >
<TintableSvg src="img/icon-invite-people.svg" width="35" height="35" />
</div>
<div className="mx_RightPanel_message">Invite to this room</div>
</div>;
</AccessibleButton>;
}
}
@@ -220,20 +197,28 @@ module.exports = React.createClass({
if (this.props.roomId) {
buttonGroup =
<div className="mx_RightPanel_headerButtonGroup">
<div className="mx_RightPanel_headerButton" title="Members" onClick={ this.onMemberListButtonClick }>
<AccessibleButton className="mx_RightPanel_headerButton"
title="Members" onClick={ this.onMemberListButtonClick }>
<div className="mx_RightPanel_headerButton_badge">{ membersBadge ? membersBadge : <span>&nbsp;</span>}</div>
<TintableSvg src="img/icons-people.svg" width="25" height="25"/>
{ membersHighlight }
</div>
<div className="mx_RightPanel_headerButton mx_RightPanel_filebutton" title="Files" onClick={ this.onFileListButtonClick }>
</AccessibleButton>
<AccessibleButton
className="mx_RightPanel_headerButton mx_RightPanel_filebutton"
title="Files" onClick={ this.onFileListButtonClick }>
<div className="mx_RightPanel_headerButton_badge">&nbsp;</div>
<TintableSvg src="img/icons-files.svg" width="25" height="25"/>
{ filesHighlight }
</div>
<div className="mx_RightPanel_headerButton mx_RightPanel_notificationbutton" title="Notifications" onClick={ this.onNotificationListButtonClick }>
</AccessibleButton>
<AccessibleButton
className="mx_RightPanel_headerButton mx_RightPanel_notificationbutton"
title="Notifications" onClick={ this.onNotificationListButtonClick }>
<div className="mx_RightPanel_headerButton_badge">&nbsp;</div>
<TintableSvg src="img/icons-notifications.svg" width="25" height="25"/>
{ notificationsHighlight }
</AccessibleButton>
<div className="mx_RightPanel_headerButton mx_RightPanel_collapsebutton" title="Hide panel" onClick={ this.onCollapseClick }>
<TintableSvg src="img/minimise.svg" width="10" height="16"/>
</div>
</div>;
}
@@ -276,4 +261,3 @@ module.exports = React.createClass({
);
}
});

View File

@@ -31,6 +31,8 @@ var linkifyMatrix = require('matrix-react-sdk/lib/linkify-matrix');
var sanitizeHtml = require('sanitize-html');
var q = require('q');
import {instanceForInstanceId, protocolNameForInstanceId} from '../../utils/DirectoryUtils';
linkifyMatrix(linkify);
module.exports = React.createClass({
@@ -42,9 +44,7 @@ module.exports = React.createClass({
getDefaultProps: function() {
return {
config: {
networks: [],
},
config: {},
}
},
@@ -52,36 +52,26 @@ module.exports = React.createClass({
return {
publicRooms: [],
loading: true,
network: null,
protocolsLoading: true,
instanceId: null,
includeAll: false,
roomServer: null,
filterString: null,
}
},
componentWillMount: function() {
// precompile Regexps
this.portalRoomPatterns = {};
this.nativePatterns = {};
if (this.props.config.networks) {
for (const network of Object.keys(this.props.config.networks)) {
const network_info = this.props.config.networks[network];
if (network_info.portalRoomPattern) {
this.portalRoomPatterns[network] = new RegExp(network_info.portalRoomPattern);
}
if (network_info.nativePattern) {
this.nativePatterns[network] = new RegExp(network_info.nativePattern);
}
}
}
this.nextBatch = null;
this.filterTimeout = null;
this.scrollPanel = null;
this.protocols = null;
this.setState({protocolsLoading: true});
MatrixClientPeg.get().getThirdpartyProtocols().done((response) => {
this.protocols = response;
this.setState({protocolsLoading: false});
}, (err) => {
this.setState({protocolsLoading: false});
if (MatrixClientPeg.get().isGuest()) {
// Guests currently aren't allowed to use this API, so
// ignore this as otherwise this error is literally the
@@ -131,6 +121,11 @@ module.exports = React.createClass({
if (my_server != MatrixClientPeg.getHomeServerName()) {
opts.server = my_server;
}
if (this.state.instanceId) {
opts.third_party_instance_id = this.state.instanceId;
} else if (this.state.includeAll) {
opts.include_all_networks = true;
}
if (this.nextBatch) opts.since = this.nextBatch;
if (my_filter_string) opts.filter = { generic_search_term: my_filter_string } ;
return MatrixClientPeg.get().publicRooms(opts).then((data) => {
@@ -231,7 +226,7 @@ module.exports = React.createClass({
}
},
onOptionChange: function(server, network) {
onOptionChange: function(server, instanceId, includeAll) {
// clear next batch so we don't try to load more rooms
this.nextBatch = null;
this.setState({
@@ -240,7 +235,8 @@ module.exports = React.createClass({
// to clear the list anyway.
publicRooms: [],
roomServer: server,
network: network,
instanceId: instanceId,
includeAll: includeAll,
}, this.refreshRoomList);
// We also refresh the room list each time even though this
// filtering is client-side. It hopefully won't be client side
@@ -271,7 +267,7 @@ module.exports = React.createClass({
this.filterTimeout = setTimeout(() => {
this.filterTimeout = null;
this.refreshRoomList();
}, 300);
}, 700);
},
onFilterClear: function() {
@@ -286,14 +282,19 @@ module.exports = React.createClass({
},
onJoinClick: function(alias) {
// If we're on the 'Matrix' network (or all networks),
// just show that rooms alias
if (this.state.network == null || this.state.network == '_matrix') {
// If we don't have a particular instance id selected, just show that rooms alias
if (!this.state.instanceId) {
// If the user specified an alias without a domain, add on whichever server is selected
// in the dropdown
if (alias.indexOf(':') == -1) {
alias = alias + ':' + this.state.roomServer;
}
this.showRoomAlias(alias);
} else {
// This is a 3rd party protocol. Let's see if we
// can join it
const fields = this._getFieldsForThirdPartyLocation(alias, this.state.network);
// This is a 3rd party protocol. Let's see if we can join it
const protocolName = protocolNameForInstanceId(this.protocols, this.state.instanceId);
const instance = instanceForInstanceId(this.protocols, this.state.instanceId);
const fields = protocolName ? this._getFieldsForThirdPartyLocation(alias, this.protocols[protocolName], instance) : null;
if (!fields) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
@@ -302,8 +303,7 @@ module.exports = React.createClass({
});
return;
}
const protocol = this._protocolForThirdPartyNetwork(this.state.network);
MatrixClientPeg.get().getThirdpartyLocation(protocol, fields).done((resp) => {
MatrixClientPeg.get().getThirdpartyLocation(protocolName, fields).done((resp) => {
if (resp.length > 0 && resp[0].alias) {
this.showRoomAlias(resp[0].alias);
} else {
@@ -372,13 +372,7 @@ module.exports = React.createClass({
if (!this.state.publicRooms) return [];
var rooms = this.state.publicRooms.filter((a) => {
if (this.state.network) {
if (!this._isRoomInNetwork(a, this.state.roomServer, this.state.network)) return false;
}
return true;
});
var rooms = this.state.publicRooms;
var rows = [];
var self = this;
var guestRead, guestJoin, perms;
@@ -440,119 +434,46 @@ module.exports = React.createClass({
this.scrollPanel = element;
},
/**
* Terrible temporary function that guess what network a public room
* entry is in, until synapse is able to tell us
*/
_isRoomInNetwork: function(room, server, network) {
// We carve rooms into two categories here. 'portal' rooms are
// rooms created by a user joining a bridge 'portal' alias to
// participate in that room or a foreign network. A room is a
// portal room if it has exactly one alias and that alias matches
// a pattern defined in the config. Its network is the key
// of the pattern that it matches.
// All other rooms are considered 'native matrix' rooms, and
// go into the special '_matrix' network.
let roomNetwork = '_matrix';
if (room.aliases && room.aliases.length == 1) {
if (this.props.config.serverConfig && this.props.config.serverConfig[server] && this.props.config.serverConfig[server].networks) {
for (const n of this.props.config.serverConfig[server].networks) {
const pat = this.portalRoomPatterns[n];
if (pat && pat.test(room.aliases[0])) {
roomNetwork = n;
}
}
}
}
return roomNetwork == network;
},
_stringLooksLikeId: function(s, network) {
_stringLooksLikeId: function(s, field_type) {
let pat = /^#[^\s]+:[^\s]/;
if (
network && network != '_matrix' &&
this.nativePatterns[network]
) {
pat = this.nativePatterns[network];
if (field_type && field_type.regexp) {
pat = new RegExp(field_type.regexp);
}
return pat.test(s);
},
_protocolForThirdPartyNetwork: function(network) {
if (
this.props.config.networks &&
this.props.config.networks[network] &&
this.props.config.networks[network].protocol
) {
return this.props.config.networks[network].protocol;
}
},
_getFieldsForThirdPartyLocation: function(user_input, network) {
if (!this.props.config.networks || !this.props.config.networks[network]) return null;
const network_info = this.props.config.networks[network];
if (!network_info.protocol) return null;
if (!this.protocols) return null;
let matched_instance;
// Try to find which instance in the 'protocols' response
// matches this network. We look for a matching protocol
// and the existence of a 'domain' field and if present,
// its value.
if (
this.protocols[network_info.protocol] &&
this.protocols[network_info.protocol].instances &&
this.protocols[network_info.protocol].instances.length == 1
) {
const the_instance = this.protocols[network_info.protocol].instances[0];
// If there's only one instance in this protocol, use it
// as long as it has no domain (which we assume to mean it's
// there is only one possible instance).
if (
(
the_instance.fields.domain === undefined &&
network_info.domain === undefined
) ||
(
the_instance.fields.domain !== undefined &&
the_instance.fields.domain == network_info.domain
)
) {
matched_instance = the_instance;
}
} else if (network_info.domain) {
// otherwise, we look for one with a matching domain.
for (const this_instance of this.protocols[network_info.protocol].instances) {
if (this_instance.fields.domain == network_info.domain) {
matched_instance = this_instance;
}
}
}
if (matched_instance === undefined) return null;
// now make an object with the fields specified by that protocol. We
_getFieldsForThirdPartyLocation: function(userInput, protocol, instance) {
// make an object with the fields specified by that protocol. We
// require that the values of all but the last field come from the
// instance. The last is the user input.
const required_fields = this.protocols[network_info.protocol].location_fields;
const requiredFields = protocol.location_fields;
if (!requiredFields) return null;
const fields = {};
for (let i = 0; i < required_fields.length - 1; ++i) {
const this_field = required_fields[i];
if (matched_instance.fields[this_field] === undefined) return null;
fields[this_field] = matched_instance.fields[this_field];
for (let i = 0; i < requiredFields.length - 1; ++i) {
const thisField = requiredFields[i];
if (instance.fields[thisField] === undefined) return null;
fields[thisField] = instance.fields[thisField];
}
fields[required_fields[required_fields.length - 1]] = user_input;
fields[requiredFields[requiredFields.length - 1]] = userInput;
return fields;
},
render: function() {
const SimpleRoomHeader = sdk.getComponent('rooms.SimpleRoomHeader');
const Loader = sdk.getComponent("elements.Spinner");
if (this.state.protocolsLoading) {
return (
<div className="mx_RoomDirectory">
<SimpleRoomHeader title="Directory" />
<Loader />
</div>
);
}
let content;
if (this.state.loading) {
const Loader = sdk.getComponent("elements.Spinner");
content = <div className="mx_RoomDirectory">
<Loader />
</div>;
@@ -583,26 +504,35 @@ module.exports = React.createClass({
</ScrollPanel>;
}
let placeholder = 'Search for a room';
if (this.state.network === null || this.state.network === '_matrix') {
placeholder = '#example:' + this.state.roomServer;
} else if (
this.props.config.networks &&
this.props.config.networks[this.state.network] &&
this.props.config.networks[this.state.network].example &&
this._getFieldsForThirdPartyLocation(this.state.filterString, this.state.network)
const protocolName = protocolNameForInstanceId(this.protocols, this.state.instanceId);
let instance_expected_field_type;
if (
protocolName &&
this.protocols &&
this.protocols[protocolName] &&
this.protocols[protocolName].location_fields.length > 0 &&
this.protocols[protocolName].field_types
) {
placeholder = this.props.config.networks[this.state.network].example;
const last_field = this.protocols[protocolName].location_fields.slice(-1)[0];
instance_expected_field_type = this.protocols[protocolName].field_types[last_field];
}
let showJoinButton = this._stringLooksLikeId(this.state.filterString, this.state.network);
if (this.state.network && this.state.network != '_matrix') {
if (this._getFieldsForThirdPartyLocation(this.state.filterString, this.state.network) === null) {
let placeholder = 'Search for a room';
if (!this.state.instanceId) {
placeholder = '#example:' + this.state.roomServer;
} else if (instance_expected_field_type) {
placeholder = instance_expected_field_type.placeholder;
}
let showJoinButton = this._stringLooksLikeId(this.state.filterString, instance_expected_field_type);
if (protocolName) {
const instance = instanceForInstanceId(this.protocols, this.state.instanceId);
if (this._getFieldsForThirdPartyLocation(this.state.filterString, this.protocols[protocolName], instance) === null) {
showJoinButton = false;
}
}
const SimpleRoomHeader = sdk.getComponent('rooms.SimpleRoomHeader');
const NetworkDropdown = sdk.getComponent('directory.NetworkDropdown');
const DirectorySearchBox = sdk.getComponent('elements.DirectorySearchBox');
return (
@@ -615,7 +545,7 @@ module.exports = React.createClass({
onChange={this.onFilterChange} onClear={this.onFilterClear} onJoinClick={this.onJoinClick}
placeholder={placeholder} showJoinButton={showJoinButton}
/>
<NetworkDropdown config={this.props.config} onOptionChange={this.onOptionChange} />
<NetworkDropdown config={this.props.config} protocols={this.protocols} onOptionChange={this.onOptionChange} />
</div>
{content}
</div>

View File

@@ -26,6 +26,7 @@ var Unread = require('matrix-react-sdk/lib/Unread');
var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var RoomNotifs = require('matrix-react-sdk/lib/RoomNotifs');
var FormattingUtils = require('matrix-react-sdk/lib/utils/FormattingUtils');
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
// turn this on for drop & drag console debugging galore
var debug = false;
@@ -417,15 +418,17 @@ var RoomSubList = React.createClass({
}
}
var tabindex = this.props.searchFilter === "" ? "0" : "-1";
return (
<div className="mx_RoomSubList_labelContainer" title={ title } ref="header">
<div onClick={ this.onClick } className="mx_RoomSubList_label">
<AccessibleButton onClick={ this.onClick } className="mx_RoomSubList_label" tabIndex={tabindex}>
{ this.props.collapsed ? '' : this.props.label }
<div className="mx_RoomSubList_roomCount">{ roomCount }</div>
<div className={chevronClasses}></div>
{ badge }
{ incomingCall }
</div>
</AccessibleButton>
</div>
);
},
@@ -447,11 +450,11 @@ var RoomSubList = React.createClass({
});
return (
<div className="mx_RoomSubList_ellipsis" onClick={this._showFullMemberList}>
<AccessibleButton className="mx_RoomSubList_ellipsis" onClick={this._showFullMemberList}>
<div className="mx_RoomSubList_line"></div>
<div className="mx_RoomSubList_more">more</div>
<div className={ badgeClasses }>{ content }</div>
</div>
<div className={ badgeClasses }>{ content }</div>
</AccessibleButton>
);
},

View File

@@ -20,6 +20,7 @@ var React = require('react');
var sdk = require('matrix-react-sdk')
var dis = require('matrix-react-sdk/lib/dispatcher');
var rate_limited_func = require('matrix-react-sdk/lib/ratelimitedfunc');
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
module.exports = React.createClass({
displayName: 'SearchBox',
@@ -35,6 +36,25 @@ module.exports = React.createClass({
};
},
componentDidMount: function() {
this.dispatcherRef = dis.register(this.onAction);
},
componentWillUnmount: function() {
dis.unregister(this.dispatcherRef);
},
onAction: function(payload) {
switch (payload.action) {
// Clear up the text field when a room is selected.
case 'view_room':
if (this.refs.search) {
this._clearSearch();
}
break;
}
},
onChange: function() {
if (!this.refs.search) return;
this.setState({ searchTerm: this.refs.search.value });
@@ -61,35 +81,42 @@ module.exports = React.createClass({
}
},
_clearSearch: function() {
this.refs.search.value = "";
this.onChange();
},
render: function() {
var TintableSvg = sdk.getComponent('elements.TintableSvg');
var collapseTabIndex = this.refs.search && this.refs.search.value !== "" ? "-1" : "0";
var toggleCollapse;
if (this.props.collapsed) {
toggleCollapse =
<div className="mx_SearchBox_maximise" onClick={ this.onToggleCollapse.bind(this, true) }>
<TintableSvg src="img/maximise.svg" width="10" height="16" alt="&lt;"/>
</div>
<AccessibleButton className="mx_SearchBox_maximise" tabIndex={collapseTabIndex} onClick={ this.onToggleCollapse.bind(this, true) }>
<TintableSvg src="img/maximise.svg" width="10" height="16" alt="Expand panel"/>
</AccessibleButton>
}
else {
toggleCollapse =
<div className="mx_SearchBox_minimise" onClick={ this.onToggleCollapse.bind(this, false) }>
<TintableSvg src="img/minimise.svg" width="10" height="16" alt="&lt;"/>
</div>
<AccessibleButton className="mx_SearchBox_minimise" tabIndex={collapseTabIndex} onClick={ this.onToggleCollapse.bind(this, false) }>
<TintableSvg src="img/minimise.svg" width="10" height="16" alt="Collapse panel"/>
</AccessibleButton>
}
var searchControls;
if (!this.props.collapsed) {
searchControls = [
this.state.searchTerm.length > 0 ?
<div key="button"
className="mx_SearchBox_closeButton"
onClick={ ()=>{ this.refs.search.value = ""; this.onChange(); } }>
<AccessibleButton key="button"
className="mx_SearchBox_closeButton"
onClick={ ()=>{ this._clearSearch(); } }>
<TintableSvg
className="mx_SearchBox_searchButton"
src="img/icons-close.svg" width="24" height="24"
/>
</div>
</AccessibleButton>
:
<TintableSvg
key="button"

View File

@@ -22,7 +22,8 @@ module.exports = React.createClass({
displayName: 'ViewSource',
propTypes: {
onFinished: React.PropTypes.func.isRequired
content: React.PropTypes.object.isRequired,
onFinished: React.PropTypes.func.isRequired,
},
componentDidMount: function() {
@@ -45,10 +46,9 @@ module.exports = React.createClass({
return (
<div className="mx_ViewSource">
<pre>
{JSON.stringify(this.props.mxEvent.event, null, 2)}
{JSON.stringify(this.props.content, null, 2)}
</pre>
</div>
);
}
});

View File

@@ -47,7 +47,16 @@ module.exports = React.createClass({
onViewSourceClick: function() {
var ViewSource = sdk.getComponent('structures.ViewSource');
Modal.createDialog(ViewSource, {
mxEvent: this.props.mxEvent
content: this.props.mxEvent.event,
}, 'mx_Dialog_viewsource');
if (this.props.onFinished) this.props.onFinished();
},
onViewClearSourceClick: function() {
const ViewSource = sdk.getComponent('structures.ViewSource');
Modal.createDialog(ViewSource, {
// FIXME: _clearEvent is private
content: this.props.mxEvent._clearEvent,
}, 'mx_Dialog_viewsource');
if (this.props.onFinished) this.props.onFinished();
},
@@ -74,7 +83,7 @@ module.exports = React.createClass({
if (this.props.onFinished) this.props.onFinished();
},
onPermalinkClick: function() {
closeMenu: function() {
if (this.props.onFinished) this.props.onFinished();
},
@@ -97,10 +106,12 @@ module.exports = React.createClass({
var eventStatus = this.props.mxEvent.status;
var resendButton;
var viewSourceButton;
var viewClearSourceButton;
var redactButton;
var cancelButton;
var permalinkButton;
var unhidePreviewButton;
var externalURLButton;
if (eventStatus === 'not_sent') {
resendButton = (
@@ -132,6 +143,14 @@ module.exports = React.createClass({
</div>
);
if (this.props.mxEvent.getType() !== this.props.mxEvent.getWireType()) {
viewClearSourceButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onViewClearSourceClick}>
View Decrypted Source
</div>
);
}
if (this.props.eventTileOps) {
if (this.props.eventTileOps.isWidgetHidden()) {
unhidePreviewButton = (
@@ -146,7 +165,7 @@ module.exports = React.createClass({
permalinkButton = (
<div className="mx_MessageContextMenu_field">
<a href={ "https://matrix.to/#/" + this.props.mxEvent.getRoomId() +"/"+ this.props.mxEvent.getId() }
target="_blank" onClick={ this.onPermalinkClick }>Permalink</a>
target="_blank" rel="noopener" onClick={ this.closeMenu }>Permalink</a>
</div>
);
@@ -156,15 +175,28 @@ module.exports = React.createClass({
</div>
);
// Bridges can provide a 'external_url' to link back to the source.
if( typeof(this.props.mxEvent.event.content.external_url) === "string") {
externalURLButton = (
<div className="mx_MessageContextMenu_field">
<a href={ this.props.mxEvent.event.content.external_url }
rel="noopener" target="_blank" onClick={ this.closeMenu }>Source URL</a>
</div>
);
}
return (
<div>
{resendButton}
{redactButton}
{cancelButton}
{viewSourceButton}
{viewClearSourceButton}
{unhidePreviewButton}
{permalinkButton}
{UserSettingsStore.isFeatureEnabled('rich_text_editor') ? quoteButton : null}
{externalURLButton}
</div>
);
}

View File

@@ -120,22 +120,22 @@ module.exports = React.createClass({
</div>
<div className={ alertMeClasses } onClick={this._onClickAlertMe} >
<img className="mx_NotificationStateContextMenu_activeIcon" src="img/notif-active.svg" width="12" height="12" />
<img className="mx_NotificationStateContextMenu_icon" src="img/icon-context-mute-off-copy.svg" width="16" height="12" />
<img className="mx_NotificationStateContextMenu_icon mx_filterFlipColor" src="img/icon-context-mute-off-copy.svg" width="16" height="12" />
All messages (loud)
</div>
<div className={ allNotifsClasses } onClick={this._onClickAllNotifs} >
<img className="mx_NotificationStateContextMenu_activeIcon" src="img/notif-active.svg" width="12" height="12" />
<img className="mx_NotificationStateContextMenu_icon" src="img/icon-context-mute-off.svg" width="16" height="12" />
<img className="mx_NotificationStateContextMenu_icon mx_filterFlipColor" src="img/icon-context-mute-off.svg" width="16" height="12" />
All messages
</div>
<div className={ mentionsClasses } onClick={this._onClickMentions} >
<img className="mx_NotificationStateContextMenu_activeIcon" src="img/notif-active.svg" width="12" height="12" />
<img className="mx_NotificationStateContextMenu_icon" src="img/icon-context-mute-mentions.svg" width="16" height="12" />
<img className="mx_NotificationStateContextMenu_icon mx_filterFlipColor" src="img/icon-context-mute-mentions.svg" width="16" height="12" />
Mentions only
</div>
<div className={ muteNotifsClasses } onClick={this._onClickMute} >
<img className="mx_NotificationStateContextMenu_activeIcon" src="img/notif-active.svg" width="12" height="12" />
<img className="mx_NotificationStateContextMenu_icon" src="img/icon-context-mute.svg" width="16" height="12" />
<img className="mx_NotificationStateContextMenu_icon mx_filterFlipColor" src="img/icon-context-mute.svg" width="16" height="12" />
Mute
</div>
</div>

View File

@@ -16,13 +16,15 @@ limitations under the License.
'use strict';
var q = require("q");
var React = require('react');
var classNames = require('classnames');
var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var dis = require('matrix-react-sdk/lib/dispatcher');
var DMRoomMap = require('matrix-react-sdk/lib/utils/DMRoomMap');
var Rooms = require('matrix-react-sdk/lib/Rooms');
import q from 'q';
import React from 'react';
import classNames from 'classnames';
import sdk from 'matrix-react-sdk';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import dis from 'matrix-react-sdk/lib/dispatcher';
import DMRoomMap from 'matrix-react-sdk/lib/utils/DMRoomMap';
import Rooms from 'matrix-react-sdk/lib/Rooms';
import Modal from 'matrix-react-sdk/lib/Modal';
module.exports = React.createClass({
displayName: 'RoomTagContextMenu',
@@ -214,7 +216,7 @@ module.exports = React.createClass({
'mx_RoomTagContextMenu_fieldDisabled': false,
});
if (myMember && myMember.membership === "leave") {
if (myMember && (myMember.membership === "leave" || myMember.membership === "ban")) {
return (
<div>
<div className={ leaveClasses } onClick={ this._onClickForget } >

View File

@@ -0,0 +1,127 @@
/*
Copyright 2017 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from 'react';
import sdk from 'matrix-react-sdk';
import rageshake from '../../../vector/rageshake';
export default class BugReportDialog extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
sendLogs: true,
busy: false,
err: null,
text: "",
};
this._onSubmit = this._onSubmit.bind(this);
this._onCancel = this._onCancel.bind(this);
this._onTextChange = this._onTextChange.bind(this);
this._onSendLogsChange = this._onSendLogsChange.bind(this);
}
_onCancel(ev) {
this.props.onFinished(false);
}
_onSubmit(ev) {
const sendLogs = this.state.sendLogs;
const userText = this.state.text;
if (!sendLogs && userText.trim().length === 0) {
this.setState({
err: "Please describe the bug and/or send logs.",
});
return;
}
this.setState({ busy: true, err: null });
rageshake.sendBugReport(userText, sendLogs).then(() => {
this.setState({ busy: false });
this.props.onFinished(false);
}, (err) => {
this.setState({ busy: false, err: `Failed: ${err.message}` });
});
}
_onTextChange(ev) {
this.setState({ text: ev.target.value });
}
_onSendLogsChange(ev) {
this.setState({ sendLogs: ev.target.checked });
}
render() {
const Loader = sdk.getComponent("elements.Spinner");
let error = null;
if (this.state.err) {
error = <div className="error">
{this.state.err}
</div>;
}
const okLabel = this.state.busy ? <Loader /> : 'Send';
let cancelButton = null;
if (!this.state.busy) {
cancelButton = <button onClick={this._onCancel}>
Cancel
</button>;
}
return (
<div className="mx_BugReportDialog">
<div className="mx_Dialog_title">
Report a bug
</div>
<div className="mx_Dialog_content">
<p>Please describe the bug. What did you do?
What did you expect to happen?
What actually happened?</p>
<textarea
className="mx_BugReportDialog_input"
rows={5}
onChange={this._onTextChange}
value={this.state.text}
placeholder="Describe your problem here."
/>
<p>In order to diagnose problems, logs from this client will be sent with
this bug report.
If you would prefer to only send the text above, please untick:</p>
<input type="checkbox" checked={this.state.sendLogs}
onChange={this._onSendLogsChange} id="mx_BugReportDialog_logs"/>
<label htmlFor="mx_BugReportDialog_logs">Send logs</label>
{error}
</div>
<div className="mx_Dialog_buttons">
<button
className="mx_Dialog_primary danger"
onClick={this._onSubmit}
autoFocus={true}
>
{okLabel}
</button>
{cancelButton}
</div>
</div>
);
}
}
BugReportDialog.propTypes = {
onFinished: React.PropTypes.func.isRequired,
};

View File

@@ -31,9 +31,10 @@ export default class ChangelogDialog extends React.Component {
const version = this.props.newVersion.split('-');
const version2 = this.props.version.split('-');
if(version == null || version2 == null) return;
// parse versions of form: [vectorversion]-react-[react-sdk-version]-js-[js-sdk-version]
for(let i=0; i<REPOS.length; i++) {
const oldVersion = version2[2*i+1];
const newVersion = version[2*i+1];
const oldVersion = version2[2*i];
const newVersion = version[2*i];
request(`https://api.github.com/repos/${REPOS[i]}/compare/${oldVersion}...${newVersion}`, (a, b, body) => {
if(body == null) return;
this.setState({[REPOS[i]]: JSON.parse(body).commits});
@@ -44,7 +45,7 @@ export default class ChangelogDialog extends React.Component {
_elementsForCommit(commit) {
return (
<li key={commit.sha} className="mx_ChangelogDialog_li">
<a href={commit.html_url} target="_blank" ref="noopener">
<a href={commit.html_url} target="_blank" rel="noopener">
{commit.commit.message}
</a>
</li>

View File

@@ -16,6 +16,9 @@ limitations under the License.
import React from 'react';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import {instanceForInstanceId} from '../../../utils/DirectoryUtils';
const DEFAULT_ICON_URL = "img/network-matrix.svg";
export default class NetworkDropdown extends React.Component {
constructor(props) {
@@ -35,20 +38,11 @@ export default class NetworkDropdown extends React.Component {
this.inputTextBox = null;
const server = MatrixClientPeg.getHomeServerName();
let defaultNetwork = null;
if (
this.props.config.serverConfig &&
this.props.config.serverConfig[server] &&
this.props.config.serverConfig[server].networks &&
this.props.config.serverConfig[server].networks.indexOf('_matrix') > -1
) {
defaultNetwork = '_matrix';
}
this.state = {
expanded: false,
selectedServer: server,
selectedNetwork: defaultNetwork,
selectedInstance: null,
includeAllNetworks: false,
};
}
@@ -58,7 +52,7 @@ export default class NetworkDropdown extends React.Component {
document.addEventListener('click', this.onDocumentClick, false);
// fire this now so the defaults can be set up
this.props.onOptionChange(this.state.selectedServer, this.state.selectedNetwork);
this.props.onOptionChange(this.state.selectedServer, this.state.selectedInstance, this.state.includeAllNetworks);
}
componentWillUnmount() {
@@ -98,13 +92,14 @@ export default class NetworkDropdown extends React.Component {
ev.preventDefault();
}
onMenuOptionClick(server, network, ev) {
onMenuOptionClick(server, instance, includeAll) {
this.setState({
expanded: false,
selectedServer: server,
selectedNetwork: network,
selectedInstanceId: instance ? instance.instance_id : null,
includeAll: includeAll,
});
this.props.onOptionChange(server, network);
this.props.onOptionChange(server, instance ? instance.instance_id : null, includeAll);
}
onInputKeyUp(e) {
@@ -144,11 +139,22 @@ export default class NetworkDropdown extends React.Component {
servers.unshift(MatrixClientPeg.getHomeServerName());
}
// For our own HS, we can use the instance_ids given in the third party protocols
// response to get the server to filter the room list by network for us.
// We can't get thirdparty protocols for remote server yet though, so for those
// we can only show the default room list.
for (const server of servers) {
options.push(this._makeMenuOption(server, null));
if (this.props.config.serverConfig && this.props.config.serverConfig[server] && this.props.config.serverConfig[server].networks) {
for (const network of this.props.config.serverConfig[server].networks) {
options.push(this._makeMenuOption(server, network));
options.push(this._makeMenuOption(server, null, true));
if (server == MatrixClientPeg.getHomeServerName()) {
options.push(this._makeMenuOption(server, null, false));
if (this.props.protocols) {
for (const proto of Object.keys(this.props.protocols)) {
if (!this.props.protocols[proto].instances) continue;
for (const instance of this.props.protocols[proto].instances) {
if (!instance.instance_id) continue;
options.push(this._makeMenuOption(server, instance, false));
}
}
}
}
}
@@ -156,50 +162,39 @@ export default class NetworkDropdown extends React.Component {
return options;
}
_makeMenuOption(server, network, wire_onclick) {
if (wire_onclick === undefined) wire_onclick = true;
_makeMenuOption(server, instance, includeAll, handleClicks) {
if (handleClicks === undefined) handleClicks = true;
let icon;
let name;
let span_class;
let key;
if (network === null) {
if (!instance && includeAll) {
key = server;
name = server;
span_class = 'mx_NetworkDropdown_menu_all';
} else if (network == '_matrix') {
} else if (!instance) {
key = server + '_all';
name = 'Matrix';
icon = <img src="img/network-matrix.svg" width="16" height="16" />;
icon = <img src="img/network-matrix.svg" />;
span_class = 'mx_NetworkDropdown_menu_network';
} else {
if (this.props.config.networks[network] === undefined) {
throw new Error(network + ' network missing from config');
}
if (this.props.config.networks[network].name) {
name = this.props.config.networks[network].name;
} else {
name = network;
}
if (this.props.config.networks[network].icon) {
// omit height here so if people define a non-square logo in the config, it
// will keep the aspect when it scales
icon = <img src={this.props.config.networks[network].icon} width="16" />;
} else {
icon = <img src={iconPath} width="16" height="16" />;
}
key = server + '_inst_' + instance.instance_id;
const imgUrl = instance.icon ?
MatrixClientPeg.get().mxcUrlToHttp(instance.icon, 25, 25, 'crop', true) :
DEFAULT_ICON_URL;
icon = <img src={imgUrl} />;
name = instance.desc;
span_class = 'mx_NetworkDropdown_menu_network';
}
const click_handler = wire_onclick ? this.onMenuOptionClick.bind(this, server, network) : null;
let key = server;
if (network !== null) {
key += '_' + network;
}
const click_handler = handleClicks ? this.onMenuOptionClick.bind(this, server, instance, includeAll) : null;
return <div key={key} className="mx_NetworkDropdown_networkoption" onClick={click_handler}>
{icon}
<span className={span_class}>{name}</span>
</div>;
<span className="mx_NetworkDropdown_menu_network">{name}</span>
</div>
}
render() {
@@ -216,8 +211,9 @@ export default class NetworkDropdown extends React.Component {
placeholder="matrix.org" // 'matrix.org' as an example of an HS name
/>
} else {
const instance = instanceForInstanceId(this.props.protocols, this.state.selectedInstanceId);
current_value = this._makeMenuOption(
this.state.selectedServer, this.state.selectedNetwork, false
this.state.selectedServer, instance, this.state.includeAll, false
);
}
@@ -233,12 +229,12 @@ export default class NetworkDropdown extends React.Component {
NetworkDropdown.propTypes = {
onOptionChange: React.PropTypes.func.isRequired,
protocols: React.PropTypes.object,
// The room directory config. May have a 'servers' key that is a list of server names to include in the dropdown
config: React.PropTypes.object,
};
NetworkDropdown.defaultProps = {
config: {
networks: [],
}
protocols: {},
config: {},
};

View File

@@ -22,6 +22,7 @@ var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var DateUtils = require('matrix-react-sdk/lib/DateUtils');
var filesize = require('filesize');
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
module.exports = React.createClass({
displayName: 'ImageView',
@@ -162,7 +163,7 @@ module.exports = React.createClass({
<img src={this.props.src} style={style}/>
<div className="mx_ImageView_labelWrapper">
<div className="mx_ImageView_label">
<img className="mx_ImageView_cancel" src="img/cancel-white.svg" width="18" height="18" alt="Close" onClick={ this.props.onFinished }/>
<AccessibleButton className="mx_ImageView_cancel" onClick={ this.props.onFinished }><img src="img/cancel-white.svg" width="18" height="18" alt="Close"/></AccessibleButton>
<div className="mx_ImageView_shim">
</div>
<div className="mx_ImageView_name">

View File

@@ -19,6 +19,7 @@ limitations under the License.
var React = require('react');
var Notifier = require("matrix-react-sdk/lib/Notifier");
var sdk = require('matrix-react-sdk')
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
module.exports = React.createClass({
displayName: 'MatrixToolbar',
@@ -38,7 +39,7 @@ module.exports = React.createClass({
<div className="mx_MatrixToolbar_content">
You are not receiving desktop notifications. <a className="mx_MatrixToolbar_link" onClick={ this.onClick }>Enable them now</a>
</div>
<div className="mx_MatrixToolbar_close"><img src="img/cancel.svg" width="18" height="18" onClick={ this.hideToolbar } /></div>
<AccessibleButton className="mx_MatrixToolbar_close" onClick={ this.hideToolbar } ><img src="img/cancel.svg" width="18" height="18" /></AccessibleButton>
</div>
);
}

Some files were not shown because too many files have changed in this diff Show More