openreplay/frontend/app/components/Session_/Issues/IssueForm.js
Delirium a71381da40
getting rid of redux for good (#2556)
* start moving ui to redux tlk

* remove unused reducer

* changes for gdpr and site types

* ui: migrating duck/roles to mobx

* ui: drop unreferenced types

* ui: drop unreferenced types

* ui: move player slice reducer to mobx family

* ui: move assignments to issueReportingStore.ts

* remove issues store

* some fixes after issues store

* remove errors reducer, drop old components

* finish removing errors reducer

* start moving integrations state to mobx

* change(ui): funnel duck cleanup

* change(ui): custom fields

* change(ui): customMetrics cleanup

* change(ui): customMetrics cleanup

* change(ui): duck/filters minor cleanup

* change(ui): duck/filters cleanup

* change(ui): duck/customMetrics cleanup and upgrades

* fix integrations service, fix babel config to >.25 + not ie

* refactoring integrations reducers etc WIP

* finish removing integrations state

* some fixes for integrated check

* start of projects refactoring

* move api and "few" files to new project store

* new batch for site -> projects

* fix setid context

* move all critical components, drop site duck

* remove all duck/site refs, remove old components

* fixup for SessionTags.tsx, remove duck/sources (?)

* move session store

* init sessionstore outside of context

* fix userfilter

* replace simple actions for session store

* sessions sotre

* Rtm temp (#2597)

* change(ui): duck/search wip

* change(ui): duck/search wip

* change(ui): duck/search wip

* change(ui): duck/searchLive wip

* change(ui): duck/searchLive wip

* change(ui): duck/searchLive wip

* change(ui): duck/searchLive wip

* change(ui): search states

* change(ui): search states

* change(ui): search states

* change(ui): fix savedSearch store

* change(ui): fix savedSearch store

* some fixes for session connector

* change(ui): fix savedSearch store

* change(ui): fix searchLive

* change(ui): fix searchLive

* fixes for session replay

* change(ui): bookmark fetch

* last components for sessions

* add fetchautoplaylist

* finish session reducer, remove deleted reducers

* change(ui): fix the search fetch

* change(ui): fix the search fetch

* fix integrations call ctx

* ensure ctx for sessionstore

* fix(ui): checking for latest sessions path

* start removing user reducer

* removing user reducer pt2...

* finish user store

* remove rand log

* fix crashes

* tinkering workflow file for tracker test

* making sure prefetched sessions work properly

* fix conflict

* fix router redirects during loading

---------

Co-authored-by: Shekar Siri <sshekarsiri@gmail.com>
2024-10-03 11:38:36 +02:00

178 lines
5 KiB
JavaScript

import { observer } from 'mobx-react-lite';
import React from 'react';
import { useStore } from 'App/mstore';
import { Button, CircularLoader, Form, Input, Loader } from 'UI';
import Select from 'Shared/Select';
const SelectedValue = ({ icon, text }) => {
return (
<div className="flex items-center">
{icon}
<span>{text}</span>
</div>
);
};
function IssueForm(props) {
const { closeHandler } = props;
const { issueReportingStore } = useStore();
const creating = issueReportingStore.createLoading;
const projects = issueReportingStore.projects;
const projectsLoading = issueReportingStore.projectsLoading;
const users = issueReportingStore.users;
const instance = issueReportingStore.instance;
const metaLoading = issueReportingStore.metaLoading;
const issueTypes = issueReportingStore.issueTypes;
const addActivity = issueReportingStore.saveIssue;
const init = issueReportingStore.init;
const edit = issueReportingStore.editInstance;
const fetchMeta = issueReportingStore.fetchMeta;
React.useEffect(() => {
init({
projectId: projects[0] ? projects[0].id : '',
issueType: issueTypes[0] ? issueTypes[0].id : '',
});
}, []);
React.useEffect(() => {
if (instance?.projectId) {
fetchMeta(instance?.projectId).then(() => {
edit({
issueType: '',
assignee: '',
projectId: instance?.projectId,
});
});
}
}, [instance?.projectId]);
const onSubmit = () => {
const { sessionId } = props;
addActivity(sessionId, instance).then(() => {
const { errors } = props;
if (!errors || errors.length === 0) {
init({ projectId: instance?.projectId });
void issueReportingStore.fetchList(sessionId);
closeHandler();
}
});
};
const write = (e) => {
const {
target: { name, value },
} = e;
edit({ [name]: value });
};
const writeOption = ({ name, value }) => edit({ [name]: value.value });
const projectOptions = projects.map(({ name, id }) => ({
label: name,
value: id,
}));
const userOptions = users.map(({ name, id }) => ({ label: name, value: id }));
const issueTypeOptions = issueTypes.map(({ name, id, iconUrl, color }) => {
return { label: name, value: id, iconUrl, color };
});
const selectedIssueType = issueTypes.filter(
(issue) => issue.id == instance?.issueType
)[0];
return (
<Loader loading={projectsLoading} size={40}>
<Form onSubmit={onSubmit} className="text-left">
<Form.Field className="mb-15-imp">
<label htmlFor="issueType" className="flex items-center">
<span className="mr-2">Project</span>
<CircularLoader loading={metaLoading} />
</label>
<Select
name="projectId"
options={projectOptions}
defaultValue={instance?.projectId}
fluid
onChange={writeOption}
placeholder="Project"
/>
</Form.Field>
<Form.Field className="mb-15-imp">
<label htmlFor="issueType">Issue Type</label>
<Select
selection
name="issueType"
labeled
options={issueTypeOptions}
defaultValue={instance?.issueType}
fluid
onChange={writeOption}
placeholder="Select issue type"
text={
selectedIssueType ? (
<SelectedValue
icon={selectedIssueType.iconUrl}
text={selectedIssueType.name}
/>
) : (
''
)
}
/>
</Form.Field>
<Form.Field className="mb-15-imp">
<label htmlFor="assignee">Assignee</label>
<Select
selection
name="assignee"
options={userOptions}
fluid
onChange={writeOption}
placeholder="Select a user"
/>
</Form.Field>
<Form.Field className="mb-15-imp">
<label htmlFor="title">Summary</label>
<Input
name="title"
value={instance?.title}
placeholder="Issue Title / Summary"
onChange={write}
/>
</Form.Field>
<Form.Field className="mb-15-imp">
<label htmlFor="description">Description</label>
<textarea
name="description"
rows="2"
value={instance?.description}
placeholder="E.g. Found this issue at 3:29secs"
onChange={write}
className="text-area"
/>
</Form.Field>
<Button
loading={creating}
variant="primary"
disabled={!instance?.isValid}
className="float-left mr-2"
type="submit"
>
{'Create'}
</Button>
<Button type="button" onClick={closeHandler}>
{'Cancel'}
</Button>
</Form>
</Loader>
);
}
export default observer(IssueForm);