Refactor app state to be a state machine with access selectors

This commit is contained in:
Gabe Kangas
2022-05-25 20:38:40 -07:00
parent dde9878a46
commit 7b1667bf6a
21 changed files with 421 additions and 223 deletions

View File

@@ -2,7 +2,6 @@ import React, { useState } from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import ChatContainer from '../components/chat/ChatContainer';
import { ChatMessage } from '../interfaces/chat-message.model';
import { ChatState } from '../interfaces/application-state';
export default {
title: 'owncast/Chat/Chat messages container',
@@ -25,7 +24,7 @@ const testMessages =
const messages: ChatMessage[] = JSON.parse(testMessages);
const AddMessagesChatExample = args => {
const { messages: m, state } = args;
const { messages: m, loading } = args;
const [chatMessages, setChatMessages] = useState<ChatMessage[]>(m);
return (
@@ -33,7 +32,7 @@ const AddMessagesChatExample = args => {
<button type="button" onClick={() => setChatMessages([...chatMessages, chatMessages[0]])}>
Add message
</button>
<ChatContainer messages={chatMessages} state={state} />
<ChatContainer messages={chatMessages} loading={loading} />
</div>
);
};
@@ -42,17 +41,17 @@ const Template: ComponentStory<typeof ChatContainer> = args => <AddMessagesChatE
export const Example = Template.bind({});
Example.args = {
state: ChatState.Available,
loading: false,
messages,
};
export const SingleMessage = Template.bind({});
SingleMessage.args = {
state: ChatState.Available,
loading: false,
messages: [messages[0]],
};
export const Loading = Template.bind({});
Loading.args = {
state: ChatState.Loading,
loading: true,
};

View File

@@ -2,7 +2,6 @@ import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import { RecoilRoot } from 'recoil';
import { UserDropdown } from '../components/common';
import { ChatState } from '../interfaces/application-state';
export default {
title: 'owncast/Components/User settings menu',
@@ -22,11 +21,9 @@ const Template: ComponentStory<typeof UserDropdown> = args => <Example {...args}
export const ChatEnabled = Template.bind({});
ChatEnabled.args = {
username: 'test-user',
chatState: ChatState.Available,
};
export const ChatDisabled = Template.bind({});
ChatDisabled.args = {
username: 'test-user',
chatState: ChatState.NotAvailable,
};

View File

@@ -1,5 +1,6 @@
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import { RecoilRoot } from 'recoil';
import OwncastPlayer from '../components/video/OwncastPlayer';
const streams = {
@@ -23,7 +24,11 @@ export default {
parameters: {},
} as ComponentMeta<typeof OwncastPlayer>;
const Template: ComponentStory<typeof OwncastPlayer> = args => <OwncastPlayer {...args} />;
const Template: ComponentStory<typeof OwncastPlayer> = args => (
<RecoilRoot>
<OwncastPlayer {...args} />
</RecoilRoot>
);
export const LiveDemo = Template.bind({});
LiveDemo.args = {