import { For, Show } from "solid-js"; import { Trans } from "@lingui-solid/solid/macro"; import dayjs from "dayjs"; import { Server } from "stoat.js"; import { useClient } from "@revolt/client"; import { useModals } from "@revolt/modal"; import { useState } from "@revolt/state"; import { Column, Text, Time } from "@revolt/ui"; import MdAlternateEmail from "@material-design-icons/svg/outlined/alternate_email.svg?component-solid"; import MdBadge from "@material-design-icons/svg/outlined/badge.svg?component-solid"; import MdFace from "@material-design-icons/svg/outlined/face.svg?component-solid"; import MdLogout from "@material-design-icons/svg/outlined/logout.svg?component-solid"; import MdMarkChatRead from "@material-design-icons/svg/outlined/mark_chat_read.svg?component-solid"; import MdNotificationsActive from "@material-design-icons/svg/outlined/notifications_active.svg?component-solid"; import MdNotificationsOff from "@material-design-icons/svg/outlined/notifications_off.svg?component-solid"; import MdPersonAdd from "@material-design-icons/svg/outlined/person_add.svg?component-solid"; import MdReport from "@material-design-icons/svg/outlined/report.svg?component-solid"; import MdSettings from "@material-design-icons/svg/outlined/settings.svg?component-solid"; import MdShield from "@material-design-icons/svg/outlined/shield.svg?component-solid"; import MdDoNotDisturbOff from "@material-symbols/svg-400/outlined/do_not_disturb_off.svg?component-solid"; import MdDoNotDisturbOn from "@material-symbols/svg-400/outlined/do_not_disturb_on.svg?component-solid"; import MdNotificationSettings from "@material-symbols/svg-400/outlined/notification_settings.svg?component-solid"; import MdRadioButtonChecked from "@material-symbols/svg-400/outlined/radio_button_checked-fill.svg?component-solid"; import MdRadioButtonUnchecked from "@material-symbols/svg-400/outlined/radio_button_unchecked.svg?component-solid"; import { ContextMenu, ContextMenuButton, ContextMenuDivider, ContextMenuSubMenu, } from "./ContextMenu"; /** * Context menu for servers */ export function ServerContextMenu(props: { server: Server }) { const state = useState(); const client = useClient(); const { openModal } = useModals(); /** * Mark server as read */ function markAsRead() { props.server.ack(); } /** * Create a new invite */ function createInvite() { // Find the first channel we can invite people to const channel = props.server.orderedChannels .find((category) => category.channels.find((channel) => channel.havePermission("InviteOthers"), ), )! .channels.find((channel) => channel.havePermission("InviteOthers"))!; openModal({ type: "create_invite", channel, }); } /** * Open server settings */ function editIdentity() { openModal({ type: "server_identity", member: props.server.member!, }); } /** * Open server settings */ function openSettings() { openModal({ type: "settings", config: "server", context: props.server, }); } /** * Report the server */ function report() { openModal({ type: "report_content", target: props.server, client: client(), }); } /** * Leave the server */ function leave() { openModal({ type: "leave_server", server: props.server, }); } /** * Open server in Stoat Admin Panel */ function openAdminPanel() { window.open( `https://old-admin.stoatinternal.com/panel/inspect/server/${props.server.id}`, "_blank", ); } /** * Copy server id to clipboard */ function copyId() { navigator.clipboard.writeText(props.server.id); } /** * Determine whether we can invite others to any channels */ const permissionInviteOthers = () => props.server.channels.find((channel) => channel.havePermission("InviteOthers"), ); /** * Determine whether we can edit our identity */ const permissionEditIdentity = () => props.server.havePermission("ChangeNickname") || props.server.havePermission("ChangeAvatar"); /** * Determine whether we can access settings */ const permissionServerSettings = () => props.server.owner?.self || props.server.havePermission("AssignRoles") || props.server.havePermission("BanMembers") || props.server.havePermission("KickMembers") || props.server.havePermission("ManageChannel") || props.server.havePermission("ManageCustomisation") || props.server.havePermission("ManageNicknames") || props.server.havePermission("ManagePermissions") || props.server.havePermission("ManageRole") || props.server.havePermission("ManageServer") || props.server.havePermission("ManageWebhooks"); return ( Mark as read state.notifications.setServerMute(props.server, undefined) } symbol={MdDoNotDisturbOff} _titleCase={false} > Unmute Server Muted until{" "} } > state.notifications.setServerMute(props.server, {})} buttonContent={Mute Server} symbol={MdDoNotDisturbOn} > For 15 minutes], [60, For 1 hour], [180, For 3 hours], [480, For 8 hours], [1440, For 24 hours], [undefined, Until I turn it back on], ] as const } > {([timeMin, i18n]) => ( state.notifications.setServerMute(props.server, { until: timeMin ? +dayjs().add(timeMin, "minutes") : undefined, }) } _titleCase={false} > {i18n} )} Notifications} > state.notifications.setServer(props.server, "all")} actionSymbol={ state.notifications.computeForServer(props.server) === "all" ? MdRadioButtonChecked : MdRadioButtonUnchecked } > All Messages state.notifications.setServer(props.server, "mention")} actionSymbol={ state.notifications.computeForServer(props.server) === "mention" ? MdRadioButtonChecked : MdRadioButtonUnchecked } > Mentions Only state.notifications.setServer(props.server, "none")} actionSymbol={ state.notifications.computeForServer(props.server) === "none" ? MdRadioButtonChecked : MdRadioButtonUnchecked } > None Create invite Edit your identity Open server settings Report server Leave server Admin Panel Copy server ID ); }