Display correct client link by default
This commit is contained in:
parent
74d223e475
commit
e6b9325d05
3 changed files with 86 additions and 22 deletions
|
@ -14,43 +14,89 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React, { useState } from 'react';
|
||||||
|
|
||||||
import './InviteTile.scss';
|
import './InviteTile.scss';
|
||||||
|
|
||||||
import Tile from './Tile';
|
import Tile from './Tile';
|
||||||
import LinkButton from './LinkButton';
|
import LinkButton from './LinkButton';
|
||||||
import TextButton from './TextButton';
|
import ClientSelection from './ClientSelection';
|
||||||
import { Client, ClientKind } from '../clients/types';
|
import { Client, ClientKind } from '../clients/types';
|
||||||
import { SafeLink } from '../parser/types';
|
import { SafeLink } from '../parser/types';
|
||||||
|
import TextButton from './TextButton';
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
client: Client;
|
client: Client | null;
|
||||||
link: SafeLink;
|
link: SafeLink;
|
||||||
}
|
}
|
||||||
|
|
||||||
const InviteTile: React.FC<IProps> = ({ children, client, link }: IProps) => {
|
const InviteTile: React.FC<IProps> = ({ children, client, link }: IProps) => {
|
||||||
|
const [showAdvanced, setShowAdvanced] = useState(false);
|
||||||
let invite: React.ReactNode;
|
let invite: React.ReactNode;
|
||||||
switch (client.kind) {
|
let advanced: React.ReactNode;
|
||||||
case ClientKind.LINKED_CLIENT:
|
// This i s a hacky way to get a the overlapping list of client
|
||||||
invite = (
|
// options working.
|
||||||
<LinkButton href={client.toUrl(link).toString()}>
|
let advancedPlaceholder: React.ReactNode;
|
||||||
Accept invite
|
|
||||||
</LinkButton>
|
if (client === null) {
|
||||||
);
|
invite = null;
|
||||||
break;
|
} else {
|
||||||
case ClientKind.TEXT_CLIENT:
|
let inviteUseString: string;
|
||||||
invite = <p>{client.toInviteString(link)}</p>;
|
|
||||||
break;
|
switch (client.kind) {
|
||||||
|
case ClientKind.LINKED_CLIENT:
|
||||||
|
invite = (
|
||||||
|
<LinkButton href={client.toUrl(link).toString()}>
|
||||||
|
Accept invite
|
||||||
|
</LinkButton>
|
||||||
|
);
|
||||||
|
inviteUseString = `Accepting will open ${link.identifier} in ${client.name}.`;
|
||||||
|
break;
|
||||||
|
case ClientKind.TEXT_CLIENT:
|
||||||
|
// TODO: copy to clipboard
|
||||||
|
invite = <p>{client.toInviteString(link)}</p>;
|
||||||
|
inviteUseString = `These are instructions for ${client.name}.`;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const advancedToggle = showAdvanced ? (
|
||||||
|
<TextButton onClick={(): void => setShowAdvanced(!showAdvanced)}>
|
||||||
|
Hide advanced options
|
||||||
|
</TextButton>
|
||||||
|
) : (
|
||||||
|
<p>
|
||||||
|
{inviteUseString}
|
||||||
|
<TextButton
|
||||||
|
onClick={(): void => setShowAdvanced(!showAdvanced)}
|
||||||
|
>
|
||||||
|
Change Client.
|
||||||
|
</TextButton>
|
||||||
|
</p>
|
||||||
|
);
|
||||||
|
|
||||||
|
invite = (
|
||||||
|
<>
|
||||||
|
{invite}
|
||||||
|
{advancedToggle}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (client === null || showAdvanced) {
|
||||||
|
advanced = <ClientSelection link={link} />;
|
||||||
|
advancedPlaceholder = <div className="advancedPlaceholder" />;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Tile className="inviteTile">
|
<>
|
||||||
{children}
|
<Tile className="inviteTile">
|
||||||
{invite}
|
{children}
|
||||||
<TextButton>Advanced options</TextButton>
|
{invite}
|
||||||
</Tile>
|
{advancedPlaceholder}
|
||||||
|
</Tile>
|
||||||
|
{advanced}
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect, useContext } from 'react';
|
||||||
import { getEvent, client } from 'matrix-cypher';
|
import { getEvent, client } from 'matrix-cypher';
|
||||||
|
|
||||||
import { RoomPreviewWithTopic } from './RoomPreview';
|
import { RoomPreviewWithTopic } from './RoomPreview';
|
||||||
|
@ -22,13 +22,14 @@ import InviteTile from './InviteTile';
|
||||||
import { SafeLink, LinkKind } from '../parser/types';
|
import { SafeLink, LinkKind } from '../parser/types';
|
||||||
import UserPreview from './UserPreview';
|
import UserPreview from './UserPreview';
|
||||||
import EventPreview from './EventPreview';
|
import EventPreview from './EventPreview';
|
||||||
import Clients from '../clients';
|
import { clientMap } from '../clients';
|
||||||
import {
|
import {
|
||||||
getRoomFromId,
|
getRoomFromId,
|
||||||
getRoomFromAlias,
|
getRoomFromAlias,
|
||||||
getRoomFromPermalink,
|
getRoomFromPermalink,
|
||||||
getUser,
|
getUser,
|
||||||
} from '../utils/cypher-wrapper';
|
} from '../utils/cypher-wrapper';
|
||||||
|
import { ClientContext } from '../contexts/ClientContext';
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
link: SafeLink;
|
link: SafeLink;
|
||||||
|
@ -91,8 +92,20 @@ const LinkPreview: React.FC<IProps> = ({ link }: IProps) => {
|
||||||
(async (): Promise<void> => setContent(await invite({ link })))();
|
(async (): Promise<void> => setContent(await invite({ link })))();
|
||||||
}, [link]);
|
}, [link]);
|
||||||
|
|
||||||
|
const [{ rememberSelection, clientId }] = useContext(ClientContext);
|
||||||
|
|
||||||
|
// Select which client to link to
|
||||||
|
const displayClientId =
|
||||||
|
rememberSelection && clientId
|
||||||
|
? clientId
|
||||||
|
: link.arguments.client
|
||||||
|
? link.arguments.client
|
||||||
|
: null;
|
||||||
|
|
||||||
|
const client = displayClientId ? clientMap[displayClientId] : null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<InviteTile client={Clients[0]} link={link}>
|
<InviteTile client={client} link={link}>
|
||||||
{content}
|
{content}
|
||||||
</InviteTile>
|
</InviteTile>
|
||||||
);
|
);
|
||||||
|
|
|
@ -10,4 +10,9 @@
|
||||||
row-gap: 60px;
|
row-gap: 60px;
|
||||||
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
||||||
|
.advanced {
|
||||||
|
position: relative;
|
||||||
|
top: -335px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue