remove chevron, no homepage button for element and add change client

This commit is contained in:
Bruno Windels 2020-12-07 13:34:22 +01:00
parent 166f5ded77
commit b5daf8fe0a
8 changed files with 62 additions and 48 deletions

View file

@ -2,25 +2,6 @@
padding: 16px 0;
}
.ClientListView > h2 {
display: flex;
align-items: center;
}
.ClientListView > h2 .back {
background: url('../images/chevron-left.svg');
background-color: none;
background-size: 40%;
background-repeat: no-repeat;
background-position: center;
border: none;
width: 24px;
height: 24px;
padding: 16px;
cursor: pointer;
margin-right: 8px;
}
.ClientView {
border: 1px solid #E6E6E6;
border-radius: 8px;

View file

@ -1,10 +0,0 @@
<svg width="9" height="17" viewBox="0 0 9 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.20723 2.70711C8.59775 3.09763 8.59878 3.73182 8.20952 4.1236L3.27581 9.08934L8.22556 14.0391C8.61608 14.4296 8.61711 15.0638 8.22785 15.4556C7.83859 15.8474 7.20645 15.8484 6.81593 15.4579L1.15907 9.80101C0.768549 9.41049 0.767523 8.7763 1.15678 8.38452L6.79531 2.70939C7.18457 2.31761 7.8167 2.31658 8.20723 2.70711Z" fill="#333333"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="8" height="17" fill="white" transform="translate(8.5 17) rotate(-180)"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 657 B

View file

@ -65,7 +65,6 @@ class ContinueWithClientView extends TemplateView {
const backTitle = "Back to all clients";
return t.div({className: "ClientListView"}, [
t.h2([
t.button({className: "back", ["aria-label"]: backTitle, title: backTitle, onClick: () => vm.showAll()}),
t.span(`Continue with ${vm.clientViewModel.name}`)
]),
t.div({className: "list"}, t.view(new ClientView(vm.clientViewModel)))

View file

@ -75,6 +75,7 @@ export class ClientListViewModel extends ViewModel {
_pickClient(client) {
this.clientViewModel = this.clientList.find(vm => vm.clientId === client.id);
this.clientViewModel.pick(this);
this.emitChange();
}

View file

@ -56,7 +56,12 @@ class OpenClientView extends TemplateView {
href: vm.deepLink,
rel: "noopener noreferrer",
onClick: () => vm.deepLinkActivated(),
}, "Continue")
}, "Continue"),
t.p({className: {previewSource: true, hidden: vm => !vm.showBack}}, [
`Continue with ${vm.name}.`,
" ",
t.button({className: "text", onClick: () => vm.back()}, "Change"),
]),
]);
}
}
@ -77,7 +82,7 @@ class InstallClientView extends TemplateView {
}
}
});
children.push(t.p({className: "instructions"}, [vm.textInstructions, copyButton]));
children.push(t.p({className: "instructions"}, [t.code(vm.textInstructions), copyButton]));
}
const actions = t.div({className: "actions"}, vm.actions.map(a => {

View file

@ -18,6 +18,14 @@ import {isWebPlatform, isDesktopPlatform, Platform} from "../Platform.js";
import {ViewModel} from "../utils/ViewModel.js";
import {IdentifierKind} from "../Link.js";
function getMatchingPlatforms(client, supportedPlatforms) {
const clientPlatforms = client.platforms;
const matchingPlatforms = supportedPlatforms.filter(p => {
return clientPlatforms.includes(p);
});
return matchingPlatforms;
}
export class ClientViewModel extends ViewModel {
constructor(options) {
super(options);
@ -25,19 +33,17 @@ export class ClientViewModel extends ViewModel {
this._client = client;
this._link = link;
this._pickClient = pickClient;
// to provide "choose other client" button after calling pick()
this._clientListViewModel = null;
const supportedPlatforms = client.platforms;
const matchingPlatforms = this.platforms.filter(p => {
return supportedPlatforms.includes(p);
});
const matchingPlatforms = getMatchingPlatforms(client, this.platforms);
const nativePlatform = matchingPlatforms.find(p => !isWebPlatform(p));
const webPlatform = matchingPlatforms.find(p => isWebPlatform(p));
this._proposedPlatform = this.preferences.platform || nativePlatform || webPlatform;
this._nativePlatform = nativePlatform || this._proposedPlatform;
this.actions = this._createActions(client, link, nativePlatform, webPlatform);
this.name = this._client.getName(this._proposedPlatform);
this.deepLink = this._client.getDeepLink(this._proposedPlatform, this._link);
this._clientCanIntercept = !!(nativePlatform && client.canInterceptMatrixToLinks(nativePlatform));
this._showOpen = this.deepLink && !this._clientCanIntercept;
}
@ -67,13 +73,15 @@ export class ClientViewModel extends ViewModel {
});
}
}
actions.push({
label: `Visit app homepage`,
url: client.homepage,
primary: true,
kind: "homepage",
activated: () => {},
});
if (client.homepage) {
actions.push({
label: `Visit app homepage`,
url: client.homepage,
primary: true,
kind: "homepage",
activated: () => {},
});
}
return actions;
}
@ -89,6 +97,10 @@ export class ClientViewModel extends ViewModel {
return this._client.id;
}
get name() {
return this._client.getName(this._platform);
}
get iconUrl() {
return this._client.icon;
}
@ -131,6 +143,14 @@ export class ClientViewModel extends ViewModel {
return textPlatforms;
}
get deepLink() {
return this._client.getDeepLink(this._platform, this._link);
}
get _platform() {
return this.showBack ? this._proposedPlatform : this._nativePlatform;
}
deepLinkActivated() {
this._pickClient(this._client);
this.preferences.setClient(this._client.id, this._proposedPlatform);
@ -139,4 +159,22 @@ export class ClientViewModel extends ViewModel {
this.emitChange();
}
}
pick(clientListViewModel) {
this._clientListViewModel = clientListViewModel;
this.emitChange();
}
get showBack() {
return !!this._clientListViewModel;
}
back() {
if (this._clientListViewModel) {
const vm = this._clientListViewModel;
this._clientListViewModel = null;
this.emitChange();
vm.showAll();
}
}
}

View file

@ -39,7 +39,7 @@ export class Element {
get description() { return 'Fully-featured Matrix client, used by millions.'; }
get homepage() { return "https://element.io"; }
get homepage() { return ; } // prevents a visit app homepage button from appearing
get author() { return "Element"; }
getMaturity(platform) { return Maturity.Stable; }

View file

@ -95,7 +95,7 @@ export const TAG_NAMES = {
[HTML_NS]: [
"br", "a", "ol", "ul", "li", "div", "h1", "h2", "h3", "h4", "h5", "h6",
"p", "strong", "em", "span", "img", "section", "main", "article", "aside",
"pre", "button", "time", "input", "textarea", "label", "form", "progress", "output"],
"pre", "button", "time", "input", "textarea", "label", "form", "progress", "output", "code"],
[SVG_NS]: ["svg", "circle"]
};