diff --git a/src/components/ui/IconButton.tsx b/src/components/ui/IconButton.tsx index a0c75784..bf946abc 100644 --- a/src/components/ui/IconButton.tsx +++ b/src/components/ui/IconButton.tsx @@ -12,6 +12,7 @@ export default styled.div` display: grid; cursor: pointer; place-items: center; + transition: .1s ease background-color; fill: ${normal}; color: ${normal}; diff --git a/src/context/revoltjs/RevoltClient.tsx b/src/context/revoltjs/RevoltClient.tsx index 5ca77857..08617827 100644 --- a/src/context/revoltjs/RevoltClient.tsx +++ b/src/context/revoltjs/RevoltClient.tsx @@ -3,12 +3,12 @@ import { Client } from "revolt.js"; import { takeError } from "./util"; import { createContext } from "preact"; import { Children } from "../../types/Preact"; +import { useHistory } from 'react-router-dom'; import { Route } from "revolt.js/dist/api/routes"; import { connectState } from "../../redux/connector"; import Preloader from "../../components/ui/Preloader"; import { WithDispatcher } from "../../redux/reducers"; import { AuthState } from "../../redux/reducers/auth"; -import { SyncOptions } from "../../redux/reducers/sync"; import { useEffect, useMemo, useState } from "preact/hooks"; import { useIntermediate } from '../intermediate/Intermediate'; import { registerEvents, setReconnectDisallowed } from "./events"; @@ -30,6 +30,8 @@ export interface ClientOperations { logout: (shouldRequest?: boolean) => Promise; loggedIn: () => boolean; ready: () => boolean; + + openDM: (user_id: string) => Promise; } export const AppContext = createContext(undefined as any); @@ -42,6 +44,7 @@ type Props = WithDispatcher & { }; function Context({ auth, children, dispatcher }: Props) { + const history = useHistory(); const { openScreen } = useIntermediate(); const [status, setStatus] = useState(ClientStatus.INIT); const [client, setClient] = useState(undefined as unknown as Client); @@ -132,7 +135,12 @@ function Context({ auth, children, dispatcher }: Props) { ready: () => ( operations.loggedIn() && typeof client.user !== "undefined" - ) + ), + openDM: async (user_id: string) => { + let channel = await client.users.openDM(user_id); + history.push(`/channel/${channel!._id}`); + return channel!._id; + } } }, [ client, auth.active ]); diff --git a/src/pages/friends/Friend.module.scss b/src/pages/friends/Friend.module.scss index ab28639b..a8183e51 100644 --- a/src/pages/friends/Friend.module.scss +++ b/src/pages/friends/Friend.module.scss @@ -72,16 +72,16 @@ display: flex; gap: 12px; - > a { - height: 40px; + .button { width: 40px; + height: 40px; - &:nth-child(1):hover { - background: var(--status-online); //TOFIX: change to normal green color + &:hover.error { + background: var(--error); } - &:nth-child(3):hover { - background: var(--error); + &:hover.success { + background: var(--success); } } } diff --git a/src/pages/friends/Friend.tsx b/src/pages/friends/Friend.tsx index dd51b263..2befba18 100644 --- a/src/pages/friends/Friend.tsx +++ b/src/pages/friends/Friend.tsx @@ -1,18 +1,19 @@ import { Text } from "preact-i18n"; -import { Link } from "react-router-dom"; +import classNames from "classnames"; import styles from "./Friend.module.scss"; import { useContext } from "preact/hooks"; import { Children } from "../../types/Preact"; -import { X, Plus } from "@styled-icons/boxicons-regular"; -import { PhoneCall, Envelope } from "@styled-icons/boxicons-solid"; import IconButton from "../../components/ui/IconButton"; import { attachContextMenu } from "preact-context-menu"; +import { X, Plus } from "@styled-icons/boxicons-regular"; import { User, Users } from "revolt.js/dist/api/objects"; import { stopPropagation } from "../../lib/stopPropagation"; +import { VoiceOperationsContext } from "../../context/Voice"; import UserIcon from "../../components/common/user/UserIcon"; import UserStatus from '../../components/common/user/UserStatus'; -import { AppContext } from "../../context/revoltjs/RevoltClient"; +import { PhoneCall, Envelope } from "@styled-icons/boxicons-solid"; import { useIntermediate } from "../../context/intermediate/Intermediate"; +import { AppContext, OperationsContext } from "../../context/revoltjs/RevoltClient"; interface Props { user: User; @@ -21,6 +22,8 @@ interface Props { export function Friend({ user }: Props) { const client = useContext(AppContext); const { openScreen } = useIntermediate(); + const { openDM } = useContext(OperationsContext); + const { connect } = useContext(VoiceOperationsContext); const actions: Children[] = []; let subtext: Children = null; @@ -29,18 +32,16 @@ export function Friend({ user }: Props) { subtext = actions.push( <> - + className={classNames(styles.button, styles.success)} + onClick={ev => stopPropagation(ev, openDM(user._id).then(connect))}> - - + className={styles.button} + onClick={ev => stopPropagation(ev, openDM(user._id))}> - ); } @@ -48,6 +49,7 @@ export function Friend({ user }: Props) { if (user.relationship === Users.Relationship.Incoming) { actions.push( stopPropagation(ev, client.users.addFriend(user.username))}> @@ -67,6 +69,7 @@ export function Friend({ user }: Props) { ) { actions.push( stopPropagation(ev, client.users.removeFriend(user._id))}> @@ -76,6 +79,7 @@ export function Friend({ user }: Props) { if (user.relationship === Users.Relationship.Blocked) { actions.push( stopPropagation(ev, client.users.unblockUser(user._id))}> diff --git a/src/pages/friends/Friends.tsx b/src/pages/friends/Friends.tsx index 343a9fc0..b144030b 100644 --- a/src/pages/friends/Friends.tsx +++ b/src/pages/friends/Friends.tsx @@ -29,6 +29,9 @@ export default function Friends() { x => x.relationship === Users.Relationship.Blocked ); + const online = friends.filter(x => x.online && x.status?.presence !== Users.Presence.Invisible); + const offline = friends.filter(x => !x.online || x.status?.presence === Users.Presence.Invisible); + return ( <>
@@ -36,7 +39,7 @@ export default function Friends() {
- openScreen({ id: 'special_input', type: 'add_friend' })}> {/* TOFIX: Make sure this opens the "Start Group DM" window on click */} + openScreen({ id: 'special_input', type: 'create_group' })}> openScreen({ id: 'special_input', type: 'add_friend' })}> @@ -64,13 +67,22 @@ export default function Friends() { {pending.map(y => ( ))} - {friends.length > 0 && ( + {online.length > 0 && ( - —{" "} - {friends.length} + —{" "} + {online.length} )} - {friends.map(y => ( + {online.map(y => ( + + ))} + {offline.length > 0 && ( + + —{" "} + {offline.length} + + )} + {offline.map(y => ( ))} {blocked.length > 0 && (