Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
46ff75a
feat: add getWord
DenisArger Nov 15, 2024
32af2e4
feat: add new parsing ref
DenisArger Nov 15, 2024
3ed9853
feat: add update TNTWLContent
DenisArger Nov 15, 2024
74456ef
feat: add transformHref and getWordsAcademy
DenisArger Nov 19, 2024
1578118
feat: add show content ACdemy in TNotes
DenisArger Nov 19, 2024
9cad39b
fix: edit getData from tWords
DenisArger Nov 19, 2024
65755b1
feat: add api ta
DenisArger Nov 19, 2024
34540a3
feat: add config on props
DenisArger Nov 19, 2024
0d58893
fix: delete ResourcesList (unused)
DenisArger Nov 19, 2024
4f0dcd2
feat: add contentRef and scrollTop = 0
DenisArger Nov 20, 2024
40a813a
feat: add click Back for other type content
DenisArger Nov 20, 2024
d36d6df
feat: add show tAcademy in sidebar
DenisArger Nov 26, 2024
60ddc14
feat: add TAContent
DenisArger Nov 26, 2024
ce1184a
feat: add show croff-reference tA
DenisArger Nov 26, 2024
b2f4ee0
fix: delete handleMdLinkClick
DenisArger Nov 26, 2024
a4b0b5f
feat: add resolvePath
DenisArger Nov 26, 2024
6b3b850
fix: edit replace */
DenisArger Nov 26, 2024
0c386ea
feat: add goBack for TA
DenisArger Nov 26, 2024
23ad6db
feat: add scrollRef
DenisArger Nov 26, 2024
2463945
feat: add academyLinks
DenisArger Nov 26, 2024
f4ca4f2
feat: add AcademicCap svg
DenisArger Nov 26, 2024
890f7d1
fix: delete academyLinks for es
DenisArger Nov 26, 2024
3716281
fix: select academyLinks for others lang
DenisArger Nov 26, 2024
7ffbca5
feat: add locales translationAcademy
DenisArger Nov 26, 2024
f4e6a54
Merge remote-tracking branch 'origin/develop' into feature-denisarger…
DenisArger Nov 26, 2024
7b170a1
style: edit color links tA
DenisArger Nov 26, 2024
59a0f39
feat: add Loading for TA
DenisArger Nov 26, 2024
fa376f7
fix: edit svg academic
DenisArger Nov 27, 2024
10deb65
style: add min-w for sidebar
DenisArger Nov 27, 2024
f538966
style: edit Back button and title
DenisArger Nov 27, 2024
49d86de
fix: show Back for root item
DenisArger Nov 27, 2024
55868e6
style: add contentClassName for ModalInSideBar
DenisArger Nov 27, 2024
a38537d
fix: mirrior fix after comments
DenisArger Nov 27, 2024
c314bd6
feat: add info about new version
DenisArger Nov 27, 2024
dbfa90a
fix: edit file version
DenisArger Nov 27, 2024
4eee22b
style: mirror fixed style button Back
DenisArger Nov 27, 2024
a7c4a5f
fix: edit updateHref
DenisArger Nov 27, 2024
da01534
style: add loading for TaContentInfo
DenisArger Nov 28, 2024
656dd3d
Merge remote-tracking branch 'origin/develop' into feature-denisarger…
DenisArger Nov 28, 2024
a5eb36f
Merge pull request #739 from hiscoder-com/feature-denisarger-653
Valyukhov Nov 30, 2024
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
83 changes: 73 additions & 10 deletions components/MarkdownExtended.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,88 @@ import remarkGfm from 'remark-gfm'

import 'github-markdown-css/github-markdown-light.css'

function MarkdownExtended({ children, className }) {
const content = (typeof children === 'string' ? children : '')
.replace(/< *br *\/?>/gi, '\n')
.replaceAll('\\n', '\n')
import TaContentInfo from './Panel/Resources/TAContentInfo'

const convertYoutube = (props) => {
function MarkdownExtended({ children, className, onLinkClick, config, setItem }) {
const convertRcLinksToMarkdownLinks = (text) => {
if (!config?.resource?.repo) return text
const locale = config.resource.repo.split('_')[0]
return text
.replace(/\*\//g, locale + '/')
.replace(/\[\[(rc:\/\/\S+?)\]\]/g, (_, url) => `[${url}](${url})`)
.replace(/\[(\d+:\d+)\]\(\.\.\/\d+\/\d+\.md\)/g, (_, time) => time)
}

const content = convertRcLinksToMarkdownLinks(
(typeof children === 'string' ? children : '')
.replace(/< *br *\/?>/gi, '\n')
.replaceAll('\\n', '\n')
)

const handleLinkClick = (href) => {
if (href.endsWith('.md')) {
onLinkClick?.(href)
} else if (href.startsWith('rc://')) {
onLinkClick?.(href)
}
}

const parsingRef = (props) => {
function getVideoID(userInput) {
var res = userInput.match(
const res = userInput.match(
/^.*(?:(?:youtu.be\/)|(?:v\/)|(?:\/u\/\w\/)|(?:embed\/)|(?:watch\?))\??v?=?([^#\&\?]*).*/
)
if (res) return res[1]
return false
return res ? res[1] : false
}

const href = props?.node?.properties?.href
if (href?.includes('translate') && href.includes('ta')) {
return (
<TaContentInfo
href={href}
onClick={handleLinkClick}
config={config}
setItem={setItem}
>
{props.children}
</TaContentInfo>
)
}

if (href?.includes('translate')) {
return (
<a
href={href}
onClick={(e) => {
e.preventDefault()
handleLinkClick(href)
}}
>
{props.children}
</a>
)
}

if (props.href.endsWith('.md')) {
return (
<a
href={props.href}
onClick={(e) => {
e.preventDefault()
handleLinkClick(props.href)
}}
>
{props.children}
</a>
)
}

const youtubeId = getVideoID(props?.href)
return youtubeId ? (
<iframe
src={`https://youtube.com/embed/${youtubeId}`}
frameBorder="0"
allow="accelerometer;autoplay;clipboard-write;encrypted-media;gyroscope;picture-in-picture"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
style={{ width: '100%', aspectRatio: '16/9', outline: 'none' }}
></iframe>
Expand All @@ -36,7 +99,7 @@ function MarkdownExtended({ children, className }) {
rehypePlugins={[rehypeRaw]}
className={className}
components={{
a: convertYoutube,
a: parsingRef,
}}
remarkPlugins={[remarkGfm]}
>
Expand Down
5 changes: 4 additions & 1 deletion components/ModalInSideBar.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ function ModalInSideBar({
modalTitle,
buttonTitle,
collapsed,
contentClassName = 'p-4',
}) {
return (
<>
Expand All @@ -31,7 +32,9 @@ function ModalInSideBar({
<Close className="h-8 stroke-th-secondary-10" />
</button>
</div>
<div className="h-full overflow-y-auto overflow-x-hidden p-4 lg:px-7">
<div
className={`h-full overflow-y-auto overflow-x-hidden px-4 sm:px-7 ${contentClassName}`}
>
{children}
</div>
</div>
Expand Down
72 changes: 72 additions & 0 deletions components/Panel/Resources/TAContentInfo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import { useEffect, useRef, useState } from 'react'

import { getFile } from 'utils/apiHelper'
import { getWordsAcademy } from 'utils/helper'

import Loading from 'public/icons/progress.svg'

function TaContentInfo({ href, config, setItem, returnImmediately = false }) {
const [words, setWords] = useState(null)
const [isLoading, setIsLoading] = useState(true)
const hrefRef = useRef(href)

useEffect(() => {
if (!config || !config.resource) {
console.error('Config object is missing or invalid.')
return
}

const getData = async () => {
setIsLoading(true)
try {
const zip = await getFile({
owner: config.resource.owner,
repo: config.resource.repo.split('_')[0] + '_ta',
commit: config.resource.commit,
apiUrl: '/api/git/ta',
})
const fetchedWords = await getWordsAcademy({
zip,
href: hrefRef.current,
})
setWords(fetchedWords)
} catch (error) {
console.error('Error fetching data:', error)
} finally {
setIsLoading(false)
}
}

getData()
}, [config, returnImmediately, setItem])

if (isLoading) {
return (
<Loading className="progress-custom-colors right-2 m-auto w-6 animate-spin stroke-th-primary-100" />
)
}

if (!words) return null

const description = words['title'] || words.title || hrefRef.current
const title = words['sub-title'] || words.sub || hrefRef.current
const text = words['01'] || hrefRef.current
const item = { title, text, type: 'ta' }

if (returnImmediately) {
return null
}

return (
<div
className="inline-block cursor-pointer text-[#0969da] hover:underline"
onClick={(e) => {
e.preventDefault()
setItem?.(item)
}}
>
{description}
</div>
)
}
export default TaContentInfo
60 changes: 57 additions & 3 deletions components/Panel/Resources/TN.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@ import { useQuotesTranslation } from '@texttree/tn-quote'

import { Placeholder, TNTWLContent } from '../UI'

import { filterNotes } from 'utils/helper'
import { getFile } from 'utils/apiHelper'
import { filterNotes, getWordsAcademy } from 'utils/helper'
import { useGetResource, useScroll } from 'utils/hooks'

function TN({ config, url, toolName }) {
const [item, setItem] = useState(null)
const [href, setHref] = useState(null)

const [parentItem, setParentItem] = useState(null)
const [tnotes, setTnotes] = useState([])
const { isLoading, data } = useGetResource({ config, url })
const { extraTNotes, setTnotes: updateTnotes } = useQuotesTranslation({
Expand All @@ -28,6 +32,42 @@ function TN({ config, url, toolName }) {
config.mainResource.repo,
},
})

useEffect(() => {
const fetchWordData = async () => {
if (href && data.length > 0) {
if (href?.includes('-')) {
const result = href.split('/')[1]
const zip = await getFile({
owner: config.resource.owner,
repo: config.resource.repo.split('_')[0] + '_ta',
commit: config.resource.commit,
apiUrl: '/api/git/ta',
})

const hrefNew = `rc://${config.resource.repo.split('_')[0]}/ta/man/translate/${result}`
const fetchedWords = await getWordsAcademy({
zip,
href: hrefNew,
})
const title = fetchedWords?.['sub-title'] || fetchedWords?.sub || href
const text = fetchedWords?.['01'] || href
const type = 'ta'
const item = {
title,
text,
type,
}
setItem?.(item)
}
}
}

fetchWordData()

// eslint-disable-next-line
}, [href, config.resource.repo])

useEffect(() => {
if (extraTNotes) {
const _data = []
Expand All @@ -50,10 +90,18 @@ function TN({ config, url, toolName }) {
) : (
<div className="relative h-full">
{item ? (
<TNTWLContent setItem={setItem} item={item} />
<TNTWLContent
setItem={setItem}
item={item}
parentItem={parentItem}
setParentItem={setParentItem}
setHref={setHref}
config={config}
/>
) : (
<TNList
setItem={setItem}
setParentItem={setParentItem}
data={tnotes}
toolName={toolName}
isLoading={isLoading || tnotes}
Expand All @@ -67,7 +115,7 @@ function TN({ config, url, toolName }) {

export default TN

function TNList({ setItem, data, toolName, isLoading }) {
function TNList({ setItem, setParentItem, data, toolName, isLoading }) {
const { t } = useTranslation()
const [verses, setVerses] = useState([])
const { highlightId, handleSaveScroll } = useScroll({
Expand Down Expand Up @@ -103,9 +151,15 @@ function TNList({ setItem, data, toolName, isLoading }) {
}`}
onClick={() => {
handleSaveScroll(verseNumber, note.ID)
setParentItem({
text: note.Note,
title: note.Quote || note.origQuote,
type: 'tn',
})
setItem({
text: note.Note,
title: note.Quote || note.origQuote,
type: 'tn',
})
}}
>
Expand Down
Loading