diff --git a/.env.sample b/.env.sample index 3d968fc..0123b53 100644 --- a/.env.sample +++ b/.env.sample @@ -1,4 +1,5 @@ DIRECTUS_API_URL=http://0.0.0.0:8055 +DIRECTUS_API_WS_URL=ws://0.0.0.0:8055/websocket APP_TITLE=constitution de karukera APP_FOOTER_TEXT=organisation ka internationale (oki) APP_FOOTER_URL=https://o-k-i.net @@ -9,6 +10,7 @@ NEXTAUTH_SECRET=NEXTAUTH_SECRET USER_ROLE=DIRECTUS_USER_ROLE_ID NEXT_PUBLIC_URL=http://0.0.0.0:3000 NEXT_PUBLIC_DIRECTUS_API_URL=$DIRECTUS_API_URL +NEXT_PUBLIC_DIRECTUS_API_WS_URL=$DIRECTUS_API_WS_URL # COMMENTS COMMENTS_PER_PAGE=5 diff --git a/components/session/sign.js b/components/session/sign.js index d2a7a49..d1b1786 100644 --- a/components/session/sign.js +++ b/components/session/sign.js @@ -1,7 +1,7 @@ 'use client' import PropTypes from 'prop-types' -import {useState} from 'react' +import {useEffect, useState} from 'react' import {signOut} from 'next-auth/react' import {useRouter} from 'next/navigation' import Box from '@mui/material/Box' @@ -12,8 +12,11 @@ import Tooltip, {tooltipClasses} from '@mui/material/Tooltip' import LogoutIcon from '@mui/icons-material/Logout' import LoginIcon from '@mui/icons-material/Login' import PersonAddIcon from '@mui/icons-material/PersonAdd' +import {createDirectus, realtime, staticToken} from '@directus/sdk' import ConfirmationAlert from './confirmation-alert.js' +const apiWsUrl = process.env.DIRECTUS_API_WS_URL || process.env.NEXT_PUBLIC_DIRECTUS_API_WS_URL + const LightTooltip = styled(({className, ...props}) => ( ))(({theme}) => ({ @@ -29,11 +32,72 @@ export default function Sign({session, navButton}) { const router = useRouter() const [isOpen, setIsOpen] = useState(false) + const directusClientWS = createDirectus(apiWsUrl) + .with(staticToken(session?.user?.accessToken)) + .with(realtime()) + const handleSignout = () => { setIsOpen(false) signOut() } + async function subscribe() { + const {subscription} = await directusClientWS.subscribe('directus_versions', { + event: 'create', + query: { + fields: ['*'], + filter: { + collection: { + _eq: 'titres' + } + } + } + }) + + for await (const item of subscription) { + console.log('New version created:', item) + } + } + + useEffect(() => { + let cleanup = () => {} + + if (session) { + (async () => { + try { + await directusClientWS.connect() + + directusClientWS.onWebSocket('open', () => { + console.log({event: 'onopen'}) + subscribe() + }) + + directusClientWS.onWebSocket('message', message => { + if (message.type === 'auth' && message.status === 'ok') { + console.log({event: 'onmessage', message}) + } + }) + + directusClientWS.onWebSocket('close', () => { + console.log({event: 'onclose'}) + }) + + directusClientWS.onWebSocket('error', error => { + console.log({event: 'onerror', error}) + }) + + cleanup = () => { + directusClientWS.disconnect() + } + } catch (error) { + console.error('WebSocket connection error:', error) + } + })() + } + + return () => cleanup() + }, [session]) // eslint-disable-line react-hooks/exhaustive-deps + return ( <>