Files
pawol.nu/components/teks/repons-mastodon.jsx
T

125 lines
4.5 KiB
React
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use client'
import {useState} from 'react'
import PropTypes from 'prop-types'
import Box from '@mui/material/Box'
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import TextField from '@mui/material/TextField'
import Typography from '@mui/material/Typography'
import FormControl from '@mui/material/FormControl'
import InputLabel from '@mui/material/InputLabel'
import Select from '@mui/material/Select'
import MenuItem from '@mui/material/MenuItem'
import Link from 'next/link'
import {Mastodon} from '@icons-pack/react-simple-icons'
const BOKANTE_URL = process.env.NEXT_PUBLIC_BOKANTE_URL || 'https://bokante.o-k-i.net'
const BOKANTE_ACCOUNT = process.env.NEXT_PUBLIC_BOKANTE_ACCOUNT || 'pawol_nu'
const INSTANCES_SUGGEREES = [
{domain: 'bokante.o-k-i.net', label: 'BOKANTE - notre instance'},
{domain: 'mastodon.social', label: 'mastodon.social'},
{domain: 'piaille.fr', label: 'piaille.fr'},
]
const AUTRE_INSTANCE = 'autre'
function extraireInstance(saisie) {
const valeur = saisie.trim().replace(/^@/, '').replace(/^https?:\/\//, '').replace(/\/$/, '')
return valeur.includes('@') ? valeur.split('@').pop() : valeur
}
export default function ReponsMastodon({bokanteStatusId}) {
const [ouvert, setOuvert] = useState(false)
const [instance, setInstance] = useState(INSTANCES_SUGGEREES[0].domain)
const [autreInstance, setAutreInstance] = useState('')
if (!bokanteStatusId) {
return null
}
const tootUrl = `${BOKANTE_URL}/@${BOKANTE_ACCOUNT}/${bokanteStatusId}`
const repondre = () => {
const domaine = instance === AUTRE_INSTANCE ? extraireInstance(autreInstance) : instance
if (!domaine) {
return
}
window.open(`https://${domaine}/authorize_interaction?uri=${encodeURIComponent(tootUrl)}`, '_blank', 'noopener,noreferrer')
setOuvert(false)
setAutreInstance('')
}
return (
<Box sx={{maxWidth: 700, margin: '1em auto 0', textAlign: 'center'}}>
<Typography variant='body2' sx={{mb: 1}}>
Rejoignez la discussion sur le Fediverse via{' '}
<Link href={tootUrl} target='_blank' rel='noopener noreferrer'>BOKANTE (Mastodon)</Link>
</Typography>
<Button
variant='outlined'
size='small'
startIcon={<Mastodon size={16} color='#6364FF' title='' />}
onClick={() => setOuvert(true)}
>
Répondre sur Mastodon
</Button>
<Dialog open={ouvert} onClose={() => setOuvert(false)}>
<DialogTitle>Répondre depuis Mastodon</DialogTitle>
<DialogContent>
<Typography variant='body2' sx={{mb: 2}}>
Choisissez linstance Mastodon sur laquelle vous avez un compte.
BOKANTE est linstance de OKI : vous pouvez aussi utiliser
nimporte quelle autre instance du Fediverse.
</Typography>
<FormControl fullWidth sx={{mb: 2}}>
<InputLabel id='instance-mastodon-label'>Instance Mastodon</InputLabel>
<Select
labelId='instance-mastodon-label'
id='instance-mastodon'
value={instance}
label='Instance Mastodon'
onChange={event => setInstance(event.target.value)}
>
{INSTANCES_SUGGEREES.map(({domain, label}) => (
<MenuItem key={domain} value={domain}>
{label}
</MenuItem>
))}
<MenuItem value={AUTRE_INSTANCE}>Autre instance</MenuItem>
</Select>
</FormControl>
{instance === AUTRE_INSTANCE && (
<TextField
autoFocus
fullWidth
label='@vous@votre-instance'
helperText='Indiquez votre identifiant (@vous@votre-instance) ou juste le nom de votre instance, vous serez redirigé·e vers votre compte pour répondre.'
value={autreInstance}
onChange={event => setAutreInstance(event.target.value)}
onKeyDown={event => {
if (event.key === 'Enter') {
repondre()
}
}}
/>
)}
</DialogContent>
<DialogActions>
<Button onClick={() => setOuvert(false)}>Annuler</Button>
<Button variant='contained' onClick={repondre}>Continuer</Button>
</DialogActions>
</Dialog>
</Box>
)
}
ReponsMastodon.propTypes = {
bokanteStatusId: PropTypes.string
}