jam-cloud/jam-ui/src/components/page/JKNewMusicSession.js

234 lines
8.5 KiB
JavaScript

import React, { useRef, useState, useEffect } from 'react';
//import {useHistory} from 'react-router-dom';
import { Form, FormGroup, Input, Label, Card, CardBody, Button, Row, Col } from 'reactstrap';
import FalconCardHeader from '../common/FalconCardHeader';
import JKTooltip from '../common/JKTooltip';
import { useTranslation } from 'react-i18next';
import { useAuth } from '../../context/UserAuth';
import JKFriendsAutoComplete from '../people/JKFriendsAutoComplete';
import JKSessionInviteesChips from '../people/JKSessionInviteesChips';
import { getFriends } from '../../helpers/rest';
import jkCustomUrlScheme from '../../helpers/jkCustomUrlScheme';
import JKModalDialog from '../common/JKModalDialog';
import useNativeAppCheck from '../../hooks/useNativeAppCheck';
import { useNativeApp } from '../../context/NativeAppContext';
import { useResponsive } from '@farfetch/react-context-responsive';
import { sessionPrivacyMap } from '../../config';
// const privacyMap = {
// public: 1,
// private_invite: 2,
// private_approve: 3
// };
const JKNewMusicSession = () => {
const { currentUser } = useAuth();
const { t } = useTranslation();
const [friends, setFriends] = useState([]);
const [isFriendsFetched, setIsFriendsFetched] = useState(false);
const [description, setDescription] = useState('');
const [invitees, setInvitees] = useState([]);
const [privacy, setPrivacy] = useState('1');
const [submitted, setSubmitted] = useState(false);
const [showAppUnavailable, setShowAppUnavailable] = useState(false);
//const history = useHistory();
const formRef = useRef();
const isNativeAppAvailable = useNativeAppCheck();
const { nativeAppUnavailable, setNativeAppUnavailable } = useNativeApp();
const { greaterThan } = useResponsive();
useEffect(() => {
fetchFriends();
}, []);
useEffect(() => {
if (isFriendsFetched) {
populateFormDataFromLocalStorage();
}
}, [isFriendsFetched]);
const fetchFriends = () => {
getFriends(currentUser.id)
.then(resp => {
if (resp.ok) {
return resp.json();
}
})
.then(data => {
setFriends(data);
setIsFriendsFetched(true);
});
};
const populateFormDataFromLocalStorage = () => {
try {
const formData = localStorage.getItem('formData');
if (formData) {
const formDataItems = JSON.parse(formData);
setDescription(formDataItems['description']);
setPrivacy(formDataItems['privacy']);
const inviteeIds = formDataItems['inviteeIds'];
const invitees = friends.filter(f => inviteeIds.includes(f.id));
updateSessionInvitations(invitees);
}
} catch (error) {
console.error('localStorage is not available', error);
}
};
const handleSubmit = async event => {
event.preventDefault();
setSubmitted(true);
const formData = new FormData(event.target);
const payload = {
privacy: formData.get('privacy'),
description: formData.get('description'),
inviteeIds: invitees.map(i => i.id).join()
};
try {
//store this payload in localstorage.
localStorage.setItem('formData', JSON.stringify(payload));
} catch (error) {
console.error('localStorage is not available', error);
}
//check if jamkazam app is installed
try {
await isNativeAppAvailable();
//window.open jamkazam app url using custom URL scheme
//an example URL would be: jamkazam://url=https://www.jamkazam.com/client#/createSession/privacy~2|description~hello|inviteeIds~1,2,3,4
const q = `privacy~${payload.privacy}|description~${payload.description}|inviteeIds~${payload.inviteeIds}`;
const urlScheme = jkCustomUrlScheme('createSession', q);
window.open(urlScheme);
//history.push('/sessions');
} catch (error) {
toggleAppUnavilableModel();
}
return false;
};
const handleOnSelect = submittedItems => {
updateSessionInvitations(submittedItems);
};
const updateSessionInvitations = submittedInvitees => {
const updatedInvitees = Array.from(new Set([...invitees, ...submittedInvitees]));
setInvitees(updatedInvitees);
const friendIds = submittedInvitees.map(si => si.id);
const updatedFriends = friends.filter(f => !friendIds.includes(f.id));
setFriends(updatedFriends);
};
const removeInvitee = invitee => {
const updatedInvitees = invitees.filter(i => i.id !== invitee.id);
setInvitees(updatedInvitees);
const updatedFriends = [...friends, invitee];
setFriends(updatedFriends);
};
const toggleAppUnavilableModel = () => {
setNativeAppUnavailable(prev => !prev);
if (!nativeAppUnavailable) {
setSubmitted(false);
}
};
return (
<div>
<Card>
<FalconCardHeader title={t('new.page_title', { ns: 'sessions' })} titleClass="font-weight-bold" />
<CardBody className="pt-0">
<Row>
<Col>
<Form onSubmit={handleSubmit} ref={formRef}>
<FormGroup className="mb-3">
<Label>
{t('new.privacy', { ns: 'sessions' })}{' '}
<JKTooltip title={t('new.privacy_help', { ns: 'sessions' })} />
</Label>
<Input
type="select"
aria-label="Session Privacy"
name="privacy"
value={privacy}
onChange={e => setPrivacy(e.target.value)}
data-testid="session-privacy"
>
<option value={sessionPrivacyMap['public']}>{t('new.privacy_opt_public', { ns: 'sessions' })}</option>
<option value={sessionPrivacyMap['private_invite']}>
{t('new.privacy_opt_private_invite', { ns: 'sessions' })}
</option>
<option value={sessionPrivacyMap['private_approve']}>
{t('new.privacy_opt_private_approve', { ns: 'sessions' })}
</option>
</Input>
</FormGroup>
<FormGroup className="mb-3">
<Label>
{t('new.invitations', { ns: 'sessions' })}{' '}
<JKTooltip title={t('new.invitations_help', { ns: 'sessions' })} />
</Label>
<JKFriendsAutoComplete friends={friends} onSelect={handleOnSelect} />
{invitees.length > 0 && <JKSessionInviteesChips invitees={invitees} removeInvitee={removeInvitee} />}
</FormGroup>
<FormGroup className="mb-3">
<Label>
{t('new.description', { ns: 'sessions' })}{' '}
<JKTooltip title={t('new.description_help', { ns: 'sessions' })} />
</Label>
<Input
value={description}
onChange={e => setDescription(e.target.value)}
name="description"
type="textarea"
data-testid="session-description"
placeholder={t('new.description_placeholder', { ns: 'sessions' })}
/>
</FormGroup>
<FormGroup className="mb-3">
<Button color="primary" data-testid="btn-create-session" disabled={submitted}>
{t('new.create_session', { ns: 'sessions' })}
</Button>
</FormGroup>
</Form>
</Col>
{ greaterThan.lg && (
<Col />
)}
</Row>
</CardBody>
</Card>
<JKModalDialog
show={nativeAppUnavailable}
onToggle={toggleAppUnavilableModel}
title={t('modals.native_app_unavailable.title', { ns: 'common' })}
>
<p>{t('modals.native_app_unavailable.body', { ns: 'common' })}</p>
<div className="d-flex flex-row">
<a
href="https://www.jamkazam.com/downloads"
onClick={() => toggleAppUnavilableModel()}
target="_blank"
className="btn btn-primary mr-2"
>
{t('modals.native_app_unavailable.download_button', { ns: 'common' })}
</a>
<a
href="https://www.jamkazam.com/help_desk"
onClick={() => toggleAppUnavilableModel()}
target="_blank"
className="btn btn-light"
>
{t('modals.native_app_unavailable.help_button', { ns: 'common' })}
</a>
</div>
</JKModalDialog>
</div>
);
};
export default JKNewMusicSession;