forked from Kieran/zap.stream
fix: don't crash when no follows
This commit is contained in:
parent
508abaad1f
commit
c708870e04
@ -53,4 +53,4 @@
|
|||||||
|
|
||||||
.new-stream .tos-link:hover {
|
.new-stream .tos-link:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
@ -88,26 +88,41 @@ export function NostrProviderDialog({
|
|||||||
function tosInput() {
|
function tosInput() {
|
||||||
if (!info) return;
|
if (!info) return;
|
||||||
|
|
||||||
return <>
|
return (
|
||||||
<div>
|
<>
|
||||||
<div className="flex g12">
|
<div>
|
||||||
<input type="checkbox" checked={tos} onChange={e => setTos(e.target.checked)} />
|
<div className="flex g12">
|
||||||
<p>
|
<input
|
||||||
I have read and agree with {info.name}'s <span className="tos-link" onClick={() => window.open(info.tosLink, "popup", "width=400,height=800")}>terms and conditions</span>.
|
type="checkbox"
|
||||||
</p>
|
checked={tos}
|
||||||
|
onChange={(e) => setTos(e.target.checked)}
|
||||||
|
/>
|
||||||
|
<p>
|
||||||
|
I have read and agree with {info.name}'s{" "}
|
||||||
|
<span
|
||||||
|
className="tos-link"
|
||||||
|
onClick={() =>
|
||||||
|
window.open(info.tosLink, "popup", "width=400,height=800")
|
||||||
|
}
|
||||||
|
>
|
||||||
|
terms and conditions
|
||||||
|
</span>
|
||||||
|
.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div>
|
||||||
<div>
|
<AsyncButton
|
||||||
<AsyncButton
|
type="button"
|
||||||
type="button"
|
className="btn btn-primary wide"
|
||||||
className="btn btn-primary wide"
|
disabled={!tos}
|
||||||
disabled={!tos}
|
onClick={acceptTos}
|
||||||
onClick={acceptTos}
|
>
|
||||||
>
|
Continue
|
||||||
Continue
|
</AsyncButton>
|
||||||
</AsyncButton>
|
</div>
|
||||||
</div>
|
</>
|
||||||
</>
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -167,26 +182,33 @@ export function NostrProviderDialog({
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{info.tosAccepted === false ? tosInput() :
|
{info.tosAccepted === false ? (
|
||||||
|
tosInput()
|
||||||
|
) : (
|
||||||
<StreamEditor
|
<StreamEditor
|
||||||
onFinish={(ex) => {
|
onFinish={(ex) => {
|
||||||
provider.updateStreamInfo(ex);
|
provider.updateStreamInfo(ex);
|
||||||
others.onFinish?.(ex);
|
others.onFinish?.(ex);
|
||||||
}}
|
}}
|
||||||
ev={{
|
ev={
|
||||||
tags: [
|
{
|
||||||
["title", info.streamInfo?.title ?? ""],
|
tags: [
|
||||||
["summary", info.streamInfo?.summary ?? ""],
|
["title", info.streamInfo?.title ?? ""],
|
||||||
["image", info.streamInfo?.image ?? ""],
|
["summary", info.streamInfo?.summary ?? ""],
|
||||||
...(info.streamInfo?.content_warning ? [["content-warning", info.streamInfo?.content_warning]] : []),
|
["image", info.streamInfo?.image ?? ""],
|
||||||
...(info.streamInfo?.tags?.map(a => ["t", a]) ?? [])
|
...(info.streamInfo?.content_warning
|
||||||
]
|
? [["content-warning", info.streamInfo?.content_warning]]
|
||||||
} as NostrEvent}
|
: []),
|
||||||
|
...(info.streamInfo?.tags?.map((a) => ["t", a]) ?? []),
|
||||||
|
],
|
||||||
|
} as NostrEvent
|
||||||
|
}
|
||||||
options={{
|
options={{
|
||||||
canSetStream: false,
|
canSetStream: false,
|
||||||
canSetStatus: false,
|
canSetStatus: false,
|
||||||
}}
|
}}
|
||||||
/>}
|
/>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -12,13 +12,14 @@ export function RootPage() {
|
|||||||
|
|
||||||
const { live, planned, ended } = useStreamsFeed();
|
const { live, planned, ended } = useStreamsFeed();
|
||||||
const mutedHosts = new Set(getTagValues(login?.muted.tags ?? [], "p"));
|
const mutedHosts = new Set(getTagValues(login?.muted.tags ?? [], "p"));
|
||||||
|
const tags = login?.follows.tags ?? [];
|
||||||
const followsHost = useCallback(
|
const followsHost = useCallback(
|
||||||
(ev: NostrEvent) => {
|
(ev: NostrEvent) => {
|
||||||
return login?.follows.tags.find((t) => t.at(1) === getHost(ev));
|
return tags.find((t) => t.at(1) === getHost(ev));
|
||||||
},
|
},
|
||||||
[login?.follows]
|
[tags]
|
||||||
);
|
);
|
||||||
const hashtags = getTagValues(login?.follows.tags ?? [], "t");
|
const hashtags = getTagValues(tags, "t");
|
||||||
const following = live.filter(followsHost);
|
const following = live.filter(followsHost);
|
||||||
const liveNow = live.filter((e) => !following.includes(e));
|
const liveNow = live.filter((e) => !following.includes(e));
|
||||||
const hasFollowingLive = following.length > 0;
|
const hasFollowingLive = following.length > 0;
|
||||||
|
@ -53,7 +53,7 @@ export interface StreamProviderInfo {
|
|||||||
balance?: number;
|
balance?: number;
|
||||||
endpoints: Array<StreamProviderEndpoint>;
|
endpoints: Array<StreamProviderEndpoint>;
|
||||||
tosAccepted?: boolean;
|
tosAccepted?: boolean;
|
||||||
tosLink?: string
|
tosLink?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface StreamProviderEndpoint {
|
export interface StreamProviderEndpoint {
|
||||||
@ -66,11 +66,11 @@ export interface StreamProviderEndpoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface StreamProviderStreamInfo {
|
export interface StreamProviderStreamInfo {
|
||||||
title: string
|
title: string;
|
||||||
summary: string
|
summary: string;
|
||||||
image: string
|
image: string;
|
||||||
tags: Array<string>
|
tags: Array<string>;
|
||||||
content_warning: string
|
content_warning: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ProviderStore extends ExternalStore<Array<StreamProvider>> {
|
export class ProviderStore extends ExternalStore<Array<StreamProvider>> {
|
||||||
|
@ -51,7 +51,7 @@ export class OwncastProvider implements StreamProvider {
|
|||||||
acceptTos(): Promise<void> {
|
acceptTos(): Promise<void> {
|
||||||
throw new Error("Method not implemented.");
|
throw new Error("Method not implemented.");
|
||||||
}
|
}
|
||||||
|
|
||||||
async #getJson<T>(
|
async #getJson<T>(
|
||||||
method: "GET" | "POST",
|
method: "GET" | "POST",
|
||||||
path: string,
|
path: string,
|
||||||
|
Loading…
Reference in New Issue
Block a user