Compare commits

...

12 Commits

Author SHA1 Message Date
Ibrahima G. Coulibaly
9a9ce814fd ```
feat: fix Blob type in tools (main)

This commit fixes a type-related issue. The 'Blob'
constructor was used without specifying 'as any' for the
data argument in several tools. This change ensures
correctness and prevents potential type errors.

The following files were modified:
- src/pages/tools/video/change-speed/index.tsx
- src/pages/tools/video/crop-video/service.ts
- src/pages/tools/audio/trim/service.ts
- src/pages/tools/video/merge-video/service.ts
- src/pages/tools/video/rotate/service.ts
- src/pages/tools/image/generic/rotate/service.ts
- src/pages/tools/pdf/merge-pdf/service.ts
- src/pages/tools/pdf/rotate-pdf/service.ts
- src/pages/tools/video/compress/service.ts
- src/pages/tools/video/flip/service.ts
- src/pages/tools/video/trim/index.tsx
- src/pages/tools/video/loop/service.ts
- src/pages/tools/audio/extract-audio/service.ts
- src/pages/tools/pdf/split-pdf/service.ts
- src/pages/tools/audio/change-speed/service.ts
- src/pages/tools/image/generic/resize/service.ts
- src/pages/tools/video/gif/change-speed/index.tsx
- src/pages/tools/audio/merge-audio/service.ts
- src/pages/tools/video/video-to-gif/index.tsx
2025-10-02 22:33:34 +01:00
Ibrahima G. Coulibaly
28f4c64d30 feat: remove temperature conversion from generic-calc
This commit removes the temperature conversion tool from the
generic-calc tool. This is because the tool was causing issues.

The following files were modified:
- src/pages/tools/number/generic-calc/data/index.ts
- src/pages/tools/number/generic-calc/data/temperature.ts
- package.json
- .idea/workspace.xml
2025-10-02 22:18:34 +01:00
Ibrahima G. Coulibaly
579cfeb55f
Merge pull request #128
feat: temperature converter
2025-10-02 20:54:28 +01:00
Ibrahima G. Coulibaly
ee71c0d39c
Merge pull request #230
fix (video): Missing loop video icon
2025-10-02 20:51:26 +01:00
Ibrahima G. Coulibaly
f889de8068
Merge pull request #256 from njfletcher215/trim-on-video-to-gif
added option to concurrently trim video
2025-10-02 20:45:24 +01:00
Ibrahima G. Coulibaly
0542063e30
Merge pull request #257 from njfletcher215/qr-code-wifi-uri-wpa-type-update
Changed the 'type' for WPA/WPA2/WPA3 to just 'WPA'
2025-10-02 20:43:41 +01:00
Nat Fletcher
20b5c322ad Changed the 'type' for WPA/WPA2/WPA3 to just 'WPA' 2025-09-25 02:28:57 -05:00
Nat Fletcher
37f2fed2d9 added option to concurrently trim video 2025-09-24 00:48:54 -05:00
Chesterkxng
1ff1642052 fix (video): Missing loop video icon 2025-07-26 16:00:46 +02:00
Chesterkxng
613aa49532 Merge branch 'main' into chesterking 2025-07-26 16:00:06 +02:00
Chesterkxng
04657469b0 Merge branch 'main' into chesterking 2025-07-23 15:08:32 +02:00
Chesterkxng
000ee911e5 feat: temperature converter 2025-05-27 00:51:44 +02:00
28 changed files with 4124 additions and 2985 deletions

495
.idea/workspace.xml generated
View File

@ -4,12 +4,27 @@
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="chore: translate userTypes">
<list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="feat: remove temperature conversion from generic-calc&#10;&#10;This commit removes the temperature conversion tool from the&#10;generic-calc tool. This is because the tool was causing issues.&#10;&#10;The following files were modified:&#10;- src/pages/tools/number/generic-calc/data/index.ts&#10;- src/pages/tools/number/generic-calc/data/temperature.ts&#10;- package.json&#10;- .idea/workspace.xml">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/index.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/random-number-generator/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/random-number-generator/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/random-port-generator/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/random-port-generator/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/number/random-port-generator/meta.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/number/random-port-generator/meta.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/change-speed/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/change-speed/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/extract-audio/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/extract-audio/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/merge-audio/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/merge-audio/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/audio/trim/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/audio/trim/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/generic/resize/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/generic/resize/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/image/generic/rotate/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/image/generic/rotate/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/merge-pdf/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/merge-pdf/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/rotate-pdf/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/rotate-pdf/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/pdf/split-pdf/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/pdf/split-pdf/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/change-speed/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/change-speed/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/compress/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/compress/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/crop-video/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/crop-video/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/flip/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/flip/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/gif/change-speed/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/gif/change-speed/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/loop/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/loop/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/merge-video/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/merge-video/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/rotate/service.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/rotate/service.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/trim/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/trim/index.tsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/tools/video/video-to-gif/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/video/video-to-gif/index.tsx" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -43,230 +58,313 @@
<option name="PUSH_AUTO_UPDATE" value="true" />
<option name="RECENT_BRANCH_BY_REPOSITORY">
<map>
<entry key="$PROJECT_DIR$" value="fork/AshAnand34/tool/random-generators" />
<entry key="$PROJECT_DIR$" value="fork/ssagar1999/feature/244" />
</map>
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
<option name="RESET_MODE" value="HARD" />
</component>
<component name="GitHubPullRequestSearchHistory">{
&quot;history&quot;: [
<component name="GitHubPullRequestSearchHistory"><![CDATA[{
"history": [
{
&quot;assignee&quot;: &quot;iib0011&quot;
"assignee": "iib0011"
},
{
&quot;state&quot;: &quot;OPEN&quot;
"searchQuery": "filter",
"state": "OPEN"
},
{
&quot;searchQuery&quot;: &quot;filter&quot;,
&quot;state&quot;: &quot;OPEN&quot;
"state": "OPEN"
}
],
&quot;lastFilter&quot;: {
&quot;searchQuery&quot;: &quot;filter&quot;,
&quot;state&quot;: &quot;OPEN&quot;
"lastFilter": {
"state": "OPEN"
}
}</component>
<component name="GitHubPullRequestState">{
&quot;prStates&quot;: [
}]]></component>
<component name="GitHubPullRequestState"><![CDATA[{
"prStates": [
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts51PkS9&quot;,
&quot;number&quot;: 22
"id": {
"id": "PR_kwDOMJIfts51PkS9",
"number": 22
},
&quot;lastSeen&quot;: 1741207144695
"lastSeen": 1741207144695
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6NiNYl&quot;,
&quot;number&quot;: 32
"id": {
"id": "PR_kwDOMJIfts6NiNYl",
"number": 32
},
&quot;lastSeen&quot;: 1741209723869
"lastSeen": 1741209723869
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6Nheyd&quot;,
&quot;number&quot;: 31
"id": {
"id": "PR_kwDOMJIfts6Nheyd",
"number": 31
},
&quot;lastSeen&quot;: 1741213371410
"lastSeen": 1741213371410
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6NmRBs&quot;,
&quot;number&quot;: 33
"id": {
"id": "PR_kwDOMJIfts6NmRBs",
"number": 33
},
&quot;lastSeen&quot;: 1741282429036
"lastSeen": 1741282429036
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts5zyFTs&quot;,
&quot;number&quot;: 15
"id": {
"id": "PR_kwDOMJIfts5zyFTs",
"number": 15
},
&quot;lastSeen&quot;: 1741535540953
"lastSeen": 1741535540953
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6QQB3c&quot;,
&quot;number&quot;: 59
"id": {
"id": "PR_kwDOMJIfts6QQB3c",
"number": 59
},
&quot;lastSeen&quot;: 1743018960900
"lastSeen": 1743018960900
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6QMPEg&quot;,
&quot;number&quot;: 58
"id": {
"id": "PR_kwDOMJIfts6QMPEg",
"number": 58
},
&quot;lastSeen&quot;: 1743019452983
"lastSeen": 1743019452983
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6QZvRI&quot;,
&quot;number&quot;: 61
"id": {
"id": "PR_kwDOMJIfts6QZvRI",
"number": 61
},
&quot;lastSeen&quot;: 1743103196866
"lastSeen": 1743103196866
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6QqPrQ&quot;,
&quot;number&quot;: 73
"id": {
"id": "PR_kwDOMJIfts6QqPrQ",
"number": 73
},
&quot;lastSeen&quot;: 1743265865001
"lastSeen": 1743265865001
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6Qp5nI&quot;,
&quot;number&quot;: 72
"id": {
"id": "PR_kwDOMJIfts6Qp5nI",
"number": 72
},
&quot;lastSeen&quot;: 1743338472110
"lastSeen": 1743338472110
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6QsjlS&quot;,
&quot;number&quot;: 76
"id": {
"id": "PR_kwDOMJIfts6QsjlS",
"number": 76
},
&quot;lastSeen&quot;: 1743352150953
"lastSeen": 1743352150953
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6Q0JBe&quot;,
&quot;number&quot;: 82
"id": {
"id": "PR_kwDOMJIfts6Q0JBe",
"number": 82
},
&quot;lastSeen&quot;: 1743470267269
"lastSeen": 1743470267269
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6UE9-x&quot;,
&quot;number&quot;: 102
"id": {
"id": "PR_kwDOMJIfts6UE9-x",
"number": 102
},
&quot;lastSeen&quot;: 1747171977348
"lastSeen": 1747171977348
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6XPua_&quot;,
&quot;number&quot;: 117
"id": {
"id": "PR_kwDOMJIfts6XPua_",
"number": 117
},
&quot;lastSeen&quot;: 1747929835864
"lastSeen": 1747929835864
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6XY-mZ&quot;,
&quot;number&quot;: 119
"id": {
"id": "PR_kwDOMJIfts6XY-mZ",
"number": 119
},
&quot;lastSeen&quot;: 1748028108508
"lastSeen": 1748028108508
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6Xdz4n&quot;,
&quot;number&quot;: 120
"id": {
"id": "PR_kwDOMJIfts6Xdz4n",
"number": 120
},
&quot;lastSeen&quot;: 1748282672214
"lastSeen": 1748282672214
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6X_zxl&quot;,
&quot;number&quot;: 131
"id": {
"id": "PR_kwDOMJIfts6X_zxl",
"number": 131
},
&quot;lastSeen&quot;: 1748881279494
"lastSeen": 1748881279494
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6bhieT&quot;,
&quot;number&quot;: 152
"id": {
"id": "PR_kwDOMJIfts6bhieT",
"number": 152
},
&quot;lastSeen&quot;: 1751848489082
"lastSeen": 1751848489082
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6dOyRk&quot;,
&quot;number&quot;: 154
"id": {
"id": "PR_kwDOMJIfts6dOyRk",
"number": 154
},
&quot;lastSeen&quot;: 1751849436454
"lastSeen": 1751849436454
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6cHjNi&quot;,
&quot;number&quot;: 153
"id": {
"id": "PR_kwDOMJIfts6cHjNi",
"number": 153
},
&quot;lastSeen&quot;: 1751849501498
"lastSeen": 1751849501498
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6Zs1FN&quot;,
&quot;number&quot;: 145
"id": {
"id": "PR_kwDOMJIfts6Zs1FN",
"number": 145
},
&quot;lastSeen&quot;: 1751849770308
"lastSeen": 1751849770308
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6bgKi9&quot;,
&quot;number&quot;: 150
"id": {
"id": "PR_kwDOMJIfts6bgKi9",
"number": 150
},
&quot;lastSeen&quot;: 1751850367300
"lastSeen": 1751850367300
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6eUKC-&quot;,
&quot;number&quot;: 176
"id": {
"id": "PR_kwDOMJIfts6eUKC-",
"number": 176
},
&quot;lastSeen&quot;: 1752158748013
"lastSeen": 1752158748013
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6eqzP7&quot;,
&quot;number&quot;: 190
"id": {
"id": "PR_kwDOMJIfts6et6vx",
"number": 192
},
&quot;lastSeen&quot;: 1752404173008
"lastSeen": 1752585709582
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6et6vx&quot;,
&quot;number&quot;: 192
"id": {
"id": "PR_kwDOMJIfts6d36mi",
"number": 168
},
&quot;lastSeen&quot;: 1752585709582
"lastSeen": 1752805763664
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6d36mi&quot;,
&quot;number&quot;: 168
"id": {
"id": "PR_kwDOMJIfts6fnXKf",
"number": 208
},
&quot;lastSeen&quot;: 1752805763664
"lastSeen": 1752862212326
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6fnXKf&quot;,
&quot;number&quot;: 208
"id": {
"id": "PR_kwDOMJIfts6rjINx",
"number": 259
},
&quot;lastSeen&quot;: 1752862212326
"lastSeen": 1759434090574
},
{
&quot;id&quot;: {
&quot;id&quot;: &quot;PR_kwDOMJIfts6fo_ig&quot;,
&quot;number&quot;: 209
"id": {
"id": "PR_kwDOMJIfts6qcP13",
"number": 256
},
&quot;lastSeen&quot;: 1753201966322
"lastSeen": 1759434257615
},
{
"id": {
"id": "PR_kwDOMJIfts6ow8QZ",
"number": 252
},
"lastSeen": 1759434340504
},
{
"id": {
"id": "PR_kwDOMJIfts6myVeZ",
"number": 247
},
"lastSeen": 1759434588110
},
{
"id": {
"id": "PR_kwDOMJIfts6i5ZAq",
"number": 239
},
"lastSeen": 1759434599664
},
{
"id": {
"id": "PR_kwDOMJIfts6iiuGd",
"number": 237
},
"lastSeen": 1759434652702
},
{
"id": {
"id": "PR_kwDOMJIfts6gwm8n",
"number": 230
},
"lastSeen": 1759434669914
},
{
"id": {
"id": "PR_kwDOMJIfts6f5JeZ",
"number": 220
},
"lastSeen": 1759434706785
},
{
"id": {
"id": "PR_kwDOMJIfts6ftgWI",
"number": 217
},
"lastSeen": 1759434804548
},
{
"id": {
"id": "PR_kwDOMJIfts6XsHfL",
"number": 128
},
"lastSeen": 1759434870000
},
{
"id": {
"id": "PR_kwDOMJIfts6ec-tz",
"number": 180
},
"lastSeen": 1759434882113
},
{
"id": {
"id": "PR_kwDOMJIfts6fsi5n",
"number": 216
},
"lastSeen": 1759434902813
},
{
"id": {
"id": "PR_kwDOMJIfts6ZkP3F",
"number": 142
},
"lastSeen": 1759434918778
},
{
"id": {
"id": "PR_kwDOMJIfts6qcbuA",
"number": 257
},
"lastSeen": 1759438234107
}
]
}</component>
}]]></component>
<component name="GithubPullRequestsUISettings">{
&quot;selectedUrlAndAccountId&quot;: {
&quot;url&quot;: &quot;https://github.com/iib0011/omni-tools.git&quot;,
@ -279,9 +377,9 @@
<component name="HighlightingSettingsPerFile">
<setting file="file://$PROJECT_DIR$/node_modules/react-image-crop/dist/index.d.ts" root0="SKIP_INSPECTION" />
</component>
<component name="KubernetesApiProvider">{
&quot;isMigrated&quot;: true
}</component>
<component name="KubernetesApiProvider"><![CDATA[{
"isMigrated": true
}]]></component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
@ -326,7 +424,7 @@
"Vitest.replaceText function (regexp mode).should return the original text when passed an invalid regexp.executor": "Run",
"Vitest.replaceText function.executor": "Run",
"Vitest.timeBetweenDates.executor": "Run",
"git-widget-placeholder": "#218 on fork/AshAnand34/tool/random-generators",
"git-widget-placeholder": "main",
"ignore.virus.scanning.warn.message": "true",
"kotlin-language-version-configured": "true",
"last_opened_file_path": "C:/Users/Ibrahima/IdeaProjects/omni-tools",
@ -347,6 +445,7 @@
"npm.test.executor": "Run",
"npm.test:e2e.executor": "Run",
"npm.test:e2e:run.executor": "Run",
"npm.typecheck.executor": "Run",
"prettierjs.PrettierConfiguration.Package": "C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\node_modules\\prettier",
"project.structure.last.edited": "Problems",
"project.structure.proportion": "0.0",
@ -383,19 +482,6 @@
</key>
</component>
<component name="RunManager" selected="npm.dev">
<configuration name="generatePassword" type="JavaScriptTestRunnerVitest" temporary="true" nameIsGenerated="true">
<node-interpreter value="project" />
<vitest-package value="$PROJECT_DIR$/node_modules/vitest" />
<working-dir value="$PROJECT_DIR$" />
<vitest-options value="--run" />
<envs />
<scope-kind value="SUITE" />
<test-file value="$PROJECT_DIR$/src/pages/tools/string/password-generator/password-generator.service.test.ts" />
<test-names>
<test-name value="generatePassword" />
</test-names>
<method v="2" />
</configuration>
<configuration default="true" type="docker-deploy" factoryName="dockerfile" temporary="true">
<deployment type="dockerfile">
<settings />
@ -415,26 +501,6 @@
</envs>
<method v="2" />
</configuration>
<configuration name="i18n:extract" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="i18n:extract" />
</scripts>
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
<configuration name="i18n:pull" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="i18n:pull" />
</scripts>
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
<configuration name="i18n:sync" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
@ -447,20 +513,50 @@
</envs>
<method v="2" />
</configuration>
<configuration name="test" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="test" />
</scripts>
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
<configuration name="test:e2e" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="test:e2e" />
</scripts>
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
<configuration name="typecheck" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
<package-json value="$PROJECT_DIR$/package.json" />
<command value="run" />
<scripts>
<script value="typecheck" />
</scripts>
<node-interpreter value="project" />
<envs />
<method v="2" />
</configuration>
<list>
<item itemvalue="npm.i18n:extract" />
<item itemvalue="npm.i18n:pull" />
<item itemvalue="npm.test" />
<item itemvalue="npm.test:e2e" />
<item itemvalue="npm.typecheck" />
<item itemvalue="npm.i18n:sync" />
<item itemvalue="npm.dev" />
<item itemvalue="Vitest.generatePassword" />
</list>
<recent_temporary>
<list>
<item itemvalue="npm.dev" />
<item itemvalue="npm.test:e2e" />
<item itemvalue="npm.test" />
<item itemvalue="npm.typecheck" />
<item itemvalue="npm.i18n:sync" />
<item itemvalue="Vitest.generatePassword" />
<item itemvalue="npm.i18n:pull" />
<item itemvalue="npm.i18n:extract" />
</list>
</recent_temporary>
</component>
@ -581,14 +677,6 @@
<workItem from="1753206561770" duration="119000" />
<workItem from="1753206717510" duration="3599000" />
</task>
<task id="LOCAL-00201" summary="chore: rename from Omni Tools to OmniTools">
<option name="closed" value="true" />
<created>1751630993003</created>
<option name="number" value="00201" />
<option name="presentableId" value="LOCAL-00201" />
<option name="project" value="LOCAL" />
<updated>1751630993003</updated>
</task>
<task id="LOCAL-00202" summary="fix: tools by category page title">
<option name="closed" value="true" />
<created>1751846877842</created>
@ -973,7 +1061,15 @@
<option name="project" value="LOCAL" />
<updated>1753210033390</updated>
</task>
<option name="localTasksCounter" value="250" />
<task id="LOCAL-00250" summary="feat: remove temperature conversion from generic-calc&#10;&#10;This commit removes the temperature conversion tool from the&#10;generic-calc tool. This is because the tool was causing issues.&#10;&#10;The following files were modified:&#10;- src/pages/tools/number/generic-calc/data/index.ts&#10;- src/pages/tools/number/generic-calc/data/temperature.ts&#10;- package.json&#10;- .idea/workspace.xml">
<option name="closed" value="true" />
<created>1759439927012</created>
<option name="number" value="00250" />
<option name="presentableId" value="LOCAL-00250" />
<option name="project" value="LOCAL" />
<updated>1759439927012</updated>
</task>
<option name="localTasksCounter" value="251" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
@ -996,6 +1092,11 @@
<entry key="Branch">
<value>
<list>
<RecentGroup>
<option name="FILTER_VALUES">
<option value="origin/main" />
</option>
</RecentGroup>
<RecentGroup>
<option name="FILTER_VALUES">
<option value="origin/examples" />
@ -1010,7 +1111,19 @@
<map>
<entry key="MAIN">
<value>
<State />
<State>
<option name="FILTERS">
<map>
<entry key="branch">
<value>
<list>
<option value="origin/main" />
</list>
</value>
</entry>
</map>
</option>
</State>
</value>
</entry>
</map>
@ -1020,12 +1133,6 @@
<option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
<option name="CHECK_NEW_TODO" value="false" />
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
<MESSAGE value="chore: i18n in meta" />
<MESSAGE value="chore: add i18n to meta script" />
<MESSAGE value="chore: bundle translations at build time" />
<MESSAGE value="fix: tsc" />
<MESSAGE value="chore: remove unnecessary" />
<MESSAGE value="chore: saveMissing" />
<MESSAGE value="fix: translation related behaviors" />
<MESSAGE value="feat: password generator to test translation" />
<MESSAGE value="docs: translation docs" />
@ -1045,7 +1152,13 @@
<MESSAGE value="chore: show only necessary tags on a category" />
<MESSAGE value="chore: CATEGORIES_USER_TYPES_MAPPINGS" />
<MESSAGE value="chore: translate userTypes" />
<option name="LAST_COMMIT_MESSAGE" value="chore: translate userTypes" />
<MESSAGE value="```" />
<MESSAGE value="```&#10;feat: remove temperature conversion from generic-calc&#10;&#10;This commit removes the temperature conversion" />
<MESSAGE value="```&#10;feat: remove temperature conversion from generic-calc&#10;&#10;This commit removes the temperature conversion tool from the&#10;generic-calc tool. This is because the tool was causing" />
<MESSAGE value="```&#10;feat: remove temperature conversion from generic-calc&#10;&#10;This commit removes the temperature conversion tool from the&#10;generic-calc tool. This is because the tool was causing issues.&#10;&#10;The following files were modified:&#10;- src/pages/tools/number/generic-calc/data/index.ts&#10;- src/" />
<MESSAGE value="```&#10;feat: remove temperature conversion from generic-calc&#10;&#10;This commit removes the temperature conversion tool from the&#10;generic-calc tool. This is because the tool was causing issues.&#10;&#10;The following files were modified:&#10;- src/pages/tools/number/generic-calc/data/index.ts&#10;- src/pages/tools/number/generic-calc/data/temperature.ts&#10;- package.json&#10;- .idea/workspace.xml&#10;```" />
<MESSAGE value="feat: remove temperature conversion from generic-calc&#10;&#10;This commit removes the temperature conversion tool from the&#10;generic-calc tool. This is because the tool was causing issues.&#10;&#10;The following files were modified:&#10;- src/pages/tools/number/generic-calc/data/index.ts&#10;- src/pages/tools/number/generic-calc/data/temperature.ts&#10;- package.json&#10;- .idea/workspace.xml" />
<option name="LAST_COMMIT_MESSAGE" value="feat: remove temperature conversion from generic-calc&#10;&#10;This commit removes the temperature conversion tool from the&#10;generic-calc tool. This is because the tool was causing issues.&#10;&#10;The following files were modified:&#10;- src/pages/tools/number/generic-calc/data/index.ts&#10;- src/pages/tools/number/generic-calc/data/temperature.ts&#10;- package.json&#10;- .idea/workspace.xml" />
</component>
<component name="VgoProject">
<integration-enabled>false</integration-enabled>

6479
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -68,6 +68,7 @@
"nerdamer-prime": "^1.2.4",
"notistack": "^3.0.1",
"omggif": "^1.0.10",
"onnxruntime-web": "^1.23.0",
"pdf-lib": "^1.17.1",
"pdfjs-dist": "^5.2.133",
"playwright": "^1.45.0",
@ -81,6 +82,7 @@
"react-image-crop": "^11.0.7",
"react-konva": "^18.2.10",
"react-router-dom": "^6.23.1",
"styled-components": "^6.1.19",
"tesseract.js": "^6.0.0",
"type-fest": "^4.35.0",
"use-deep-compare-effect": "^1.8.1",

View File

@ -41,7 +41,7 @@ export async function changeAudioSpeed(
const outputName = `output.${outputFormat}`;
await ffmpeg.writeFile(fileName, await fetchFile(input));
const audioFilter = computeAudioFilter(newSpeed);
let args = ['-i', fileName, '-filter:a', audioFilter];
const args = ['-i', fileName, '-filter:a', audioFilter];
if (outputFormat === 'mp3') {
args.push('-b:a', '192k', '-f', 'mp3', outputName);
} else if (outputFormat === 'aac') {
@ -64,7 +64,7 @@ export async function changeAudioSpeed(
let mimeType = 'audio/mp3';
if (outputFormat === 'aac') mimeType = 'audio/aac';
if (outputFormat === 'wav') mimeType = 'audio/wav';
const blob = new Blob([data], { type: mimeType });
const blob = new Blob([data as any], { type: mimeType });
const newFile = new File(
[blob],
fileName.replace(/\.[^/.]+$/, `-${newSpeed}x.${outputFormat}`),

View File

@ -57,7 +57,7 @@ export async function extractAudioFromVideo(
return new File(
[
new Blob([extractedAudio], {
new Blob([extractedAudio as any], {
type: `audio/${configuredOutputAudioFormat}`
})
],

View File

@ -105,7 +105,7 @@ export async function mergeAudioFiles(
return new File(
[
new Blob([mergedAudio], {
new Blob([mergedAudio as any], {
type: mimeType
})
],

View File

@ -98,7 +98,7 @@ export async function trimAudio(
return new File(
[
new Blob([trimmedAudio], {
new Blob([trimmedAudio as any], {
type: mimeType
})
],

View File

@ -40,7 +40,7 @@ const initialValues: InitialValuesType = {
// WiFi
wifiSsid: '',
wifiPassword: '',
wifiEncryption: 'WPA/WPA2',
wifiEncryption: 'WPA',
// vCard
vCardName: '',
@ -353,7 +353,7 @@ export default function QRCodeGenerator({ title }: ToolComponentProps) {
label="Encryption Type"
margin="normal"
>
<MenuItem value="WPA/WPA2">WPA/WPA2</MenuItem>
<MenuItem value="WPA">WPA</MenuItem>
<MenuItem value="WEP">WEP</MenuItem>
<MenuItem value="None">None</MenuItem>
</TextField>

View File

@ -7,7 +7,7 @@ export type QRCodeType =
| 'WiFi'
| 'vCard';
export type WifiEncryptionType = 'WPA/WPA2' | 'WEP' | 'None';
export type WifiEncryptionType = 'WPA' | 'WEP' | 'None';
export interface InitialValuesType {
qrCodeType: QRCodeType;

View File

@ -148,7 +148,7 @@ export const processImage = async (
const data = await ffmpeg.readFile('output.gif');
// Create a new File object
return new File([data], file.name, { type: 'image/gif' });
return new File([data as any], file.name, { type: 'image/gif' });
} catch (error) {
console.error('Error processing GIF with FFmpeg:', error);
// Fall back to canvas method if FFmpeg processing fails

View File

@ -66,7 +66,7 @@ export const processImage = async (
// Read the output file
const data = await ffmpeg.readFile('output.' + file.name.split('.').pop());
return new File([data], file.name, { type: file.type });
return new File([data as any], file.name, { type: file.type });
} catch (error) {
console.error('Error processing image:', error);
return null;

View File

@ -3,6 +3,7 @@ import voltageDropInWire from './voltageDropInWire';
import sphereArea from './sphereArea';
import sphereVolume from './sphereVolume';
import slackline from './slackline';
export default [
ohmslaw,
voltageDropInWire,

View File

@ -70,7 +70,9 @@ export async function splitPdf(
const newPdfBytes = await newPdf.save();
const newFileName = pdfFile.name.replace('.pdf', '-extracted.pdf');
return new File([newPdfBytes], newFileName, { type: 'application/pdf' });
return new File([newPdfBytes as any], newFileName, {
type: 'application/pdf'
});
}
/**
@ -89,7 +91,7 @@ export async function mergePdf(pdfFiles: File[]): Promise<File> {
const mergedPdfBytes = await mergedPdf.save();
const mergedFileName = 'merged.pdf';
return new File([mergedPdfBytes], mergedFileName, {
return new File([mergedPdfBytes as any], mergedFileName, {
type: 'application/pdf'
});
}

View File

@ -28,7 +28,7 @@ export async function convertPdfToPngImages(pdfFile: File): Promise<{
canvas.width = viewport.width;
canvas.height = viewport.height;
await page.render({ canvasContext: context, viewport }).promise;
await page.render({ canvas, canvasContext: context, viewport }).promise;
const blob = await new Promise<Blob>((resolve) =>
canvas.toBlob((b) => b && resolve(b), 'image/png')

View File

@ -78,5 +78,7 @@ export async function rotatePdf(
const modifiedPdfBytes = await pdfDoc.save();
const newFileName = pdfFile.name.replace('.pdf', '-rotated.pdf');
return new File([modifiedPdfBytes], newFileName, { type: 'application/pdf' });
return new File([modifiedPdfBytes as any], newFileName, {
type: 'application/pdf'
});
}

View File

@ -70,5 +70,7 @@ export async function splitPdf(
const newPdfBytes = await newPdf.save();
const newFileName = pdfFile.name.replace('.pdf', '-extracted.pdf');
return new File([newPdfBytes], newFileName, { type: 'application/pdf' });
return new File([newPdfBytes as any], newFileName, {
type: 'application/pdf'
});
}

View File

@ -101,7 +101,7 @@ export default function ChangeSpeed({
const data = await ffmpeg.readFile(outputName);
// Create new file from processed data
const blob = new Blob([data], { type: 'video/mp4' });
const blob = new Blob([data as any], { type: 'video/mp4' });
const newFile = new File(
[blob],
file.name.replace('.mp4', `-${newSpeed}x.mp4`),

View File

@ -53,7 +53,7 @@ export async function compressVideo(
}
const compressedData = await ffmpeg.readFile(outputName);
return new File(
[new Blob([compressedData], { type: 'video/mp4' })],
[new Blob([compressedData as any], { type: 'video/mp4' })],
`${input.name.replace(/\.[^/.]+$/, '')}_compressed_${options.width}p.mp4`,
{ type: 'video/mp4' }
);

View File

@ -60,7 +60,7 @@ export async function cropVideo(
const croppedData = await ffmpeg.readFile(outputName);
return await new File(
[new Blob([croppedData], { type: 'video/mp4' })],
[new Blob([croppedData as any], { type: 'video/mp4' })],
`${input.name.replace(/\.[^/.]+$/, '')}_cropped.mp4`,
{ type: 'video/mp4' }
);

View File

@ -36,7 +36,7 @@ export async function flipVideo(
const flippedData = await ffmpeg.readFile(outputName);
return new File(
[new Blob([flippedData], { type: 'video/mp4' })],
[new Blob([flippedData as any], { type: 'video/mp4' })],
`${input.name.replace(/\.[^/.]+$/, '')}_flipped.mp4`,
{ type: 'video/mp4' }
);

View File

@ -71,7 +71,7 @@ export default function ChangeSpeed({ title }: ToolComponentProps) {
const data = await ffmpeg.readFile('output.gif');
// Create a new file from the processed data
const blob = new Blob([data], { type: 'image/gif' });
const blob = new Blob([data as any], { type: 'image/gif' });
const newFile = new File(
[blob],
file.name.replace('.gif', `-${newSpeed}x.gif`),

View File

@ -3,7 +3,7 @@ import { lazy } from 'react';
export const tool = defineTool('video', {
path: 'loop',
icon: 'material-symbols:loop',
icon: 'ic:outline-loop',
keywords: ['video', 'loop', 'repeat', 'continuous'],
component: lazy(() => import('./index')),

View File

@ -34,7 +34,7 @@ export async function loopVideo(
const loopedData = await ffmpeg.readFile(outputName);
return await new File(
[new Blob([loopedData], { type: 'video/mp4' })],
[new Blob([loopedData as any], { type: 'video/mp4' })],
`${input.name.replace(/\.[^/.]+$/, '')}_looped.mp4`,
{ type: 'video/mp4' }
);

View File

@ -112,7 +112,7 @@ export async function mergeVideos(
throw new Error('Output file is empty or corrupted');
}
return new Blob([mergedData], { type: 'video/mp4' });
return new Blob([mergedData as any], { type: 'video/mp4' });
} catch (error) {
console.error('Error merging videos:', error);
throw error instanceof Error

View File

@ -37,7 +37,7 @@ export async function rotateVideo(
const rotatedData = await ffmpeg.readFile(outputName);
return new File(
[new Blob([rotatedData], { type: 'video/mp4' })],
[new Blob([rotatedData as any], { type: 'video/mp4' })],
`${input.name.replace(/\.[^/.]+$/, '')}_rotated.mp4`,
{ type: 'video/mp4' }
);

View File

@ -67,7 +67,7 @@ export default function TrimVideo({ title }: ToolComponentProps) {
]);
// Retrieve the processed file
const trimmedData = await ffmpeg.readFile(outputName);
const trimmedBlob = new Blob([trimmedData], { type: 'video/mp4' });
const trimmedBlob = new Blob([trimmedData as any], { type: 'video/mp4' });
const trimmedFile = new File(
[trimmedBlob],
`${input.name.replace(/\.[^/.]+$/, '')}_trimmed.mp4`,

View File

@ -1,8 +1,11 @@
import { Box } from '@mui/material';
import React, { useState } from 'react';
import * as Yup from 'yup';
import ToolContent from '@components/ToolContent';
import { ToolComponentProps } from '@tools/defineTool';
import { GetGroupsType } from '@components/options/ToolOptions';
import TextFieldWithDesc from '@components/options/TextFieldWithDesc';
import { updateNumberField } from '@utils/string';
import { InitialValuesType } from './types';
import ToolVideoInput from '@components/input/ToolVideoInput';
import ToolFileResult from '@components/result/ToolFileResult';
@ -13,9 +16,19 @@ import { fetchFile } from '@ffmpeg/util';
const initialValues: InitialValuesType = {
quality: 'mid',
fps: '10',
scale: '320:-1:flags=bicubic'
scale: '320:-1:flags=bicubic',
start: 0,
end: 100
};
const validationSchema = Yup.object({
start: Yup.number().min(0, 'Start time must be positive'),
end: Yup.number().min(
Yup.ref('start'),
'End time must be greater than start time'
)
});
export default function VideoToGif({
title,
longDescription
@ -26,14 +39,16 @@ export default function VideoToGif({
const compute = (values: InitialValuesType, input: File | null) => {
if (!input) return;
const { fps, scale } = values;
const { fps, scale, start, end } = values;
let ffmpeg: FFmpeg | null = null;
let ffmpegLoaded = false;
const convertVideoToGif = async (
file: File,
fps: string,
scale: string
scale: string,
start: number,
end: number
): Promise<void> => {
setLoading(true);
@ -58,6 +73,10 @@ export default function VideoToGif({
await ffmpeg.exec([
'-i',
fileName,
'-ss',
start.toString(),
'-to',
end.toString(),
'-vf',
`fps=${fps},scale=${scale},palettegen`,
'palette.png'
@ -68,6 +87,10 @@ export default function VideoToGif({
fileName,
'-i',
'palette.png',
'-ss',
start.toString(),
'-to',
end.toString(),
'-filter_complex',
`fps=${fps},scale=${scale}[x];[x][1:v]paletteuse`,
outputName
@ -75,7 +98,7 @@ export default function VideoToGif({
const data = await ffmpeg.readFile(outputName);
const blob = new Blob([data], { type: 'image/gif' });
const blob = new Blob([data as any], { type: 'image/gif' });
const convertedFile = new File([blob], outputName, {
type: 'image/gif'
});
@ -92,7 +115,7 @@ export default function VideoToGif({
}
};
convertVideoToGif(input, fps, scale);
convertVideoToGif(input, fps, scale, start, end);
};
const getGroups: GetGroupsType<InitialValuesType> | null = ({
@ -141,6 +164,28 @@ export default function VideoToGif({
/>
</Box>
)
},
{
title: 'Timestamps',
component: (
<Box>
<TextFieldWithDesc
onOwnChange={(value) =>
updateNumberField(value, 'start', updateField)
}
value={values.start}
label="Start Time"
sx={{ mb: 2, backgroundColor: 'background.paper' }}
/>
<TextFieldWithDesc
onOwnChange={(value) =>
updateNumberField(value, 'end', updateField)
}
value={values.end}
label="End Time"
/>
</Box>
)
}
];
@ -148,9 +193,22 @@ export default function VideoToGif({
<ToolContent
title={title}
input={input}
inputComponent={
<ToolVideoInput value={input} onChange={setInput} title="Input Video" />
}
renderCustomInput={({ start, end }, setFieldValue) => {
return (
<ToolVideoInput
value={input}
onChange={setInput}
title={'Input Video'}
showTrimControls={true}
onTrimChange={(start, end) => {
setFieldValue('start', start);
setFieldValue('end', end);
}}
trimStart={start}
trimEnd={end}
/>
);
}}
resultComponent={
loading ? (
<ToolFileResult

View File

@ -2,4 +2,6 @@ export type InitialValuesType = {
quality: 'mid' | 'high' | 'low' | 'ultra';
fps: string;
scale: string;
start: number;
end: number;
};