diff --git a/web/pages/chat.tsx b/web/pages/chat.tsx index 8e910df1b..2922c6fb2 100644 --- a/web/pages/chat.tsx +++ b/web/pages/chat.tsx @@ -5,7 +5,8 @@ import format from 'date-fns/format' import { CHAT_HISTORY, - fetchDataFromMain, + UPDATE_CHAT_MESSGAE_VIZ, + fetchData, } from "../utils/apis"; const { Title } = Typography; @@ -21,8 +22,13 @@ interface Message { visible: boolean; } +interface MessageToggleProps { + isVisible: boolean; + message: Message; + setMessage: (message: Message) => {}, +}; -function createUserNameFilters(messages) { +function createUserNameFilters(messages: Message[]) { const filtered = messages.reduce((acc, curItem) => { const curAuthor = curItem.author; if (!acc.some(item => item.text === curAuthor)) { @@ -46,23 +52,58 @@ function createUserNameFilters(messages) { }); } +function MessageToggle({ isVisible, message, setMessage }: MessageToggleProps) { + const { id: messageId } = message; + + const updateChatMessage = async () => { + const result = await fetchData(UPDATE_CHAT_MESSGAE_VIZ, { + auth: true, + method: 'POST', + data: { + visible: !isVisible, + id: messageId, + }, + }); + + if (result.success && result.message === "changed") { + setMessage({ + ...message, + visible: !isVisible, + }); + } + } + + return ( + + ); +} + export default function Chat() { const [messages, setMessages] = useState([]); const getInfo = async () => { try { - const result = await fetchDataFromMain(CHAT_HISTORY); + const result = await fetchData(CHAT_HISTORY, { auth: false }); setMessages(result); } catch (error) { console.log("==== error", error); } }; + const updateMessage = message => { + const messageIndex = messages.findIndex(m => m.id === message.id); + messages.splice(messageIndex, 1, message) + setMessages([...messages]); + }; + useEffect(() => { getInfo(); }, []); - const nameFilters = createUserNameFilters(messages); const rowSelection = { onChange: (selectedRowKeys, selectedRows) => { @@ -118,13 +159,11 @@ export default function Chat() { key: 'visible', filters: [{ text: 'visible', value: true }, { text: 'hidden', value: false }], onFilter: (value, record) => record.visible === value, - render: visible => ( - { - console.log(`switch to ${checked}`); - }} - defaultChecked={visible} + render: (visible, record) => ( + ), width: 60, diff --git a/web/utils/apis.ts b/web/utils/apis.ts index 736b41463..062785555 100644 --- a/web/utils/apis.ts +++ b/web/utils/apis.ts @@ -34,41 +34,41 @@ export const LOGS_ALL = `${API_LOCATION}logs`; // Get warnings + errors export const LOGS_WARN = `${API_LOCATION}logs/warnings`; -// Chat history +// Get chat history export const CHAT_HISTORY = `${NEXT_PUBLIC_API_HOST}api/chat`; +// Get chat history +export const UPDATE_CHAT_MESSGAE_VIZ = `${NEXT_PUBLIC_API_HOST}api/admin/chat/updatemessagevisibility`; + const GITHUB_RELEASE_URL = "https://api.github.com/repos/owncast/owncast/releases/latest"; -export async function fetchData(url) { - const options: RequestInit = {}; +export async function fetchData(url: string, options?: object) { + const { + data, + method = 'GET', + auth = true, + } = options || {}; - if (ADMIN_USERNAME && ADMIN_STREAMKEY) { + const requestOptions: RequestInit = { + method, + }; + + if (data) { + requestOptions.body = JSON.stringify(data) + } + + if (auth && ADMIN_USERNAME && ADMIN_STREAMKEY) { const encoded = btoa(`${ADMIN_USERNAME}:${ADMIN_STREAMKEY}`); - options.headers = { + requestOptions.headers = { 'Authorization': `Basic ${encoded}` } - options.mode = 'cors'; - options.credentials = 'include' + requestOptions.mode = 'cors'; + requestOptions.credentials = 'include'; } try { - const response = await fetch(url, options); - if (!response.ok) { - const message = `An error has occured: ${response.status}`; - throw new Error(message); - } - const json = await response.json(); - return json; - } catch (error) { - console.log(error) - } - return {}; -} - -export async function fetchDataFromMain(url) { - try { - const response = await fetch(url); + const response = await fetch(url, requestOptions); if (!response.ok) { const message = `An error has occured: ${response.status}`; throw new Error(message);