Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5be52c4

Browse files
[feat]: Implemented new type inference mechanism
[feat]: Implemented "Add to Debit Card" functionality in the application [feat]: Implemented efficient file querying for faster results [fix]: Resolve bug in tracking the number of shared files for users
1 parent 1e30b3a commit 5be52c4

File tree

6 files changed

+100
-14
lines changed

6 files changed

+100
-14
lines changed

‎components/app/Header.tsx‎

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Image from "next/image";
33
import { Input } from "@/components/ui/input";
44
import { Label } from "@/components/ui/label";
55
import { Button } from "@/components/ui/button";
6-
import { UploadCloud, Command } from "lucide-react";
6+
import { UploadCloud, Command,Search } from "lucide-react";
77
import { UserButton } from "@clerk/nextjs";
88
import { isMobile } from "react-device-detect";
99
import {
@@ -23,13 +23,15 @@ type HeaderProp = {
2323
setOpen: Dispatch<SetStateAction<boolean>>;
2424
open: boolean;
2525
uploadState: typeUpldState;
26+
setSearchQ: Dispatch<SetStateAction<string>>;
2627
};
2728

2829
export default function Header({
2930
uploadFile,
3031
setOpen,
3132
open,
3233
uploadState,
34+
setSearchQ
3335
}: HeaderProp) {
3436
const [count, setCount] = useState(0);
3537
const [isMobileUse, setIsMobileUse] = useState(false);
@@ -46,8 +48,8 @@ export default function Header({
4648

4749
return (
4850
<header className="fixed top-0 w-full z-10 md:p-3 md:px-10 lg:p-3 lg:px-10 p-4 bg-white/30 dark:bg-darkestbg/70 backdrop-blur-md border border-transparent border-b-borderbtm/20 dark:border-b-borderbtm flex items-center justify-between">
49-
<div className="">
50-
<Link href="/dashboard">
51+
<div className="flex items-center gap-3">
52+
<Link href="/dashboard"className="">
5153
<Image
5254
src={DarkImage}
5355
width={150}
@@ -67,6 +69,13 @@ export default function Header({
6769
alt="forget logo"
6870
/>
6971
</Link>
72+
<span className="relative md:block lg:block hidden">
73+
<Search className="w-4 h-4 absolute top-3 left-3 text-hashtext" />
74+
<Input type="text" placeholder="Search drive" className="x border-2 border-transparent w-96 p-4 px-10 bg-[#282a2f] focus:bg-transparent focus:border-containerBG placeholder:text-hashtext" onChange={(e) => setSearchQ(e.target.value) } />
75+
</span>
76+
77+
</div>
78+
<div className="">
7079
</div>
7180
<nav className="flex items-center md:gap-4 lg:gap-4 gap-3">
7281
{/* account */}

‎components/studio/Files.tsx‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type FileProp = {
4242
fetchFiles(): Promise<void>;
4343
setShow: Dispatch<SetStateAction<boolean>>;
4444
setExtension: Dispatch<SetStateAction<extension>>;
45+
searchQ: string;
4546
};
4647

4748
export default function Files({
@@ -51,11 +52,19 @@ export default function Files({
5152
fetchFiles,
5253
setShow,
5354
setExtension,
55+
searchQ
5456
}: FileProp) {
5557
const { toast } = useToast();
5658
const { isSignedIn, user } = useUser();
5759
const router = useRouter();
5860

61+
const filteredFile = files.filter((file:typeFile) => {
62+
const lowercaseSearch = searchQ.toLowerCase()
63+
const lowercasedFilename = file.filename.toLowerCase();
64+
const uppercasedFilename = file.filename.toUpperCase();
65+
return lowercasedFilename.includes(lowercaseSearch) || uppercasedFilename.includes(lowercaseSearch);
66+
})
67+
5968
const deleteFile = async (filename: string, uploadID: string) => {
6069
if (isSignedIn) {
6170
const id = user.id;
@@ -151,8 +160,7 @@ export default function Files({
151160
</TableRow>
152161
</TableHeader>
153162
<TableBody>
154-
{files.map((item: typeFile, index: number) => {
155-
const editedFile = item.filename;
163+
{filteredFile.map((item: typeFile, index: number) => {
156164
return (
157165
<TableRow
158166
key={item.uploadID}

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "stashblob",
3-
"version": "1.10.2",
3+
"version": "2.11.3",
44
"private": true,
55
"scripts": {
66
"dev": "next dev",

‎pages/billing.tsx‎

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import Head from "next/head";
22
import { useState, useEffect } from "react";
33
import { ColorRing } from "react-loader-spinner";
4-
import { ExternalLink, Archive } from "lucide-react";
4+
import { ExternalLink, Archive, CreditCard, X } from "lucide-react";
5+
import { Button } from "@/components/ui/button";
56
import { Badge } from "@/components/ui/badge";
67
import Header from "@/components/app/bill/Header";
78
import Link from "next/link";
@@ -28,7 +29,10 @@ export default function Billing() {
2829
const router = useRouter();
2930
const getPath = router.pathname;
3031
const [loading, setLoading] = useState(false);
32+
const [isrendering, setIsrendering] = useState(false);
33+
const [isRendered, setIsRendered] = useState(false);
3134
const [renderCount, setRenderCount] = useState(0);
35+
const [isBtnClicked, setIsBtnClicked] = useState(false);
3236
const [billObj, setBillObj] = useState<typeBill>({
3337
status: {
3438
hasPaid: false,
@@ -52,6 +56,7 @@ export default function Billing() {
5256

5357
async function getBillingStatus() {
5458
setLoading(true);
59+
setIsRendered(false);
5560
if (!isLoaded || !isSignedIn) {
5661
return null;
5762
} else {
@@ -65,6 +70,13 @@ export default function Billing() {
6570
})
6671
.then(async function (response) {
6772
setLoading(false);
73+
setTimeout(() => {
74+
setIsrendering(true);
75+
}, 1000);
76+
setTimeout(() => {
77+
setIsrendering(false);
78+
setIsRendered(true);
79+
}, 2000);
6880
setBillObj((prev) => {
6981
return {
7082
...prev,
@@ -86,6 +98,7 @@ export default function Billing() {
8698
.catch(async function (error) {
8799
console.error(error.response);
88100
setLoading(false);
101+
setIsRendered(false);
89102
});
90103
}
91104
}
@@ -200,7 +213,7 @@ export default function Billing() {
200213
Basic Plan
201214
</p>
202215
<Badge className="dark:bg-[#dfe9f5] bg-[#3864ac] dark:text-[#3864ac] text-[#dfe9f5] py-[0.1rem]">
203-
Monthly
216+
Free
204217
</Badge>
205218
</hgroup>
206219
<hgroup>
@@ -218,7 +231,8 @@ export default function Billing() {
218231
<div className="absolute w-full bottom-12 right-0 dark:bg-[#1a1b1e] bg-borderbtm/20 h-[0.1rem]"></div>
219232
<div className="mt-6 w-full flex items-end justify-end m-auto">
220233
<Link
221-
href="/"
234+
href="https://timilab.lemonsqueezy.com/checkout"
235+
target="_blank"
222236
className="flex items-center gap-3 transition-all dark:text-linkclr text-royalblue dark:hover:text-fileicon hover:text-royalglue hover:underline"
223237
>
224238
Upgrade plan <ExternalLink className="w-4 h-4" />
@@ -260,9 +274,59 @@ export default function Billing() {
260274
)}
261275
</div>
262276
</section>
277+
{isrendering && (
278+
<div className="flex mt-8 w-full items-center justify-center">
279+
<ColorRing
280+
visible={true}
281+
height="80"
282+
width="80"
283+
ariaLabel="blocks-loading"
284+
wrapperStyle={{}}
285+
wrapperClass="blocks-wrapper"
286+
colors={["#2559c0", "#a6a6b1", "#2473c8", "#749ae4", "#9C86E8"]}
287+
/>
288+
</div>
289+
)}
290+
{isRendered && (
291+
<section className="mt-8">
292+
<div id="payitems" className="flex flex-col gap-4">
293+
<hgroup className="flex flex-col gap-2">
294+
<h2 className="text-3xl font-medium dark:text-white text-blackmid">
295+
Payment methods
296+
</h2>
297+
<p className="dark:text-white/70 text-borderbtm">
298+
You can add a payment method to have your subscription renewed
299+
automatically.
300+
</p>
301+
</hgroup>
302+
<div id="paymentgroup">
303+
<Button
304+
className="flex items-center gap-2 border border-royalblue hover:border-containerBG"
305+
onClick={() => setIsBtnClicked(true)}
306+
>
307+
<CreditCard /> Add credit / debit card
308+
</Button>
309+
</div>
310+
<div id="paystatus">
311+
<span>You have no saved payment methods.</span>
312+
</div>
313+
</div>
314+
</section>
315+
)}
316+
{isBtnClicked && (
317+
<div className="w-full h-screen absolute top-0 left-0 bg-thirdprop/30 backdrop-blur-md">
318+
<div className="absolute right-10 top-24 z-10" onClick={() => setIsBtnClicked(false)} >
319+
<X className="w-8 h-8 text-white cursor-pointer" />
320+
</div>
321+
<div className="flex items-center justify-center h-full">
322+
<iframe
323+
src="https://timilab.lemonsqueezy.com/checkout/buy/47120f93-803e-435d-89bd-441482dca0e8?embed=1&dark=1"
324+
className="x w-full max-w-lg md:h-full lg:h-full h-[30rem]"
325+
></iframe>
326+
</div>
327+
</div>
328+
)}
263329
</main>
264330
</>
265331
);
266332
}
267-
268-

‎pages/index.tsx‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { PackageOpen } from "lucide-react";
1616
import UploadSection from "@/components/studio/uploadSection";
1717
import Files from "@/components/studio/Files";
1818

19-
import { extension } from "@/types/appx";
19+
import { extension,searchQuery } from "@/types/appx";
2020
import { supaType } from "@/types/appx";
2121
import { typeUpldState } from "../types/appx";
2222
import { typeCounter } from "@/types/appx";
@@ -52,8 +52,9 @@ export default function Home() {
5252
});
5353
const [dataLoading, setDataLoading] = useState<booleanType>(false);
5454
const [userName, setuserName] = useState<typeUser>("");
55+
const [q, setQ] = useState<searchQuery>("")
56+
const [searchQ, setSearchQ] = useState<searchQuery>("")
5557
const [isErr, setIsErr] = useState<booleanType>(false);
56-
const [isProd, setIsProd] = useState<booleanType>(false);
5758
const [counter, setCounter] = useState<typeCounter>(0);
5859

5960
useEffect(() => {
@@ -361,6 +362,7 @@ export default function Home() {
361362
setOpen={setOpen}
362363
open={open}
363364
uploadState={uploadState}
365+
setSearchQ={setSearchQ}
364366
/>
365367
<main>
366368
<div className="md:p-10 lg:p-10 md:px-14 lg:px-14 p-4 md:mt-14 lg:mt-14 mt-20">
@@ -388,6 +390,7 @@ export default function Home() {
388390

389391
<Files
390392
files={files}
393+
searchQ={searchQ}
391394
dataLoading={dataLoading}
392395
isErr={isErr}
393396
fetchFiles={fetchFiles}

‎types/appx.ts‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,6 @@ export type supaType = {
1818
public_anon_key: string;
1919
};
2020

21-
export type typeUser = string | null;
21+
export type typeUser = string | null;
22+
23+
export type searchQuery = string;

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /