Skip to content

Commit

Permalink
feat: react animation
Browse files Browse the repository at this point in the history
  • Loading branch information
wkylin committed Dec 5, 2024
1 parent 8c67150 commit 008b20b
Show file tree
Hide file tree
Showing 23 changed files with 468 additions and 316 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/qodana_code_quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ jobs:
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }} # to check out the actual pull request commit, not the merge commit
fetch-depth: 0 # a full history is required for pull request analysis
ref: ${{ github.event.pull_request.head.sha }} # to check out the actual pull request commit, not the merge commit
fetch-depth: 0 # a full history is required for pull request analysis
- name: 'Qodana Scan'
uses: JetBrains/[email protected]
with:
pr-mode: false
env:
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN_1824326538 }}
QODANA_ENDPOINT: 'https://qodana.cloud'
QODANA_ENDPOINT: 'https://qodana.cloud'
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,6 @@ A CSS Module is a CSS file in which all class names and animation names are scop

1. GitHub Actions


## Test

1. [Jest](https://jestjs.io/)
Expand Down Expand Up @@ -530,11 +529,13 @@ npm version [| major | minor | patch | premajor | preminor | prepatch | prerelea
```bash
npm run analyze:build
```

2. 依赖分析

```bash
npm run js-analyzer
````
```bash
npm run js-analyzer
```

![image](https://github.com/user-attachments/assets/4a76e27f-47d3-4230-8587-73c3f0d8e5a0)

## CRACO:Create React App Configuration Override
Expand Down
28 changes: 28 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -225,9 +225,12 @@
"@sentry/react": "^8.41.0",
"@sentry/tracing": "^7.119.0",
"@supermapgis/iclient-leaflet": "^11.2.1",
"@use-gesture/react": "^10.3.1",
"animate.css": "^4.1.1",
"antd": "^5.22.2",
"axios": "^1.7.8",
"blueimp-md5": "^2.19.0",
"canvas-confetti": "^1.9.3",
"clsx": "^2.1.1",
"cookies-js": "^1.2.3",
"copy-to-clipboard": "^3.3.3",
Expand Down Expand Up @@ -267,6 +270,7 @@
"qs": "^6.13.1",
"query-string": "^9.1.1",
"react": "^18.3.1",
"react-animate-on-scroll": "^2.1.9",
"react-barcode": "^1.5.3",
"react-canvas-confetti": "^2.0.7",
"react-countup": "^6.5.3",
Expand Down
47 changes: 25 additions & 22 deletions src/components/container/masonryContainer/index.jsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
import { useState } from "react";
import useMasonry from "@hooks/useMasonry";
import { useState } from 'react'

Check warning on line 1 in src/components/container/masonryContainer/index.jsx

View workflow job for this annotation

GitHub Actions / Qodana for JS

Unused import

Unused import { useState } from 'react'

Check failure on line 1 in src/components/container/masonryContainer/index.jsx

View workflow job for this annotation

GitHub Actions / Qodana for JS

ESLint

ESLint: Install the 'eslint' package
import useMasonry from '@hooks/useMasonry'

const Masonry = () => {
const masonryContainer = useMasonry();
const masonryContainer = useMasonry()
return (
<div className="mx-auto grid max-w-sm items-start gap-6 sm:max-w-none sm:grid-cols-2 lg:grid-cols-3" ref={masonryContainer}>
<div className="relative rounded-xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 140 }}>我的中国心</div>
</div>
<div className="relative rounded-2xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 80 }}>我的中国心</div>
</div>
<div className="relative rounded-2xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 150 }}>我的中国心</div>
</div>
<div className="relative rounded-2xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 120 }}>我的中国心</div>
</div>
<div className="relative rounded-2xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 130 }}>我的中国心</div>
</div>
<div className="relative rounded-2xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 50 }}>我的中国心</div>
</div>
<div
className="mx-auto grid max-w-sm items-start gap-6 sm:max-w-none sm:grid-cols-2 lg:grid-cols-3"
ref={masonryContainer}
>
<div className="relative rounded-xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 140 }}>我的中国心</div>
</div>
<div className="relative rounded-2xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 80 }}>我的中国心</div>
</div>
<div className="relative rounded-2xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 150 }}>我的中国心</div>
</div>
<div className="relative rounded-2xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 120 }}>我的中国心</div>
</div>
<div className="relative rounded-2xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 130 }}>我的中国心</div>
</div>
<div className="relative rounded-2xl bg-gradient-to-br from-gray-900/50 via-gray-800/25 to-gray-900/50 p-5 backdrop-blur-sm transition-opacity before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-transparent before:[background:linear-gradient(to_right,theme(colors.gray.800),theme(colors.gray.700),theme(colors.gray.800))_border-box] before:[mask-composite:exclude_!important] before:[mask:linear-gradient(white_0_0)_padding-box,_linear-gradient(white_0_0)]">
<div style={{ height: 50 }}>我的中国心</div>
</div>
</div>
)
}
Expand Down
10 changes: 5 additions & 5 deletions src/components/hooks/useBodyScrollLock/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
const useBodyScrollLock = () => {

Check failure on line 1 in src/components/hooks/useBodyScrollLock/index.js

View workflow job for this annotation

GitHub Actions / Qodana for JS

ESLint

ESLint: Install the 'eslint' package
React.useLayoutEffect(() => {
const originalStyle = window.getComputedStyle(document.body).overflow;
document.body.style.overflow = 'hidden';
return () => (document.body.style.overflow = originalStyle);
}, []);
};
const originalStyle = window.getComputedStyle(document.body).overflow
document.body.style.overflow = 'hidden'
return () => (document.body.style.overflow = originalStyle)
}, [])
}

export default useBodyScrollLock
28 changes: 28 additions & 0 deletions src/components/hooks/useElementViewportPosition/index.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { useState, useEffect, RefObject } from 'react'

Check warning on line 1 in src/components/hooks/useElementViewportPosition/index.jsx

View workflow job for this annotation

GitHub Actions / Qodana for JS

Unused import

Unused import specifier RefObject

Check failure on line 1 in src/components/hooks/useElementViewportPosition/index.jsx

View workflow job for this annotation

GitHub Actions / Qodana for JS

ESLint

ESLint: Install the 'eslint' package

const useElementViewportPosition = (ref = null, offset = 0) => {
const [position, setPosition] = useState([0, 0])

useEffect(() => {
const update = () => {
if (!ref || !ref.current) return
const pageHeight = document.body.scrollHeight
const start = ref.current.offsetTop
const end = start + ref.current.offsetHeight

setPosition([(start + offset) / pageHeight, (end + offset) / pageHeight])
}

update()

document.addEventListener('resize', update)

return () => {
document.removeEventListener('resize', update)
}
}, [offset, ref])

return { position }
}

export default useElementViewportPosition
19 changes: 9 additions & 10 deletions src/components/hooks/useEventListener/index.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@

const useEventListener = (type, handler, el = window) => {

Check failure on line 1 in src/components/hooks/useEventListener/index.js

View workflow job for this annotation

GitHub Actions / Qodana for JS

ESLint

ESLint: Install the 'eslint' package
const savedHandler = React.useRef();
const savedHandler = React.useRef()

React.useEffect(() => {
savedHandler.current = handler;
}, [handler]);
savedHandler.current = handler
}, [handler])

React.useEffect(() => {
const listener = e => savedHandler.current(e);
const listener = (e) => savedHandler.current(e)

el.addEventListener(type, listener);
el.addEventListener(type, listener)

return () => {
el.removeEventListener(type, listener);
};
}, [type, el]);
el.removeEventListener(type, listener)
}
}, [type, el])
}

export default useEventListener
Expand All @@ -25,4 +24,4 @@ export default useEventListener
// },
// [setCoords]
// );
// useEventListener('mousemove', updateCoords);
// useEventListener('mousemove', updateCoords);
62 changes: 32 additions & 30 deletions src/components/hooks/useInViewport/index.jsx
Original file line number Diff line number Diff line change
@@ -1,42 +1,44 @@
import { useEffect, useRef, useState } from 'react';

const useInViewport = (triggerOnce = false, threshold = 0, rootMargin="0px" ) => {
const inViewRef = useRef(null);
const [inViewport, setInViewport] = useState(false);
const observer = useRef(null);
import { useEffect, useRef, useState } from 'react'

Check failure on line 1 in src/components/hooks/useInViewport/index.jsx

View workflow job for this annotation

GitHub Actions / Qodana for JS

ESLint

ESLint: Install the 'eslint' package

const useInViewport = (triggerOnce = false, threshold = 0, rootMargin = '0px') => {
const inViewRef = useRef(null)
const [inViewport, setInViewport] = useState(false)
const observer = useRef(null)

useEffect(() => {
const targetElement = elementRef.current;
if (!targetElement) return;
observer.current = new IntersectionObserver((entries) => {
const targetElement = elementRef.current
if (!targetElement) return
observer.current = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting && entry.intersectionRatio >= threshold) {
setInViewport(true);
if (triggerOnce) {
observer.current.disconnect()
}
} else {
setInViewport(false);
if (entry.isIntersecting && entry.intersectionRatio >= threshold) {
setInViewport(true)
if (triggerOnce) {
observer.current.disconnect()
}
});
}, {threshold, rootMargin});
} else {
setInViewport(false)
}
})
},
{ threshold, rootMargin }
)

if (inViewRef.current) {
observer.current.observe(inViewRef.current);
observer.current.observe(inViewRef.current)
}

return () => {
if (inViewRef.current) {
observer.current.unobserve(inViewRef.current);
}
};
}, [threshold, triggerOnce, rootMargin]);
if (inViewRef.current) {
observer.current.unobserve(inViewRef.current)
}
}
}, [threshold, triggerOnce, rootMargin])

return {
inViewRef,
inViewport
};
};
return {
inViewRef,
inViewport,
}
}

export default useInViewport;
export default useInViewport
28 changes: 14 additions & 14 deletions src/components/hooks/useKeyPress/index.jsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
const useKeyPress = targetKey => {
const [keyPressed, setKeyPressed] = React.useState(false);
const useKeyPress = (targetKey) => {

Check failure on line 1 in src/components/hooks/useKeyPress/index.jsx

View workflow job for this annotation

GitHub Actions / Qodana for JS

ESLint

ESLint: Install the 'eslint' package
const [keyPressed, setKeyPressed] = React.useState(false)

const downHandler = ({ key }) => {
if (key === targetKey) setKeyPressed(true);
};
if (key === targetKey) setKeyPressed(true)
}

const upHandler = ({ key }) => {
if (key === targetKey) setKeyPressed(false);
};
if (key === targetKey) setKeyPressed(false)
}

React.useEffect(() => {
window.addEventListener('keydown', downHandler);
window.addEventListener('keyup', upHandler);
window.addEventListener('keydown', downHandler)
window.addEventListener('keyup', upHandler)

return () => {
window.removeEventListener('keydown', downHandler);
window.removeEventListener('keyup', upHandler);
};
}, []);
window.removeEventListener('keydown', downHandler)
window.removeEventListener('keyup', upHandler)
}
}, [])

return keyPressed;
};
return keyPressed
}

export default useKeyPress
Loading

0 comments on commit 008b20b

Please sign in to comment.