diff --git a/web/pages/chat.tsx b/web/pages/chat.tsx
index 2922c6fb2..8d573dba1 100644
--- a/web/pages/chat.tsx
+++ b/web/pages/chat.tsx
@@ -1,34 +1,18 @@
import React, { useState, useEffect } from "react";
-import { Table, Typography, Tooltip, Switch } from "antd";
+import { Table, Typography, Tooltip, Switch, Button, Result } from "antd";
+import { RowSelectionType } from "antd/es/table/interface";
import { ColumnsType } from 'antd/es/table';
import format from 'date-fns/format'
-import {
- CHAT_HISTORY,
- UPDATE_CHAT_MESSGAE_VIZ,
- fetchData,
-} from "../utils/apis";
+import ToggleSwitch from './components/toggle';
+
+import { CHAT_HISTORY, fetchData } from "../utils/apis";
+import { MessageType } from '../types/chat';
+
const { Title } = Typography;
-interface Message {
- key: string;
- author: string;
- body: string;
- id: string;
- name: string;
- timestamp: string;
- type: string;
- visible: boolean;
-}
-
-interface MessageToggleProps {
- isVisible: boolean;
- message: Message;
- setMessage: (message: Message) => {},
-};
-
-function createUserNameFilters(messages: Message[]) {
+function createUserNameFilters(messages: MessageType[]) {
const filtered = messages.reduce((acc, curItem) => {
const curAuthor = curItem.author;
if (!acc.some(item => item.text === curAuthor)) {
@@ -52,38 +36,9 @@ function createUserNameFilters(messages: Message[]) {
});
}
-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 [selectedRowKeys, setSelectedRows] = useState([]);
const getInfo = async () => {
try {
@@ -96,6 +51,7 @@ export default function Chat() {
const updateMessage = message => {
const messageIndex = messages.findIndex(m => m.id === message.id);
+ console.log("====update?", message, messages[messageIndex])
messages.splice(messageIndex, 1, message)
setMessages([...messages]);
};
@@ -105,17 +61,16 @@ export default function Chat() {
}, []);
const nameFilters = createUserNameFilters(messages);
- const rowSelection = {
- onChange: (selectedRowKeys, selectedRows) => {
- console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
+
+ const rowSelection: RowSelectionType = {
+ selectedRowKeys,
+ onChange: selectedKeys => {
+ setSelectedRows(selectedKeys);
},
- getCheckboxProps: record => ({
- disabled: record.name === 'Disabled User', // Column configuration not to be checked
- name: record.name,
- }),
};
- const chatColumns: ColumnsType = [
+
+ const chatColumns: ColumnsType = [
{
title: 'Time',
dataIndex: 'timestamp',
@@ -160,7 +115,7 @@ export default function Chat() {
filters: [{ text: 'visible', value: true }, { text: 'hidden', value: false }],
onFilter: (value, record) => record.visible === value,
render: (visible, record) => (
-
Chat Messages
+ click things and stuff
+
+
row.id}
-
- rowSelection={{
- type: "checkbox",
- ...rowSelection,
- }}
-
+ rowSelection={rowSelection}
/>
)
}
diff --git a/web/pages/components/toggle.tsx b/web/pages/components/toggle.tsx
new file mode 100644
index 000000000..c867f3152
--- /dev/null
+++ b/web/pages/components/toggle.tsx
@@ -0,0 +1,75 @@
+// Wrapper for AntDesign Switch that makes an api call, then displays a confirmation icon upon
+// TODO: make it more generic, maybe. This one is currently just for message visiblity updates.
+
+import React, { useState, useEffect } from "react";
+import { Switch } from "antd";
+import { CheckCircleFilled, ExclamationCircleFilled } from "@ant-design/icons";
+import { fetchData, UPDATE_CHAT_MESSGAE_VIZ } from "../../utils/apis";
+import { MessageType } from '../../types/chat';
+
+interface MessageToggleProps {
+ isVisible: boolean;
+ message: MessageType;
+ setMessage: (message: MessageType) => {},
+};
+
+const OUTCOME_TIMEOUT = 3000;
+
+export default function ToggleSwitch({ isVisible, message, setMessage }: MessageToggleProps) {
+ let outcomeTimeout = null;
+ const [outcome, setOutcome] = useState(0);
+
+ const { id: messageId } = message;
+
+ const resetOutcome = () => {
+ outcomeTimeout = setTimeout(() => { setOutcome(0)}, OUTCOME_TIMEOUT);
+ };
+
+ useEffect(() => {
+ return () => {
+ clearTimeout(outcomeTimeout);
+ };
+ });
+
+
+ const updateChatMessage = async () => {
+ clearTimeout(outcomeTimeout);
+ setOutcome(0);
+ 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 });
+ setOutcome(1);
+ } else {
+ setMessage({ ...message, visible: isVisible });
+ setOutcome(-1);
+ }
+ resetOutcome();
+ }
+
+
+ let outcomeIcon = ;
+ if (outcome) {
+ outcomeIcon = outcome > 0 ?
+ :
+ ;
+ }
+
+ return (
+
+ {outcomeIcon}
+
+
+ );
+}
\ No newline at end of file
diff --git a/web/styles/chat.scss b/web/styles/chat.scss
index 0e3e0aba5..df54dfed0 100644
--- a/web/styles/chat.scss
+++ b/web/styles/chat.scss
@@ -17,4 +17,16 @@
}
.ant-table-filter-dropdown {
max-width: 250px;
+}
+
+.toggle-switch {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ flex-wrap: nowrap;
+ justify-content: flex-end;
+
+ .outcome-icon {
+ margin-right: .5rem;
+ }
}
\ No newline at end of file
diff --git a/web/styles/colors.scss b/web/styles/colors.scss
index 22aa1d407..5c93e506d 100644
--- a/web/styles/colors.scss
+++ b/web/styles/colors.scss
@@ -3,4 +3,10 @@
--owncast-purple-highlight: #ccd;
--online-color: #73dd3f;
+
+
+ --ant-error: #ff4d4f;
+ --ant-success: #52c41a;
+ --ant-warning: #faad14;
+
}
diff --git a/web/styles/globals.scss b/web/styles/globals.scss
index a1278937a..49e7e41d8 100644
--- a/web/styles/globals.scss
+++ b/web/styles/globals.scss
@@ -41,4 +41,4 @@ pre {
background-color: rgb(44, 44, 44);
color:lightgrey;
}
-}
\ No newline at end of file
+}
diff --git a/web/types/chat.ts b/web/types/chat.ts
new file mode 100644
index 000000000..096839b86
--- /dev/null
+++ b/web/types/chat.ts
@@ -0,0 +1,10 @@
+export interface MessageType {
+ author: string;
+ body: string;
+ id: string;
+ key: string;
+ name: string;
+ timestamp: string;
+ type: string;
+ visible: boolean;
+}