diff --git a/.github/workflows/triage_issue.yml b/.github/workflows/triage_issue.yml index b625a98b..ecc69f59 100644 --- a/.github/workflows/triage_issue.yml +++ b/.github/workflows/triage_issue.yml @@ -15,22 +15,27 @@ jobs: gh api graphql -f query=' query { organization(login: "revoltchat"){ - projectNext(number: 3) { + projectV2(number: 3) { id fields(first:20) { nodes { - id - name - settings + ... on ProjectV2SingleSelectField { + id + name + options { + id + name + } + } } } } } }' > project_data.json - echo 'PROJECT_ID='$(jq '.data.organization.projectNext.id' project_data.json) >> $GITHUB_ENV - echo 'STATUS_FIELD_ID='$(jq '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") | .id' project_data.json) >> $GITHUB_ENV - echo 'TODO_OPTION_ID='$(jq '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") |.settings | fromjson.options[] | select(.name=="Todo") |.id' project_data.json) >> $GITHUB_ENV + echo 'PROJECT_ID='$(jq '.data.organization.projectV2.id' project_data.json) >> $GITHUB_ENV + echo 'STATUS_FIELD_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .id' project_data.json) >> $GITHUB_ENV + echo 'TODO_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .options[] | select(.name=="Todo") |.id' project_data.json) >> $GITHUB_ENV - name: Add issue to project env: @@ -39,11 +44,11 @@ jobs: run: | item_id="$( gh api graphql -f query=' mutation($project:ID!, $issue:ID!) { - addProjectNextItem(input: {projectId: $project, contentId: $issue}) { - projectNextItem { + addProjectV2ItemById(input: {projectId: $project, contentId: $issue}) { + item { id } } - }' -f project=$PROJECT_ID -f issue=$ISSUE_ID --jq '.data.addProjectNextItem.projectNextItem.id')" - + }' -f project=$PROJECT_ID -f issue=$ISSUE_ID --jq '.data.addProjectV2ItemById.item.id')" + echo 'ITEM_ID='$item_id >> $GITHUB_ENV diff --git a/.github/workflows/triage_pr.yml b/.github/workflows/triage_pr.yml index df07fe88..de5a9421 100644 --- a/.github/workflows/triage_pr.yml +++ b/.github/workflows/triage_pr.yml @@ -15,22 +15,27 @@ jobs: gh api graphql -f query=' query { organization(login: "revoltchat"){ - projectNext(number: 3) { + projectV2(number: 3) { id fields(first:20) { nodes { - id - name - settings + ... on ProjectV2SingleSelectField { + id + name + options { + id + name + } + } } } } } }' > project_data.json - echo 'PROJECT_ID='$(jq '.data.organization.projectNext.id' project_data.json) >> $GITHUB_ENV - echo 'STATUS_FIELD_ID='$(jq '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") | .id' project_data.json) >> $GITHUB_ENV - echo 'INCOMING_OPTION_ID='$(jq '.data.organization.projectNext.fields.nodes[] | select(.name== "Status") |.settings | fromjson.options[] | select(.name=="Incoming PRs") |.id' project_data.json) >> $GITHUB_ENV + echo 'PROJECT_ID='$(jq '.data.organization.projectV2.id' project_data.json) >> $GITHUB_ENV + echo 'STATUS_FIELD_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .id' project_data.json) >> $GITHUB_ENV + echo 'INCOMING_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .options[] | select(.name=="Incoming PRs") |.id' project_data.json) >> $GITHUB_ENV - name: Add PR to project env: @@ -39,13 +44,13 @@ jobs: run: | item_id="$( gh api graphql -f query=' mutation($project:ID!, $pr:ID!) { - addProjectNextItem(input: {projectId: $project, contentId: $pr}) { - projectNextItem { + addProjectV2ItemById(input: {projectId: $project, contentId: $pr}) { + item { id } } - }' -f project=$PROJECT_ID -f pr=$PR_ID --jq '.data.addProjectNextItem.projectNextItem.id')" - + }' -f project=$PROJECT_ID -f pr=$PR_ID --jq '.data.addProjectV2ItemById.item.id')" + echo 'ITEM_ID='$item_id >> $GITHUB_ENV - name: Set fields @@ -59,14 +64,16 @@ jobs: $status_field: ID! $status_value: String! ) { - set_status: updateProjectNextItemField(input: { + set_status: updateProjectV2ItemFieldValue(input: { projectId: $project itemId: $item fieldId: $status_field - value: $status_value + value: { + singleSelectOptionId: $status_value + } }) { - projectNextItem { + projectV2Item { id - } + } } }' -f project=$PROJECT_ID -f item=$ITEM_ID -f status_field=$STATUS_FIELD_ID -f status_value=${{ env.INCOMING_OPTION_ID }} --silent diff --git a/external/lang b/external/lang index f95ec6dc..4eec9dd0 160000 --- a/external/lang +++ b/external/lang @@ -1 +1 @@ -Subproject commit f95ec6dc8200adba7925425d4cf2ae0c16f049c3 +Subproject commit 4eec9dd02afa6a7f9b68c336282d4819b9c30790 diff --git a/external/revolt.js b/external/revolt.js index ab064f41..e1a98853 160000 --- a/external/revolt.js +++ b/external/revolt.js @@ -1 +1 @@ -Subproject commit ab064f41a4154acee7c1751ea5b59d9ee4345a0b +Subproject commit e1a98853b49adb78698af175e8b7c971ef501d5b diff --git a/src/components/common/AutoComplete.tsx b/src/components/common/AutoComplete.tsx index 72c0d885..0ba18214 100644 --- a/src/components/common/AutoComplete.tsx +++ b/src/components/common/AutoComplete.tsx @@ -1,4 +1,7 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +import { Link } from "react-router-dom"; import { Channel, User } from "revolt.js"; +import { Emoji as CustomEmoji } from "revolt.js/esm/maps/Emojis"; import styled, { css } from "styled-components/macro"; import { StateUpdater, useState } from "preact/hooks"; @@ -7,6 +10,8 @@ import { emojiDictionary } from "../../assets/emojis"; import { useClient } from "../../controllers/client/ClientController"; import ChannelIcon from "./ChannelIcon"; import Emoji from "./Emoji"; +import ServerIcon from "./ServerIcon"; +import Tooltip from "./Tooltip"; import UserIcon from "./user/UserIcon"; export type AutoCompleteState = @@ -14,7 +19,7 @@ export type AutoCompleteState = | ({ selected: number; within: boolean } & ( | { type: "emoji"; - matches: string[]; + matches: (string | CustomEmoji)[]; } | { type: "user"; @@ -104,16 +109,23 @@ export function useAutoComplete( if (type === "emoji") { // ! TODO: we should convert it to a Binary Search Tree and use that - const matches = Object.keys(emojiDictionary) - .filter((emoji: string) => emoji.match(regex)) - .splice(0, 5); + const matches = [ + ...Object.keys(emojiDictionary).filter((emoji: string) => + emoji.match(regex), + ), + ...Array.from(client.emojis.values()).filter((emoji) => + emoji.name.match(regex), + ), + ].splice(0, 5); if (matches.length > 0) { const currentPosition = state.type !== "none" ? state.selected : 0; setState({ + // @ts-ignore-next-line are you high type: "emoji", + // @ts-ignore-next-line matches, selected: Math.min(currentPosition, matches.length - 1), within: false, @@ -233,10 +245,13 @@ export function useAutoComplete( const content = el.value.split(""); if (state.type === "emoji") { + const selected = state.matches[state.selected]; content.splice( index, search.length, - state.matches[state.selected], + selected instanceof CustomEmoji + ? selected._id + : selected, ": ", ); } else if (state.type === "user") { @@ -388,12 +403,17 @@ export default function AutoComplete({ setState, onClick, }: Pick) { + const client = useClient(); return (
{state.type === "emoji" && state.matches.map((match, i) => ( ))} {state.type === "user" && diff --git a/src/components/common/messaging/embed/Embed.tsx b/src/components/common/messaging/embed/Embed.tsx index 3d04c44f..ce63c1aa 100644 --- a/src/components/common/messaging/embed/Embed.tsx +++ b/src/components/common/messaging/embed/Embed.tsx @@ -67,7 +67,8 @@ export default function Embed({ embed }: Props) { break; } case "Twitch": - case "Lightspeed": { + case "Lightspeed": + case "Streamable": { mw = 1280; mh = 720; break; diff --git a/src/components/common/messaging/embed/EmbedMedia.tsx b/src/components/common/messaging/embed/EmbedMedia.tsx index 53723d27..fca1cedc 100644 --- a/src/components/common/messaging/embed/EmbedMedia.tsx +++ b/src/components/common/messaging/embed/EmbedMedia.tsx @@ -92,6 +92,16 @@ export default function EmbedMedia({ embed, width, height }: Props) { /> ); } + case "Streamable": { + return ( +