GYU: Account Notification Settings (#11008)
* Implement new notification settings UI * Sort new keywords at the front * Make ts-strict happier * Make ts-strict happier * chore: fixed lint issues * update beta card * Fix issue with the user settings test * chore: fixed lint issues * Add tests for notification settings * chore: fixed lint issues * fix: spurious text failures * improve tests further * make ts-strict happier * improve tests further * Reduce uncovered conditions * Correct snapshot * even more test coverage * Fix an issue with inverted rules * Update res/css/views/settings/tabs/_SettingsIndent.pcss Co-authored-by: Šimon Brandner <simon.bra.ag@gmail.com> * Fix license headers * Improve i18n * make linters happier * Improve beta labels * improve i18n * chore: fixed lint issues * fix: more lint issues * Update snapshots to match changed text * Update text as requested * Remove labs image * Update snapshots * Correct an issue with one of the tests * fix: keyword reconcilation code * Determine mute status more accurately * Address review comments * Prevent duplicate updates * Fix missing license header * slight change to avoid ts-strict complaining * fix test issue caused by previous merge --------- Co-authored-by: Šimon Brandner <simon.bra.ag@gmail.com>
This commit is contained in:
parent
95283d21bb
commit
f62fe2626c
25 changed files with 3797 additions and 33 deletions
|
@ -44,6 +44,7 @@ type UseNotificationSettings = {
|
|||
};
|
||||
|
||||
export function useNotificationSettings(cli: MatrixClient): UseNotificationSettings {
|
||||
const run = useLinearisedPromise<void>();
|
||||
const supportsIntentionalMentions = useMemo(() => cli.supportsIntentionalMentions(), [cli]);
|
||||
|
||||
const pushRules = useRef<IPushRules | null>(null);
|
||||
|
@ -61,21 +62,41 @@ export function useNotificationSettings(cli: MatrixClient): UseNotificationSetti
|
|||
}, [cli, supportsIntentionalMentions]);
|
||||
|
||||
useEffect(() => {
|
||||
updatePushRules().catch((err) => console.error(err));
|
||||
}, [cli, updatePushRules]);
|
||||
run(updatePushRules).catch((err) => console.error(err));
|
||||
}, [cli, run, updatePushRules]);
|
||||
|
||||
const reconcile = useCallback(
|
||||
(model: NotificationSettings) => {
|
||||
if (pushRules.current !== null) {
|
||||
setModel(model);
|
||||
const changes = reconcileNotificationSettings(pushRules.current, model, supportsIntentionalMentions);
|
||||
applyChanges(cli, changes)
|
||||
.then(updatePushRules)
|
||||
.catch((err) => console.error(err));
|
||||
}
|
||||
setModel(model);
|
||||
run(async () => {
|
||||
if (pushRules.current !== null) {
|
||||
const changes = reconcileNotificationSettings(
|
||||
pushRules.current,
|
||||
model,
|
||||
supportsIntentionalMentions,
|
||||
);
|
||||
await applyChanges(cli, changes);
|
||||
await updatePushRules();
|
||||
}
|
||||
}).catch((err) => console.error(err));
|
||||
},
|
||||
[cli, updatePushRules, supportsIntentionalMentions],
|
||||
[run, supportsIntentionalMentions, cli, updatePushRules],
|
||||
);
|
||||
|
||||
return { model, hasPendingChanges, reconcile };
|
||||
}
|
||||
|
||||
function useLinearisedPromise<T>(): (fun: () => Promise<T>) => Promise<T> {
|
||||
const lastPromise = useRef<Promise<T> | null>(null);
|
||||
|
||||
return useCallback((fun: () => Promise<T>): Promise<T> => {
|
||||
let next: Promise<T>;
|
||||
if (lastPromise.current === null) {
|
||||
next = fun();
|
||||
} else {
|
||||
next = lastPromise.current.then(fun);
|
||||
}
|
||||
lastPromise.current = next;
|
||||
return next;
|
||||
}, []);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue