Skip to content

Commit 9296f3b

Browse files
authored
Merge pull request #71 from SolidLabResearch/master
🚀
2 parents 1ce3457 + d43c810 commit 9296f3b

37 files changed

Lines changed: 7495 additions & 2874 deletions

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ This project is in active development. This in an overview of the progress:
4949
- [x] Sending, retrieving and displaying messages
5050
- [x] Watching a video stream
5151
- [x] Video stream syncing and controls
52-
- [ ] Privacy
52+
- [x] Privacy
5353
- [ ] Polishing
5454
2. **Statistics dashboard:**
5555
- *details to be determined*

solid-watchparty/github-post-build-script.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import * as fs from "fs";
33

44
const routes = [
55
"/menu",
6-
"/watch"
6+
"/watch",
7+
"/auth",
78
];
89
const dir = viteConfig.build.outDir;
910
for (const route of routes) {

solid-watchparty/package-lock.json

Lines changed: 6026 additions & 2431 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

solid-watchparty/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
},
1313
"dependencies": {
1414
"@comunica/query-sparql-link-traversal": "^0.3.0",
15+
"@comunica/query-sparql-link-traversal-solid": "^0.4.0",
1516
"@comunica/query-sparql-solid": "^2.4.0",
1617
"@incremunica/query-sparql-incremental": "^1.2.0",
1718
"@inrupt/solid-client": "^1.30.2",
@@ -22,6 +23,7 @@
2223
"clsx": "^2.1.0",
2324
"dashjs": "^4.7.3",
2425
"lucide-react": "^0.363.0",
26+
"microtime": "^3.1.1",
2527
"react": "^18.2.0",
2628
"react-dom": "^18.2.0",
2729
"react-full-screen": "^1.1.1",

solid-watchparty/src/App.jsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { SessionProvider } from '@inrupt/solid-ui-react'
77
import LoginPage from './pages/LoginPage';
88
import MenuPage from './pages/MenuPage';
99
import WatchPage from './pages/WatchPage';
10+
import LandingPage from './pages/LandingPage';
1011

1112
/* context imports */
1213
import { MessageBoxContext } from './contexts';
@@ -15,7 +16,8 @@ import { MessageBoxContext } from './contexts';
1516
import config from '../config';
1617

1718
const router = createBrowserRouter([
18-
{path: (config.baseDir + "/"), element: <LoginPage/>},
19+
{path: (config.baseDir + "/"), element: <LandingPage/>},
20+
{path: (config.baseDir + "/auth"), element: <LoginPage/>},
1921
{path: (config.baseDir + "/menu"), element: <MenuPage/>},
2022
{path: (config.baseDir + "/watch"), element: <WatchPage/>},
2123
]);
@@ -25,7 +27,7 @@ function App() {
2527
return (
2628
<SessionProvider>
2729
<MessageBoxContext.Provider value={messageBox}>
28-
<RouterProvider router={router}/>
30+
<RouterProvider router={router}/>
2931
</MessageBoxContext.Provider>
3032
</SessionProvider>
3133
);
1.9 MB
Loading

solid-watchparty/src/components/SWChatComponent.jsx

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* library imports */
2-
import { useState, useEffect, } from 'react';
2+
import { useState, useEffect, useContext } from 'react';
33
import { useSession, } from "@inrupt/solid-ui-react";
44
import PropTypes from 'prop-types';
55

@@ -8,6 +8,9 @@ import SWMessageComponent from '../components/SWMessageComponent'
88
import SWAutoScrollDiv from '../components/SWAutoScrollDiv';
99
import SWLoadingIcon from '../components/SWLoadingIcon';
1010

11+
/* context imports */
12+
import { MessageBoxContext } from '../contexts';
13+
1114
/* service imports */
1215
import MessageSolidService from '../services/message.solidservice.js'
1316
import UserSolidService from '../services/user.solidservice.js'
@@ -21,39 +24,54 @@ function SWChatComponent({roomUrl, joined}) {
2124
const [input, setInput] = useState('');
2225
const [messages, setMessages] = useState([]);
2326
const sessionContext = useSession();
27+
const [messageBox,] = useContext(MessageBoxContext);
28+
const [userNames, setUserNames] = useState({});
2429

2530
useEffect(() => {
26-
let messageSeriesStreams = null;
27-
let messageStreams = [];
2831
const fetch = async () => {
29-
messageSeriesStreams = await MessageSolidService.getMessageSeriesStream(sessionContext, roomUrl);
32+
const messageSeriesStreams = await MessageSolidService.getMessageSeriesStream(sessionContext, roomUrl);
3033
if (messageSeriesStreams.error) {
3134
console.error(messageSeriesStreams.error)
3235
messageSeriesStreams = null;
3336
setState({isLoading: false, hasAccess: false});
3437
return;
3538
}
36-
console.log('NOW LISTENING FOR MESSAGE STREAMS')
3739
messageSeriesStreams.on('data', async (data) => {
38-
console.log('NEW MESSAGESTREAM ACQUIRED')
39-
let messageStream = await MessageSolidService.getMessageStream(sessionContext,
40-
data.get('messageSeries').value);
41-
messageStreams.push(messageStream);
42-
if (messageStream.error) {
40+
const messageSeries = data.get('messageSeries').value;
41+
42+
let senderName = "Unknown";
43+
let creatorUrlStream = await MessageSolidService.getMessageSeriesCreatorStream(sessionContext, messageSeries);
44+
creatorUrlStream.on('data', (data) => {
45+
const creatorUrl = data?.get('creator')?.value;
46+
UserSolidService.getName(sessionContext, creatorUrl).then((name) => {
47+
if (!name.error) {
48+
setUserNames((userNames) => {
49+
userNames[messageSeries] = name;
50+
return userNames;
51+
});
52+
}
53+
});
54+
});
55+
56+
// TODO(Elias): Switch out restart of stream when Incremunica has internal handling for this
57+
let messageStreamAuthCheck = await MessageSolidService.getMessageStream(sessionContext, messageSeries);
58+
messageStreamAuthCheck.on('data', async (data) => {
59+
messageStreamAuthCheck.close();
60+
});
61+
62+
let messageStream = await MessageSolidService.getMessageStream(sessionContext, messageSeries);
63+
if (!messageStream || messageStream.error) {
4364
messageStream = null;
4465
return;
4566
}
4667
messageStream.on('data', async (data) => {
47-
let name = await UserSolidService.getName(sessionContext, data.get('sender').value);
48-
if (name.error) {
49-
name = '[Anonymous]';
50-
}
5168
const message = {
52-
text: data.get('text').value,
53-
sender: name,
54-
date: new Date(data.get('dateSent').value),
55-
key: (name + data.get('dateSent').value),
69+
text: data.get('text').value,
70+
messageBoxUrl: messageSeries,
71+
date: new Date(data.get('dateSent').value),
72+
key: (name + data.get('dateSent').value),
5673
};
74+
// TODO: Make this more efficient
5775
setMessages(messages => (
5876
[...messages, message]
5977
.sort((m1, m2) => (m1.date > m2.date) ? 1 : ((m1.date < m2.date) ? -1 : 0))
@@ -65,18 +83,6 @@ function SWChatComponent({roomUrl, joined}) {
6583
setState({isLoading: false, hasAccess: true});
6684
}
6785
fetch();
68-
69-
return (() => {
70-
if (messageSeriesStreams) {
71-
messageSeriesStreams.close();
72-
}
73-
for (let i = 0; i < messageStreams.length; i++) {
74-
if (messageStreams[i]) {
75-
messageStreams[i].close()
76-
}
77-
}
78-
setMessages([]);
79-
});
8086
}, [sessionContext.session, sessionContext.sessionRequestInProgress, roomUrl, joined])
8187

8288

@@ -85,7 +91,11 @@ function SWChatComponent({roomUrl, joined}) {
8591
if (input.length === 0) {
8692
return;
8793
}
88-
MessageSolidService.createMessage(sessionContext, input, roomUrl);
94+
MessageSolidService.createMessage(sessionContext, input, roomUrl, messageBox).then((r) => {
95+
if (r.error) {
96+
console.error(r.error);
97+
}
98+
})
8999
setInput('');
90100
}
91101

@@ -110,13 +120,18 @@ function SWChatComponent({roomUrl, joined}) {
110120
pageContent = (
111121
<>
112122
<SWAutoScrollDiv className="overflow-y-auto overflow-x-auto mb-2 shrink">
113-
{messages.map((message) => <SWMessageComponent message={message} key={message.key}/>)}
123+
{messages.map((message) => {
124+
const sender = userNames[message.messageBoxUrl];
125+
return (
126+
<SWMessageComponent message={{...message, sender}} key={message.key}/>
127+
);
128+
})}
114129
</SWAutoScrollDiv>
115130
<form autoComplete="off" className="grow-0 flex flex-between items-center" onSubmit={submitMessage}>
116-
<input id="msgInput" className="px-2 h-10 rgb-bg-1 sw-border w-full"
131+
<input id="msgInput" className="px-2 h-10 rgb-bg-1 sw-border w-full border-solid"
117132
onChange={(e) => setInput(parseMessage(e.target.value))}
118133
value={input} type='text'/>
119-
<button className="sw-btn hidden"> P </button>
134+
<button className="sw-btn hidden"></button>
120135
</form>
121136
</>
122137
);

solid-watchparty/src/components/SWFooter.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
function SWFooter()
22
{
33
return (
4-
<div className="grow-0 p-8 flex flex-col justify-end text-center">
4+
<div className="p-8 flex flex-col justify-end text-center">
55
<p className="rgb-2">(c) IDLab 2023</p>
66
</div>
77
);

solid-watchparty/src/components/SWLoginButton.jsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
/* libary imports */
22
import { LoginButton } from '@inrupt/solid-ui-react';
33
import PropTypes from 'prop-types';
4+
import { FaChevronRight } from 'react-icons/fa';
45

56
function SWLoginButton(props)
67
{
78
return (
8-
<LoginButton authOptions={props.authOptions} oidcIssuer={props.oidcIssuer}
9-
redirectUrl={props.redirectUrl} onError={console.error}>
10-
<button className={"sw-btn rgb-bg-3 rgb-3" + ' ' + props.className}>Log In</button>
11-
</LoginButton>
9+
<></>
1210
);
1311
}
1412

solid-watchparty/src/components/SWMenu.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ MenuBar.propTypes = {
2929
}
3030

3131

32-
export function MenuItem({children, onClick}) {
32+
export function MenuItem({children, onClick, href}) {
3333
return (
3434
<button className="flex flex-row" onClick={onClick}>
35-
<a>{children}</a>
35+
<a href={href}>{children}</a>
3636
</button>
3737
);
3838
}

0 commit comments

Comments
 (0)