Iframe com
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import MessageBox from "@/components/MessageBox";
|
||||
import MessageBox from "@/components/channel/MessageBox";
|
||||
import AppLayout from "@/components/app/AppLayout";
|
||||
import { useParams, useRouter } from "next/navigation";
|
||||
import useApp from "@/hooks/use-app";
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { useParams, useSearchParams } from "next/navigation";
|
||||
import MessageBox from "@/components/MessageBox";
|
||||
import MessageBox from "@/components/channel/MessageBox";
|
||||
import AppLayout from "@/components/app/AppLayout";
|
||||
import { Server as ServerType } from "@/types/types";
|
||||
import auth from "@/lib/auth";
|
||||
import { useServerMessages } from "@/hooks/use-messages";
|
||||
import useApp from "@/hooks/use-app";
|
||||
import { useEffectOnceWhenReady } from "@/hooks/use-once";
|
||||
import ChannelView from "@/components/ChannelView";
|
||||
import ChannelView from "@/components/channel/ChannelView";
|
||||
|
||||
export default function Server() {
|
||||
const { ip } = useParams<{ ip: string }>();
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Channel, Message, Server } from "@/types/types";
|
||||
import MessageBox from "./MessageBox";
|
||||
import App from "@/types/app";
|
||||
import React, { Ref } from "react";
|
||||
import React, { Ref, useEffect, useRef } from "react";
|
||||
import PluginChannel from "./PluginChannel";
|
||||
|
||||
export default function ChannelView({
|
||||
app,
|
||||
@@ -47,6 +48,13 @@ export default function ChannelView({
|
||||
return null;
|
||||
|
||||
default:
|
||||
return <iframe src={app.currentChannel.kind} className="w-full" />;
|
||||
return (
|
||||
<PluginChannel
|
||||
app={app}
|
||||
messages={messages}
|
||||
ip={ip}
|
||||
serverRef={serverRef}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,24 @@
|
||||
"use client";
|
||||
|
||||
import { Message } from "@/types/types";
|
||||
import { Button } from "./ui/button";
|
||||
import { Input } from "./ui/input";
|
||||
import { Button } from "../ui/button";
|
||||
import { Input } from "../ui/input";
|
||||
import * as emoji from "emoji-picker-react";
|
||||
import EmojiPicker from "emoji-picker-react";
|
||||
import {
|
||||
DropdownMenu,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuTrigger,
|
||||
} from "./ui/dropdown-menu";
|
||||
} from "../ui/dropdown-menu";
|
||||
import { ChevronLeftIcon, SendIcon, SmilePlusIcon } from "lucide-react";
|
||||
import { useRef, useState } from "react";
|
||||
import { format, isToday, isYesterday } from "date-fns";
|
||||
import ReactMarkdown from "react-markdown";
|
||||
import remarkGfm from "remark-gfm";
|
||||
import { UserProfile } from "@/hooks/get-user";
|
||||
import ProfilePicture from "./ProfilePicture";
|
||||
import ProfilePicture from "../ProfilePicture";
|
||||
import App from "@/types/app";
|
||||
import { Textarea } from "./ui/textarea";
|
||||
import { Textarea } from "../ui/textarea";
|
||||
|
||||
function MessageContainer({ message, app }: { message: Message; app: App }) {
|
||||
const [profile, setProfile] = useState<UserProfile | null>();
|
||||
@@ -0,0 +1,50 @@
|
||||
import { Message } from "@/types/types";
|
||||
import App from "@/types/app";
|
||||
import React, { useEffect, useRef } from "react";
|
||||
import { useParentCommunication } from "react-iframes-bridge";
|
||||
|
||||
export default function PluginChannel({
|
||||
app,
|
||||
messages,
|
||||
ip,
|
||||
serverRef,
|
||||
}: {
|
||||
app: App;
|
||||
messages: Record<string, Message[]>;
|
||||
ip: string;
|
||||
serverRef: React.RefObject<WebSocket | null>;
|
||||
}) {
|
||||
if (!app.currentChannel)
|
||||
return (
|
||||
<div className="h-svh w-full max-h-svh flex flex-col pb-5 pl-5 gap-5" />
|
||||
);
|
||||
|
||||
const iframeRef = useRef<HTMLIFrameElement>(null);
|
||||
|
||||
const parentComm = useParentCommunication(iframeRef, {
|
||||
allowedOrigins: [new URL(app.currentChannel.kind).origin],
|
||||
communication: { debug: false },
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
parentComm.onMessage("GET_MESSAGES", () => {
|
||||
parentComm.sendToChild("MESSAGES", messages);
|
||||
});
|
||||
|
||||
parentComm.onMessage("SEND_MESSAGE", (msg: string) => {
|
||||
serverRef.current?.send(
|
||||
JSON.stringify({
|
||||
type: "send_message",
|
||||
params: {
|
||||
channel_id: app.currentChannel?.id,
|
||||
contents: msg,
|
||||
},
|
||||
})
|
||||
);
|
||||
});
|
||||
}, [parentComm]);
|
||||
|
||||
return (
|
||||
<iframe src={app.currentChannel.kind} className="w-full" ref={iframeRef} />
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user