braidchat / braid Goto Github PK
View Code? Open in Web Editor NEWBraid is a team-chat app with a novel UI that leads to better conversations.
Home Page: http://www.braidchat.com/
License: Other
Braid is a team-chat app with a novel UI that leads to better conversations.
Home Page: http://www.braidchat.com/
License: Other
Change messages in the client to be in one of the following states:
Display each state slightly differently.
Get rid of the global 'message not sent' error
Store message drafts to local-storage
Adjust the "disconnected" warning to not prevent typing of messages
A task for new Braid contributors.
Goal:
To create a new page, for group admins, to be able to easily administer existing tags.
It should list all tags (with # of threads they are used it) and allow renaming. It should show a list of tags without any threads and allow deleting (this could be done as a second PR)
Notes:
A task for new Braid contributors.
Goal:
In a thread, if the time between messages is very long (let's say... > 24 hours), include some UI between the messages, like "24 hours later..."
Notes:
braid.core.client.ui.views.thread/messages-view
braid.core.client.helpers
)cljs-time.coerce/from-date
, cljs-time.core/now
, cljs-time.core/days
, cljs-time.core/hours
and cljs-time.core/in-milis
will probably be usefulA task for new Braid contributors.
Goal:
Braid has a read-only mode, where non-logged in users can see chat messages in a public group. Currently, in 'read-only-mode', there is no 'composer' textarea shown at the end of a thread. Instead of showing nothing, show a button "Join Group to Reply"
Notes:
braid.core.client.ui.views.thread
is a relevant namespacebraid.core.client.ui.views.header/readonly-header-view
for how to trigger the login/join-group flowWhen starting a new thread, after hitting enter, focus should go to the input of the newly created thread
A task for new Braid contributors.
Goal:
Add the "boomerang" feature that's common in various email clients, where you can click a button to hide an email from your inbox and have it re-show-up after some time. In Braid, this would involve boomeranging a thread instead. (If there's a better term than boomerang for it, by all means, change the terminology).
You can show the option to boomerang in the thread menu (which shows on-hover of the close button). For now, a preset boomerang time (of, let's say, 48 hours) is sufficient.
Notes:
braid.stars
is a good reference for how to write modulesbraid.core.api/register-daily-job!
exists, but you may need to add an hourly versionbraid.core.api/register-thread-control!
can be used to add a button to the thread menuA task for new Braid contributors.
Goal:
On user-hover-cards (cards that show up when hovering over a user mention), show how long the user has been a member.
Notes:
:db/txInstant
of when the :group/user
datom was created. Some example code:(d/q
'[:find [?inst ...]
:in $ ?user-id ?group-id
:where
[?u :user/id ?user-id]
[?g :group/id ?group-id]
[?g :group/user ?t ?tx false]
[?tx :db/txInstant ?inst]]
(d/history (db/db))
some-user-id
some-group-id)
Links to non-existant (or at least non-public) repository https://github.com/braidchat/meta
When the last member leaves a group, delete the group.
Should show a prompt to the user, along the lines of:
"You are the last member of the group. Leaving will destroy all content of the group. Are you sure you want to leave?"
After the module refactor, this behaviour seems to have changed
There is an effort underway to significantly refactor the code-base to be organized as "modules".
Most of Braid's code is organized around technical layers ("views", "client-side-state", "websocket-message-handlers", "db", etc.). Adding a feature (such as, say, "starring a thread") involves changes throughout the entire stack, and the code being peppered throughout multiple files:
server client
http db email ui ....
| | | | |
emoji | e | m | o | ji |
| | | | |
| | | | |
| | | | |
search | s | e | a | rch |
| | | | |
| | | | |
.... | | | | |
src/
braid/
client/
desktop/
gateway/
mobile/
bots/
quests/
...
server
api/
db/
quests/
search/
crypto
...
"Modules" involves re-factoring the code so that each "feature" lives in its own folder. New functionality would be an addition of code, rather than a modification of previous code ("open to extension, closed to modification", "aspect oriented programming").
msgs db ui email
________________________________________________
emoji e mo ji
________________________________________________
search s e a rch
________________________________________________
/src
/braid
/core
...lots of stuff here, organized similarly to now, smaller as we extract into modules
/search
...one or more files, organized as necessary
/emoji-provider
/emoji-one
/file-upload
/file-upload-search
/dropbox-file-upload
/oauth-provider
/github-oauth
/google-oauth
... (lots of other modules)
One way to think about it is: currently, our separation-of-concerns is based only on "technical concerns", whereas the change to "modules" would add "product functionality" as concerns as well.
Modules should hopefully:
We've thought a lot about the "api" of modules, and iterated it multiple times. Improvements to how "modules work" will continue, and tracked in this milestone and this issue .
We've transitioned the code into a core
module, and extracted a few modules out of core
(quests
and various emoji
modules).
The Braid Module Graph project exists to help visualize what modules could be extracted and how they could be related.
Next:
quests
and emoji
according to the changesModules
A task for new Braid contributors.
Goal:
When a message is sent in non-English (for now), show a translation of the message below the message.
Potential extensions (for a separate PR):
Notes:
braid.core.api/register-footer-view!
can be used to display content after a messageA task for new Braid contributors.
Goal:
Allow users to include some brief profile text. On their profile preferences page, show their profile and allow for editing it (a freeform text area). Include the description in user hover-cards.
Alternatively, allow admins to define certain fields that they want from their users, and show multiple input fields for the user.
Notes:
Another telegram feature. I don't know what you guys think about this, if it fits the conversation flow you're trying to create or deviates from it. I personally think replies help bring the chat together, removing ambiguities that might arise because someone sent a message just before yours, or because the message you're addressing has already been buried by others. What's your opinion on this matter?
People make mistakes. Let's help users undo them.
Suggested experience:
Braid's code base is organized around "modules" (more about modules here ). How modules work in Braid has been iterated upon multiple times and will likely continue to evolve.
This issue and related milestone will track the ongoing effort to improve the module system.
xyz-module
depends on:
"foo-event",
"bar-event"
provides:
"baz-event" params, docstring, expected return value
* [ ] unit tests can be defined per module
* [ ] e2e-tests can be defined per module
### v100
* [ ] modules can be turned on/off (via UI or system config)
* [ ] modules can be defined across repos (ie. for now, it's fine to have everything in a mega-repo)
## Potential Inspiration:
* ring pipeline / middleware
* re-frame events
* robert-hooke library
* DOM event system
* component
* mount
* defmulti
* pubsub
"If I scroll right in the list of the threads, then send a message to one of the threads, the thread disappears. I don't know where it's going, lol. I guess it should move to the left, because the threads are sorted by the latest message? I'm not sure, but it looks like it just disappears."
With the latest changes to the Braid system start, I can no longer reliably start it within Emacs/Cider.
Firstly, figwheel fails to compile cljs:
Failed to compile build :desktop-dev from ["src/braid" "src/retouch"] in 2.911 seconds.
---- Could not Analyze target/classes/braid/core/modules_dummy.cljs ----
Could not locate braid/core/module_helpers__init.class or braid/core/module_helpers.clj on classpath. Please check that namespaces with dashes use underscores in the Clojure file name.
---- Analysis Error : Please see target/classes/braid/core/modules_dummy.cljs ----
I'm unable to find that file or the gen-module-requires
macro anywhere in the project.
Could it be that the module_helpers.cljs was forgotten on master?
Secondly, the change has an unfortunate effect of working against how Cider like to have the repls started. When I run cider-jack-in-clojurescript
it starts lein repl
and lein figwheel
separately with piggieback
and other dependencies injected that are compatible with other nrepl middleware(nrepl-refactor
for example).
Cider provides cider-clojurescript-connect
function, but I would need to add the right dependencies in the project itself.
Was it done to simplify the setup process in IDEs like Cursive? I understand that not everyone is using Emacs; the docs here https://github.com/braidchat/braid/blob/master/docs/dev/getting-up-and-running-in-development.md do need to be updated though(the Emacs portion).
A task for new Braid contributors.
Goal:
Currently, hitting the ESC key while a thread is selected, closes/archives the thread. However... this can be really bad if the user is still typing a message (ie. has text in the composer). Change the existing ESC logic to not close the thread if there is content in the composer.
Notes:
braid.core.client.ui.views.new-message
and braid.core.client.ui.views.thread
are likely relevant namespacesWould it be a good idea to allow for automatic tag creation when a never-before-seen tag is utilized in a conversation? [I think it would be nice to save a step but then there is the problem with typos--i.e., inadvertently creating a new tag when attempting to reference an existing one].
Maybe a better solution altogether is to not allow free-form tags but rather display a list of existing tags when the '#' char is typed (and an empty slot at the bottom or top of the list to add a new one on-the-fly).
We have some unit tests for backend-code, but end-to-end tests would be valuable to help prevent future regressions.
There is a lot of implemented-but-untested functionality in Braid now, so having decent coverage will require a lot of work. Marking this as an 'ongoing-effort'.
With the effort to reorganize the codebase around modules , we don't have to test what is currently 'core', and instead, provide a way for modules to include end-to-end tests and have at least one basic happy-path end-to-end test for each module.
Progress:
Module Progress:
A task for new Braid contributors.
Goal:
Detect google maps links in messages and show a map below the message.
Notes:
braid.embeds
module already provides functionality for registering 'embeds' based on message content. See braid.embeds.api
.braid.video-embeds
for an example of a similar existing modulebraid.core.api/register-config-var!
I tried to write an email to [email protected] but got an delivery error.
A task for new Braid contributors.
Goal:
Detect youtube links in messages and show an embedded video below the message.
Notes:
braid.embeds
module already provides functionality for registering 'embeds' based on message content. See braid.embeds.api
.braid.video-embeds
for an example of a similar existing module (which detects links to movie files directly)A task for new Braid contributors.
Goal:
In a thread, show headers between messages at the start of a new day.
ie.
message
message
—— Jan 25 ——
message
Notes:
braid.core.client.ui.views.thread/messages-view
cljs-time.coerce/from-date
will probably be useful (and other functions)A task for new Braid contributors.
Goal:
Show a "PM" (private message) button on user hover cards. Clicking on the button should create a new private thread with that user.
Notes:
Here is a video http://bit.ly/2qdc06N
Maybe there is inspiration in there
Add some responsive CSS to make the existing web client at least decent on mobile devices.
A task for new Braid contributors.
Goal:
To create a new page, for group admins, to easily manage the existing users in a group.
The page should list of users in a table (with their name, last-sign in) and buttons to remove user or make the user an admin. Later, add the ability to bulk invite users.
Feel free to make a PR for partial completion of this issue (for example, just listing name and "make user an admin" button; we can then make a new task for the remaining functionality).
Notes:
A task for new Braid contributors.
We're extracting parts out of "Braid core" into loosely-coupled modules, to ease future development. As part of this effort, the functionality of the "reconnect-notice" can be extracted.
Currently, when the websocket is disconnected, a red notice bar is shown (you can trigger this by starting Braid in dev, then, in your repl, doing (stop!)
).
Extract this functionality out of core and into a new module.
Notes:
braid.core.client.ui.views.reconnect-overlay
is where the view is nowbraid.stars
for how to write a modulebraid.core.api/register-root-view!
A task for new Braid contributors.
Goal:
Braid uses https://github.com/noprompt/garden for it's CSS. SASS/Less have a concept of mixins (effectively, functions that returns style rules that can be included in other places). With garden, we just use regular clojure(script) values. Currently, there is a mix of using constants and functions for mixin functionality. It would be nice if this was consistent -- just functions.
We'll call a mixin anything that returns either a map of css-rules {:foo "bar"}
or a list of css-rules [:& {:foo "bar"}]
. Values, such as "#00cc00"
are not mixins.
For this task, convert all non-function mixins in braid.core.client.ui.styles.mixins
into functions (and update wherever they are used).
Similarly, change all style blocks that are included in braid.core.client.ui.views.styles
If you happen to see mixins defined elsewhere that aren't functions, change those too.
Regression, presumably from when the logic for thread scrolling changed.
If one switches to a group with a long thread that has links in it, they'll see it starts scrolled to the bottom as expected, but then as the link previews load, the height changes & they end up scrolled up somewhat.
I searched for a string with a lot of results, scrolled far to the right, then when I closed the search, I lost the new conversation box.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.