import * as React from 'react'; import {useState} from 'react'; import Button from '@mui/material/Button'; import TextField from '@mui/material/TextField'; import Dialog from '@mui/material/Dialog'; import DialogActions from '@mui/material/DialogActions'; import DialogContent from '@mui/material/DialogContent'; import DialogContentText from '@mui/material/DialogContentText'; import DialogTitle from '@mui/material/DialogTitle'; import Subscription from "../app/Subscription"; import {Autocomplete, Checkbox, FormControlLabel, useMediaQuery} from "@mui/material"; import theme from "./theme"; import api from "../app/Api"; import {topicUrl, validTopic, validUrl} from "../app/utils"; import useStyles from "./styles"; import User from "../app/User"; const defaultBaseUrl = "http://127.0.0.1" //const defaultBaseUrl = "https://ntfy.sh" const SubscribeDialog = (props) => { const [baseUrl, setBaseUrl] = useState(""); const [topic, setTopic] = useState(""); const [showLoginPage, setShowLoginPage] = useState(false); const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); const handleSuccess = (user) => { const actualBaseUrl = (baseUrl) ? baseUrl : defaultBaseUrl; // FIXME const subscription = new Subscription(actualBaseUrl, topic); props.onSuccess(subscription, user); } return ( {!showLoginPage && setShowLoginPage(true)} onSuccess={handleSuccess} />} {showLoginPage && setShowLoginPage(false)} onSuccess={handleSuccess} />} ); }; const SubscribePage = (props) => { const [anotherServerVisible, setAnotherServerVisible] = useState(false); const baseUrl = (anotherServerVisible) ? props.baseUrl : defaultBaseUrl; const topic = props.topic; const existingTopicUrls = props.subscriptions.map((id, s) => s.url()); const existingBaseUrls = Array.from(new Set(["https://ntfy.sh", ...props.subscriptions.map((id, s) => s.baseUrl)])) .filter(s => s !== defaultBaseUrl); const handleSubscribe = async () => { const success = await api.auth(baseUrl, topic, null); if (!success) { console.log(`[SubscribeDialog] Login to ${topicUrl(baseUrl, topic)} failed for anonymous user`); props.onNeedsLogin(); return; } console.log(`[SubscribeDialog] Successful login to ${topicUrl(baseUrl, topic)} for anonymous user`); props.onSuccess(null); }; const handleUseAnotherChanged = (e) => { props.setBaseUrl(""); setAnotherServerVisible(e.target.checked); }; const subscribeButtonEnabled = (() => { if (anotherServerVisible) { const isExistingTopicUrl = existingTopicUrls.includes(topicUrl(baseUrl, topic)); return validTopic(topic) && validUrl(baseUrl) && !isExistingTopicUrl; } else { const isExistingTopicUrl = existingTopicUrls.includes(topicUrl(defaultBaseUrl, topic)); // FIXME return validTopic(topic) && !isExistingTopicUrl; } })(); return ( <> Subscribe to topic Topics may not be password-protected, so choose a name that's not easy to guess. Once subscribed, you can PUT/POST notifications. props.setTopic(ev.target.value)} type="text" fullWidth variant="standard" /> } label="Use another server" /> {anotherServerVisible && props.setBaseUrl(newVal)} renderInput={ (params) => } />} ); }; const LoginPage = (props) => { const styles = useStyles(); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [errorText, setErrorText] = useState(""); const baseUrl = (props.baseUrl) ? props.baseUrl : defaultBaseUrl; const topic = props.topic; const handleLogin = async () => { const user = new User(baseUrl, username, password); const success = await api.auth(baseUrl, topic, user); if (!success) { console.log(`[SubscribeDialog] Login to ${topicUrl(baseUrl, topic)} failed for user ${username}`); setErrorText(`User ${username} not authorized`); return; } console.log(`[SubscribeDialog] Successful login to ${topicUrl(baseUrl, topic)} for user ${username}`); props.onSuccess(user); }; return ( <> Login required This topic is password-protected. Please enter username and password to subscribe. setUsername(ev.target.value)} type="text" fullWidth variant="standard" /> setPassword(ev.target.value)} fullWidth variant="standard" />
{errorText}
); }; export default SubscribeDialog;