Anders Kaseorg
e382389797
js: Convert static/js/reactions.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
7e9b5efa8a
js: Convert static/js/timerender.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
a832983290
js: Convert static/js/activity.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
7145cb4a0d
js: Convert static/js/message_store.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
c94ffb5319
js: Convert static/js/hash_util.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
b3f74af090
js: Convert static/js/popovers.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
5ba7153a3b
js: Convert static/js/condense.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
dd18b32e04
js: Convert static/js/message_edit.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
245d6c3a3e
js: Convert static/js/stream_data.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
d81ba3698f
js: Convert static/js/stream_color.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
5d3baec4ef
js: Convert static/js/compose.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
ea01e6da5e
js: Convert static/js/compose_fade.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
b830f53eb5
js: Convert static/js/narrow_state.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
817358ce00
js: Convert static/js/message_list_view.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
68f7bfff56
js: Convert static/js/submessage.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
592cd780f5
js: Convert static/js/rows.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Anders Kaseorg
fe4d1e839c
js: Convert static/js/message_viewport.js to ES6 module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-28 14:23:00 -08:00
Aman Agrawal
a29b328854
MessageListView: Don't reselect message_id if RT is open.
...
When idle, we try to backfill messages and in the end reselect
the closest message in the list, which can be a unread message
if present.
When recent topics is open, we can backfill messages; but
shouldn't select the message_id otherwise it will mark the
message as read if the message is unread while triggering
`message_selected.zulip`.
2021-02-25 17:31:32 -08:00
Anders Kaseorg
9896782fd1
dependencies: Remove XDate.
...
It’s even more unmaintained than Moment and doesn’t add any
functionality we don’t already have.
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-07 06:41:33 -05:00
Anders Kaseorg
aa650a4c88
js: Escape strings interpolated into CSS selectors with CSS.escape.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2021-02-04 11:00:06 -08:00
Anders Kaseorg
d72423ef21
eslint: Replace empty-returns with consistent-return.
...
Instead of prohibiting ‘return undefined’ (#8669 ), we require that a
function must return an explicit value always or never. This prevents
you from forgetting to return a value in some cases. It will also be
important for TypeScript, which distinguishes between undefined and
void.
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-09-25 15:17:59 -07:00
Priyank Patel
b7998d3160
js: Purge people module from window.
2020-09-01 19:55:58 -07:00
Anders Kaseorg
768f9f93cd
docs: Capitalize Markdown consistently.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-08-11 10:23:06 -07:00
Anders Kaseorg
6ec808b8df
js: Add "use strict" directive to CommonJS files.
...
ES and TypeScript modules are strict by default and don’t need this
directive. ESLint will remind us to add it to new CommonJS files and
remove it from ES and TypeScript modules.
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-07-31 22:09:46 -07:00
Anders Kaseorg
bcab7efb37
js: Use XDate as a module.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-07-28 10:54:35 -07:00
Anders Kaseorg
a1295936a4
message_list_view: Convert MessageListView to an ES6 class.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-07-26 17:00:05 -07:00
Anders Kaseorg
d2520cd7e0
js: Replace underscore with lodash and remove it from globals.
...
Tweaked by tabbott to bump PROVISION_VERSION.
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-07-26 16:12:06 -07:00
Anders Kaseorg
e3b3df328d
eslint: Replace sort-imports with import/order.
...
import/order sorts require() calls as well as import statements.
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-07-24 09:42:56 -07:00
Anders Kaseorg
96dcc0ce6e
js: Use ES6 object literal shorthand syntax.
...
Generated by ESLint.
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-07-21 12:42:22 -07:00
Anders Kaseorg
b65d2e063d
js: Reformat with Prettier.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-07-17 14:31:25 -07:00
Anders Kaseorg
8046b6477a
js: Remove extra consecutive spaces.
...
Prettier would do this anyway, but it’s separated out for a more
reviewable diff. Generated by ESLint.
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-07-17 14:31:25 -07:00
Anders Kaseorg
f3726db89a
js: Normalize strings to double quotes.
...
Prettier would do this anyway, but it’s separated out for a more
reviewable diff. Generated by ESLint.
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-07-17 14:31:24 -07:00
Anders Kaseorg
e014ea966a
eslint: Enable comma-dangle for functions.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-07-03 16:55:51 -07:00
Anders Kaseorg
b0253c5a2e
eslint: Enable arrow-parens.
...
Signed-off-by: Anders Kaseorg <anders@zulip.com >
2020-07-03 16:53:39 -07:00
sahil839
b7f6a51797
message_list_view: Use stream_id to get sub object for populating group.
...
This commit changes populate_group_for_message_container function to
use stream id to get sub object, instead of stream name.
We already have stream id from message object, so we can easily
use it to fetch sub. We are using stream ids so that we can
avoid bugs related to live update after stream rename.
2020-06-22 13:39:47 -07:00
Rohitt Vashishtha
fa9431c0a4
markdown: Extract rendered_markdown.js to update dynamic elements.
...
Previously, we handled this code only in message_list_view.js.
Now we support rendering stream descriptions and some dynamic
elements can be rendered in them, so we extract this new module
and use it in both the places.
2020-05-21 12:32:52 -07:00
Tim Abbott
f572bf50f5
message_list_view: Suppress exceptions for missing mention users.
...
If we can't find data on a mentioned user to update its full_name to
the current value, we'll have to go with the value in the message
itself.
This can happen if e.g. we hard-deleted the originally mentioned user
from the database (which can sometimes happen after a "delete my
account completely" request).
2020-03-31 17:56:12 -07:00
Anders Kaseorg
dbffb2a614
js: Convert _.extend to spread syntax or Object.assign.
...
This is not always a behavior-preserving translation: _.extend mutates
its first argument. However, the code does not always appear to have
been written to expect that.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com >
2020-02-25 14:09:39 -08:00
Steve Howell
184f51ee0c
message view: Remove id_of_last_message_sent_by_us.
...
We were computing id_of_last_message_sent_by_us
for a valid reason before
fa44d2ea69
was committed in December 2017 to remove the
autoscroll_forever setting.
Since then the only thing that the
conditional for `id_of_last_message_sent_by_us`
short-circuits is a buggy computation of
`id_of_last_message_sent_by_us` itself.
Removing this dead code obviously makes the code
more clear, plus it does save some needless and
possibly bug-prone computation.
In particular, I am trying to lock down `rows.id` to
be more strict about receiving bogus elements, and
removing this code will help with that.
2020-02-24 12:19:10 -08:00
Steve Howell
99eb75e558
minor: Remove awesome comment about C++ iterators.
...
See cff1714209
from 2013. :)
2020-02-24 12:19:10 -08:00
shubhamgupta2956
efda2684ea
util: Replace util.get_message_topic().
...
Replace `util.get_message_topic(message)` with `message.topic`.
Fixes #13931
2020-02-21 09:53:45 -05:00
Steve Howell
cb91b7f312
util: Kill off set_topic_links/get_topic_links.
...
These functions were just shims that were
used in the somewhat painful migration from
subject_* to topic_*.
The commit 4572be8c27
fixed it so that the client never needs to
deal with "subject_links".
So now we just go back to simpler code:
message.topic_links = links
links = message.topic_links
2020-02-15 21:15:48 +00:00
Steve Howell
9ab07d1038
util.js: Remove util from window.
...
We now treat util like a leaf module and
use "require" to import it everywhere it's used.
An earlier version of this commit moved
util into our "shared" library, but we
decided to wait on that. Once we're ready
to do that, we should only need to do a
simple search/replace on various
require/zrequire statements plus a small
tweak to one of the custom linter checks.
It turns out we don't really need util.js
for our most immediate code-sharing goal,
which is to reuse our markdown code on
mobile. There's a little bit of cleanup
still remaining to break the dependency,
but it's minor.
The util module still calls the global
blueslip module in one place, but that
code is about to be removed in the next
few commits.
I am pretty confident that once we start
sharing things like the typeahead code
more aggressively, we'll start having
dependencies on util. The module is barely
more than 300 lines long, so we'll probably
just move the whole thing into shared
rather than break it apart. Also, we
can continue to nibble away at the
cruftier parts of the module.
2020-02-15 12:20:20 -08:00
Anders Kaseorg
0ce06d45a1
message_list_view: Convert message_containers from object to Map.
...
Signed-off-by: Anders Kaseorg <anders@zulipchat.com >
2020-02-12 10:39:01 -08:00
Anders Kaseorg
86dd98d481
message_list_view: Convert _rows from object to Map.
...
Signed-off-by: Anders Kaseorg <anders@zulipchat.com >
2020-02-12 10:39:01 -08:00
Anders Kaseorg
2834b051d2
js: Read zid with rows.id.
...
Signed-off-by: Anders Kaseorg <anders@zulipchat.com >
2020-02-12 10:39:01 -08:00
Anders Kaseorg
336a279005
js: Convert _.find(a, …) to a.find(…).
...
And convert the corresponding function expressions to arrow style
while we’re here.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com >
2020-02-10 14:08:12 -08:00
Anders Kaseorg
ef50346a29
js: Convert _.reject(a, … => …) to a.filter(… => !…).
...
And convert the corresponding function expressions to arrow style
while we’re here.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com >
2020-02-10 14:08:12 -08:00
Anders Kaseorg
ac7b09d57e
js: Convert _.map(a, …) to a.map(…).
...
And convert the corresponding function expressions to arrow style
while we’re here.
import * as babelParser from "recast/parsers/babel";
import * as recast from "recast";
import * as tsParser from "recast/parsers/typescript";
import { builders as b, namedTypes as n } from "ast-types";
import K from "ast-types/gen/kinds";
import fs from "fs";
import path from "path";
import process from "process";
const checkExpression = (node: n.Node): node is K.ExpressionKind =>
n.Expression.check(node);
for (const file of process.argv.slice(2)) {
console.log("Parsing", file);
const ast = recast.parse(fs.readFileSync(file, { encoding: "utf8" }), {
parser: path.extname(file) === ".ts" ? tsParser : babelParser,
});
let changed = false;
recast.visit(ast, {
visitCallExpression(path) {
const { callee, arguments: args } = path.node;
if (
n.MemberExpression.check(callee) &&
!callee.computed &&
n.Identifier.check(callee.object) &&
callee.object.name === "_" &&
n.Identifier.check(callee.property) &&
callee.property.name === "map" &&
args.length === 2 &&
checkExpression(args[0]) &&
checkExpression(args[1])
) {
const [arr, fn] = args;
path.replace(
b.callExpression(b.memberExpression(arr, b.identifier("map")), [
n.FunctionExpression.check(fn) ||
n.ArrowFunctionExpression.check(fn)
? b.arrowFunctionExpression(
fn.params,
n.BlockStatement.check(fn.body) &&
fn.body.body.length === 1 &&
n.ReturnStatement.check(fn.body.body[0])
? fn.body.body[0].argument || b.identifier("undefined")
: fn.body
)
: fn,
])
);
changed = true;
}
this.traverse(path);
},
});
if (changed) {
console.log("Writing", file);
fs.writeFileSync(file, recast.print(ast).code, { encoding: "utf8" });
}
}
Signed-off-by: Anders Kaseorg <anders@zulipchat.com >
2020-02-10 14:08:12 -08:00
Anders Kaseorg
02511bff1c
js: Automatically convert _.each to for…of.
...
This commit was automatically generated by the following script,
followed by lint --fix and a few small manual lint-related cleanups.
import * as babelParser from "recast/parsers/babel";
import * as recast from "recast";
import * as tsParser from "recast/parsers/typescript";
import { builders as b, namedTypes as n } from "ast-types";
import { Context } from "ast-types/lib/path-visitor";
import K from "ast-types/gen/kinds";
import { NodePath } from "ast-types/lib/node-path";
import assert from "assert";
import fs from "fs";
import path from "path";
import process from "process";
const checkExpression = (node: n.Node): node is K.ExpressionKind =>
n.Expression.check(node);
const checkStatement = (node: n.Node): node is K.StatementKind =>
n.Statement.check(node);
for (const file of process.argv.slice(2)) {
console.log("Parsing", file);
const ast = recast.parse(fs.readFileSync(file, { encoding: "utf8" }), {
parser: path.extname(file) === ".ts" ? tsParser : babelParser,
});
let changed = false;
let inLoop = false;
let replaceReturn = false;
const visitLoop = (...args: string[]) =>
function(this: Context, path: NodePath) {
for (const arg of args) {
this.visit(path.get(arg));
}
const old = { inLoop };
inLoop = true;
this.visit(path.get("body"));
inLoop = old.inLoop;
return false;
};
recast.visit(ast, {
visitDoWhileStatement: visitLoop("test"),
visitExpressionStatement(path) {
const { expression, comments } = path.node;
let valueOnly;
if (
n.CallExpression.check(expression) &&
n.MemberExpression.check(expression.callee) &&
!expression.callee.computed &&
n.Identifier.check(expression.callee.object) &&
expression.callee.object.name === "_" &&
n.Identifier.check(expression.callee.property) &&
["each", "forEach"].includes(expression.callee.property.name) &&
[2, 3].includes(expression.arguments.length) &&
checkExpression(expression.arguments[0]) &&
(n.FunctionExpression.check(expression.arguments[1]) ||
n.ArrowFunctionExpression.check(expression.arguments[1])) &&
[1, 2].includes(expression.arguments[1].params.length) &&
n.Identifier.check(expression.arguments[1].params[0]) &&
((valueOnly = expression.arguments[1].params[1] === undefined) ||
n.Identifier.check(expression.arguments[1].params[1])) &&
(expression.arguments[2] === undefined ||
n.ThisExpression.check(expression.arguments[2]))
) {
const old = { inLoop, replaceReturn };
inLoop = false;
replaceReturn = true;
this.visit(
path
.get("expression")
.get("arguments")
.get(1)
.get("body")
);
inLoop = old.inLoop;
replaceReturn = old.replaceReturn;
const [right, { body, params }] = expression.arguments;
const loop = b.forOfStatement(
b.variableDeclaration("let", [
b.variableDeclarator(
valueOnly ? params[0] : b.arrayPattern([params[1], params[0]])
),
]),
valueOnly
? right
: b.callExpression(
b.memberExpression(right, b.identifier("entries")),
[]
),
checkStatement(body) ? body : b.expressionStatement(body)
);
loop.comments = comments;
path.replace(loop);
changed = true;
}
this.traverse(path);
},
visitForStatement: visitLoop("init", "test", "update"),
visitForInStatement: visitLoop("left", "right"),
visitForOfStatement: visitLoop("left", "right"),
visitFunction(path) {
this.visit(path.get("params"));
const old = { replaceReturn };
replaceReturn = false;
this.visit(path.get("body"));
replaceReturn = old.replaceReturn;
return false;
},
visitReturnStatement(path) {
if (replaceReturn) {
assert(!inLoop); // could use labeled continue if this ever fires
const { argument, comments } = path.node;
if (argument === null) {
const s = b.continueStatement();
s.comments = comments;
path.replace(s);
} else {
const s = b.expressionStatement(argument);
s.comments = comments;
path.replace(s, b.continueStatement());
}
return false;
}
this.traverse(path);
},
visitWhileStatement: visitLoop("test"),
});
if (changed) {
console.log("Writing", file);
fs.writeFileSync(file, recast.print(ast).code, { encoding: "utf8" });
}
}
Signed-off-by: Anders Kaseorg <anders@zulipchat.com >
2020-02-07 14:09:47 -08:00