Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
b57b7d2
next13
djyde Feb 7, 2023
31dd79b
prisma 4
djyde Feb 7, 2023
cb1fb0e
new dashboard
djyde Feb 7, 2023
eb0dbbc
comment page
djyde Feb 7, 2023
34acaa3
comment page
djyde Feb 11, 2023
c9f3eb0
get comments
djyde Feb 11, 2023
22eaa5f
reply form style
djyde Feb 11, 2023
46583c6
comment style
djyde Feb 12, 2023
535ab67
add react-query
djyde Feb 12, 2023
7f579ce
action panel
djyde Feb 13, 2023
3cac886
remove 1.0 code
djyde Feb 13, 2023
1f32c4b
change db url
djyde Feb 13, 2023
c95b6f5
remove docker file
djyde Feb 13, 2023
1cfab8b
update dependency
djyde Feb 13, 2023
0d1aec8
update pnpm
djyde Feb 13, 2023
db5499c
add engines
djyde Feb 13, 2023
ba883f2
update dockerfile
djyde Feb 13, 2023
dffc5cd
update dockerfile
djyde Feb 13, 2023
544bf5c
update dockerfile
djyde Feb 13, 2023
b2aaca9
update dockerfile
djyde Feb 13, 2023
898fac7
update dockerfile
djyde Feb 13, 2023
aec2c08
add missing dependency
djyde Feb 13, 2023
fd403b4
remove unused var
djyde Feb 13, 2023
1b58c30
update dockerfile
djyde Feb 13, 2023
158609b
add port
djyde Feb 13, 2023
7b63343
expost port
djyde Feb 13, 2023
88cb09b
add comment as signed user
djyde Feb 13, 2023
a1663d3
plain session info
djyde Feb 13, 2023
e9b97ac
reply mutation
djyde Feb 14, 2023
4b32b41
sdk
djyde Feb 18, 2023
ff8f740
new layout
djyde Feb 19, 2023
ff339b7
comment list
djyde Feb 19, 2023
4ba3c6f
comment page
djyde Feb 19, 2023
8548a15
submit page url & page title
djyde Feb 20, 2023
4ae0263
remove unused prop
djyde Feb 20, 2023
3e10f71
remove unused prop
djyde Feb 20, 2023
d4391c6
paginator
djyde Feb 20, 2023
db1b5f8
remove workflow
djyde Feb 20, 2023
fe8b8f7
fix type error
djyde Feb 20, 2023
ff99f1d
no result ui
djyde Feb 21, 2023
0507429
dashboard 403
djyde Feb 21, 2023
de72eae
project update api
djyde Feb 21, 2023
885a8a9
fix prisma import
djyde Feb 21, 2023
0575aea
title edit
djyde Feb 21, 2023
f483717
fix type
djyde Feb 21, 2023
80f2792
filter deleted project
djyde Feb 21, 2023
a9cc1d3
fix type error
djyde Feb 21, 2023
f5c1bb4
settings
djyde Mar 1, 2023
b3f38e2
fix type error
djyde Mar 1, 2023
25c603a
profile page
djyde Mar 13, 2023
8751fc2
signin entry in reply form
djyde Mar 13, 2023
434cb6d
logout
djyde Mar 13, 2023
2218dad
dark mode
djyde Mar 13, 2023
16a21d5
displayname
djyde Mar 13, 2023
cd930a4
add legacy js
djyde Mar 13, 2023
ef7c37c
add legacy sdk
djyde Mar 13, 2023
55fc575
set notification email
djyde Mar 13, 2023
87c7093
add page title
djyde Mar 13, 2023
0edbac8
upgrade next
djyde Mar 13, 2023
7fcd93b
remove unvalid export
djyde Mar 13, 2023
12b543d
remove props
djyde Mar 13, 2023
9a047ce
disable strictnullcheck
djyde Mar 13, 2023
83623f2
update comment
djyde Mar 14, 2023
348ed98
timezone
djyde Mar 14, 2023
a9ad4a7
embeded code
djyde Mar 14, 2023
ea4c54f
disable samesite
djyde Mar 14, 2023
408c4e9
add cors rewrite
djyde Mar 14, 2023
0bf3433
fix headers
djyde Mar 14, 2023
7eb0c58
fix name
djyde Mar 14, 2023
c4aab07
add posted by
djyde Mar 14, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 0 additions & 12 deletions .babelrc

This file was deleted.

72 changes: 0 additions & 72 deletions .github/workflows/ci.yml

This file was deleted.

14 changes: 0 additions & 14 deletions .github/workflows/docker-publish.yml

This file was deleted.

41 changes: 13 additions & 28 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,35 +1,20 @@
FROM node:16-alpine3.15 as builder
FROM node:16-alpine

VOLUME [ "/data" ]
ARG DATABASE_URL
ARG PORT

ARG DB_TYPE=sqlite
ENV DB_TYPE=$DB_TYPE
ARG EnvironmentVariable

RUN apk add --no-cache python3 py3-pip make gcc g++

COPY . /app

COPY package.json yarn.lock /app/

WORKDIR /app

RUN npm install -g pnpm
RUN yarn install --frozen-lockfile && npx browserslist@latest --update-db
RUN npm run build:without-migrate

FROM node:16-alpine3.15 as runner

ENV NODE_ENV=production
ARG DB_TYPE=sqlite
ENV DB_TYPE=$DB_TYPE
ENV PORT=${PORT}

ADD . /app
WORKDIR /app

COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next ./.next
COPY . /app

EXPOSE 3000/tcp
RUN apk update
RUN apk add python3 make g++
RUN npm i -g pnpm
RUN pnpm i
RUN npm run build

CMD ["npm", "run", "start:with-migrate"]
EXPOSE ${PORT}
CMD ["npm", "start"]
19 changes: 19 additions & 0 deletions app/HomeActions.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
'use client'

import { useSession } from "next-auth/client"
import Link from "next/link"
import { Button } from "./components/ui/Button"

export const HomeActions = () => {
const [session, isLoadingSession] = useSession()

return (
<div className="flex gap-4 mt-4">
{!session && <Button>Sign in</Button>}
{!isLoadingSession && session && <a target={"_blank"} href="/dashboard"><Button>Dashboard</Button></a>}
<a href="/doc" target="_blank">
<Button variant="outline">Documentation</Button>
</a>
</div>
)
}
58 changes: 58 additions & 0 deletions app/c/[projectId]/Bridge.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
'use client'

import { useEffect, useLayoutEffect } from "react"

export function Bridge() {
useLayoutEffect(() => {

// @ts-expect-error
window.__CUSDIS__ = true

// auto size

function postMessage(event, data = {}) {
const parent = window.parent
parent.postMessage(
{
from: 'cusdis',
event,
data,
},
"*"
)
}
function requestResize() {
postMessage('resize', document.documentElement.offsetHeight)
}

const resizeObserve = new MutationObserver(() => {
requestResize()
})

resizeObserve.observe(document.body, {
childList: true,
subtree: true
})

function onMessage(e) {
console.log(e.data)
}

window.addEventListener('message', onMessage)

requestResize()


return () => {
// console.log('disconnect')
// resizeObserve.disconnect()
// window.removeEventListener('message', onMessage)
}


}, [])

return (
<div></div>
)
}
64 changes: 64 additions & 0 deletions app/c/[projectId]/Comment.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import 'server-only'
import { CommentList } from './CommentList'
import { ReplyForm } from './ReplyForm'
import { CommentAction } from './CommentAction'
import classNames from 'classnames'
import { env } from '../../env'
import { getComments } from './data'

export async function CommentComponent(props: {
locale: any,
session?: any,
isChild?: boolean
isModerator: boolean
timezoneOffset: number,
comment: Awaited<ReturnType<typeof getComments>>[0]
}) {
const isSelfhost = !env.isHosted
// get child comments
const comments = await getComments(props.comment.page.projectId, props.comment.page.slug, 1, props.timezoneOffset, {
parentId: props.comment.id,
onlyApproved: !props.isModerator,
})
const isModerator = props.comment.moderator?.id === props.comment.page.project.ownerId

return (
<div className={classNames('flex flex-col gap-4 pt-2 border-b-gray-100', {
})}>
<div className='flex flex-col gap-1'>
<div className='flex gap-2 items-center'>
<div className='font-medium dark:text-white'>
{props.comment.moderator?.displayName || props.comment.moderator?.name || props.comment.by_nickname}
</div>
{isModerator && (
<span className='uppercase bg-gray-100 dark:bg-gray-700 text-xs font-bold px-2 py-1 rounded-md'>
MOD
</span>
)}
{!props.comment.approved && (
<div>
<span className='bg-yellow-500 text-yellow-50 rounded-md px-2 py-1 text-xs font-bold'>Unapproved</span>
</div>
)}
<div className='text-gray-500 text-sm'>
{/* @ts-expect-error */}
{props.comment.createdAt as string}
</div>
</div>
</div>
<div className='text-gray-500 dark:text-gray-100'>
{props.comment.content}
</div>
{props.session &&
<div>
<CommentAction comment={props.comment} />
</div>}
<ReplyForm isSelfHost={isSelfhost} session={props.session} parentId={props.comment.id} locale={props.locale} projectId={props.comment.page.projectId} />
{/* children comments */}
<div className='pl-8'>
{/* @ts-expect-error Server Component */}
<CommentList session={props.session} locale={props.locale} comments={comments} />
</div>
</div>
)
}
45 changes: 45 additions & 0 deletions app/c/[projectId]/CommentAction.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
'use client'

import { Comment } from "@prisma/client"
import { useMutation } from "@tanstack/react-query"
import axios from "axios"
import { useRouter } from "next/navigation"
import type { getComments } from "./data"

export function CommentAction(props: {
comment: Awaited<ReturnType<typeof getComments>>[0]
}) {

const router = useRouter()

const deleteMutation = useMutation(async () => {
await axios.delete(`/api/v2/comments/${props.comment.id}`)
}, {
onSuccess() {
router.refresh()
}
})

const approveMutation = useMutation(async () => {
await axios.put(`/api/v2/comments/${props.comment.id}`, {
approved: true
})
}, {
onSuccess() {
router.refresh()
}
})

return (
<div className="flex gap-2 text-xs font-medium text-gray-500 dark:text-gray-300">
{!props.comment.approved && (
<button disabled={approveMutation.isLoading} type="button" onClick={_ => {
approveMutation.mutate()
}}>{approveMutation.isLoading ? 'Approving...' : 'Approve'}</button>
)}
<button disabled={deleteMutation.isLoading} type="button" onClick={_ => {
deleteMutation.mutate()
}}>{deleteMutation.isLoading ? 'Deleting...' : 'Delete'}</button>
</div>
)
}
24 changes: 24 additions & 0 deletions app/c/[projectId]/CommentList.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import 'server-only'
import { CommentComponent } from './Comment'
import type { getComments } from './data'

export async function CommentList(props: {
comments: Awaited<ReturnType<typeof getComments>>,
locale: any,
session?: any,
isModerator: boolean
timezoneOffset: number,
}) {
return (
<div className="flex flex-col" >
{props.comments.map(comment => {
return (
<div key={comment.id}>
{/* @ts-expect-error Server Component */}
<CommentComponent timezoneOffset={props.timezoneOffset} isModerator={props.isModerator} session={props.session} locale={props.locale} comment={comment} />
</div>
)
})}
</div>
)
}
Loading