+
+ {hint && (
+
{hint}
+ )}
+
-
{list.map((item, i) => (
))}
diff --git a/web/src/components/Portrait/PortraitForm/PortraitForm.tsx b/web/src/components/Portrait/PortraitForm/PortraitForm.tsx
index 0b9387d..df625b8 100644
--- a/web/src/components/Portrait/PortraitForm/PortraitForm.tsx
+++ b/web/src/components/Portrait/PortraitForm/PortraitForm.tsx
@@ -1,4 +1,4 @@
-import { useRef, useState } from 'react'
+import { useState } from 'react'
import { Meta, UploadResult } from '@uppy/core'
import type {
@@ -56,13 +56,7 @@ const CREATE_PORTRAIT_MUTATION: TypedDocumentNode<
`
const PortraitForm = ({ portrait }: PortraitFormProps) => {
- const [fileId, _setFileId] = useState
(portrait?.fileId)
- const fileIdRef = useRef(fileId)
-
- const setFileId = (fileId: string) => {
- _setFileId(fileId)
- fileIdRef.current = fileId
- }
+ const [fileId, setFileId] = useState(portrait?.fileId)
const unloadAbortController = new AbortController()
@@ -96,7 +90,7 @@ const PortraitForm = ({ portrait }: PortraitFormProps) => {
setFileId(result.successful[0]?.uploadURL)
window.addEventListener(
'beforeunload',
- (e) => handleBeforeUnload(e, [fileIdRef.current]),
+ (e) => handleBeforeUnload(e, [fileId]),
{
once: true,
signal: unloadAbortController.signal,
diff --git a/web/src/components/Project/Project/Project.tsx b/web/src/components/Project/Project/Project.tsx
index 71be951..4938381 100644
--- a/web/src/components/Project/Project/Project.tsx
+++ b/web/src/components/Project/Project/Project.tsx
@@ -46,18 +46,23 @@ const Project = ({ project }: Props) => {
<>
Links
- {project.links.map((link, i) => (
-
-
- {link}
-
- ))}
+
+ {project.links.map((link, i) => (
+ -
+
+
+ ))}
+
>
)}
diff --git a/web/src/components/Project/ProjectForm/ProjectForm.tsx b/web/src/components/Project/ProjectForm/ProjectForm.tsx
index 26c0da3..c98cbd5 100644
--- a/web/src/components/Project/ProjectForm/ProjectForm.tsx
+++ b/web/src/components/Project/ProjectForm/ProjectForm.tsx
@@ -198,6 +198,7 @@ const ProjectForm = (props: ProjectFormProps) => {
{
diff --git a/web/src/components/Resume/ResumeForm/ResumeForm.tsx b/web/src/components/Resume/ResumeForm/ResumeForm.tsx
index 42239f4..6962b0b 100644
--- a/web/src/components/Resume/ResumeForm/ResumeForm.tsx
+++ b/web/src/components/Resume/ResumeForm/ResumeForm.tsx
@@ -1,4 +1,4 @@
-import { useRef, useState } from 'react'
+import { useState } from 'react'
import { Meta, UploadResult } from '@uppy/core'
import type {
@@ -55,13 +55,7 @@ const CREATE_RESUME_MUTATION: TypedDocumentNode<
`
const ResumeForm = ({ resume }: ResumeFormProps) => {
- const [fileId, _setFileId] = useState(resume?.fileId)
- const fileIdRef = useRef(fileId)
-
- const setFileId = (fileId: string) => {
- _setFileId(fileId)
- fileIdRef.current = fileId
- }
+ const [fileId, setFileId] = useState(resume?.fileId)
const unloadAbortController = new AbortController()
@@ -95,7 +89,7 @@ const ResumeForm = ({ resume }: ResumeFormProps) => {
setFileId(result.successful[0]?.uploadURL)
window.addEventListener(
'beforeunload',
- (e) => handleBeforeUnload(e, [fileIdRef.current]),
+ (e) => handleBeforeUnload(e, [fileId]),
{
once: true,
signal: unloadAbortController.signal,
diff --git a/web/src/components/ThemeToggle/ThemeToggle.tsx b/web/src/components/ThemeToggle/ThemeToggle.tsx
index b5e60a8..0b55cc0 100644
--- a/web/src/components/ThemeToggle/ThemeToggle.tsx
+++ b/web/src/components/ThemeToggle/ThemeToggle.tsx
@@ -8,7 +8,7 @@ const DARK_THEME = 'dark'
const ThemeToggle = () => {
const [theme, setTheme] = useState(
- localStorage.getItem('theme') ? localStorage.getItem('theme') : LIGHT_THEME
+ localStorage.getItem('theme') ?? LIGHT_THEME
)
const handleToggle = (e: React.ChangeEvent) => {
@@ -37,13 +37,8 @@ const ThemeToggle = () => {
checked={theme === DARK_THEME}
onChange={handleToggle}
/>
-
-
-
-
+
+
)
}
diff --git a/web/src/components/Title/Titles/Titles.tsx b/web/src/components/Title/Titles/Titles.tsx
index cd61a67..daad259 100644
--- a/web/src/components/Title/Titles/Titles.tsx
+++ b/web/src/components/Title/Titles/Titles.tsx
@@ -23,6 +23,12 @@ export const Titles = ({ titles, className }: TitlesProps) => {
backDelay={1000}
startWhenVisible
loop
+ onStringTyped={(pos, self) => {
+ if (pos === 0) {
+ self.stop()
+ setTimeout(() => self.start(), 2500)
+ }
+ }}
/>
>
)}
diff --git a/web/src/components/Title/TitlesForm/TitlesForm.tsx b/web/src/components/Title/TitlesForm/TitlesForm.tsx
index d04c30d..0644740 100644
--- a/web/src/components/Title/TitlesForm/TitlesForm.tsx
+++ b/web/src/components/Title/TitlesForm/TitlesForm.tsx
@@ -56,6 +56,9 @@ const TitlesForm = ({ titles }: TitlesFormProps) => {
return (