aboutsummaryrefslogtreecommitdiffstats
path: root/src/features/workspaces/components/WorkspacesDashboard.tsx
diff options
context:
space:
mode:
authorLibravatar muhamedsalih-tw <104364298+muhamedsalih-tw@users.noreply.github.com>2022-11-17 05:45:39 +0530
committerLibravatar GitHub <noreply@github.com>2022-11-17 00:15:39 +0000
commitd9502c7516bc2d4ae467c6ea8a2e4816b0885f37 (patch)
treeb339c587a5529ac26d52cfc12d9972a8a00255e6 /src/features/workspaces/components/WorkspacesDashboard.tsx
parentTransform JSX components to TSX (#755) (diff)
downloadferdium-app-d9502c7516bc2d4ae467c6ea8a2e4816b0885f37.tar.gz
ferdium-app-d9502c7516bc2d4ae467c6ea8a2e4816b0885f37.tar.zst
ferdium-app-d9502c7516bc2d4ae467c6ea8a2e4816b0885f37.zip
Transfrom workspace components to ts (#775)
Diffstat (limited to 'src/features/workspaces/components/WorkspacesDashboard.tsx')
-rw-r--r--src/features/workspaces/components/WorkspacesDashboard.tsx191
1 files changed, 191 insertions, 0 deletions
diff --git a/src/features/workspaces/components/WorkspacesDashboard.tsx b/src/features/workspaces/components/WorkspacesDashboard.tsx
new file mode 100644
index 000000000..60fc7a0ce
--- /dev/null
+++ b/src/features/workspaces/components/WorkspacesDashboard.tsx
@@ -0,0 +1,191 @@
1/* eslint-disable react/jsx-no-useless-fragment */
2import { Component, ReactElement } from 'react';
3import { observer } from 'mobx-react';
4import { defineMessages, injectIntl, WrappedComponentProps } from 'react-intl';
5import withStyles, { WithStylesProps } from 'react-jss';
6import Infobox from '../../../components/ui/infobox/index';
7import Loader from '../../../components/ui/Loader';
8import WorkspaceItem from './WorkspaceItem';
9import CreateWorkspaceForm from './CreateWorkspaceForm';
10import Request from '../../../stores/lib/Request';
11import Appear from '../../../components/ui/effects/Appear';
12import { H1 } from '../../../components/ui/headline';
13import Workspace from '../models/Workspace';
14
15const messages = defineMessages({
16 headline: {
17 id: 'settings.workspaces.headline',
18 defaultMessage: 'Your workspaces',
19 },
20 noServicesAdded: {
21 id: 'settings.workspaces.noWorkspacesAdded',
22 defaultMessage: "You haven't created any workspaces yet.",
23 },
24 workspacesRequestFailed: {
25 id: 'settings.workspaces.workspacesRequestFailed',
26 defaultMessage: 'Could not load your workspaces',
27 },
28 tryReloadWorkspaces: {
29 id: 'settings.workspaces.tryReloadWorkspaces',
30 defaultMessage: 'Try again',
31 },
32 updatedInfo: {
33 id: 'settings.workspaces.updatedInfo',
34 defaultMessage: 'Your changes have been saved',
35 },
36 deletedInfo: {
37 id: 'settings.workspaces.deletedInfo',
38 defaultMessage: 'Workspace has been deleted',
39 },
40 workspaceFeatureInfo: {
41 id: 'settings.workspaces.workspaceFeatureInfo',
42 defaultMessage:
43 'Ferdium Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.',
44 },
45 workspaceFeatureHeadline: {
46 id: 'settings.workspaces.workspaceFeatureHeadline',
47 defaultMessage: 'Less is More: Introducing Ferdium Workspaces',
48 },
49});
50
51const styles = {
52 table: {
53 width: '100%',
54 '& td': {
55 padding: '10px',
56 },
57 },
58 createForm: {
59 height: 'auto',
60 },
61 appear: {
62 height: 'auto',
63 },
64 teaserImage: {
65 width: 250,
66 margin: [-8, 0, 0, 20],
67 alignSelf: 'center',
68 },
69};
70
71interface IProps extends WithStylesProps<typeof styles>, WrappedComponentProps {
72 getUserWorkspacesRequest: Request;
73 createWorkspaceRequest: Request;
74 deleteWorkspaceRequest: Request;
75 updateWorkspaceRequest: Request;
76 onCreateWorkspaceSubmit: (workspace: Workspace) => void;
77 onWorkspaceClick: (workspace: Workspace) => void;
78 workspaces: Workspace[];
79}
80
81@observer
82class WorkspacesDashboard extends Component<IProps> {
83 render(): ReactElement {
84 const {
85 classes,
86 getUserWorkspacesRequest,
87 createWorkspaceRequest,
88 deleteWorkspaceRequest,
89 updateWorkspaceRequest,
90 onCreateWorkspaceSubmit,
91 onWorkspaceClick,
92 workspaces,
93 } = this.props;
94
95 const { intl } = this.props;
96
97 return (
98 <div className="settings__main">
99 <div className="settings__header">
100 <H1>{intl.formatMessage(messages.headline)}</H1>
101 </div>
102 <div className="settings__body">
103 {/* ===== Workspace updated info ===== */}
104 {updateWorkspaceRequest.wasExecuted && updateWorkspaceRequest.result && (
105 <Appear className={classes.appear}>
106 <Infobox
107 type="success"
108 icon="checkbox-marked-circle-outline"
109 dismissible
110 onUnmount={updateWorkspaceRequest.reset}
111 >
112 {intl.formatMessage(messages.updatedInfo)}
113 </Infobox>
114 </Appear>
115 )}
116
117 {/* ===== Workspace deleted info ===== */}
118 {deleteWorkspaceRequest.wasExecuted && deleteWorkspaceRequest.result && (
119 <Appear className={classes.appear}>
120 <Infobox
121 type="success"
122 icon="checkbox-marked-circle-outline"
123 dismissible
124 onUnmount={deleteWorkspaceRequest.reset}
125 >
126 {intl.formatMessage(messages.deletedInfo)}
127 </Infobox>
128 </Appear>
129 )}
130
131 {/* ===== Create workspace form ===== */}
132 <div className={classes.createForm}>
133 <CreateWorkspaceForm
134 isSubmitting={createWorkspaceRequest.isExecuting}
135 onSubmit={onCreateWorkspaceSubmit}
136 />
137 </div>
138 {getUserWorkspacesRequest.isExecuting ? (
139 <Loader />
140 ) : (
141 <>
142 {/* ===== Workspace could not be loaded error ===== */}
143 {getUserWorkspacesRequest.error ? (
144 <Infobox
145 icon="alert"
146 type="danger"
147 ctaLabel={intl.formatMessage(messages.tryReloadWorkspaces)}
148 // ctaLoading={getUserWorkspacesRequest.isExecuting} // TODO - [TECH DEBT][PROP NOT USED IN COMPONENT] need to check and update
149 ctaOnClick={getUserWorkspacesRequest.retry}
150 >
151 {intl.formatMessage(messages.workspacesRequestFailed)}
152 </Infobox>
153 ) : (
154 <>
155 {workspaces.length === 0 ? (
156 <div className="align-middle settings__empty-state">
157 {/* ===== Workspaces empty state ===== */}
158 <p className="settings__empty-text">
159 <span className="emoji">
160 <img src="./assets/images/emoji/sad.png" alt="" />
161 </span>
162 {intl.formatMessage(messages.noServicesAdded)}
163 </p>
164 </div>
165 ) : (
166 <table className={classes.table} role="grid">
167 {/* ===== Workspaces list ===== */}
168 <tbody>
169 {workspaces.map(workspace => (
170 <WorkspaceItem
171 key={workspace.id}
172 workspace={workspace}
173 onItemClick={w => onWorkspaceClick(w)}
174 />
175 ))}
176 </tbody>
177 </table>
178 )}
179 </>
180 )}
181 </>
182 )}
183 </div>
184 </div>
185 );
186 }
187}
188
189export default injectIntl(
190 withStyles(styles, { injectTheme: true })(WorkspacesDashboard),
191);