the root container had height: 100% but also a margin-top set on it. This
caused unnecessary scrollbars to appear when the content did not
actually overflow the container.
Firefox treats the reflow in the scroll container weirdly so for the
scrollback case, we save the position to restore later, when the backlog
messages come in. For the 'locked at bottom' case we add a new state
variable and rescroll based on that.
Previously, if a room was navigated to directly, the resubscribe message
would show before the chatSynced state was loaded. Initialises
chatSynced as null and checks it is not null before showing the
resubscribe message.
On initial load, instead of getting the first 25 links for every
collection, only get their totals and unread counts. This drastically
reduces the pageload time.
Updates the frontend to match:
- Handle initial results without link content.
- Dynamically load in collection's links, even for page 0.
If the initial 20 messages doesn't cause the messages container to
overflow then the backlog will never be requested, making scrollback
impossible. This is due to making the container have position:relative
in order to display an overlay inside it. Fixed by unconditionally
requesting the first page of backlog on load.
Refactored the patp autocomplete into a reusable component, and then
used that to add the DM popover interface. Also introduces some
performance improvements for the popover.
Triggers invitee suggestions after one character of input. To
compensate for the potential explosion of suggestions, we
tighten our group searching criteria and truncate the
ship suggestions on short searches. Also addresses a bug where names of
groups were not being downcased before search.
Fixes#2635
Hide and shows profile overlay on sigil click. Shows the overlay for 2
seconds after click. If the user moves their mouse into the overlay then
it will remain open as long as the mouse is inside the overlay.
Adds a profile overlay to display information about the user on hover.
Also adds the svgClass prop to the sigil component, to allow setting
classes directly on the sigil svg.
Improve the UX of the loading spinner that shows when you have a new
note, by displaying it until we receive the new note in the
subscription, instead of until the poke succeeds.
Empty groups caused the padding on the first group to be too large.
Filter the groups before we map over them so that we can set padding
properly.
Fixes#2674
Shows the spinner whilst joining a channel, both manually and from a
url. Also fixes an issue where a newly joined channel may be navigated
away from automatically.
Runs the snippet through ReactMarkdown instead of rendering it as text.
We restrict the allowed nodes in the render to pure text, so the snippet is not
overly visually heavy.
Previously we were checking for a title for the association by accessing
a non-existent property of the key we were using to iterate through
the object. What we want to do is access the iterated object to find
that title, and so this commit does that.
I've moved the slightly edited interface development instructions from the root controbuting.md doc, over to the one located in pkg/interface. I've made sure to ensure any precvious information in the interface contributing doc has been matched or expanded upon in the new writing, which is a incrementally more thorough, and assumes a lower level of build-tooling knowledge.
When changing description, some pre-metadata refactors were resulting in
permanently broken calls to the API. This accesses our resource object
correctly.
This commit pulls the spinner out of the header bar -- and
reincorporates it as a component that hooks into local state when
awaiting a new prop, or disabling an input.
Before, when we got new props for the metadata of the notebook, all the
fields would flash blank or to previous inputs. This rewrites the
update function to be more atomic with how it edits state,
which seems to correct the behaviour to avoid blank fields and disable fields
correctly.
By using an array, not a set, we stop deduplicating our group index,
pushing redundant information instead. When searching, this prevents a
component fail state where it cannot search a non-existent index for
matches.