Commit Graph

272 Commits

Author SHA1 Message Date
Jonathan Rainville b245d858aa feat: redisgn compact mode part 1
redesigns the compact mode to have a nice hover, easier replying and adding reactions and more

Missing parts are aligning chat command, images and unfurlings, redesigning mentions and the channel list and also trying to find a way to re-enable link hovers in the text
2021-02-01 11:54:26 -05:00
Pascal Precht 0daf355f54 uiux(StatusTooltip): change color according to theme
It was requested to change the tooltip to black an white and white on
black in dark and light themes respectively.
This commit changes the colors accordingly.
2021-01-19 16:50:47 -05:00
staked-smart-ace 338069c9ad Changed the card date format to be short. Fixes #1692 2021-01-19 16:46:23 -05:00
staked-smart-ace 086c868bdc
uiux(StatusButton): introduce warn type
Fixes #1603
2021-01-19 12:45:03 +01:00
staked-smart-ace f2eda36569 Fixes #1610 2021-01-15 13:51:52 -05:00
staked-smart-ace 96b09fd025 Fixes #1611 2021-01-14 15:59:45 -05:00
Jonathan Rainville 7f2f3b599d Apply suggestions from code review
Co-authored-by: RichΛrd <info@richardramos.me>
2021-01-11 13:57:35 -05:00
Jonathan Rainville 2d3a870f60 wip community invitatations and more 2021-01-11 13:57:35 -05:00
Jonathan Rainville ce3252fb8f wip community 2021-01-11 13:57:35 -05:00
Jonathan Rainville 6ed0d30fc5 feat: add ethereum explorer setting in the profile 2021-01-05 11:24:31 -05:00
Jonathan Rainville 1c83ac98a0 feat: add search engine settings in the profile 2021-01-05 11:24:31 -05:00
Jonathan Rainville bc515d2627 fix: fix chat reply color and size 2021-01-04 15:29:10 -05:00
Pascal Precht f9b7d9dfc9 refactor: make use of Qt.locale 2021-01-04 15:16:37 -05:00
Pascal Precht eca5622439 feat: introduce Utils.formatDateTime
We already have a utility function to format time, this one formats date + time
and is used in status updates as well as channel lists.
2021-01-04 15:16:37 -05:00
Jonathan Rainville 16f5c2fb1a feat: add showFavoritesBar setting (placeholder for now) 2020-12-30 16:52:44 -05:00
emizzle 6a0a75888b feat: whitelist gifs (no url extension needed)
Fixes #1377.
Fixes #1479.

Two sites have been added to the whitelist: giphy.com and tenor.com.

`imageUrls` in its entirety has been removed and instead all links are being handle through the message `linkUrls`. This prevents double-handling of urls that may or may not be images.

The logic to automatically show links previews works like this:
1. If the setting "display chat images" is enabled, all links that *contain* ".png", ".jpg", ".jpeg", ".svg", ".gif" will be automatically shown. If the URL doesn't contain the extension, we are not downloading it. This was meant to be somewhat of a security compromise as we do not want to download each and every link posted in a message just to find out its true content type.
2. If the above setting is *disabled*, then we follow the whitelist settings for tenor and giphy. This allows us to preview gifs that do not have a file extension in their url.

feat: bump status-go to the commit that supports the new whitelist (https://github.com/status-im/status-go/pull/2094), and also lets us get link preview data from urls in the whitelist. NOTE: this commit was branched off status-go `develop`, so once it is merged, and we update this PR to the new commit, we will effectively be getting status-go develop changes. We *could* base that status-go PR off of master if it makes things easier.

fix: height on settings update issue

feat: move date/time of message below links

fix: layout issues when changing setting `neverAskAboutUnfurlingAgain`

feat: Add MessageBorder component to aid in showing rounded corners with different radius
2020-12-21 14:14:32 -05:00
Richard Ramos 3258ac8f9c feat: disconnect accounts in browser 2020-12-17 16:44:50 -05:00
Pascal Precht f512d5063c feat: introduce StatusUpdateChatInput variation
This commit changes the `StatusChatInput` component to also be a `StatusUpdateInput`.
The latter isn't an actual new type or component, it's just a visual variation of the already
existing status chat input. That's my most of the changes are `isStatusUpdateInput` conditions
sprinkled here and there.

In addition, this commit introduces a new `chatType` which is passed to `StatusChatInput` later
in the timeline view, so it knows it has to render like a status update input.
2020-12-14 12:36:49 +01:00
Jonathan Rainville 08a7baed8f feat: add OS notification and setting to switch back 2020-12-09 14:19:16 -05:00
hydrogen 398a6b2fc0 fix: make validity error match design 2020-12-08 16:59:20 -05:00
hydrogen 020c1b0bc3 fix: rename function 2020-12-04 15:52:23 -05:00
hydrogen fad0bb858e fix: password count and disable repeat until first is valid
cleanup
2020-12-04 15:52:23 -05:00
hydrogen f69da599ae fix: update chat view after user is blocked 2020-12-04 15:52:04 -05:00
hydrogen 8fd28dfad6 fix: check if user is blocked on profile popup
This PR is a response to @emizzle's suggested change in PR #1431 . It checks if a user is blocked before exposing certain functionality to the user in a Profile popup. The new unblock button also has a fail-safe unblock confirmation popup

disable the chat input if 1-on-1 chat recipient has been blocked.
2020-12-04 15:52:04 -05:00
hydrogen 69035176d5 fix: reply text colors
fixes #1378
2020-12-02 14:43:40 -05:00
Jonathan Rainville ff0a96c02b feat: add the Add favorite popup 2020-12-01 14:07:31 -05:00
Richard Ramos 22f4815957 fix: 18n and category headers 2020-11-26 11:44:49 -05:00
Richard Ramos 159c82c329 feat: choose network 2020-11-26 11:44:49 -05:00
emizzle 417194e7b4 feat: Keyboard shortcuts
Add keyboard shortcuts according to https://notes.status.im/02cfVf1KQLeQU2SqrIi9tw

fix: update chat message bubbles
- Align emojis to middle of text
- Add line-height as per design
- Properly support RTL languages (right-aligned) and LTR languages (left-aligned)
- Remove unneeded non-breaking space at the beginning of current user messages
- Properly support markdown for bold, strikethrough, and italic
- Fix text being removed when in between strikethrough markdown (~~)

fix: emoji resolution update for high resolution monitors
- Emojis now use the 72x72 original set, but are down-scaled to 20x20 (in chat bubbles) or 22x22 in other places, effectively tripling their pixel density

feat: handle new lines in blockquote

Handle new lines in blockquote so that messages display correctly.

Also, add functionality when a new line is entered in to the chat input, if it's inside a blockquote, a new ">" will be added automatically. This is also handled when backspace is entered.

feat: update xss to support full qt html4 table and table-cell attributes
2020-11-26 11:33:32 -05:00
Pascal Precht 8b74141b99 feat: allow users to change font size for chat messages
Closes #737
2020-11-25 14:41:29 +01:00
Pascal Precht 60a939d29e feat: introduce StatusNotification component
This component renders a macos like notification and can be used in the
notification settings for message previews.
2020-11-24 11:16:02 +01:00
Jonathan Rainville 6869a3ddfb feat: whitelist the characters possible for the channel names 2020-11-16 13:03:08 -05:00
Pascal Precht fc6c68232b validation and ens resolution fixes 2020-11-11 12:01:38 -05:00
Jonathan Rainville dbc1d26966 fix: protect against XSS in chat names 2020-11-06 16:23:09 -05:00
Richard Ramos ea02c7f0b5 feat: choose fleet 2020-11-06 16:22:07 -05:00
emizzle 423882df89
fix: 1:1 chat command transactions "intrinsic gas too low"
I noticed that the 1:1 chat commands were not able to send token transactions due to "intrinsic gas too low" error. I quickly realised there there were a few components missing, which have been fixed.

*feat: update the 1:1 chat commands transaction modal to allow editing of the from account and network fee*

The TransactionStackGroup was updated slightly to allow manual control of back/next actions.

Fixes #870.

*fix: Create distinct modal transaction actions*

Previously, adding `Connection`s for the  `walletModel.transactionWasSent` signal in different dialogs would cause the signal to be handled in the wrong dialog. The solution was to pass a `uuid` from the requesting dialog, and include the `uuid` in the response, so that only requests that were requested from the dialog would be handled.

*fix: update 1:1 translations*
All the translations were not being translated for me. I noticed that they did not exist in the `.ts` translation files either.
2020-10-28 11:07:21 +01:00
Jonathan Rainville af2af0700c feat: add basic browser settings and go to them on browser button click 2020-10-21 12:06:50 -04:00
Richard Ramos b18a1d6b4d feat: support message signing 2020-10-20 14:42:36 -04:00
Jonathan Rainville 7ddb7c6c30 feat: change network name and color based on network 2020-10-20 14:42:36 -04:00
Jonathan Rainville 56d6ece3e9 feat: enable sending an ETH transaction from the browser 2020-10-20 14:42:36 -04:00
Richard Ramos 3326c8b5f5 feat: ask for user approval for API requests 2020-10-20 14:42:36 -04:00
Pascal Precht 3d0f50a5b3 feat: allow users to configure notification settings
Can choose between all, just mentions, or nothing
2020-10-20 13:50:49 -04:00
Pascal Precht 8bf82e1dd6 feat: allow for fetching messages older than 24 hours 2020-10-16 10:43:38 -04:00
Pascal Precht 12a7d7c067 feat: introduce new chat input component
Closes #757
2020-10-07 14:03:12 +02:00
hydr063n eb8d95ed3e fix: account for translations 2020-10-05 10:52:30 -04:00
hydr063n 3c299d054c feat: implement seed word phrase counter
- If the count matches the required amount a tick will be included next the count
- The format is "✓ 12 words"
- This commit also fixes the text color when in dark in the wallet add new account modal
2020-10-05 10:52:30 -04:00
Jonathan Rainville 42102bdae4 feat: limit number of collectibles to 200 to avoid explosions 2020-09-29 14:44:10 -04:00
Jonathan Rainville 3881d1e012 fix: make chatMessages new message box clearer 2020-09-29 14:43:58 -04:00
Jonathan Rainville 577dbba831 fix: fix code review and fix deleting colon closes emoji popup 2020-09-29 14:04:13 -04:00
Jonathan Rainville db6b87d813 chore: simplify punct regex
Co-authored-by: Eric Mastro <eric.mastro@gmail.com>
2020-09-29 14:04:13 -04:00
Jonathan Rainville cf734796d1 feat: enable adding emojis from the suggestion list 2020-09-29 14:04:13 -04:00
Jonathan Rainville 9f9bad2fa3 feat: add a read more button and crop text when message is too long 2020-09-29 14:02:33 -04:00
hydr063n 2a59ab402d fix: top bar theme color 2020-09-29 13:26:01 -04:00
Jonathan Rainville a35130ff68 fix: fix reply colors in dark mode 2020-09-22 11:30:30 -04:00
Pascal Precht 9c1613acf8 uiux(Wallet): improve readability of high value balances
Uses `toLocaleString()` polyfill to insert `.` and/or `,` as
needed based on currently selected locale.

Closes #845
2020-09-17 15:16:16 -04:00
emizzle c9c1dce6ea fix: Sticker market dark mode support 2020-09-17 12:22:00 -04:00
Jonathan Rainville 103f02b289 feat: show toast message for transaction status changes 2020-09-14 14:48:26 -04:00
Pascal Precht 729a2781f0 feat(TransactionModal): introduce async validation for ENS names
This commit extends the AddressInput to perform ENS lookups when valid
ENS values are entered. The lookup happens asynchronously, so we show a loading
indicator as the request is happening.

Closes #790
2020-09-10 13:40:42 -04:00
Jonathan Rainville f3f27a5e59 fix: address more comments about the chat commands 2020-09-09 15:03:45 -04:00
Jonathan Rainville 91c8089716 fix: fix decimals problem with Chat commands
The problem was that the BigInt lib did not handle decimals at all. `divMod` only let the remainder be what is after the dot. So I created my own divde and multiply methods to move the dot depending on the number of decimals
2020-09-09 15:03:45 -04:00
Jonathan Rainville 6b3cac31bc feat: enable sending chat requests 2020-09-09 15:03:45 -04:00
Jonathan Rainville 60492b4db1 feat: add chat command bubbles for received txs 2020-09-09 15:03:45 -04:00
Pascal Precht 1481f2648f feat: introduce "fetch more messages" button to request old messages
Closes #149
2020-09-07 10:20:17 -04:00
emizzle d8b0145eb3 feat: Add Sticker purchase transaction modal
Add gas estimate for sticker pack purchase.

Update transaction for sticker pack purchase.

Add GasValidator component which validates gas is selected correctly and displays an error message if not. This component is not visible until it is not valid (at which point the valdiation error message is displayed).

In a future PR, need to:
1. estimate gas for token txfer (sendTransaction) via a normalised method for estimating gas for EthSend
2. move sticker pack purchase to use an EthSend object so gas can be estimated and tx sent
2020-09-04 16:13:33 -04:00
hydr063n e77b6d193e refactor and add support for converting to emoji after pasting text 2020-09-04 15:31:46 -04:00
emizzle 1e020a203c feat(tx-comps): Send transaction modal
Fixes #669.

Composes all tx components to create a send transaction modal for the wallet.

1. Add a reusable TransactionStackView component that wraps a StackView component to show the screens of the Send Tx modal and handles back/forward/reset functionality.
2. Add a reusable TransactionStackGroup which holds tx components and allows modal header and button text to be defined and handles validation for all child components.
3. Add an isValid property to all tx comps for pristine validation state.
4. Reset all components in modal once modal is closed. This consists of a `resetInternal` function that each component should implement to reinstate its original starting state, and a `reset` function that parent components can use to reinstate the overridden properties.
5. Tx error handling to display either a StatusGo error message in the dialog, or wrong password in the TransactionSigner.
6. Fix ReceiveModal to allow for pre-selected account based on current wallet account.
7. Add focused border colour to Input component.
8. Fix issue with last TransactionStackGroup input not being able to obtain focus.
9. Fix fiatBalance not appearing on initial load on AccountSelector.
10. Fix selected asset updated properly when assets changed in the AssetSelector component.
11. AccountSelector is pre-populated with selected wallet account. Supporting work on the components has been done to suppor this.
12. Changing accounts in the "from account" updates the asset balances in the AssetAndAmountInput component.
13. Move validation from ContactSelector to the Select component.

1. Test sending of tokens. This requires that tokens contracts are setup on testnet. Right now, they are set up for contract addresses on mainnet.
2. Loading state once transaction is sent. Button in modal needs to move to a loading state and the "toast" messages in the wallet need to appear informaing user of tx progress.
3. Need to clarify (and implement?) support of ENS names in the AddressInput. It appears that ENS names could be resolved. This would be a long operation and require some kind of UI loading indication.
4. Wallet balances need to be updated on every block, so for example, sending funds between accounts I should be able to see the balance updated in real time.

1. Sending to a contact currently doesn't work because the ContactSelector component selects the Contact's whipser key, instead of his/her wallet address. May need to figure out how this is done in status-react. As it stands, attempting to send to a contact will crash the app.
2. Sending *from* an imported account does not work, with an error from StatusGo `cannot locate account for address: 0x123...`
2020-09-03 15:32:55 -04:00
Pascal Precht de5b62030b fix(Chat): ensure cursor is set correctly in when selecting suggestion
This commit fixes a regression that was introduced in: https://github.com/status-im/nim-status-client/commit/459de8cd1
where the cursor position in the chat input was calculated incorrectly.
It also introduced a bug in the text processing which is described in #769

Partly fixes #769
2020-08-27 17:38:32 -04:00
Jonathan Rainville 60f7a3cbe2 feat: format timestamp in TransactionBubble like the Chat 2020-08-27 16:15:27 -04:00
Jonathan Rainville 9e2bf87d84 feat: add TransactionBubble for use with the chat commands
Add only the UI component for the TransactionBubble
Was not thoroughly tested since it was only developed in QT Designer
2020-08-27 16:15:27 -04:00
Pascal Precht c142d7a99f WIP SAVEPOINT 2020-08-25 11:36:46 -04:00
Pascal Precht 23e1307659 WIP SAVEPOINT 2020-08-25 11:36:46 -04:00
Jonathan Rainville 3219b0f5f4 refactor: refactor collectibles to be loaded individually 2020-08-25 09:15:01 -04:00
Jonathan Rainville db68a278ff chore: remove duplicated value in the Theme 2020-08-20 14:21:20 -04:00
Jonathan Rainville f083310193 feat: make all collectibles work and fix Cryptokitties 2020-08-20 14:21:20 -04:00
Jonathan Rainville 13201e5085 feat: add CollectiblesContent 2020-08-20 14:21:20 -04:00
Jonathan Rainville 474f68cf8a feat: add chat command modal shell
It doesn't do anything for now
2020-08-19 15:25:13 -04:00
emizzle 3dac87df3d feat/tx-comps: Add TransactionPreview component
Adds a TransactionPreview component as per the spec https://www.notion.so/emizzle/Wallet-transaction-components-2003b78a8d0d41c4ab3d21eb2496fb20

- update ReceiveModal dropdown to match design
- long alias and account name support
- long name support in account selector
- strip all trailing zeros from displayed balances
2020-08-19 14:38:45 -04:00
emizzle 60b0a4f115 fix/tx-comps: Recipient selector -- ability to have readonly value shown
This work must have gotten lost in a rebase along the way.
2020-08-13 15:08:12 -04:00
emizzle d07daac377
feat/tx-comps: Add RecipientSelector component
Based on the spec in https://www.notion.so/emizzle/Wallet-transaction-components-2003b78a8d0d41c4ab3d21eb2496fb20, this component handles user input for a recipient address, which can be sourced from manual address input, ENS name, contact selection, or another of the user's wallet accounts.
2020-08-13 09:28:35 +02:00
Richard Ramos e96f3ed47f
fix: display ens names with correct format in all screens 2020-08-11 08:39:07 -04:00
Richard Ramos 613c70c4a6
fix: link color 2020-08-06 16:35:54 +02:00
emizzle 9374be5857
feat: Send transaction component -- Account selector
Fixes #670.

Component spec based on https://www.notion.so/emizzle/Wallet-transaction-components-2003b78a8d0d41c4ab3d21eb2496fb20.

Changes the current Select shared component to a model databound component. This means we can bind directly to `QAbstractListModel`'s coming from Nim instead of needing manipulating the data in to javascript objects. The changes to the Select component will be used for the upcoming Asset selector shared component.
2020-08-05 16:38:49 +10:00
Richard Ramos 459de8cd1c
fix: display emojis on input textarea 2020-08-04 10:14:57 -04:00
Richard Ramos 5ab1088f7c
feat: play audio messages 2020-07-30 13:49:50 -04:00
Richard Ramos 7fd1f9c468 fix: send emoji contentType 2020-07-28 15:35:06 -05:00
Richard Ramos e91cd9e610 fix: validate mnemonic format when importing a existing key 2020-07-28 22:22:50 +02:00
Jonathan Rainville c71f5f1a07 fix: fix dark theme colors for chat and profile 2020-07-23 15:59:18 -04:00
Richard Ramos 5351fb62dc feat: display messages with an image contenttype 2020-07-21 13:15:22 -04:00
Iuri Matias 1e0e3fadd0 remove duplicated property 2020-07-16 11:38:00 -04:00
Richard Ramos fd88fd19d0 feat: display connected/disconnected status in the chat module 2020-07-16 11:38:00 -04:00
Jonathan Rainville 5951fcf131 feat: refactor Message and add Compact message type 2020-07-16 10:29:29 -04:00
emizzle ac7deb3af0 feat: Un/install free sticker packs in sticker market
Sticker pack details retreived from contract:
 - pack data decoded from contract response
 - data contains contentHash which, once decoded, contains an IPFS identifier
 - futher pack data in EDN format is downloaded from IPFS
 - the EDN info is decoded in to a StickerPack

List of available packs from contract are obtained separately from list of installed contracts (stored as a setting in Status-go).

Sticker market contains dynamic list of sticker packs. The sticker button shown for each pack has all states defined (in the design) for all UI states (ie bought, free, installed, pending, etc)

Add modal popup showing sticker pack details and list of stickers to be un/installed. Contains a "larger" version of the sticker pack button with many differnt UI states defined.

Uninstallation of a sticker pack removes those sticker pack's stickers from the recent sticker list and persists the list

Simplify the view model by including stickers, instead of setting an "activeStickerPackId" property. This allowed for display of sticker pack stickers to be displayed in the modal popup separately from the sticker packs shown in the market.
2020-07-15 15:53:48 -04:00
Jonathan Rainville 92f5a9ca5c feat: add dark theme colors and new properties for it 2020-07-14 12:37:17 -04:00
Richard Ramos 06efb531cb feat: adds QML debounce library 2020-07-14 11:56:44 -04:00
Richard Ramos a342192f43 fix: code review 2020-07-10 20:09:15 -04:00
Jonathan Rainville 6e8c371063 feat: enable adding the clicked emoji to the chat input 2020-07-06 13:59:47 -04:00
Jonathan Rainville 881f6dbe80 feat: enable changing theme from the profile settings 2020-07-03 09:59:14 -04:00
Jonathan Rainville a529d729ea feat: change Theme to Style to enable changing Theme 2020-07-03 09:59:14 -04:00
Jonathan Rainville d90c9ba882 fix: use normal Inter for normal text and StatusInter for addresses 2020-07-02 10:51:57 -04:00
Richard Ramos 961139e778 feat: start chats with ENS usernames 2020-06-30 16:21:21 -04:00
Richard Ramos bbd51cdcfe Use twemoji.js 2020-06-30 14:35:14 -04:00
Richard Ramos 2af0b0bc6a feat: adds emoji contentType support 2020-06-30 14:35:14 -04:00
Jonathan Rainville 02d915cb50 chore: up import version and fix SplitViews 2020-06-25 11:02:35 -04:00
Jonathan Rainville 051eeea3df feat: add validation to seed modal 2020-06-23 07:09:18 -04:00
Jonathan Rainville 300caf22a2 feat: add validation to private key and watchonly modal 2020-06-23 07:09:18 -04:00
Jonathan Rainville ad2a318c85 feat: add validationError prop on Input and use it in privateChatPopup 2020-06-23 07:09:18 -04:00
Jonathan Rainville 8755c901de fix: fix font loading issue and create a text component to use that font 2020-06-19 14:53:45 -04:00
Iuri Matias 0ad64cc5de update qml imports 2020-06-18 11:02:11 -04:00
Jonathan Rainville 846dc646e1 feat: add design to enter a seed key 2020-06-13 09:51:38 -04:00
Jonathan Rainville 317c956718 feat: show the real account values in settings 2020-06-11 11:23:01 -04:00
Jonathan Rainville 193f1331d1 feat: add very placeholder account settings modal
fef
2020-06-11 11:23:01 -04:00
Richard Ramos 8cca18d7f9 Display group chat message types and react to chat updates 2020-06-10 15:21:15 -04:00
Richard Ramos b5b02cfd57 show identifier as the first message of chat view 2020-06-08 15:27:30 -04:00
Jonathan Rainville adda897eb9 make color selector work 2020-06-04 16:31:17 -04:00
Iuri Matias 98d2c1df68 display a sticker when a content type sticker message is received
display a sticker when a content type sticker message is received

display a sticker when a content type sticker message is received

display a sticker when a content type sticker message is received

display sticker

fix height and default value

cleanup

cleanup

cleanup

use constants for the content type
2020-05-29 09:52:20 -04:00
Jonathan Rainville d1b786811f feat: add TabButton and TabBar for the Wallet 2020-05-28 13:59:56 -04:00
Richard Ramos 3b8408d21a Join private chats 2020-05-28 11:54:44 -04:00
Jonathan Rainville 398e3387cf feat: add placeholder wallets in leftTab 2020-05-27 17:31:27 -04:00
Richard Ramos 0ee8f5c0fe feat: display menu when clicking on addChat 2020-05-26 18:06:16 -04:00
Jonathan Rainville fe1a4db078 feat: add Wallet tab bar 2020-05-13 19:05:20 -04:00
Jonathan Rainville 067b6f6fb0 feat: add basic WalletLayout 2020-05-13 19:05:20 -04:00
emizzle 4769f578a6 feat: Onboarding carousel
Onboarding carousel completed

Redo folder restructuring

NOTES:
1. nim_status_client binary is output to `./bin/nim_status_client`, so you'll need to update your workflow to run this file. README has been updated to reflect this. Also, if you're running VSCode, instructions for code reload were added.
2. All `ui` files now live in `ui/`
3. All lib files (ie `libstatus`) now live in `lib/`
4. Removed the Qt Creater user project file as this is unique to each user
5. Moved the project file to `ui/`, so just open up the `ui` folder in Qt creator and it should locate the project file
6. `-d:release` removed from compilation as it wasn't needed
7. Broke up main.qml in to the main app and onboarding components, however this should be broken down further into more reusable components
8. Click "Get started" to show chat

Format some files using nimpretty
2020-05-12 18:52:51 -04:00