mirror of
				https://github.com/owncast/owncast.git
				synced 2025-11-04 13:27:21 +08:00 
			
		
		
		
	call update message api on toggle switch and update ui state
This commit is contained in:
		@ -5,7 +5,8 @@ import format from 'date-fns/format'
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
  CHAT_HISTORY,
 | 
					  CHAT_HISTORY,
 | 
				
			||||||
  fetchDataFromMain,
 | 
					  UPDATE_CHAT_MESSGAE_VIZ,
 | 
				
			||||||
 | 
					  fetchData,
 | 
				
			||||||
} from "../utils/apis";
 | 
					} from "../utils/apis";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const { Title } = Typography;
 | 
					const { Title } = Typography;
 | 
				
			||||||
@ -21,8 +22,13 @@ interface Message {
 | 
				
			|||||||
  visible: boolean;
 | 
					  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 filtered = messages.reduce((acc, curItem) => {
 | 
				
			||||||
    const curAuthor = curItem.author;
 | 
					    const curAuthor = curItem.author;
 | 
				
			||||||
    if (!acc.some(item => item.text === curAuthor)) {
 | 
					    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 (
 | 
				
			||||||
 | 
					    <Switch
 | 
				
			||||||
 | 
					      size="small"
 | 
				
			||||||
 | 
					      onChange={updateChatMessage}
 | 
				
			||||||
 | 
					      defaultChecked={isVisible}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default function Chat() {
 | 
					export default function Chat() {
 | 
				
			||||||
  const [messages, setMessages] = useState([]);
 | 
					  const [messages, setMessages] = useState([]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const getInfo = async () => {
 | 
					  const getInfo = async () => {
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const result = await fetchDataFromMain(CHAT_HISTORY);
 | 
					      const result = await fetchData(CHAT_HISTORY, { auth: false });
 | 
				
			||||||
      setMessages(result);
 | 
					      setMessages(result);
 | 
				
			||||||
    } catch (error) {
 | 
					    } catch (error) {
 | 
				
			||||||
      console.log("==== error", 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(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
    getInfo();
 | 
					    getInfo();
 | 
				
			||||||
  }, []);
 | 
					  }, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  const nameFilters = createUserNameFilters(messages);
 | 
					  const nameFilters = createUserNameFilters(messages);
 | 
				
			||||||
  const rowSelection = {
 | 
					  const rowSelection = {
 | 
				
			||||||
    onChange: (selectedRowKeys, selectedRows) => {
 | 
					    onChange: (selectedRowKeys, selectedRows) => {
 | 
				
			||||||
@ -118,13 +159,11 @@ export default function Chat() {
 | 
				
			|||||||
      key: 'visible',
 | 
					      key: 'visible',
 | 
				
			||||||
      filters: [{ text: 'visible', value: true }, { text: 'hidden', value: false }],
 | 
					      filters: [{ text: 'visible', value: true }, { text: 'hidden', value: false }],
 | 
				
			||||||
      onFilter: (value, record) => record.visible === value,
 | 
					      onFilter: (value, record) => record.visible === value,
 | 
				
			||||||
      render: visible => (
 | 
					      render: (visible, record) => (
 | 
				
			||||||
        <Switch
 | 
					        <MessageToggle
 | 
				
			||||||
          size="small"
 | 
					          isVisible={visible}
 | 
				
			||||||
          onChange={checked => {
 | 
					          message={record}
 | 
				
			||||||
            console.log(`switch to ${checked}`);
 | 
					          setMessage={updateMessage}
 | 
				
			||||||
          }}
 | 
					 | 
				
			||||||
          defaultChecked={visible}
 | 
					 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
      width: 60,
 | 
					      width: 60,
 | 
				
			||||||
 | 
				
			|||||||
@ -34,41 +34,41 @@ export const LOGS_ALL = `${API_LOCATION}logs`;
 | 
				
			|||||||
// Get warnings + errors
 | 
					// Get warnings + errors
 | 
				
			||||||
export const LOGS_WARN = `${API_LOCATION}logs/warnings`;
 | 
					export const LOGS_WARN = `${API_LOCATION}logs/warnings`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Chat history
 | 
					// Get chat history
 | 
				
			||||||
export const CHAT_HISTORY = `${NEXT_PUBLIC_API_HOST}api/chat`;
 | 
					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";
 | 
					const GITHUB_RELEASE_URL = "https://api.github.com/repos/owncast/owncast/releases/latest";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export async function fetchData(url) {
 | 
					export async function fetchData(url: string, options?: object) {
 | 
				
			||||||
  const options: RequestInit = {};
 | 
					  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}`);
 | 
					    const encoded = btoa(`${ADMIN_USERNAME}:${ADMIN_STREAMKEY}`);
 | 
				
			||||||
    options.headers = {
 | 
					    requestOptions.headers = {
 | 
				
			||||||
      'Authorization': `Basic ${encoded}`
 | 
					      'Authorization': `Basic ${encoded}`
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    options.mode = 'cors';
 | 
					    requestOptions.mode = 'cors';
 | 
				
			||||||
    options.credentials = 'include'
 | 
					    requestOptions.credentials = 'include';
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    const response = await fetch(url, options);
 | 
					    const response = await fetch(url, requestOptions);
 | 
				
			||||||
    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);
 | 
					 | 
				
			||||||
    if (!response.ok) {
 | 
					    if (!response.ok) {
 | 
				
			||||||
      const message = `An error has occured: ${response.status}`;
 | 
					      const message = `An error has occured: ${response.status}`;
 | 
				
			||||||
      throw new Error(message);
 | 
					      throw new Error(message);
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user