Compare commits

...

653 Commits

Author SHA1 Message Date
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
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
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
b0319ec0f1 merge 2016-12-24 19:32:29 +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
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
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
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
David Baker
59fe9279d1 0.8.3 2016-10-12 11:49:58 +01:00
David Baker
046c9ef920 Prepare changelog for v0.8.3 2016-10-12 11:49:57 +01:00
David Baker
bca22f26c5 js-sdk & react-sdk release versions 2016-10-12 11:49:21 +01:00
Richard van der Hoff
2b68b88b14 Merge pull request #2453 from vector-im/rav/center_images_in_dialog_buttons
Centre images in dialog buttons
2016-10-11 19:09:46 +01:00
Richard van der Hoff
97cedfc712 Centre images in dialog buttons
Some dialogs put a spinner in the button... need to line them up.
2016-10-11 17:50:49 +01:00
Matthew Hodgson
86cb3e9376 Merge pull request #2448 from aviraldg/fix-quote
Only show quote option if RTE is enabled
2016-10-11 14:39:42 +01:00
Aviral Dasgupta
42993a78ed Only show quote option if RTE is enabled 2016-10-11 19:07:15 +05:30
Richard van der Hoff
2a5ca9d3df Merge pull request #2443 from vector-im/dbkr/matrix_network_join_button
Fix join button for 'matrix' networks
2016-10-10 11:40:32 +01:00
David Baker
323bd79d0e Fix join button for 'matrix' networks
Fixes https://github.com/vector-im/vector-web/issues/2435
2016-10-10 11:21:20 +01:00
Matthew Hodgson
60adbffacf try to fix the create room label 2016-10-10 02:38:38 +01:00
Richard van der Hoff
f827a2963e Merge pull request #2422 from vector-im/dbkr/fix_no_freenode_rooms
Don't stop paginating if no rooms match
2016-10-06 10:39:45 +01:00
David Baker
5e293c0f45 Don't stop paginating if no rooms match
Always show the scrollpanel otherwise we stop paginating if there
are no matching rooms in the first request (as per comment).

Fixes no freenode rooms being shown.
2016-10-05 18:06:43 +01:00
David Baker
cd7adfed0a Back to develop react & js sdk 2016-10-05 16:59:25 +01:00
David Baker
902bf3a0a6 0.8.2 2016-10-05 16:55:45 +01:00
David Baker
f736e5243c Prepare changelog for v0.8.2 2016-10-05 16:55:44 +01:00
David Baker
fb2c2ed09a Use released version of react-sdk & js-sdk 2016-10-05 16:54:24 +01:00
David Baker
ea38968be9 Merge pull request #2379 from vector-im/dbkr/join_3p_location
Add native joining of 3p networks to room dir
2016-10-05 14:00:21 +01:00
David Baker
562b047362 Typo 2016-10-05 13:49:30 +01:00
David Baker
381c9009fb Doc roomDirectory config section 2016-10-04 16:21:39 +01:00
David Baker
c0a4574069 For single instance, allow domain present & match 2016-10-04 15:30:46 +01:00
David Baker
de9bf4bb47 Actually use variable 2016-10-04 15:18:07 +01:00
Richard van der Hoff
c57bfccb9e Merge pull request #2406 from vector-im/dbkr/linkify_213
Update to linkify 2.1.3
2016-10-04 11:59:07 +01:00
David Baker
52cae92dd7 Update to linkify 2.1.3
To pull in https://github.com/SoapBox/linkifyjs/pull/166
2016-10-04 11:28:28 +01:00
David Baker
b80b08f04f Specify width on icons & comment 2016-10-04 11:14:36 +01:00
David Baker
304e5b997a PR Freedback 2016-10-04 11:04:01 +01:00
David Baker
6b4dbfbd62 Change default brand to Riot
& update sample config
2016-10-04 10:23:38 +01:00
David Baker
000ca35727 Don't pop up errors when this API fails for guests 2016-10-03 16:30:57 +01:00
David Baker
776fe2ad70 Different way of getting fields for 3p location
Try to match protocol insance from 'domain' field and use its
fields for all but the last field. Assume the last takes the user
input.
2016-10-03 13:42:55 +01:00
Aviral Dasgupta
9174b32ef1 Upgrade to babel6 and enable some presets. 2016-10-02 17:28:24 +05:30
Richard van der Hoff
602727b7ad Merge pull request #2383 from vector-im/dbkr/sign_in_not_log_in
Use 'Sign In' / 'Sign Out' universally
2016-09-30 11:31:15 +01:00
Richard van der Hoff
56deea9f10 Merge pull request #2382 from vector-im/dbkr/networkdropdown_size_jump
Prevent network dropdown resizing slightly
2016-09-30 10:59:15 +01:00
Richard van der Hoff
8e0be29c13 Merge pull request #2380 from vector-im/dbkr/roomdir_no_results
Room directory: indicate when there are no results
2016-09-30 10:23:23 +01:00
David Baker
b71b1b5535 Use more variables 2016-09-30 09:39:30 +01:00
Matthew Hodgson
5b3524f174 better wordwrap on RightPanels 2016-09-29 17:41:34 +01:00
David Baker
f9a70a8b04 Use 'Sign In' / 'Sign Out' universally
Rather than a mix of 'sign in/out' and 'log in/out'
2016-09-29 17:40:19 +01:00
David Baker
b652ea5024 Prevent network dropdown resizing slightly
Dropdown resized by 2px when opened
2016-09-29 16:49:44 +01:00
David Baker
2a37a0cb19 Room directory: indicate when there are no results
Fixes https://github.com/vector-im/vector-web/issues/2250
2016-09-29 15:45:45 +01:00
David Baker
761600f325 Add native joining of 3p networks to room dir
Use the 3rd party location lookup API to accept third-party locations
in their native form and look up the corresponding portal room for
that location.

Also give the network dropdown some placeholder text.

Fixes https://github.com/vector-im/vector-web/issues/2374
2016-09-29 15:30:54 +01:00
David Baker
65f14c7d21 Stop random rooms appearing when switching network
in the public room directory
2016-09-28 14:18:40 +01:00
David Baker
864ba52bc5 Relative img paths please 2016-09-28 12:03:35 +01:00
David Baker
fdb5020c0c Oops, fix undefined variable 2016-09-28 11:56:07 +01:00
Richard van der Hoff
62344b5194 Merge pull request #2362 from vector-im/dbkr/roomdir_filter_3pnetworks
Room dir: New filtering & 3rd party networks
2016-09-28 11:38:03 +01:00
David Baker
0db12fcd22 Move method & don't wastefullt create elements
Put did update with the other react interface methods & don't
bother creating the 'current_value' if we throw it away later.
2016-09-28 11:05:14 +01:00
David Baker
455ee4f91b Argh, tabs 2016-09-28 11:04:54 +01:00
David Baker
5ca391f914 Replace double truth test with something sane
Also typo
2016-09-28 11:04:13 +01:00
David Baker
a32abae5a3 Don't use _matrix as default if there isn't one 2016-09-28 10:58:01 +01:00
David Baker
b2dd3ecf3a Add the _matrix network to the sample config 2016-09-28 10:44:29 +01:00
David Baker
cc7017b62d Emptry commit to force re-test 2016-09-28 10:22:29 +01:00
David Baker
f852e8a01d Update sample config 2016-09-28 10:13:35 +01:00
David Baker
6ff1c30a4b Fix spurious fill requests when switching networks
Ignore responses for old servers too, don't trigger a backfill request
when we re-render before refresh. Also a few more comments.
2016-09-28 10:08:03 +01:00
David Baker
85ea45a64a Room dir: New filtering & 3rd party networks
Changes filtering on 3rd party networks to divide into portal / non portal rooms and not show portal rooms by default. Adds a special '_matrix' network for all rooms that aren't portal rooms.

Also adds ability to query 3rd party directory servers.
2016-09-27 19:39:20 +01:00
Matthew Hodgson
7b258bc229 it's called Riot 2016-09-27 12:27:12 +01:00
Richard van der Hoff
5ba3499f56 Merge pull request #2359 from vector-im/dbkr/linkify_version
Update linkify version
2016-09-27 11:30:16 +01:00
David Baker
f4a6a3c4b2 Update linkify version
Fixes https://github.com/vector-im/vector-web/issues/2357
In addition, https://github.com/matrix-org/matrix-react-sdk/pull/500 will make sure failures like this are obvious.
2016-09-27 10:40:02 +01:00
David Baker
5967dc4983 Merge pull request #2339 from vector-im/dbkr/directory_search_box
Directory search join button
2016-09-26 15:43:39 +01:00
David Baker
bf58c340bc Oops, missed the ref 2016-09-26 15:30:42 +01:00
David Baker
dc0b15bdfa Remove unused variable / function 2016-09-26 14:17:36 +01:00
Matthew Hodgson
be6fbc2432 let's stick with the vector-web GA target for riot-web 2016-09-25 13:24:07 +01:00
David Baker
51a5542446 Make tests pass 2016-09-23 18:20:31 +01:00
David Baker
3938abc5dd add webkit vendor prefixed properties
for mavericks safari
2016-09-23 17:18:52 +01:00
David Baker
4961a97ed4 More css:
* Make join button more buttony
 * Fix size of dropdown, allow search box to expand
 * Use flexbox within search box to input can fill the rest of the space
2016-09-23 16:33:28 +01:00
David Baker
fb477fad1e Less hardcoded CSS 2016-09-23 15:58:28 +01:00
David Baker
a070bccffb Hacky hardcoded css for join button 2016-09-23 15:26:08 +01:00
David Baker
8e1105b12a Oops, wrong function 2016-09-23 15:25:13 +01:00
David Baker
93e4a04118 Chrome manifest branding 2016-09-23 14:26:09 +01:00
David Baker
6e3313b461 More missed rebranding 2016-09-23 14:24:47 +01:00
David Baker
2e77b0a3c7 Use directory search box component 2016-09-23 13:48:44 +01:00
David Baker
16c22e07b8 Missed some mstile icons 2016-09-23 13:46:46 +01:00
David Baker
99b0f9eb7c Back to develop 2016-09-21 17:33:27 +01:00
David Baker
5248bdd974 0.8.1 2016-09-21 17:30:41 +01:00
David Baker
157ae836c0 Prepare changelog for v0.8.1 2016-09-21 17:30:40 +01:00
David Baker
2639d10f97 Pin to released js-sdk & react-sdk 2016-09-21 17:29:44 +01:00
David Baker
cc5c636fa5 Back to develop versions 2016-09-21 12:03:59 +01:00
David Baker
c4a2df75eb 0.8.0 2016-09-21 12:02:41 +01:00
David Baker
06c4cae016 Prepare changelog for v0.8.0 2016-09-21 12:02:41 +01:00
David Baker
3eed711b34 Use released versions 2016-09-21 12:01:59 +01:00
David Baker
d9c51832ab Use 2x res logo to work with hidpi displays 2016-09-21 11:09:00 +01:00
David Baker
5011d3b158 Only show version bar if on develop
Or rather, if the version string is in the right format it to work.
2016-09-20 14:33:25 +01:00
David Baker
c10b11a22c Separate GA tracking ID for riot 2016-09-19 17:46:54 +01:00
David Baker
a5ee48d857 Swap out unknown user icons 2016-09-19 16:42:07 +01:00
David Baker
343fc1b164 Update GA hostnames 2016-09-19 16:22:42 +01:00
David Baker
55fde43d5d All the logos. 2016-09-19 15:52:39 +01:00
David Baker
940eaf2b7d The times, they are a changin' 2016-09-19 15:32:39 +01:00
David Baker
855ecbe11d Update twitter / blog 2016-09-19 15:18:49 +01:00
David Baker
fc8f3eb0ee Just change favicon for now 2016-09-19 14:55:08 +01:00
David Baker
df90921d6c More s/Vector/Riot/ 2016-09-19 14:50:17 +01:00
David Baker
0f2c41dddc Merge pull request #2285 from vector-im/dbkr/rebrand
Dbkr/rebrand
2016-09-19 13:37:02 +01:00
David Baker
1c76870dcf Remove failed commenting 2016-09-19 13:36:04 +01:00
David Baker
a99c9f4db2 Keep order of blog / twitter the same 2016-09-19 13:35:31 +01:00
David Baker
7e5373e194 Stick with VectorCo twitter for now 2016-09-19 13:34:49 +01:00
David Baker
560174b99f Keep width on logo 2016-09-19 13:34:01 +01:00
David Baker
d2947a637a Better. 2016-09-19 13:31:01 +01:00
David Baker
8e4dcd9b41 Rebrand 2016-09-19 13:29:49 +01:00
Matthew Hodgson
9391dc6c2a aargh 2016-09-19 07:41:32 -04:00
Matthew Hodgson
f19044fef2 re-apply new scalar CSS 2016-09-19 06:59:24 -04:00
Kegsay
60179aab52 Merge pull request #2282 from vector-im/kegan/close-scalar
Listen for close_scalar and close the dialog box when received
2016-09-19 10:47:36 +01:00
Kegan Dougal
de38a32969 Listen for close_scalar and close the dialog box when received 2016-09-19 10:37:19 +01:00
Kegsay
5f6cc9b37b Merge pull request #2281 from vector-im/revert-2280-matthew/scalar-lipstick
Revert "improve lipstick and support scalar logout"
2016-09-19 10:17:54 +01:00
Kegsay
e2fc2b1b09 Revert "improve lipstick and support scalar logout" 2016-09-19 10:16:50 +01:00
Kegsay
1d97272874 Merge pull request #2280 from vector-im/matthew/scalar-lipstick
improve lipstick and support scalar logout
2016-09-19 09:27:07 +01:00
Richard van der Hoff
69da6a6dd8 Changelog test
empty commit to test the changelog
2016-09-19 00:14:19 +01:00
Richard van der Hoff
6cb7ffcd3b Another go at fixing the damn changelog
html_url is in the top-level 'commit' object, not in commit.commit.

Also factor some code out for legibility. Seriously, what's with stuffing
everything into inline functions?
2016-09-18 23:56:55 +01:00
Richard van der Hoff
0ab1dacb1e Merge remote-tracking branch 'origin/pull/2071/head' into rav/fix_changelog_links 2016-09-18 23:33:17 +01:00
Matthew Hodgson
af230b5fa8 improve lipstick and support scalar logout 2016-09-18 02:57:15 +01:00
Matthew Hodgson
4720da3f8e Merge pull request #2241 from vector-im/dbkr/paginate_publicrooms
Paginate Room Directory
2016-09-17 15:46:21 +01:00
Matthew Hodgson
e2b3fc3519 only show invite button for rooms you're in 2016-09-17 03:02:14 +01:00
Matthew Hodgson
ab3c1509c5 switch to 3-digit formatting for counts 2016-09-17 02:39:31 +01:00
Matthew Hodgson
91dd029483 don't let guests invite 2016-09-17 02:05:01 +01:00
David Baker
53fd3f52fa Oops, onChange doesn't catch the enter key 2016-09-16 20:56:14 +01:00
David Baker
d0618c4f49 Update test now that /publicRooms is a post 2016-09-16 20:49:28 +01:00
David Baker
0bce7f3102 Merge remote-tracking branch 'origin/develop' into dbkr/paginate_publicrooms 2016-09-16 20:16:33 +01:00
David Baker
3d97061d78 Check if we need to fetch more rooms after filter 2016-09-16 19:59:06 +01:00
David Baker
50f05db29e Don't show loading spinner if just paginating 2016-09-16 19:29:56 +01:00
David Baker
2fdec51a5b Wait a bit before sending filter requests
avoid hammering the server with requests for each keystroke
2016-09-16 18:53:18 +01:00
David Baker
6d332256b5 Ignore results of old requests 2016-09-16 18:48:47 +01:00
David Baker
2b6fbb038a Show headers while loading
& show spinner whilst waiting for filter requests
2016-09-16 18:41:29 +01:00
David Baker
48fb578952 Empty commit to test /develop redeploy 2016-09-16 18:31:47 +01:00
David Baker
7fc4b1cb35 Actually ad the arg to argparse 2016-09-16 18:26:46 +01:00
David Baker
4725fa4c2d Missed a comma 2016-09-16 18:21:33 +01:00
David Baker
5acb6b0b37 Merge pull request #2240 from vector-im/dbkr/redeploy_config
Make redeploy script symlink config
2016-09-16 18:19:34 +01:00
David Baker
838608afab Make redeploy script symlink config 2016-09-16 18:15:15 +01:00
David Baker
a11516a984 Make publicrooms use the new paginating API
Also do filtering on the server

WIP: This breaks the network dropdown
2016-09-16 17:33:28 +01:00
Matthew Hodgson
196b352b9a Merge pull request #2210 from vector-im/markjh/megolm
Update the version of olm to 1.3.0
2016-09-16 17:30:51 +01:00
Richard van der Hoff
e8a12e7ddc Revert "fix instructions"
This reverts commit 6a13155013.
2016-09-16 17:27:52 +01:00
David Baker
135c22c99d Merge pull request #2219 from vector-im/dbkr/directory_network_selector
Directory network selector
2016-09-16 17:09:23 +01:00
Matthew Hodgson
6a13155013 fix instructions 2016-09-16 17:08:27 +01:00
Matthew Hodgson
6e2a371017 fix MemberInfo layout 2016-09-16 14:36:26 +01:00
Matthew Hodgson
de26d1a8ce Merge pull request #2235 from vector-im/wmwragg/two-state-sublist-headers
Wmwragg/two state sublist headers
2016-09-16 14:08:00 +01:00
wmwragg
7af765976b Notification counts now done correctly, as well as highlights 2016-09-16 13:25:39 +01:00
David Baker
8f6d98886c Use real matrix.org network in sample config 2016-09-16 11:44:33 +01:00
wmwragg
72e108c4f9 More robust badge positioning 2016-09-16 11:34:16 +01:00
wmwragg
e2b695827e Refactor to reuse RoomSubList chevron styling 2016-09-16 11:02:09 +01:00
wmwragg
4b50a8a56e Refactored so the RoomSubList overflow element use RoomSubList CSS 2016-09-16 10:57:55 +01:00
wmwragg
737d1d8843 Changed the overflow tile styling, but there is no collpased state or mention count yet 2016-09-16 10:48:52 +01:00
Matthew Hodgson
eea9e366b8 un-revert 5282796d84 as it wasn't to blame 2016-09-16 10:38:54 +01:00
wmwragg
24d0b95cb2 Corrected the tooltip text colour to match the design 2016-09-16 08:15:27 +01:00
wmwragg
77085882fa quick tidy of CSS 2016-09-16 08:08:31 +01:00
wmwragg
9375ebfb75 Fixed broken tooltip positioning again 2016-09-16 08:06:17 +01:00
Matthew Hodgson
e2f94c8722 improve scroll cosmetics 2016-09-16 03:26:59 +01:00
Matthew Hodgson
b0fd65f442 fix ff rhs scroll 2016-09-16 03:26:45 +01:00
Matthew Hodgson
f56a6039e8 fix droptarget margins 2016-09-16 02:54:03 +01:00
Matthew Hodgson
c44994c0ee fix tinter for LeftPanel 2016-09-16 02:53:57 +01:00
Matthew Hodgson
eeb91374cf highlight my device 2016-09-15 19:42:36 +01:00
David Baker
cd4564d3d3 Make the matrix.org section be everything
(ie. every alias on the matrix.org HS, so currently everything, since we don't pull in any other directories)
2016-09-15 18:56:04 +01:00
David Baker
190cd884b5 Add roomDirectory to sample config 2016-09-15 18:42:00 +01:00
Matthew Hodgson
1741cc915e revert accidental commit 5282796d84 as folks say everything broke 2016-09-15 17:50:47 +01:00
wmwragg
37fc73b1ea Setting correct initial state 2016-09-15 17:31:15 +01:00
David Baker
c1e83da35d Put network list config into config file 2016-09-15 17:20:13 +01:00
wmwragg
5282796d84 Added back the overflow tile and two state room sub lists, rather than the three state currently 2016-09-15 17:17:45 +01:00
Matthew Hodgson
866164c4d9 Merge pull request #2222 from vector-im/wmwragg/correct-incoming-call-positioning
Wmwragg/correct incoming call positioning
2016-09-15 15:59:14 +01:00
wmwragg
5ceb1e641f Placing the incomingCallBox in the sticky element, so it sticks when the header sticks 2016-09-15 15:34:11 +01:00
David Baker
f3cbb9fe90 Make the network dropdown work 2016-09-15 15:18:12 +01:00
Matthew Hodgson
fe4371bf45 Merge pull request #2211 from vector-im/wmwragg/remove-old-filter
Wmwragg/remove old filter
2016-09-15 15:01:37 +01:00
wmwragg
cde3f33db3 Added incomingCallBox to header and removed from roomTile 2016-09-15 14:37:53 +01:00
Matthew Hodgson
82e257b4ea make DM naming consistent 2016-09-15 13:23:17 +01:00
wmwragg
3907da064e Removed no longer used MultiInviteDialog, as it's now been replaced with the ChatInviteDialog 2016-09-15 11:46:35 +01:00
wmwragg
f43530e1ef Tweaked font size to match the design spec 2016-09-15 11:39:21 +01:00
Mark Haines
f6fb1561d7 Update the version of olm to 1.3.0 2016-09-15 11:33:37 +01:00
wmwragg
a1e3ec1d19 Added query to CSS and removed nolonger used SearchableEntityList 2016-09-15 11:30:46 +01:00
David Baker
43b87e1f82 Add network selector that doesn't do anything yet 2016-09-15 11:29:27 +01:00
Matthew Hodgson
2a85b2271c tweak MemberInfo CSS 2016-09-15 02:44:34 +01:00
Matthew Hodgson
cb2c2c1b36 basic verification UI 2016-09-15 01:55:59 +01:00
Matthew Hodgson
c5a52d89be Merge pull request #2198 from vector-im/wmwragg/multi-invite-bugfix
Wmwragg/multi invite bugfix
2016-09-14 22:06:44 +01:00
wmwragg
efa574c452 The invite group, will no longer be shown when the directory listing is being shown 2016-09-14 17:13:06 +01:00
wmwragg
66ef5213b8 Increased hitbox area to the whole invite section, not just the icon 2016-09-14 14:32:30 +01:00
wmwragg
370612135f The scrollbars are nolonger always visible for the AddressSelector and ChatInviteDialog invite list 2016-09-14 13:55:10 +01:00
Matthew Hodgson
ec05d1b9bd improve e2e and scalar settings UI 2016-09-14 02:07:23 +01:00
Matthew Hodgson
089951012b actually, sod it, let's just call it Start chat 2016-09-13 19:42:35 +01:00
Matthew Hodgson
c6a9614372 Merge pull request #2181 from vector-im/wmwragg/chat-multi-invite
Wmwragg/chat multi invite
2016-09-13 19:31:05 +01:00
Matthew Hodgson
a623430c2b Merge pull request #2182 from vector-im/matthew/right-panel-collapse
shuffle bottomleftmenu around a bit
2016-09-13 19:08:54 +01:00
Matthew Hodgson
b247c8a87f rename 'start chat' tooltip 2016-09-13 19:08:43 +01:00
wmwragg
56606c01a0 Added valid but unknown mx user 2016-09-13 17:09:01 +01:00
Matthew Hodgson
eb2a55445c Merge pull request #2175 from aviraldg/feature-autocomplete-behaviour
Improve autocomplete behaviour (styling)
2016-09-13 16:17:14 +01:00
wmwragg
3fe8b503e5 Fixed over collapse on Safari, and now hide the RHS footer Invite when collapsed 2016-09-13 14:57:58 +01:00
wmwragg
bdee2d3b28 Shifting icon to center of collapsed section 2016-09-13 14:44:54 +01:00
wmwragg
15ee2578c5 Tweak to font colour 2016-09-13 14:36:13 +01:00
wmwragg
f8c9a28194 Updated to correct invite icon 2016-09-13 14:33:19 +01:00
wmwragg
768f11fe58 Added new Invite button in the RHS footer 2016-09-13 14:27:23 +01:00
wmwragg
acdcb21830 Fixed weird margin bug when LHS panel is collapsed 2016-09-13 13:32:50 +01:00
wmwragg
1530568354 Merge branch 'develop' into wmwragg/chat-multi-invite 2016-09-13 12:38:45 +01:00
Matthew Hodgson
7b25f4e069 wip for collapsable RHS 2016-09-13 12:18:09 +01:00
Aviral Dasgupta
cbab2c142b Autocomplete restyling 2016-09-13 15:43:59 +05:30
Aviral Dasgupta
81bbc05028 Merge branch 'develop' of github.com:vector-im/vector-web into develop 2016-09-13 15:42:36 +05:30
wmwragg
f59dbe40ec Added error checking, and UI 2016-09-13 11:03:27 +01:00
Matthew Hodgson
562c3b0e04 fix notif icon 2016-09-13 10:32:40 +01:00
Matthew Hodgson
f119a57952 dedicated dialog box for E2E messages 2016-09-12 23:42:43 +01:00
Matthew Hodgson
c6fa1e2e21 show e2e icon by default 2016-09-12 20:02:22 +01:00
Matthew Hodgson
0bdc026b05 E2E CSS 2016-09-12 18:50:32 +01:00
Matthew Hodgson
20eb28f052 fix e2e icon placement 2016-09-12 17:38:27 +01:00
wmwragg
bfd3ef0e44 Limit the invite area in height 2016-09-12 17:31:49 +01:00
wmwragg
abda8c77ad Added styling for unknown addresses 2016-09-12 17:25:38 +01:00
Matthew Hodgson
9e5d090ddb Merge pull request #2163 from vector-im/matthew/e2e
First wave of E2E visuals
2016-09-12 17:20:23 +01:00
wmwragg
906be376c9 Refactored AddressTile to use string address rather than user object, so it can user email as well mx userId 2016-09-12 16:51:42 +01:00
Matthew Hodgson
695930efa5 e2e icons 2016-09-12 16:50:53 +01:00
Matthew Hodgson
7f2c74e7a8 Merge branch 'develop' into matthew/e2e 2016-09-12 16:32:58 +01:00
Matthew Hodgson
f299572dc7 Merge pull request #2113 from vector-im/matthew/notif-panel
FilePanel and NotificationPanel support
2016-09-12 15:57:51 +01:00
Aviral Dasgupta
d65b791b2b bump draft-js to 0.8.1 (as with matrix-react-sdk) 2016-09-12 18:31:22 +05:30
wmwragg
2bf177dbcc Refactored the queryList into seperate AddressSelector component 2016-09-12 13:01:08 +01:00
Matthew Hodgson
5775552bab css for e2e look & feel 2016-09-12 01:38:03 +01:00
Matthew Hodgson
dd4617a7c6 bring back small avatars for info msgs otherwise the design breaks 2016-09-11 23:01:28 +01:00
Matthew Hodgson
64dedef2c7 fix wordwrap on new panels 2016-09-11 21:55:57 +01:00
Matthew Hodgson
89f8ff4988 Merge branch 'develop' into matthew/notif-panel 2016-09-11 02:37:30 +01:00
Matthew Hodgson
3a8c94de5a CSS for notif & file panel 2016-09-11 02:15:03 +01:00
Matthew Hodgson
dd39813cc2 show context menus on hoverover 2016-09-11 02:14:52 +01:00
Matthew Hodgson
e6c4273404 Merge pull request #2151 from vector-im/dbkr/memberinfo_createroom_cursor_pointer
Cursor: pointer on member info create room button
2016-09-09 22:33:37 +01:00
David Baker
e1c32536ff Cursor: pointer on member info create room button 2016-09-09 19:23:12 +01:00
David Baker
013f68519e Merge pull request #2147 from vector-im/dbkr/memberinfo_list_rooms
Support for adding DM rooms to the MemberInfo Panel
2016-09-09 17:30:35 +01:00
David Baker
ab9786cc02 Merge remote-tracking branch 'origin/develop' into dbkr/memberinfo_list_rooms 2016-09-09 16:27:00 +01:00
David Baker
57804f4e02 Support for common rooms in MemberInfo
Renames RoomDNDView to DNDRoomTile which now provides a separate DNDRoomTile component rather than
clobberring RoomTile, so we can use a draggable one where we want a draggable one and a non-draggable
one where we don't want it to be draggable. RoomTile main is still polluted with DND stuff, but is
now optional.

Remove BottomLeftMenuTile because it was no longer used in the bottom left menu. Just include
the equivalent markup directly in the one place we now use it (in MemberTile in react-sdk).
2016-09-09 16:15:45 +01:00
Matthew Hodgson
c4421f6bc7 Merge pull request #2139 from vector-im/wmwragg/one-to-one-indicators
Wmwragg/one to one indicators
2016-09-09 15:08:20 +01:00
wmwragg
965d9aaf47 Lowered the Avatar menu background, so the Direct Message indicator is in front of it 2016-09-09 14:56:20 +01:00
wmwragg
2476f87e1d Positional tweaks for the new Direct Message indicator 2016-09-09 14:47:26 +01:00
wmwragg
cd36800426 New direct message indicator CSS 2016-09-09 14:42:11 +01:00
wmwragg
18eb9d9330 Made sure the z-index was correct for the new little green men 2016-09-09 14:36:21 +01:00
Matthew Hodgson
7e379e9877 Merge pull request #2136 from vector-im/wmwragg/room-directory-back
Added back the Directory listing button, with new tootlip
2016-09-09 14:08:19 +01:00
Matthew Hodgson
f2ca249b44 Merge pull request #2134 from vector-im/wmwragg/chat-invite-dialog-fix
wmwragg/chat invite dialog fix
2016-09-09 14:08:09 +01:00
wmwragg
09ce3a79ec Added back the Directory listing button, with new tootlip 2016-09-09 12:23:50 +01:00
wmwragg
bfa59c6c04 Increased the width of the query list container to take account of scrollbars 2016-09-09 11:42:57 +01:00
Matthew Hodgson
e75148e799 Merge branch 'develop' into matthew/notif-panel 2016-09-09 11:20:10 +01:00
Matthew Hodgson
8376f0d75a Merge pull request #2110 from vector-im/wmwragg/one-to-one-chat
Wmwragg/one to one chat
2016-09-09 10:46:01 +01:00
David Baker
bf02a21c7d Re-add icons-people (I accidentally deleted it) 2016-09-09 10:30:17 +01:00
wmwragg
ac365622b8 Align the RoomTile tooltips with the BottomLeftMenu tooltips 2016-09-09 07:10:12 +01:00
wmwragg
7cb48e0d2d Refactor so that the tooltip positional tweaks can be done in CSS rather than passed in as parameters 2016-09-09 06:56:54 +01:00
wmwragg
38ac520e1e Fixed name vertical overflow 2016-09-08 17:19:59 +01:00
Matthew Hodgson
6182ce48c9 fix (c) 2016-09-08 15:27:55 +01:00
David Baker
9e771ddd07 Merge pull request #2111 from vector-im/dbkr/toggle_dm_room
Support toggling DM status of rooms
2016-09-08 14:11:30 +01:00
David Baker
74aef1fdad Comment delay 2016-09-08 13:58:53 +01:00
Matthew Hodgson
8860c9c7fd Merge pull request #2082 from aviraldg/feature-rte-formatbar
Formatting toolbar for RTE message composer.
2016-09-08 13:54:39 +01:00
Matthew Hodgson
a8d7d23dd6 implement NotifPanel css 2016-09-08 03:03:10 +01:00
Matthew Hodgson
f5ce053f42 hook up the NotifPanel button 2016-09-08 03:02:50 +01:00
Aviral Dasgupta
d833c7632d Add strikethrough and <hr> styles 2016-09-08 02:47:31 +05:30
Aviral Dasgupta
22bf6e7969 RTE format bar enhancements 2016-09-07 22:52:37 +05:30
David Baker
a1f8116e3b Support toggling DM status of rooms
on context menu
2016-09-07 17:47:47 +01:00
wmwragg
1d32dd72ed Fixed typing error 2016-09-07 17:30:53 +01:00
wmwragg
a3b77475c7 Merge branch 'develop' into wmwragg/one-to-one-chat 2016-09-07 17:23:43 +01:00
wmwragg
761552430c Dialog buttons have a pointer cursor now 2016-09-07 17:14:27 +01:00
wmwragg
cc720b9797 Design tweaks for alignment 2016-09-07 17:08:24 +01:00
wmwragg
75c81b369f Mouse actions on the queryList added, as well as better queryListElement styling 2016-09-07 16:19:30 +01:00
Matthew Hodgson
7c74b0124b explicit props for RightPanel at last 2016-09-07 15:43:29 +01:00
wmwragg
48501d91d2 Added justification for the AddressTile, when requested 2016-09-07 10:55:31 +01:00
Matthew Hodgson
aefef2ba56 FilePanel css 2016-09-07 02:16:09 +01:00
Richard van der Hoff
31dd49ffd7 Bump to olm 1.2.0 2016-09-06 22:33:21 +01:00
wmwragg
ace0e01d86 Tweak on the textarea to prevent the input area jumping a couple of pixels in size between textarea and AddressTile 2016-09-06 17:21:28 +01:00
wmwragg
c0ce7663a9 Initial highlighting selected address - styling not final 2016-09-06 16:39:38 +01:00
wmwragg
e3d5ca34c8 Circumventing autofill by using a textarea rather than an input type=text 2016-09-06 16:15:36 +01:00
wmwragg
1fb53565ef Added scrolling to queryList 2016-09-06 15:46:09 +01:00
wmwragg
a41a8d32b8 Basic address list created, and UX tweaks for interaction 2016-09-06 15:24:37 +01:00
Richard van der Hoff
835d13c696 Another go at using latest Olm
The previous attempt failed due to npm shenanigans. Let's have another go,
without the "help" of npm.
2016-09-06 13:24:06 +01:00
wmwragg
6153e795bf Correct AddressTile and ChatInviteDialog styling 2016-09-06 11:33:56 +01:00
Matthew Hodgson
d12498f418 right cursor for roomsettings colours 2016-09-06 11:29:50 +01:00
David Baker
c0eb69963d Merge pull request #2092 from vector-im/rav/use_development_olm
jenkins.sh: install olm from jenkins artifacts
2016-09-06 11:11:05 +01:00
Matthew Hodgson
1f19ee88c6 make FilePanel work, superficially at least 2016-09-06 01:45:12 +01:00
Matthew Hodgson
24351537d2 we have nothing to hide 2016-09-06 01:19:48 +01:00
Richard van der Hoff
d309a7a67b jenkins.sh: install olm from jenkins artifacts
Use the latest version of olm, as provided by jenkins, rather than the most
recent release.
2016-09-05 18:54:10 +01:00
wmwragg
f6f68bc348 Initial AddressTile added 2016-09-05 17:28:23 +01:00
Aviral Dasgupta
d6a324ede7 Formatting toggle, markdown indicator, quoting 2016-09-05 17:39:32 +05:30
wmwragg
7378904f00 Adding back the BottomLeftMenuTile component, as it turns out it's still used in the RightPanel 2016-09-05 12:43:04 +01:00
wmwragg
059f5198e5 Merge branch 'develop' into wmwragg/one-to-one-chat 2016-09-05 12:07:21 +01:00
wmwragg
2acbad36a6 Initial commit of the new ChatInviteDialog 2016-09-05 12:03:43 +01:00
wmwragg
519dd16135 Added the correct styling back for the dialog buttons, that got regressed somewhere 2016-09-05 10:50:58 +01:00
wmwragg
fb103cb9e1 Rename the action to make it clearer what it is doing 2016-09-05 10:27:54 +01:00
Richard van der Hoff
5e9a95fdfe Merge pull request #2085 from vector-im/rav/e2e_devices
e2e device CSS
2016-09-05 00:43:52 +01:00
Aviral Dasgupta
b8610ab466 RTE formatbar (wip) 2016-09-04 21:03:00 +05:30
Richard van der Hoff
ee3fdbee5b e2e device CSS
CSS to make the deviceinfo stuff a little bit closer to the designs
2016-09-04 13:42:33 +01:00
wmwragg
2d827a75a6 Sending the top and left position tweaks with the action 2016-09-04 12:16:01 +01:00
wmwragg
50bb4edd1c Small refactor, to make it clearer whats happening 2016-09-04 08:54:15 +01:00
wmwragg
e52f5b5d08 Removed unrequired positional tweak props 2016-09-04 08:49:43 +01:00
wmwragg
fd81ce126b Code tidy up 2016-09-04 08:40:43 +01:00
wmwragg
7ae821e2b5 Removed nolonger needed conditional test, as the parent will always exist 2016-09-04 08:39:32 +01:00
wmwragg
cb98e2421e Removed the nolonger required methods 2016-09-04 07:56:32 +01:00
wmwragg
5417385c83 Tolltip thweak to not require the passing in of the parent 2016-09-04 07:41:48 +01:00
wmwragg
c2d8067523 Testing to see if having the header badges when collapsed is usable 2016-09-03 14:55:35 +01:00
wmwragg
52bd61a2f0 When collapsed a long hover on the header now shows the full tag name and room count 2016-09-03 14:48:10 +01:00
wmwragg
aee56a5bd1 z-index tweak for badge, so it does sit aboce the header 2016-09-03 14:47:36 +01:00
wmwragg
7f52fa74a4 Better comments, and syntax tweak 2016-09-03 14:14:11 +01:00
wmwragg
d1dd4bd3d8 Updated tooltip styling to be better inline with the design 2016-09-03 13:57:49 +01:00
wmwragg
ab9f48cd47 Restyled tooltip to better match the design 2016-09-03 13:44:00 +01:00
Matthew Hodgson
c597f05e71 Merge branch 'develop' into matthew/notif-panel 2016-09-03 13:33:37 +01:00
wmwragg
80e6cd6d7c Further tweaks to the tooltip to better handle its position, and simplify it's use 2016-09-03 12:44:09 +01:00
wmwragg
cb101b0a3b Allow better updating if the tooltip is designed to stick around, rather than just appearing on hover 2016-09-02 18:50:47 +01:00
wmwragg
bf4e3364b4 Tweak of the RoomTooltip to use DOM element for the parent rather than a React component 2016-09-02 18:41:27 +01:00
Matthew Hodgson
0494dff545 Merge branch 'master' into develop 2016-09-02 17:23:02 +01:00
Remi Rampin
d5865421bd Open commits in new window/tab from changelog 2016-09-02 12:22:51 -04:00
Remi Rampin
8578203073 Open HTML commit page for changelog entries 2016-09-02 12:22:15 -04:00
Matthew Hodgson
e63e6e7016 0.7.5-r3 2016-09-02 17:21:30 +01:00
Matthew Hodgson
dec62ab92c bump react-sdk 2016-09-02 17:20:23 +01:00
Matthew Hodgson
67d38bfab8 Prepare changelog for v0.7.5-r3 2016-09-02 17:20:08 +01:00
wmwragg
d2e2c726eb Refactor of the RoomTooltip, so that it is easier to use, and also works with Safari 2016-09-02 15:45:43 +01:00
Matthew Hodgson
00d53e4824 css for conf join 2016-09-02 15:38:40 +01:00
Matthew Hodgson
4ce80a0837 fix dialog css 2016-09-02 14:39:44 +01:00
Richard van der Hoff
9aa59fa358 Merge pull request #2069 from vector-im/rav/update_olm
Bump to olm 1.1.0
2016-09-02 12:02:27 +01:00
Richard van der Hoff
6c8a492637 Bump to olm 1.1.0
Olm 1.0.0 made broken OlmAccounts.
2016-09-02 12:01:27 +01:00
Matthew Hodgson
9709a38250 merge master 2016-09-01 22:38:40 +01:00
Matthew Hodgson
06ca94c1e6 0.7.5-r2 2016-09-01 22:29:36 +01:00
Matthew Hodgson
67255e3f84 Prepare changelog for v0.7.5-r2 2016-09-01 22:29:36 +01:00
Matthew Hodgson
a20962ac14 bump to react-sdk v0.6.5-r1 2016-09-01 22:28:39 +01:00
Matthew Hodgson
b4cf86a362 fix padding-top for unread msgs 2016-09-01 17:00:52 +01:00
wmwragg
bf8d7050cc New People icon in place of Directory icon, and placeholder functionality 2016-09-01 16:46:51 +01:00
Matthew Hodgson
49e5fa41ad fix overscroll on view source 2016-09-01 16:06:50 +01:00
Matthew Hodgson
e069d808f8 Merge pull request #2056 from jansol/develop
Improve readability of the changelog dialog
2016-09-01 15:16:46 +01:00
Jan Solanti
e85674711c Improve readability of the changelog dialog 2016-09-01 15:13:09 +03:00
Matthew Hodgson
7a89328ccb file upload when on call 2016-09-01 00:38:37 +01:00
Matthew Hodgson
e77e6c2af0 fix typing notif layout 2016-09-01 00:35:07 +01:00
Matthew Hodgson
ad26631874 fix icon layout 2016-09-01 00:33:45 +01:00
Matthew Hodgson
cc75eb8b0e fix statusbar height and behaviour during voip calls 2016-09-01 00:14:51 +01:00
Matthew Hodgson
735da3c15e show ongoing audio call in LeftPanel CSS 2016-09-01 00:14:32 +01:00
Matthew Hodgson
56dfdbeb6b call noisy notifs... noisy 2016-09-01 00:14:01 +01:00
Matthew Hodgson
eaf47ea05c show ongoing audio call in LeftPanel 2016-09-01 00:13:49 +01:00
Matthew Hodgson
37c46cf02f add a top-level remote audio element for https://github.com/vector-im/vector-web/issues/1271 and https://github.com/vector-im/vector-web/issues/621 2016-08-31 21:51:20 +01:00
Matthew Hodgson
9d72a7cb35 get adding FilePanel 2016-08-31 11:57:45 +01:00
Matthew Hodgson
a047f81b84 Merge branch 'develop' into matthew/notif-panel 2016-08-30 23:39:00 +01:00
Richard van der Hoff
a2694113d3 Merge pull request #2009 from vector-im/rav/enable_react_checks
Turn react consistency checks back on in develop builds
2016-08-30 14:57:49 +01:00
Matthew Hodgson
0aae88d753 nudge jenkins 2016-08-30 14:40:30 +01:00
Matthew Hodgson
c7eba0f292 repin deps to dev 2016-08-30 13:52:35 +01:00
Matthew Hodgson
1bc1fc7e55 Merge pull request #2028 from vector-im/wmwragg/direct-chat-sublist
Wmwragg/direct chat sublist
2016-08-30 12:56:29 +01:00
wmwragg
b91a0dd7a5 Increased truncation limit to 10 2016-08-30 12:14:32 +01:00
wmwragg
45a813b795 Fixed historical scetion not scrolling up when clicked if not hidden and stuck 2016-08-30 11:56:16 +01:00
wmwragg
7b7a77bad0 Merge branch 'develop' into wmwragg/direct-chat-sublist 2016-08-30 11:22:31 +01:00
wmwragg
ff3ad47be7 Code clean up, and better comments, along with z-index fixes for scrollbar and avatar menu 2016-08-30 10:45:59 +01:00
wmwragg
f2e8607433 Over scroll of bottom sticky headers should be fixed, and expansion of hidden stuck headers should now work 2016-08-28 19:14:54 +01:00
Matthew Hodgson
b96ab58eb3 merge develop 2016-08-28 18:49:49 +01:00
Matthew Hodgson
5f233d75f2 0.7.5-r1 2016-08-28 18:09:20 +01:00
Matthew Hodgson
eb88245fe7 Prepare changelog for v0.7.5-r1 2016-08-28 18:09:20 +01:00
wmwragg
93fff53e29 Added back the border spacing, as it wasn't the issue 2016-08-28 16:22:56 +01:00
wmwragg
4ae424f37a Removed the 2px border at top of labels to see if that has any effect on bottom stickies overscroll on matthews machine 2016-08-28 14:48:29 +01:00
wmwragg
900b4b4cf8 Added a border to the top of the sections to better seperate them when they are stuck together 2016-08-28 13:44:52 +01:00
wmwragg
b782e7b9ad Bottom line of the scroll area (well the top line of the bottom left menu) is now tinted same colour as the section headers 2016-08-28 13:22:14 +01:00
wmwragg
8d4268754e Fixed the stickies notification count to limit it to 99+ 2016-08-28 12:03:05 +01:00
wmwragg
dc4459083f Fixed the LHS panel not collapsing but most of the content doing so 2016-08-26 16:22:59 +01:00
Matthew Hodgson
879c325b83 DIE ZALGO 2016-08-26 16:08:15 +01:00
wmwragg
7ad3f4a577 Better comments 2016-08-26 15:53:31 +01:00
wmwragg
5b9d3b119f Click on stuck header scrolls to that header, collapses expands for none stuck header 2016-08-26 15:08:47 +01:00
wmwragg
5467fd89d8 Getting click to not collapse expand when header stuck 2016-08-26 14:35:40 +01:00
wmwragg
d2937c2aed Setting correct heights and widths for label and container 2016-08-26 11:02:12 +01:00
wmwragg
a0236a9b76 Code tidy-up and better name for label container class 2016-08-26 09:57:02 +01:00
wmwragg
4cb1f8a226 Initial pass at sticky headers for the LHS panel section labels 2016-08-25 19:46:15 +01:00
Richard van der Hoff
21ffe22375 Turn react consistency checks back on in develop builds
The react checks are useful on /develop, to catch programming errors earlier,
and the original reason for turning them off (so that we could meaningfully
compare performance between /develop and /beta) is no longer so
relevant.

This reverts commit b5f029d10e.
2016-08-25 17:06:12 +01:00
Matthew Hodgson
2fae966884 notification panel WIP 2016-08-23 14:28:10 +01:00
Matthew Hodgson
f888ec6e81 notification panel WIP 2016-08-23 14:27:58 +01:00
wmwragg
d2e8201d79 Making sure that the sub list count always stays up to date, including when people read the outstanding notifications 2016-08-23 13:24:02 +01:00
wmwragg
65d7d01dfa Merge branch 'develop' into wmwragg/direct-chat-sublist 2016-08-23 12:49:43 +01:00
wmwragg
2cf2df20f6 Added updating of count when room tile notification state changed 2016-08-23 12:40:15 +01:00
wmwragg
ee73bc3aa4 Refactor of the badge logic, and also added no badges when zero notifications 2016-08-23 11:35:03 +01:00
wmwragg
d3fa680373 Added all the notification states to the sub list count logic 2016-08-23 11:14:45 +01:00
wmwragg
ef9d6d45b6 Merge branch 'develop' into wmwragg/direct-chat-sublist 2016-08-23 10:54:05 +01:00
wmwragg
a980864886 Initial sub list notifications count. Still needs propagation of muting/unmuting etc. events from room tile up to sub list 2016-08-23 10:47:17 +01:00
wmwragg
ca4d506391 Header wording for capped truncation count updated 2016-08-22 22:47:00 +01:00
wmwragg
4d5e3bc22b Initial tag section header badge 2016-08-22 17:25:43 +01:00
wmwragg
ff55a951c9 Number of rooms added to header of sections 2016-08-22 17:02:52 +01:00
wmwragg
895172d498 Added catch to help get the Historical and any other weird sections into a sound state, so the states can then change correctly from then on 2016-08-22 16:42:08 +01:00
wmwragg
71f73d8df2 Collapsing and truncation initial state and onClick event logic 2016-08-22 15:50:36 +01:00
wmwragg
97daca4b31 Initial restyle of the sub lists and room lists 2016-08-22 14:10:06 +01:00
220 changed files with 5652 additions and 721 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"]
}

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-js-sdk && npm install)
- (cd node_modules/matrix-react-sdk && npm run build)

View File

@@ -1,3 +1,348 @@
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)
* Centre images in dialog buttons
[\#2453](https://github.com/vector-im/vector-web/pull/2453)
* Only show quote option if RTE is enabled
[\#2448](https://github.com/vector-im/vector-web/pull/2448)
* Fix join button for 'matrix' networks
[\#2443](https://github.com/vector-im/vector-web/pull/2443)
* Don't stop paginating if no rooms match
[\#2422](https://github.com/vector-im/vector-web/pull/2422)
Changes in [0.8.2](https://github.com/vector-im/vector-web/releases/tag/v0.8.2) (2016-10-05)
============================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.8.1...v0.8.2)
* Add native joining of 3p networks to room dir
[\#2379](https://github.com/vector-im/vector-web/pull/2379)
* Update to linkify 2.1.3
[\#2406](https://github.com/vector-im/vector-web/pull/2406)
* Use 'Sign In' / 'Sign Out' universally
[\#2383](https://github.com/vector-im/vector-web/pull/2383)
* Prevent network dropdown resizing slightly
[\#2382](https://github.com/vector-im/vector-web/pull/2382)
* Room directory: indicate when there are no results
[\#2380](https://github.com/vector-im/vector-web/pull/2380)
* Room dir: New filtering & 3rd party networks
[\#2362](https://github.com/vector-im/vector-web/pull/2362)
* Update linkify version
[\#2359](https://github.com/vector-im/vector-web/pull/2359)
* Directory search join button
[\#2339](https://github.com/vector-im/vector-web/pull/2339)
Changes in [0.8.1](https://github.com/vector-im/vector-web/releases/tag/v0.8.1) (2016-09-21)
============================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.8.0...v0.8.1)
Changes in [0.8.0](https://github.com/vector-im/vector-web/releases/tag/v0.8.0) (2016-09-21)
============================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.7.5-r3...v0.8.0)
* Dbkr/rebrand
[\#2285](https://github.com/vector-im/vector-web/pull/2285)
* Listen for close_scalar and close the dialog box when received
[\#2282](https://github.com/vector-im/vector-web/pull/2282)
* Revert "improve lipstick and support scalar logout"
[\#2281](https://github.com/vector-im/vector-web/pull/2281)
* improve lipstick and support scalar logout
[\#2280](https://github.com/vector-im/vector-web/pull/2280)
* Fix changelog links
[\#2071](https://github.com/vector-im/vector-web/pull/2071)
* Paginate Room Directory
[\#2241](https://github.com/vector-im/vector-web/pull/2241)
* Make redeploy script symlink config
[\#2240](https://github.com/vector-im/vector-web/pull/2240)
* Update the version of olm to 1.3.0
[\#2210](https://github.com/vector-im/vector-web/pull/2210)
* Directory network selector
[\#2219](https://github.com/vector-im/vector-web/pull/2219)
* Wmwragg/two state sublist headers
[\#2235](https://github.com/vector-im/vector-web/pull/2235)
* Wmwragg/correct incoming call positioning
[\#2222](https://github.com/vector-im/vector-web/pull/2222)
* Wmwragg/remove old filter
[\#2211](https://github.com/vector-im/vector-web/pull/2211)
* Wmwragg/multi invite bugfix
[\#2198](https://github.com/vector-im/vector-web/pull/2198)
* Wmwragg/chat multi invite
[\#2181](https://github.com/vector-im/vector-web/pull/2181)
* shuffle bottomleftmenu around a bit
[\#2182](https://github.com/vector-im/vector-web/pull/2182)
* Improve autocomplete behaviour (styling)
[\#2175](https://github.com/vector-im/vector-web/pull/2175)
* First wave of E2E visuals
[\#2163](https://github.com/vector-im/vector-web/pull/2163)
* FilePanel and NotificationPanel support
[\#2113](https://github.com/vector-im/vector-web/pull/2113)
* Cursor: pointer on member info create room button
[\#2151](https://github.com/vector-im/vector-web/pull/2151)
* Support for adding DM rooms to the MemberInfo Panel
[\#2147](https://github.com/vector-im/vector-web/pull/2147)
* Wmwragg/one to one indicators
[\#2139](https://github.com/vector-im/vector-web/pull/2139)
* Added back the Directory listing button, with new tootlip
[\#2136](https://github.com/vector-im/vector-web/pull/2136)
* wmwragg/chat invite dialog fix
[\#2134](https://github.com/vector-im/vector-web/pull/2134)
* Wmwragg/one to one chat
[\#2110](https://github.com/vector-im/vector-web/pull/2110)
* Support toggling DM status of rooms
[\#2111](https://github.com/vector-im/vector-web/pull/2111)
* Formatting toolbar for RTE message composer.
[\#2082](https://github.com/vector-im/vector-web/pull/2082)
* jenkins.sh: install olm from jenkins artifacts
[\#2092](https://github.com/vector-im/vector-web/pull/2092)
* e2e device CSS
[\#2085](https://github.com/vector-im/vector-web/pull/2085)
* Bump to olm 1.1.0
[\#2069](https://github.com/vector-im/vector-web/pull/2069)
* Improve readability of the changelog dialog
[\#2056](https://github.com/vector-im/vector-web/pull/2056)
* Turn react consistency checks back on in develop builds
[\#2009](https://github.com/vector-im/vector-web/pull/2009)
* Wmwragg/direct chat sublist
[\#2028](https://github.com/vector-im/vector-web/pull/2028)
Changes in [0.7.5-r3](https://github.com/vector-im/vector-web/releases/tag/v0.7.5-r3) (2016-09-02)
==================================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.7.5-r2...v0.7.5-r3)
* Bump to matrix-react-sdk 0.6.5-r3 in order to fix bug #2020 (tightloop when flooded with join events)
Changes in [0.7.5-r2](https://github.com/vector-im/vector-web/releases/tag/v0.7.5-r2) (2016-09-01)
==================================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.7.5-r1...v0.7.5-r2)
* Bump to matrix-react-sdk 0.6.5-r1 in order to fix guest access
Changes in [0.7.5-r1](https://github.com/vector-im/vector-web/releases/tag/v0.7.5-r1) (2016-08-28)
==================================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.7.5...v0.7.5-r1)
* Correctly pin deps :(
Changes in [0.7.5](https://github.com/vector-im/vector-web/releases/tag/v0.7.5) (2016-08-28)
============================================================================================
[Full Changelog](https://github.com/vector-im/vector-web/compare/v0.7.4-r1...v0.7.5)

218
README.md
View File

@@ -1,67 +1,86 @@
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/vector-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!
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/vector-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. Switch to the vector-web directory: `cd vector-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,37 +91,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. `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. `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/download/desktop/ 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:
```
npm install
npm install electron
npm run build
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:
```
npm install
npm run build
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.
@@ -111,26 +176,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
(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.
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.
@@ -153,7 +218,7 @@ 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`
@@ -178,25 +243,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
===============
@@ -222,22 +281,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.

13
config.sample.json Normal file
View File

@@ -0,0 +1,13 @@
{
"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",
"enableLabs": true,
"roomDirectory": {
"servers": [
"matrix.org"
]
}
}

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

BIN
electron/img/riot.png Normal file

Binary file not shown.

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

@@ -0,0 +1,72 @@
{
"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": "https://scalar.vector.im/",
"integrations_rest_url": "https://scalar.vector.im/api",
"enableLabs": true,
"roomDirectory": {
"servers": [
"matrix.org"
],
"serverConfig": {
"matrix.org": {
"networks": [
"_matrix",
"gitter",
"irc:freenode",
"irc:mozilla",
"irc:snoonet",
"irc:oftc"
]
}
},
"networks": {
"gitter": {
"protocol": "gitter",
"portalRoomPattern": "#gitter_.*:matrix.org",
"name": "Gitter",
"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": "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": "https://matrix.org/_matrix/media/v1/download/matrix.org/DHLHpDDgWNNejFmrewvwEAHX",
"example": "#channel",
"nativePattern": "^#[^\\s]+$"
},
"irc:snoonet": {
"protocol": "irc",
"domain": "ipv6-irc.snoonet.org",
"portalRoomPattern": "#_snoonet_.*:matrix.org",
"name": "Snoonet",
"icon": "https://matrix.org/_matrix/media/v1/download/matrix.org/DHLHpDDgWNNejFmrewvwEAHX",
"example": "#channel",
"nativePattern": "^#[^\\s]+$"
},
"irc:oftc": {
"protocol": "irc",
"domain": "irc.oftc.net",
"portalRoomPattern": "#_oftc_.*:matrix.org",
"name": "OFTC",
"icon": "https://matrix.org/_matrix/media/v1/download/matrix.org/DHLHpDDgWNNejFmrewvwEAHX",
"example": "#channel",
"nativePattern": "^#[^\\s]+$"
}
}
}
}

View File

@@ -0,0 +1,216 @@
// @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 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') {
electron.autoUpdater.setFeedURL(update_base_url + 'macos/');
} 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');
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,
});
mainWindow.loadURL(`file://${__dirname}/../../webapp/index.html`);
electron.Menu.setApplicationMenu(VectorMenu);
mainWindow.once('ready-to-show', () => {
mainWindow.show();
});
mainWindow.on('closed', () => {
mainWindow = null;
});
mainWindow.on('close', (e) => {
if (process.platform == 'darwin' && !appQuitting) {
// 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,35 @@
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;

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

@@ -92,13 +92,7 @@ module.exports = function (config) {
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: [

View File

@@ -1,76 +1,105 @@
{
"name": "vector-web",
"version": "0.7.5",
"description": "Vector webapp",
"author": "matrix.org",
"name": "riot-web",
"productName": "Riot",
"main": "electron/src/electron-main.js",
"version": "0.9.6",
"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:css": "mkdirp build && catw \"src/skins/vector/css/**/*.css\" -o build/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": "NODE_ENV=production 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:css && npm run build:bundle",
"build:dev": "node scripts/babelcheck.js && npm run build:res && npm run build:css && npm run build:bundle:dev",
"dist": "scripts/package.sh",
"start:res": "node scripts/copy-res.js -w",
"start:js": "webpack-dev-server -w --progress",
"start:js:prod": "NODE_ENV=production webpack-dev-server -w --progress",
"start:css": "mkdirp build && catw \"src/skins/vector/css/**/*.css\" -o build/components.css",
"start": "node scripts/babelcheck.js && parallelshell \"npm run start:res\" \"npm run start:js\" \"npm run start:css\"",
"start:prod": "parallelshell \"npm run start:res\" \"npm run start:js:prod\" \"npm run start:css\"",
"clean": "rimraf build 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"
},
"dependencies": {
"babel-polyfill": "^6.5.0",
"babel-runtime": "^6.11.6",
"browser-request": "^0.3.3",
"classnames": "^2.1.2",
"draft-js": "^0.7.0",
"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.0.0-beta.4",
"matrix-js-sdk": "0.5.6",
"matrix-react-sdk": "0.6.5",
"linkifyjs": "^2.1.3",
"matrix-js-sdk": "0.7.4",
"matrix-react-sdk": "0.8.5",
"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",
"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",
"catw": "^1.0.1",
"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",
"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",
@@ -80,16 +109,45 @@
"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",
"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.0.0.tgz"
"olm": "https://matrix.org/packages/npm/olm/olm-2.1.0.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"
},
"win": {
"target": "squirrel"
}
},
"directories": {
"buildResources": "electron/build",
"output": "electron/dist"
}
}

1
release_config.yaml Normal file
View File

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

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

@@ -1,5 +1,5 @@
{
"name": "Vector",
"name": "Riot",
"icons": [
{
"src": "\/icons\/android-chrome-36x36.png",

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);

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

@@ -13,17 +13,20 @@ 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
# we may be using a dev branch of react-sdk, in which case we need to build it
# 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
# 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 run build)
(cd node_modules/matrix-react-sdk && npm run build)
# run the mocha tests
npm run test
# build our artifacts; dumps them in ./vector
npm run build:dev
# 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
@@ -33,4 +36,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"

View File

@@ -5,15 +5,15 @@ from urlparse import urljoin
from flask import Flask, jsonify, request, abort
app = Flask(__name__)
arg_jenkins_url, arg_extract_path, arg_should_clean, arg_symlink = (
None, None, None, None
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):
for chunk in r.iter_content(chunk_size=1024):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
return local_filename
@@ -107,27 +107,46 @@ def on_receive_jenkins_poke():
)
print("Retrieving .tar.gz file: %s" % tar_gz_url)
# 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.
filename = download_file(tar_gz_url)
print("Downloaded file: %s" % filename)
try:
# 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))
if os.path.exists(build_dir):
abort(400, "Not deploying. We have previously deployed this build.")
return
os.mkdir(build_dir)
untar_to(filename, build_dir)
print("Extracted to: %s" % build_dir)
finally:
if arg_should_clean:
os.remove(filename)
name_str = filename.replace(".tar.gz", "")
untar_location = os.path.join(arg_extract_path, name_str)
untar_to(filename, untar_location)
extracted_dir = os.path.join(build_dir, name_str)
if arg_should_clean:
os.remove(filename)
if arg_config_location:
create_symlink(source=arg_config_location, linkname=os.path.join(extracted_dir, 'config.json'))
# 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)
create_symlink(source=extracted_dir, linkname=arg_symlink)
return jsonify({})
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."
)
@@ -154,6 +173,12 @@ if __name__ == "__main__":
to the /vector directory INSIDE the tarball."
)
)
parser.add_argument(
"--config", dest="config", help=(
"Write a symlink to config.json in the extracted tarball. \
To this location."
)
)
args = parser.parse_args()
if args.jenkins.endswith("/"): # important for urljoin
arg_jenkins_url = args.jenkins
@@ -162,9 +187,10 @@ if __name__ == "__main__":
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" %
"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)
" (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)

View File

@@ -26,32 +26,61 @@ 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.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.BottomLeftMenuTile'] = require('./components/views/rooms/BottomLeftMenuTile');
module.exports.components['views.rooms.RoomDNDView'] = require('./components/views/rooms/RoomDNDView');
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';
module.exports.components['structures.BottomLeftMenu'] = structures$BottomLeftMenu;
import structures$CompatibilityPage from './components/structures/CompatibilityPage';
module.exports.components['structures.CompatibilityPage'] = structures$CompatibilityPage;
import structures$LeftPanel from './components/structures/LeftPanel';
module.exports.components['structures.LeftPanel'] = structures$LeftPanel;
import structures$RightPanel from './components/structures/RightPanel';
module.exports.components['structures.RightPanel'] = structures$RightPanel;
import structures$RoomDirectory from './components/structures/RoomDirectory';
module.exports.components['structures.RoomDirectory'] = structures$RoomDirectory;
import structures$RoomSubList from './components/structures/RoomSubList';
module.exports.components['structures.RoomSubList'] = structures$RoomSubList;
import structures$SearchBox from './components/structures/SearchBox';
module.exports.components['structures.SearchBox'] = structures$SearchBox;
import structures$ViewSource from './components/structures/ViewSource';
module.exports.components['structures.ViewSource'] = structures$ViewSource;
import views$context_menus$MessageContextMenu from './components/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';
module.exports.components['views.context_menus.NotificationStateContextMenu'] = views$context_menus$NotificationStateContextMenu;
import views$context_menus$RoomTagContextMenu from './components/views/context_menus/RoomTagContextMenu';
module.exports.components['views.context_menus.RoomTagContextMenu'] = views$context_menus$RoomTagContextMenu;
import views$dialogs$ChangelogDialog from './components/views/dialogs/ChangelogDialog';
module.exports.components['views.dialogs.ChangelogDialog'] = views$dialogs$ChangelogDialog;
import views$directory$NetworkDropdown from './components/views/directory/NetworkDropdown';
module.exports.components['views.directory.NetworkDropdown'] = views$directory$NetworkDropdown;
import views$elements$ImageView from './components/views/elements/ImageView';
module.exports.components['views.elements.ImageView'] = views$elements$ImageView;
import views$elements$Spinner from './components/views/elements/Spinner';
module.exports.components['views.elements.Spinner'] = views$elements$Spinner;
import views$globals$GuestWarningBar from './components/views/globals/GuestWarningBar';
module.exports.components['views.globals.GuestWarningBar'] = views$globals$GuestWarningBar;
import views$globals$MatrixToolbar from './components/views/globals/MatrixToolbar';
module.exports.components['views.globals.MatrixToolbar'] = views$globals$MatrixToolbar;
import views$globals$NewVersionBar from './components/views/globals/NewVersionBar';
module.exports.components['views.globals.NewVersionBar'] = views$globals$NewVersionBar;
import views$login$VectorCustomServerDialog from './components/views/login/VectorCustomServerDialog';
module.exports.components['views.login.VectorCustomServerDialog'] = views$login$VectorCustomServerDialog;
import views$login$VectorLoginFooter from './components/views/login/VectorLoginFooter';
module.exports.components['views.login.VectorLoginFooter'] = views$login$VectorLoginFooter;
import views$login$VectorLoginHeader from './components/views/login/VectorLoginHeader';
module.exports.components['views.login.VectorLoginHeader'] = views$login$VectorLoginHeader;
import views$messages$DateSeparator from './components/views/messages/DateSeparator';
module.exports.components['views.messages.DateSeparator'] = views$messages$DateSeparator;
import views$messages$MessageTimestamp from './components/views/messages/MessageTimestamp';
module.exports.components['views.messages.MessageTimestamp'] = views$messages$MessageTimestamp;
import views$rooms$DNDRoomTile from './components/views/rooms/DNDRoomTile';
module.exports.components['views.rooms.DNDRoomTile'] = views$rooms$DNDRoomTile;
import views$rooms$RoomDropTarget from './components/views/rooms/RoomDropTarget';
module.exports.components['views.rooms.RoomDropTarget'] = views$rooms$RoomDropTarget;
import views$rooms$RoomTooltip from './components/views/rooms/RoomTooltip';
module.exports.components['views.rooms.RoomTooltip'] = views$rooms$RoomTooltip;
import views$rooms$SearchBar from './components/views/rooms/SearchBar';
module.exports.components['views.rooms.SearchBar'] = views$rooms$SearchBar;
import views$settings$IntegrationsManager from './components/views/settings/IntegrationsManager';
module.exports.components['views.settings.IntegrationsManager'] = views$settings$IntegrationsManager;
import views$settings$Notifications from './components/views/settings/Notifications';
module.exports.components['views.settings.Notifications'] = views$settings$Notifications;

View File

@@ -17,48 +17,105 @@ limitations under the License.
'use strict';
var React = require('react');
var ReactDOM = require('react-dom');
var sdk = require('matrix-react-sdk')
var dis = require('matrix-react-sdk/lib/dispatcher');
module.exports = React.createClass({
displayName: 'BottomLeftMenu',
propTypes: {
collapsed: React.PropTypes.bool.isRequired,
},
getInitialState: function() {
return({
directoryHover : false,
roomsHover : false,
peopleHover : false,
settingsHover : false,
});
},
// Room events
onDirectoryClick: function() {
dis.dispatch({ action: 'view_room_directory' });
},
onDirectoryMouseEnter: function() {
this.setState({ directoryHover: true });
},
onDirectoryMouseLeave: function() {
this.setState({ directoryHover: false });
},
onRoomsClick: function() {
dis.dispatch({ action: 'view_create_room' });
},
onRoomsMouseEnter: function() {
this.setState({ roomsHover: true });
},
onRoomsMouseLeave: function() {
this.setState({ roomsHover: false });
},
// People events
onPeopleClick: function() {
dis.dispatch({ action: 'view_create_chat' });
},
onPeopleMouseEnter: function() {
this.setState({ peopleHover: true });
},
onPeopleMouseLeave: function() {
this.setState({ peopleHover: false });
},
// Settings events
onSettingsClick: function() {
dis.dispatch({action: 'view_user_settings'});
dis.dispatch({ action: 'view_user_settings' });
},
onRoomDirectoryClick: function() {
dis.dispatch({action: 'view_room_directory'});
onSettingsMouseEnter: function() {
this.setState({ settingsHover: true });
},
onCreateRoomClick: function() {
dis.dispatch({action: 'view_create_room'});
onSettingsMouseLeave: function() {
this.setState({ settingsHover: false });
},
getLabel: function(name) {
if (!this.props.collapsed) {
return <div className="mx_RoomTile_name">{name}</div>
}
else if (this.state.hover) {
// Get the label/tooltip to show
getLabel: function(label, show) {
if (show) {
var RoomTooltip = sdk.getComponent("rooms.RoomTooltip");
return <RoomTooltip name={name}/>;
return <RoomTooltip className="mx_BottomLeftMenu_tooltip" label={label} />;
}
},
render: function() {
var BottomLeftMenuTile = sdk.getComponent('rooms.BottomLeftMenuTile');
var TintableSvg = sdk.getComponent('elements.TintableSvg');
return (
<div className="mx_BottomLeftMenu">
<div className="mx_BottomLeftMenu_options">
<div className="mx_BottomLeftMenu_createRoom" title="Start chat" onClick={ this.onCreateRoomClick }>
<TintableSvg src="img/icons-create-room.svg" width="25" height="25"/>
<div 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" title="Room directory" onClick={ this.onRoomDirectoryClick }>
<div 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_settings" title="Settings" onClick={ this.onSettingsClick }>
<TintableSvg src="img/icons-settings.svg" width="25" height="25"/>
<div 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 } >
<TintableSvg src="img/icons-settings.svg" width="25" height="25" />
{ this.getLabel("Settings", this.state.settingsHover) }
</div>
</div>
</div>

View File

@@ -39,16 +39,14 @@ module.exports = React.createClass({
return (
<div className="mx_CompatibilityPage">
<div className="mx_CompatibilityPage_box">
<p>Sorry, your browser is <b>not</b> able to run Vector.</p>
<p>Sorry, your browser is <b>not</b> able to run Riot.</p>
<p>
Vector uses many advanced browser features, some of which are not
Riot uses many advanced browser features, some of which are not
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

@@ -109,7 +109,7 @@ var LeftPanel = React.createClass({
var CallView = sdk.getComponent('voip.CallView');
callPreview = (
<CallView
className="mx_LeftPanel_callView" onClick={this.onCallViewClick}
className="mx_LeftPanel_callView" showVoice={true} onClick={this.onCallViewClick}
ConferenceHandler={VectorConferenceHandler} />
);
}

View File

@@ -22,13 +22,21 @@ var Matrix = require("matrix-js-sdk");
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');
module.exports = React.createClass({
displayName: 'RightPanel',
propTypes: {
userId: React.PropTypes.string, // if showing an orphaned MemberInfo page, this is set
roomId: React.PropTypes.string, // if showing panels for a given room, this is set
collapsed: React.PropTypes.bool, // currently unused property to request for a minimized view of the panel
},
Phase : {
MemberList: 'MemberList',
FileList: 'FileList',
FilePanel: 'FilePanel',
NotificationPanel: 'NotificationPanel',
MemberInfo: 'MemberInfo',
},
@@ -61,7 +69,7 @@ module.exports = React.createClass({
},
onMemberListButtonClick: function() {
if (this.props.collapsed) {
if (this.props.collapsed || this.state.phase !== this.Phase.MemberList) {
this.setState({ phase: this.Phase.MemberList });
dis.dispatch({
action: 'show_right_panel',
@@ -74,6 +82,51 @@ module.exports = React.createClass({
}
},
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',
});
}
},
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',
});
}
},
onInviteButtonClick: function() {
if (MatrixClientPeg.get().isGuest()) {
var NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog");
Modal.createDialog(NeedToRegisterDialog, {
title: "Please Register",
description: "Guest users can't invite users. Please register to invite."
});
return;
}
// call ChatInviteDialog
dis.dispatch({
action: 'view_invite',
roomId: this.props.roomId,
});
},
onRoomStateMember: function(ev, state, member) {
// redraw the badge on the membership list
if (this.state.phase == this.Phase.MemberList && member.roomId === this.props.roomId) {
@@ -118,42 +171,70 @@ module.exports = React.createClass({
render: function() {
var MemberList = sdk.getComponent('rooms.MemberList');
var NotificationPanel = sdk.getComponent('structures.NotificationPanel');
var FilePanel = sdk.getComponent('structures.FilePanel');
var TintableSvg = sdk.getComponent("elements.TintableSvg");
var buttonGroup;
var inviteGroup;
var panel;
var filesHighlight;
var membersHighlight;
var notificationsHighlight;
if (!this.props.collapsed) {
if (this.state.phase == this.Phase.MemberList || this.state.phase === this.Phase.MemberInfo) {
membersHighlight = <div className="mx_RightPanel_headerButton_highlight"></div>;
}
else if (this.state.phase == this.Phase.FileList) {
else if (this.state.phase == this.Phase.FilePanel) {
filesHighlight = <div className="mx_RightPanel_headerButton_highlight"></div>;
}
else if (this.state.phase == this.Phase.NotificationPanel) {
notificationsHighlight = <div className="mx_RightPanel_headerButton_highlight"></div>;
}
}
var membersBadge;
if ((this.state.phase == this.Phase.MemberList || this.state.phase === this.Phase.MemberInfo) && this.props.roomId) {
var cli = MatrixClientPeg.get();
var room = cli.getRoom(this.props.roomId);
var user_is_in_room;
if (room) {
membersBadge = <div className="mx_RightPanel_headerButton_badge">{ room.getJoinedMembers().length }</div>;
membersBadge = room.getJoinedMembers().length;
user_is_in_room = room.hasMembershipState(
MatrixClientPeg.get().credentials.userId, 'join'
);
}
if (user_is_in_room) {
inviteGroup =
<div 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>;
}
}
if (this.props.roomId) {
buttonGroup =
<div className="mx_RightPanel_headerButtonGroup">
<div className="mx_RightPanel_headerButton" title="Members" onClick={ this.onMemberListButtonClick }>
{ membersBadge }
<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">
<TintableSvg src="img/files.svg" width="17" height="22"/>
<div 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 }>
<div className="mx_RightPanel_headerButton_badge">&nbsp;</div>
<TintableSvg src="img/icons-notifications.svg" width="25" height="25"/>
{ notificationsHighlight }
</div>
</div>;
}
@@ -165,6 +246,12 @@ module.exports = React.createClass({
var MemberInfo = sdk.getComponent('rooms.MemberInfo');
panel = <MemberInfo member={this.state.member} key={this.props.roomId || this.props.userId} />
}
else if (this.state.phase == this.Phase.NotificationPanel) {
panel = <NotificationPanel />
}
else if (this.state.phase == this.Phase.FilePanel) {
panel = <FilePanel roomId={this.props.roomId} />
}
}
if (!panel) {
@@ -183,6 +270,7 @@ module.exports = React.createClass({
</div>
{ panel }
<div className="mx_RightPanel_footer">
{ inviteGroup }
</div>
</aside>
);

View File

@@ -29,21 +29,62 @@ var linkify = require('linkifyjs');
var linkifyString = require('linkifyjs/string');
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({
displayName: 'RoomDirectory',
propTypes: {
config: React.PropTypes.object,
},
getDefaultProps: function() {
return {
config: {},
}
},
getInitialState: function() {
return {
publicRooms: [],
roomAlias: '',
loading: true,
protocolsLoading: true,
instanceId: null,
includeAll: false,
roomServer: null,
filterString: null,
}
},
componentWillMount: function() {
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
// thing you see when loading the client!
return;
}
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to get protocol list from Home Server",
description: "The Home Server may be too old to support third party networks",
});
});
// dis.dispatch({
// action: 'ui_opacity',
// sideOpacity: 0.3,
@@ -51,10 +92,6 @@ module.exports = React.createClass({
// });
},
componentDidMount: function() {
this.getPublicRooms();
},
componentWillUnmount: function() {
// dis.dispatch({
// action: 'ui_opacity',
@@ -63,24 +100,70 @@ module.exports = React.createClass({
// });
},
getPublicRooms: function() {
var self = this;
MatrixClientPeg.get().publicRooms(function (err, data) {
if (err) {
self.setState({ loading: false });
console.error("Failed to get publicRooms: %s", JSON.stringify(err));
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to get public room list",
description: err.message
});
refreshRoomList: function() {
this.nextBatch = null;
this.setState({
publicRooms: [],
loading: true,
});
this.getMoreRooms().done();
},
getMoreRooms: function() {
if (!MatrixClientPeg.get()) return q();
const my_filter_string = this.state.filterString;
const my_server = this.state.roomServer;
// remember the next batch token when we sent the request
// too. If it's changed, appending to the list will corrupt it.
const my_next_batch = this.nextBatch;
const opts = {limit: 20};
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) => {
if (
my_filter_string != this.state.filterString ||
my_server != this.state.roomServer ||
my_next_batch != this.nextBatch)
{
// if the filter or server has changed since this request was sent,
// throw away the result (don't even clear the busy flag
// since we must still have a request in flight)
return;
}
else {
self.setState({
publicRooms: data.chunk,
loading: false,
});
this.nextBatch = data.next_batch;
this.setState((s) => {
s.publicRooms.push(...data.chunk);
s.loading = false;
return s;
});
return Boolean(data.next_batch);
}, (err) => {
if (
my_filter_string != this.state.filterString ||
my_server != this.state.roomServer ||
my_next_batch != this.nextBatch)
{
// as above: we don't care about errors for old
// requests either
return;
}
this.setState({ loading: false });
console.error("Failed to get publicRooms: %s", JSON.stringify(err));
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to get public room list",
description: err.message
});
});
},
@@ -121,10 +204,10 @@ module.exports = React.createClass({
return MatrixClientPeg.get().deleteAlias(alias);
}).done(() => {
modal.close();
this.getPublicRooms();
this.refreshRoomList();
}, function(err) {
modal.close();
this.getPublicRooms();
this.refreshRoomList();
Modal.createDialog(ErrorDialog, {
title: "Failed to "+step,
description: err.toString()
@@ -143,6 +226,103 @@ module.exports = React.createClass({
}
},
onOptionChange: function(server, instanceId, includeAll) {
// clear next batch so we don't try to load more rooms
this.nextBatch = null;
this.setState({
// Clear the public rooms out here otherwise we needlessly
// spend time filtering lots of rooms when we're about to
// to clear the list anyway.
publicRooms: [],
roomServer: server,
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
// for very long, and we may have fetched a thousand rooms to
// find the five gitter ones, at which point we do not want
// to render all those rooms when switching back to 'all networks'.
// Easiest to just blow away the state & re-fetch.
},
onFillRequest: function(backwards) {
if (backwards || !this.nextBatch) return q(false);
return this.getMoreRooms();
},
onFilterChange: function(alias) {
this.setState({
filterString: alias || null,
});
// don't send the request for a little bit,
// no point hammering the server with a
// request for every keystroke, let the
// user finish typing.
if (this.filterTimeout) {
clearTimeout(this.filterTimeout);
}
this.filterTimeout = setTimeout(() => {
this.filterTimeout = null;
this.refreshRoomList();
}, 700);
},
onFilterClear: function() {
// update immediately
this.setState({
filterString: null,
}, this.refreshRoomList);
if (this.filterTimeout) {
clearTimeout(this.filterTimeout);
}
},
onJoinClick: function(alias) {
// 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 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, {
title: "Unable to join network",
description: "Riot does not know how to join a room on this network",
});
return;
}
MatrixClientPeg.get().getThirdpartyLocation(protocolName, fields).done((resp) => {
if (resp.length > 0 && resp[0].alias) {
this.showRoomAlias(resp[0].alias);
} else {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Room not found",
description: "Couldn't find a matching Matrix room",
});
}
}, (e) => {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Fetching third party location failed",
description: "Unable to look up room ID from server",
});
});
}
},
showRoomAlias: function(alias) {
this.showRoom(null, alias);
},
@@ -187,20 +367,12 @@ module.exports = React.createClass({
dis.dispatch(payload);
},
getRows: function(filter) {
getRows: function() {
var BaseAvatar = sdk.getComponent('avatars.BaseAvatar');
if (!this.state.publicRooms) return [];
var rooms = this.state.publicRooms.filter(function(a) {
// FIXME: if incrementally typing, keep narrowing down the search set
// incrementally rather than starting over each time.
return (((a.name && a.name.toLowerCase().search(filter.toLowerCase()) >= 0) ||
(a.aliases && a.aliases[0].toLowerCase().search(filter.toLowerCase()) >= 0)) &&
a.num_joined_members > 0);
}).sort(function(a,b) {
return a.num_joined_members - b.num_joined_members;
});
var rooms = this.state.publicRooms;
var rows = [];
var self = this;
var guestRead, guestJoin, perms;
@@ -228,7 +400,7 @@ module.exports = React.createClass({
var topic = rooms[i].topic || '';
topic = linkifyString(sanitizeHtml(topic));
rows.unshift(
rows.push(
<tr key={ rooms[i].room_id }
onClick={self.onRoomClicked.bind(self, rooms[i])}
// cancel onMouseDown otherwise shift-clicking highlights text
@@ -258,37 +430,124 @@ module.exports = React.createClass({
return rows;
},
onKeyUp: function(ev) {
this.forceUpdate();
this.setState({ roomAlias : this.refs.roomAlias.value })
if (ev.key == "Enter") {
this.showRoomAlias(this.refs.roomAlias.value);
collectScrollPanel: function(element) {
this.scrollPanel = element;
},
_stringLooksLikeId: function(s, field_type) {
let pat = /^#[^\s]+:[^\s]/;
if (field_type && field_type.regexp) {
pat = new RegExp(field_type.regexp);
}
return pat.test(s);
},
_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 requiredFields = protocol.location_fields;
if (!requiredFields) return null;
const fields = {};
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[requiredFields[requiredFields.length - 1]] = userInput;
return fields;
},
render: function() {
if (this.state.loading) {
var Loader = sdk.getComponent("elements.Spinner");
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>
);
}
var SimpleRoomHeader = sdk.getComponent('rooms.SimpleRoomHeader');
let content;
if (this.state.loading) {
content = <div className="mx_RoomDirectory">
<Loader />
</div>;
} else {
const rows = this.getRows();
// we still show the scrollpanel, at least for now, because
// otherwise we don't fetch more because we don't get a fill
// request from the scrollpanel because there isn't one
let scrollpanel_content;
if (rows.length == 0) {
scrollpanel_content = <i>No rooms to show</i>;
} else {
scrollpanel_content = <table ref="directory_table" className="mx_RoomDirectory_table">
<tbody>
{ this.getRows() }
</tbody>
</table>;
}
const ScrollPanel = sdk.getComponent("structures.ScrollPanel");
content = <ScrollPanel ref={this.collectScrollPanel}
className="mx_RoomDirectory_tableWrapper"
onFillRequest={ this.onFillRequest }
stickyBottom={false}
startAtBottom={false}
onResize={function(){}}
>
{ scrollpanel_content }
</ScrollPanel>;
}
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
) {
const last_field = this.protocols[protocolName].location_fields.slice(-1)[0];
instance_expected_field_type = this.protocols[protocolName].field_types[last_field];
}
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 NetworkDropdown = sdk.getComponent('directory.NetworkDropdown');
const DirectorySearchBox = sdk.getComponent('elements.DirectorySearchBox');
return (
<div className="mx_RoomDirectory">
<SimpleRoomHeader title="Directory" />
<div className="mx_RoomDirectory_list">
<input ref="roomAlias" placeholder="Join a room (e.g. #foo:domain.com)" className="mx_RoomDirectory_input" size="64" onKeyUp={ this.onKeyUp }/>
<GeminiScrollbar className="mx_RoomDirectory_tableWrapper">
<table ref="directory_table" className="mx_RoomDirectory_table">
<tbody>
{ this.getRows(this.state.roomAlias) }
</tbody>
</table>
</GeminiScrollbar>
<div className="mx_RoomDirectory_listheader">
<DirectorySearchBox
className="mx_RoomDirectory_searchbox"
onChange={this.onFilterChange} onClear={this.onFilterClear} onJoinClick={this.onJoinClick}
placeholder={placeholder} showJoinButton={showJoinButton}
/>
<NetworkDropdown config={this.props.config} protocols={this.protocols} onOptionChange={this.onOptionChange} />
</div>
{content}
</div>
</div>
);

View File

@@ -17,15 +17,21 @@ limitations under the License.
'use strict';
var React = require('react');
var ReactDOM = require('react-dom');
var classNames = require('classnames');
var DropTarget = require('react-dnd').DropTarget;
var sdk = require('matrix-react-sdk')
var dis = require('matrix-react-sdk/lib/dispatcher');
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');
// turn this on for drop & drag console debugging galore
var debug = false;
const TRUNCATE_AT = 10;
var roomListTarget = {
canDrop: function() {
return true;
@@ -80,7 +86,7 @@ var RoomSubList = React.createClass({
getInitialState: function() {
return {
hidden: this.props.startAsHidden || false,
truncateAt: 20,
truncateAt: TRUNCATE_AT,
sortedList: [],
};
},
@@ -109,17 +115,34 @@ var RoomSubList = React.createClass({
});
},
onClick: function(ev) {
var isHidden = !this.state.hidden;
this.setState({ hidden : isHidden });
if (isHidden) {
// as good a way as any to reset the truncate state
this.setState({ truncateAt : 20 });
this.props.onShowMoreRooms();
// The header is collapsable if it is hidden or not stuck
// The dataset elements are added in the RoomList _initAndPositionStickyHeaders method
isCollapsableOnClick: function() {
var stuck = this.refs.header.dataset.stuck;
if (this.state.hidden || stuck === undefined || stuck === "none") {
return true;
} else {
return false;
}
},
this.props.onHeaderClick(isHidden);
onClick: function(ev) {
if (this.isCollapsableOnClick()) {
// The header isCollapsable, so the click is to be interpreted as collapse and truncation logic
var isHidden = !this.state.hidden;
this.setState({ hidden : isHidden });
if (isHidden) {
// as good a way as any to reset the truncate state
this.setState({ truncateAt : TRUNCATE_AT });
}
this.props.onShowMoreRooms();
this.props.onHeaderClick(isHidden);
} else {
// The header is stuck, so the click is to be interpreted as a scroll to the header
this.props.onHeaderClick(this.state.hidden, this.refs.header.dataset.originalPosition);
}
},
tsOfNewestEvent: function(room) {
@@ -186,6 +209,52 @@ var RoomSubList = React.createClass({
this.setState({ sortedList: list.sort(comparator) });
},
_shouldShowNotifBadge: function(roomNotifState) {
const showBadgeInStates = [RoomNotifs.ALL_MESSAGES, RoomNotifs.ALL_MESSAGES_LOUD];
return showBadgeInStates.indexOf(roomNotifState) > -1;
},
_shouldShowMentionBadge: function(roomNotifState) {
return roomNotifState != RoomNotifs.MUTE;
},
/**
* Total up all the notification counts from the rooms
*
* @param {Number} If supplied will only total notifications for rooms outside the truncation number
* @returns {Array} The array takes the form [total, highlight] where highlight is a bool
*/
roomNotificationCount: function(truncateAt) {
var self = this;
return this.props.list.reduce(function(result, room, index) {
if (truncateAt === undefined || index >= truncateAt) {
var roomNotifState = RoomNotifs.getRoomNotifsState(room.roomId);
var highlight = room.getUnreadNotificationCount('highlight') > 0 || self.props.label === 'Invites';
var notificationCount = room.getUnreadNotificationCount();
const notifBadges = notificationCount > 0 && self._shouldShowNotifBadge(roomNotifState);
const mentionBadges = highlight && self._shouldShowMentionBadge(roomNotifState);
const badges = notifBadges || mentionBadges;
if (badges) {
result[0] += notificationCount;
if (highlight) {
result[1] = true;
}
}
}
return result;
}, [0, false]);
},
_updateSubListCount: function() {
// Force an update by setting the state to the current state
// Doing it this way rather than using forceUpdate(), so that the shouldComponentUpdate()
// method is honoured
this.setState(this.state);
},
moveRoomTile: function(room, atIndex) {
if (debug) console.log("moveRoomTile: id " + room.roomId + ", atIndex " + atIndex);
//console.log("moveRoomTile before: " + JSON.stringify(this.state.rooms));
@@ -279,12 +348,12 @@ var RoomSubList = React.createClass({
makeRoomTiles: function() {
var self = this;
var RoomTile = sdk.getComponent("rooms.RoomTile");
var DNDRoomTile = sdk.getComponent("rooms.DNDRoomTile");
return this.state.sortedList.map(function(room) {
var selected = room.roomId == self.props.selectedRoom;
// XXX: is it evil to pass in self as a prop to RoomTile?
return (
<RoomTile
<DNDRoomTile
room={ room }
roomSubList={ self }
key={ room.roomId }
@@ -293,32 +362,95 @@ var RoomSubList = React.createClass({
unread={ Unread.doesRoomHaveUnreadMessages(room) }
highlight={ room.getUnreadNotificationCount('highlight') > 0 || self.props.label === 'Invites' }
isInvite={ self.props.label === 'Invites' }
incomingCall={ self.props.incomingCall && (self.props.incomingCall.roomId === room.roomId) ? self.props.incomingCall : null } />
refreshSubList={ self._updateSubListCount }
incomingCall={ null } />
);
});
},
_getHeaderJsx: function() {
var TintableSvg = sdk.getComponent("elements.TintableSvg");
var subListNotifications = this.roomNotificationCount();
var subListNotifCount = subListNotifications[0];
var subListNotifHighlight = subListNotifications[1];
var roomCount = this.props.list.length > 0 ? this.props.list.length : '';
var chevronClasses = classNames({
'mx_RoomSubList_chevron': true,
'mx_RoomSubList_chevronRight': this.state.hidden,
'mx_RoomSubList_chevronDown': !this.state.hidden,
});
var badgeClasses = classNames({
'mx_RoomSubList_badge': true,
'mx_RoomSubList_badgeHighlight': subListNotifHighlight,
});
var badge;
if (subListNotifCount > 0) {
badge = <div className={badgeClasses}>{ FormattingUtils.formatCount(subListNotifCount) }</div>;
}
// When collapsed, allow a long hover on the header to show user
// the full tag name and room count
var title;
if (this.props.collapsed) {
title = this.props.label;
if (roomCount !== '') {
title += " [" + roomCount + "]";
}
}
var incomingCall;
if (this.props.incomingCall) {
var self = this;
// Check if the incoming call is for this section
var incomingCallRoom = this.state.sortedList.filter(function(room) {
return self.props.incomingCall.roomId === room.roomId;
});
if (incomingCallRoom.length === 1) {
var IncomingCallBox = sdk.getComponent("voip.IncomingCallBox");
incomingCall = <IncomingCallBox className="mx_RoomSubList_incomingCall" incomingCall={ this.props.incomingCall }/>;
}
}
return (
<h2 onClick={ this.onClick } className="mx_RoomSubList_label">
{ this.props.collapsed ? '' : this.props.label }
<img className="mx_RoomSubList_chevron"
src={ this.state.hidden ? "img/list-close.svg" : "img/list-open.svg" }
width="10" height="10" />
</h2>
<div className="mx_RoomSubList_labelContainer" title={ title } ref="header">
<div onClick={ this.onClick } className="mx_RoomSubList_label">
{ this.props.collapsed ? '' : this.props.label }
<div className="mx_RoomSubList_roomCount">{ roomCount }</div>
<div className={chevronClasses}></div>
{ badge }
{ incomingCall }
</div>
</div>
);
},
_createOverflowTile: function(overflowCount, totalCount) {
var BaseAvatar = sdk.getComponent('avatars.BaseAvatar');
// XXX: this is duplicated from RoomTile - factor it out
var content = <div className="mx_RoomSubList_chevronDown"></div>;
var overflowNotifications = this.roomNotificationCount(TRUNCATE_AT);
var overflowNotifCount = overflowNotifications[0];
var overflowNotifHighlight = overflowNotifications[1];
if (overflowNotifCount && !this.props.collapsed) {
content = FormattingUtils.formatCount(overflowNotifCount);
}
var badgeClasses = classNames({
'mx_RoomSubList_moreBadge': true,
'mx_RoomSubList_moreBadgeNotify': overflowNotifCount && !this.props.collapsed,
'mx_RoomSubList_moreBadgeHighlight': overflowNotifHighlight && !this.props.collapsed,
});
return (
<div className="mx_RoomTile mx_RoomTile_ellipsis" onClick={this._showFullMemberList}>
<div className="mx_RoomTile_avatar">
<BaseAvatar url="img/ellipsis.svg" name="..." width={24} height={24} />
</div>
<div className="mx_RoomTile_name">and { overflowCount } others...</div>
<div 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>
);
},
@@ -327,7 +459,9 @@ var RoomSubList = React.createClass({
this.setState({
truncateAt: -1
});
this.props.onShowMoreRooms();
this.props.onHeaderClick(false);
},
// Fix any undefined order elements of a room in a manual ordered list

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

@@ -20,9 +20,10 @@ var React = require('react');
var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var dis = require('matrix-react-sdk/lib/dispatcher');
var sdk = require('matrix-react-sdk')
var sdk = require('matrix-react-sdk');
var Modal = require('matrix-react-sdk/lib/Modal');
var Resend = require("matrix-react-sdk/lib/Resend");
import * as UserSettingsStore from 'matrix-react-sdk/lib/UserSettingsStore';
module.exports = React.createClass({
displayName: 'MessageContextMenu',
@@ -46,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();
},
@@ -73,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();
},
@@ -84,14 +94,24 @@ module.exports = React.createClass({
if (this.props.onFinished) this.props.onFinished();
},
onQuoteClick: function () {
console.log(this.props.mxEvent);
dis.dispatch({
action: 'quote',
event: this.props.mxEvent,
});
},
render: function() {
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 = (
@@ -123,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 = (
@@ -137,18 +165,38 @@ 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>
);
const quoteButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onQuoteClick}>
Quote
</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

@@ -21,6 +21,8 @@ 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');
module.exports = React.createClass({
displayName: 'RoomTagContextMenu',
@@ -32,9 +34,11 @@ module.exports = React.createClass({
},
getInitialState: function() {
const dmRoomMap = new DMRoomMap(MatrixClientPeg.get());
return {
isFavourite: this.props.room.tags.hasOwnProperty("m.favourite"),
isLowPriority: this.props.room.tags.hasOwnProperty("m.lowpriority"),
isDirectMessage: Boolean(dmRoomMap.getUserIdForRoomId(this.props.room.roomId)),
};
},
@@ -113,6 +117,43 @@ module.exports = React.createClass({
}
},
_onClickDM: function() {
const newIsDirectMessage = !this.state.isDirectMessage;
this.setState({
isDirectMessage: newIsDirectMessage,
});
if (MatrixClientPeg.get().isGuest()) return;
let newTarget;
if (newIsDirectMessage) {
const guessedTarget = Rooms.guessDMRoomTarget(
this.props.room,
this.props.room.getMember(MatrixClientPeg.get().credentials.userId),
);
newTarget = guessedTarget.userId;
} else {
newTarget = null;
}
// give some time for the user to see the icon change first, since
// this will hide the context menu once it completes
q.delay(500).done(() => {
return Rooms.setDMRoom(this.props.room.roomId, newTarget).finally(() => {
// Close the context menu
if (this.props.onFinished) {
this.props.onFinished();
};
}, (err) => {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to set Direct Message status of room",
description: err.toString()
});
});
});
},
_onClickLeave: function() {
// Leave room
dis.dispatch({
@@ -146,27 +187,33 @@ module.exports = React.createClass({
},
render: function() {
var myUserId = MatrixClientPeg.get().credentials.userId;
var myMember = this.props.room.getMember(myUserId);
const myUserId = MatrixClientPeg.get().credentials.userId;
const myMember = this.props.room.getMember(myUserId);
var favouriteClasses = classNames({
const favouriteClasses = classNames({
'mx_RoomTagContextMenu_field': true,
'mx_RoomTagContextMenu_fieldSet': this.state.isFavourite,
'mx_RoomTagContextMenu_fieldDisabled': false,
});
var lowPriorityClasses = classNames({
const lowPriorityClasses = classNames({
'mx_RoomTagContextMenu_field': true,
'mx_RoomTagContextMenu_fieldSet': this.state.isLowPriority,
'mx_RoomTagContextMenu_fieldDisabled': false,
});
var leaveClasses = classNames({
const leaveClasses = classNames({
'mx_RoomTagContextMenu_field': true,
'mx_RoomTagContextMenu_fieldSet': false,
'mx_RoomTagContextMenu_fieldDisabled': false,
});
const dmClasses = classNames({
'mx_RoomTagContextMenu_field': true,
'mx_RoomTagContextMenu_fieldSet': this.state.isDirectMessage,
'mx_RoomTagContextMenu_fieldDisabled': false,
});
if (myMember && myMember.membership === "leave") {
return (
<div>
@@ -190,6 +237,11 @@ module.exports = React.createClass({
<img className="mx_RoomTagContextMenu_icon_set" src="img/icon_context_low_on.svg" width="15" height="15" />
Low Priority
</div>
<div className={ dmClasses } onClick={this._onClickDM} >
<img className="mx_RoomTagContextMenu_icon" src="img/icon_context_person.svg" width="15" height="15" />
<img className="mx_RoomTagContextMenu_icon_set" src="img/icon_context_person_on.svg" width="15" height="15" />
Direct Chat
</div>
<hr className="mx_RoomTagContextMenu_separator" />
<div className={ leaveClasses } onClick={(myMember && myMember.membership === "join") ? this._onClickLeave : null} >
<img className="mx_RoomTagContextMenu_icon" src="img/icon_context_delete.svg" width="15" height="15" />

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});
@@ -41,6 +42,16 @@ 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" rel="noopener">
{commit.commit.message}
</a>
</li>
);
}
render() {
const Spinner = sdk.getComponent('views.elements.Spinner');
const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog');
@@ -50,9 +61,9 @@ export default class ChangelogDialog extends React.Component {
return (
<div key={repo}>
<h2>{repo}</h2>
{this.state[repo].map(commit =>
<div key={commit.commit.url}><a href={commit.commit.url}>{commit.commit.message}</a></div>
)}
<ul>
{this.state[repo].map(this._elementsForCommit)}
</ul>
</div>
)
});

View File

@@ -0,0 +1,237 @@
/*
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.
*/
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) {
super(props);
this.dropdownRootElement = null;
this.ignoreEvent = null;
this.onInputClick = this.onInputClick.bind(this);
this.onRootClick = this.onRootClick.bind(this);
this.onDocumentClick = this.onDocumentClick.bind(this);
this.onMenuOptionClick = this.onMenuOptionClick.bind(this);
this.onInputKeyUp = this.onInputKeyUp.bind(this);
this.collectRoot = this.collectRoot.bind(this);
this.collectInputTextBox = this.collectInputTextBox.bind(this);
this.inputTextBox = null;
const server = MatrixClientPeg.getHomeServerName();
this.state = {
expanded: false,
selectedServer: server,
selectedInstance: null,
includeAllNetworks: false,
};
}
componentWillMount() {
// Listen for all clicks on the document so we can close the
// menu when the user clicks somewhere else
document.addEventListener('click', this.onDocumentClick, false);
// fire this now so the defaults can be set up
this.props.onOptionChange(this.state.selectedServer, this.state.selectedInstance, this.state.includeAllNetworks);
}
componentWillUnmount() {
document.removeEventListener('click', this.onDocumentClick, false);
}
componentDidUpdate() {
if (this.state.expanded && this.inputTextBox) {
this.inputTextBox.focus();
}
}
onDocumentClick(ev) {
// Close the dropdown if the user clicks anywhere that isn't
// within our root element
if (ev !== this.ignoreEvent) {
this.setState({
expanded: false,
});
}
}
onRootClick(ev) {
// This captures any clicks that happen within our elements,
// such that we can then ignore them when they're seen by the
// click listener on the document handler, ie. not close the
// dropdown immediately after opening it.
// NB. We can't just stopPropagation() because then the event
// doesn't reach the React onClick().
this.ignoreEvent = ev;
}
onInputClick(ev) {
this.setState({
expanded: !this.state.expanded,
});
ev.preventDefault();
}
onMenuOptionClick(server, instance, includeAll) {
this.setState({
expanded: false,
selectedServer: server,
selectedInstanceId: instance ? instance.instance_id : null,
includeAll: includeAll,
});
this.props.onOptionChange(server, instance ? instance.instance_id : null, includeAll);
}
onInputKeyUp(e) {
if (e.key == 'Enter') {
this.setState({
expanded: false,
selectedServer: e.target.value,
selectedNetwork: null,
});
this.props.onOptionChange(e.target.value, null);
}
}
collectRoot(e) {
if (this.dropdownRootElement) {
this.dropdownRootElement.removeEventListener('click', this.onRootClick, false);
}
if (e) {
e.addEventListener('click', this.onRootClick, false);
}
this.dropdownRootElement = e;
}
collectInputTextBox(e) {
this.inputTextBox = e;
}
_getMenuOptions() {
const options = [];
let servers = [];
if (this.props.config.servers) {
servers = servers.concat(this.props.config.servers);
}
if (servers.indexOf(MatrixClientPeg.getHomeServerName()) == -1) {
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, 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));
}
}
}
}
}
return options;
}
_makeMenuOption(server, instance, includeAll, handleClicks) {
if (handleClicks === undefined) handleClicks = true;
let icon;
let name;
let span_class;
let key;
if (!instance && includeAll) {
key = server;
name = server;
span_class = 'mx_NetworkDropdown_menu_all';
} else if (!instance) {
key = server + '_all';
name = 'Matrix';
icon = <img src="img/network-matrix.svg" />;
span_class = 'mx_NetworkDropdown_menu_network';
} else {
key = server + '_inst_' + instance.instance_id;
icon = <img src={instance.icon || DEFAULT_ICON_URL} />;
name = instance.desc;
span_class = 'mx_NetworkDropdown_menu_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="mx_NetworkDropdown_menu_network">{name}</span>
</div>
}
render() {
let current_value;
let menu;
if (this.state.expanded) {
const menu_options = this._getMenuOptions();
menu = <div className="mx_NetworkDropdown_menu">
{menu_options}
</div>;
current_value = <input type="text" className="mx_NetworkDropdown_networkoption"
ref={this.collectInputTextBox} onKeyUp={this.onInputKeyUp}
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, instance, this.state.includeAll, false
);
}
return <div className="mx_NetworkDropdown" ref={this.collectRoot}>
<div className="mx_NetworkDropdown_input" onClick={this.onInputClick}>
{current_value}
<span className="mx_NetworkDropdown_arrow"></span>
{menu}
</div>
</div>;
}
}
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 = {
protocols: {},
config: {},
};

View File

@@ -34,7 +34,7 @@ module.exports = React.createClass({
<div className="mx_GuestWarningBar">
<img className="mx_GuestWarningBar_warning" src="img/warning.svg" width="24" height="23" alt="/!\"/>
<div>
You are using Vector as a guest. <a onClick={this.onRegisterClicked}>Register</a> or <a onClick={this.onLoginClicked}>log in</a> to access more rooms and features.
You are Rioting as a guest. <a onClick={this.onRegisterClicked}>Register</a> or <a onClick={this.onLoginClicked}>sign in</a> to access more rooms and features.
</div>
</div>
);

View File

@@ -16,37 +16,79 @@ limitations under the License.
'use strict';
var React = require('react');
var sdk = require('matrix-react-sdk');
import React from 'react';
import sdk from 'matrix-react-sdk';
import Modal from 'matrix-react-sdk/lib/Modal';
import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg';
export default function NewVersionBar(props) {
const onChangelogClicked = () => {
const ChangelogDialog = sdk.getComponent('dialogs.ChangelogDialog');
/**
* Check a version string is compatible with the Changelog
* dialog ([vectorversion]-react-[react-sdk-version]-js-[js-sdk-version])
*/
function checkVersion(ver) {
const parts = ver.split('-');
return parts.length == 5 && parts[1] == 'react' && parts[3] == 'js';
}
Modal.createDialog(ChangelogDialog, {
version: props.version,
newVersion: props.newVersion,
export default React.createClass({
propTypes: {
version: React.PropTypes.string.isRequired,
newVersion: React.PropTypes.string.isRequired,
releaseNotes: React.PropTypes.string,
},
displayReleaseNotes: function(releaseNotes) {
const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog');
Modal.createDialog(QuestionDialog, {
title: "What's New",
description: <pre className="changelog_text">{releaseNotes}</pre>,
button: "Update",
onFinished: (update) => {
if(update) {
window.location.reload();
if(update && PlatformPeg.get()) {
PlatformPeg.get().installUpdate();
}
}
});
};
},
return (
<div className="mx_MatrixToolbar">
<img className="mx_MatrixToolbar_warning" src="img/warning.svg" width="24" height="23" alt="/!\"/>
<div className="mx_MatrixToolbar_content">
A new version of Vector is available. Refresh your browser.
displayChangelog: function() {
const ChangelogDialog = sdk.getComponent('dialogs.ChangelogDialog');
Modal.createDialog(ChangelogDialog, {
version: this.props.version,
newVersion: this.props.newVersion,
onFinished: (update) => {
if(update && PlatformPeg.get()) {
PlatformPeg.get().installUpdate();
}
}
});
},
onUpdateClicked: function() {
PlatformPeg.get().installUpdate();
},
render: function() {
let action_button;
// If we have release notes to display, we display them. Otherwise,
// we display the Changelog Dialog which takes two versions and
// automatically tells you what's changed (provided the versions
// are in the right format)
if (this.props.releaseNotes) {
action_button = <button className="mx_MatrixToolbar_action" onClick={this.displayReleaseNotes}>What's new?</button>;
} else if (checkVersion(this.props.version) && checkVersion(this.props.newVersion)) {
action_button = <button className="mx_MatrixToolbar_action" onClick={this.displayChangelog}>What's new?</button>;
} else if (PlatformPeg.get()) {
action_button = <button className="mx_MatrixToolbar_action" onClick={this.onUpdateClicked}>Update</button>;
}
return (
<div className="mx_MatrixToolbar">
<img className="mx_MatrixToolbar_warning" src="img/warning.svg" width="24" height="23" alt="/!\"/>
<div className="mx_MatrixToolbar_content">
A new version of Riot is available.
</div>
{action_button}
</div>
<button className="mx_MatrixToolbar_action" onClick={onChangelogClicked}>Changelog</button>
</div>
);
}
NewVersionBar.propTypes = {
version: React.PropTypes.string.isRequired,
newVersion: React.PropTypes.string.isRequired,
};
);
}
});

View File

@@ -30,10 +30,10 @@ module.exports = React.createClass({
</div>
<div className="mx_Dialog_content">
<span>
You can use the custom server options to log into other Matrix
You can use the custom server options to sign into other Matrix
servers by specifying a different Home server URL.
<br/>
This allows you to use Vector with an existing Matrix account on
This allows you to use Riot with an existing Matrix account on
a different home server.
<br/>
<br/>

View File

@@ -27,8 +27,8 @@ module.exports = React.createClass({
render: function() {
return (
<div className="mx_Login_links">
<a href="https://medium.com/@Vector">blog</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="https://twitter.com/@VectorCo">twitter</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="https://medium.com/@RiotChat">blog</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="https://twitter.com/@RiotChat">twitter</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="https://github.com/vector-im/vector-web">github</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="https://matrix.org">powered by Matrix</a>
</div>

View File

@@ -27,7 +27,7 @@ module.exports = React.createClass({
render: function() {
return (
<div className="mx_Login_logo">
<img src="img/logo.png" width="249" height="78" alt="vector"/>
<img src="img/logo.png" width="195" height="195" alt="Riot"/>
</div>
);
}

View File

@@ -1,57 +0,0 @@
/*
Copyright 2015, 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.
*/
'use strict';
var React = require('react');
var sdk = require('matrix-react-sdk')
module.exports = React.createClass({
displayName: 'BottomLeftMenuTile',
getInitialState: function() {
return( { hover : false });
},
onMouseEnter: function() {
this.setState( { hover : true });
},
onMouseLeave: function() {
this.setState( { hover : false });
},
render: function() {
var label;
if (!this.props.collapsed) {
label = <div className="mx_RoomTile_name">{ this.props.label }</div>;
}
else if (this.state.hover) {
var RoomTooltip = sdk.getComponent("rooms.RoomTooltip");
label = <RoomTooltip bottom={ true } label={ this.props.label }/>;
}
return (
<div className="mx_RoomTile" onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave} onClick={this.props.onClick}>
<div className="mx_RoomTile_avatar">
<img src={ this.props.img } width="26" height="26"/>
</div>
{ label }
</div>
);
}
});

View File

@@ -25,6 +25,13 @@ var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var sdk = require('matrix-react-sdk');
var RoomTile = require('matrix-react-sdk/lib/components/views/rooms/RoomTile');
/**
* Defines a new Component, DNDRoomTile that wraps RoomTile, making it draggable.
* Requires extra props:
* roomSubList: React.PropTypes.object.isRequired,
* refreshSubList: React.PropTypes.func.isRequired,
*/
/**
* Specifies the drag source contract.
* Only `beginDrag` function is required.
@@ -202,4 +209,3 @@ DragSource('RoomTile', roomTileSource, function(connect, monitor) {
};
})(RoomTile));
module.exports.replaces = 'RoomTile';

View File

@@ -18,42 +18,79 @@ limitations under the License.
var React = require('react');
var ReactDOM = require('react-dom');
var dis = require('matrix-react-sdk/lib/dispatcher');
module.exports = React.createClass({
displayName: 'RoomTooltip',
componentDidMount: function() {
var tooltip = ReactDOM.findDOMNode(this);
if (!this.props.bottom) {
// tell the roomlist about us so it can position us
dis.dispatch({
action: 'view_tooltip',
tooltip: tooltip,
});
}
else {
tooltip.style.top = (70 + tooltip.parentElement.getBoundingClientRect().top) + "px";
tooltip.style.display = "block";
}
propTypes: {
// Alllow the tooltip to be styled by the parent element
className: React.PropTypes.string.isRequired,
// The tooltip is derived from either the room name or a label
room: React.PropTypes.object,
label: React.PropTypes.string,
},
// Create a wrapper for the tooltip outside the parent and attach it to the body element
componentDidMount: function() {
this.tooltipContainer = document.createElement("div");
this.tooltipContainer.className = "mx_RoomTileTooltip_wrapper";
document.body.appendChild(this.tooltipContainer);
this._renderTooltip();
},
componentDidUpdate: function() {
this._renderTooltip();
},
// Remove the wrapper element, as the tooltip has finished using it
componentWillUnmount: function() {
if (!this.props.bottom) {
dis.dispatch({
action: 'view_tooltip',
tooltip: null,
});
}
dis.dispatch({
action: 'view_tooltip',
tooltip: null,
parent: null,
});
ReactDOM.unmountComponentAtNode(this.tooltipContainer);
document.body.removeChild(this.tooltipContainer);
},
_renderTooltip: function() {
var label = this.props.room ? this.props.room.name : this.props.label;
// Add the parent's position to the tooltips, so it's correctly
// positioned, also taking into account any window zoom
// NOTE: The additional 6 pixels for the left position, is to take account of the
// tooltips chevron
var parent = ReactDOM.findDOMNode(this);
var style = {};
style.top = parent.getBoundingClientRect().top + window.pageYOffset;
style.left = 6 + parent.getBoundingClientRect().right + window.pageXOffset;
style.display = "block";
var tooltip = (
<div className="mx_RoomTooltip" style={style} >
<div className="mx_RoomTooltip_chevron"></div>
{ label }
</div>
);
// Render the tooltip manually, as we wish it not to be rendered within the parent
this.tooltip = ReactDOM.render(tooltip, this.tooltipContainer);
// Tell the roomlist about us so it can manipulate us if it wishes
dis.dispatch({
action: 'view_tooltip',
tooltip: this.tooltip,
parent: parent,
});
},
render: function() {
var label = this.props.room ? this.props.room.name : this.props.label;
// Render a placeholder
return (
<div className="mx_RoomTooltip">
<img className="mx_RoomTooltip_chevron" src="img/chevron-left.png" width="9" height="16"/>
{ label }
<div className={ this.props.className } >
</div>
);
}

View File

@@ -19,6 +19,7 @@ limitations under the License.
var React = require('react');
var sdk = require('matrix-react-sdk');
var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var dis = require('matrix-react-sdk/lib/dispatcher');
module.exports = React.createClass({
displayName: 'IntegrationsManager',
@@ -31,10 +32,12 @@ module.exports = React.createClass({
// XXX: keyboard shortcuts for managing dialogs should be done by the modal
// dialog base class somehow, surely...
componentDidMount: function() {
this.dispatcherRef = dis.register(this.onAction);
document.addEventListener("keydown", this.onKeyDown);
},
componentWillUnmount: function() {
dis.unregister(this.dispatcherRef);
document.removeEventListener("keydown", this.onKeyDown);
},
@@ -46,11 +49,15 @@ module.exports = React.createClass({
}
},
onAction: function(payload) {
if (payload.action === 'close_scalar') {
this.props.onFinished();
}
},
render: function() {
return (
<div className="mx_IntegrationsManager">
<iframe src={ this.props.src }></iframe>
</div>
<iframe src={ this.props.src }></iframe>
);
}
});

View File

@@ -119,7 +119,7 @@ module.exports = React.createClass({
var emailPusherPromise;
if (event.target.checked) {
var data = {}
data['brand'] = this.props.brand || 'Vector';
data['brand'] = this.props.brand || 'Riot';
emailPusherPromise = UserSettingsStore.addEmailPusher(address, data);
} else {
var emailPusher = UserSettingsStore.getEmailPusher(this.state.pushers, address);
@@ -132,7 +132,7 @@ module.exports = React.createClass({
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Error saving email notification preferences",
description: "Vector was unable to save your email notification preferences.",
description: "An error occurred whilst saving your email notification preferences.",
});
});
},
@@ -784,7 +784,7 @@ module.exports = React.createClass({
<div>
<h3>Advanced notifications settings</h3>
There are advanced notifications which are not shown here.<br/>
You might have configured them in another client than Vector. You cannot tune them in Vector but they still apply.
You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply.
<ul>
{ externalRules }
</ul>
@@ -843,7 +843,7 @@ module.exports = React.createClass({
<th width="55%"></th>
<th width="15%">Off</th>
<th width="15%">On</th>
<th width="15%">Highlight<br/>&amp; sound</th>
<th width="15%">Noisy</th>
</tr>
</thead>
<tbody>

View File

@@ -64,6 +64,11 @@ input[type=text]:focus, textarea:focus {
box-shadow: none;
}
/* Required by Firefox */
textarea {
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif;
}
/* Prevent ugly dotted highlight around selected elements in Firefox */
::-moz-focus-inner {
border: 0;
@@ -153,6 +158,8 @@ input[type=text]:focus, textarea:focus {
width: 60%;
max-width: 704px;
box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.2);
max-height: 80%;
overflow-y: auto;
}
.mx_Dialog_background {
@@ -196,16 +203,20 @@ input[type=text]:focus, textarea:focus {
height: 36px;
border-radius: 40px;
border: solid 1px #76cfa6;
font-weight: 400;
font-size: 15px;
font-weight: 600;
font-size: 14px;
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif;
margin-left: 0px;
margin-right: 8px;
padding-left: 1.5em;
padding-right: 1.5em;
outline: none;
cursor: pointer;
color: #76cfa6;
background-color: #fff;
/* align images in buttons (eg spinners) */
vertical-align: middle;
}
.mx_Dialog button.mx_Dialog_primary, .mx_Dialog input[type="submit"].mx_Dialog_primary {
@@ -277,3 +288,7 @@ input[type=text]:focus, textarea:focus {
cursor: pointer;
display: inline;
}
.changelog_text {
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif;
}

View File

@@ -1,6 +0,0 @@
.mx_RoomSettings_encrypt,
.mx_CreateRoom_encrypt,
.mx_RightPanel_filebutton
{
display: none !important;
}

View File

@@ -0,0 +1,120 @@
/*
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.
*/
.mx_FilePanel {
-webkit-box-ordinal-group: 2;
-moz-box-ordinal-group: 2;
-ms-flex-order: 2;
-webkit-order: 2;
order: 2;
-webkit-flex: 1 1 0;
flex: 1 1 0;
width: 100%;
overflow-y: auto;
}
.mx_FilePanel .mx_RoomView_messageListWrapper {
margin-right: 20px;
}
.mx_FilePanel .mx_RoomView_MessageList h2 {
display: none;
}
/* FIXME: rather than having EventTile's default CSS be for MessagePanel,
we should make EventTile a base CSS class and customise it specifically
for usage in {Message,File,Notification}Panel. */
.mx_FilePanel .mx_EventTile_avatar {
display: none;
}
/* Overrides for the attachment body tiles */
.mx_FilePanel .mx_EventTile {
word-break: break-word;
}
.mx_FilePanel .mx_EventTile .mx_MImageBody {
margin-right: 0px;
}
.mx_FilePanel .mx_EventTile .mx_MImageBody_download {
display: flex;
font-size: 14px;
color: #acacac;
}
.mx_FilePanel .mx_EventTile .mx_MImageBody_downloadLink {
flex: 1 1 auto;
color: #747474;
}
.mx_FilePanel .mx_EventTile .mx_MImageBody_size {
flex: 1 0 0;
font-size: 11px;
text-align: right;
white-space: nowrap;
}
/* Overides for the sender details line */
.mx_FilePanel .mx_EventTile_senderDetails {
display: flex;
margin-top: -2px;
}
.mx_FilePanel .mx_EventTile_senderDetailsLink {
text-decoration: none;
}
.mx_FilePanel .mx_EventTile .mx_SenderProfile {
flex: 1 1 auto;
line-height: initial;
padding: 0px;
font-size: 11px;
opacity: 1.0;
color: #acacac;
}
.mx_FilePanel .mx_EventTile .mx_MessageTimestamp {
flex: 1 0 0;
text-align: right;
visibility: visible;
position: initial;
font-size: 11px;
opacity: 1.0;
color: #acacac;
}
/* Overrides for the wrappers around the body tile */
.mx_FilePanel .mx_EventTile_line {
margin-right: 0px;
padding-left: 0px;
}
.mx_FilePanel .mx_EventTile:hover .mx_EventTile_line {
background-color: #fff;
}
.mx_FilePanel .mx_EventTile_selected .mx_EventTile_line {
padding-left: 0px;
}

View File

@@ -151,6 +151,6 @@ limitations under the License.
}
.mx_MatrixChat .mx_RightPanel.collapsed {
-webkit-flex: 0 0 72px;
flex: 0 0 72px;
-webkit-flex: 0 0 122px;
flex: 0 0 122px;
}

View File

@@ -0,0 +1,106 @@
/*
Copyright 2015, 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.
*/
.mx_NotificationPanel {
-webkit-box-ordinal-group: 2;
-moz-box-ordinal-group: 2;
-ms-flex-order: 2;
-webkit-order: 2;
order: 2;
-webkit-flex: 1 1 0;
flex: 1 1 0;
width: 100%;
overflow-y: auto;
}
.mx_NotificationPanel .mx_RoomView_messageListWrapper {
margin-right: 20px;
}
.mx_NotificationPanel .mx_RoomView_MessageList h2 {
margin-left: 0px;
}
/* FIXME: rather than having EventTile's default CSS be for MessagePanel,
we should make EventTile a base CSS class and customise it specifically
for usage in {Message,File,Notification}Panel. */
.mx_NotificationPanel .mx_EventTile {
word-break: break-word;
}
.mx_NotificationPanel .mx_EventTile_roomName {
font-weight: bold;
font-size: 14px;
}
.mx_NotificationPanel .mx_EventTile_roomName a {
color: #4a4a4a;
}
.mx_NotificationPanel .mx_EventTile_avatar {
top: 8px;
left: 0px;
}
.mx_NotificationPanel .mx_EventTile .mx_SenderProfile,
.mx_NotificationPanel .mx_EventTile .mx_MessageTimestamp {
color: #000;
opacity: 0.3;
font-size: 12px;
display: inline;
padding-left: 0px;
}
.mx_NotificationPanel .mx_EventTile_senderDetails {
padding-left: 32px;
padding-top: 8px;
position: relative;
}
.mx_NotificationPanel .mx_EventTile_roomName a,
.mx_NotificationPanel .mx_EventTile_senderDetails a {
text-decoration: none ! important;
}
.mx_NotificationPanel .mx_EventTile .mx_MessageTimestamp {
visibility: visible;
position: initial;
display: inline;
}
.mx_NotificationPanel .mx_EventTile_line {
margin-right: 0px;
padding-left: 32px;
padding-top: 0px;
padding-bottom: 0px;
padding-right: 0px;
}
.mx_NotificationPanel .mx_EventTile:hover .mx_EventTile_line {
background-color: #fff;
}
.mx_NotificationPanel .mx_EventTile_selected .mx_EventTile_line {
padding-left: 0px;
}
.mx_NotificationPanel .mx_EventTile_content {
margin-right: 0px;
}

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