Skip to content
Open
Show file tree
Hide file tree
Changes from 76 commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
427e861
Revert "Frontend executing"
Doublebee1 May 27, 2026
61c8242
Merge pull request #2 from Doublebee1/revert-1-frontend_executing
Doublebee1 May 27, 2026
2779f12
change name of docker container bitnami->valkey
Doublebee1 May 27, 2026
0e85b0d
change sql query sentence
Doublebee1 May 27, 2026
7075304
enables zero to operate in GCP
Doublebee1 May 29, 2026
ae35c0f
fix sync production workflow
May 29, 2026
16ed8ee
Merge branch 'doorman' into staging
Doublebee1 May 29, 2026
6c9ad12
Lint Js is disabled
May 29, 2026
7bdb0d1
Merge pull - Lint Js is disabled
Doublebee1 May 29, 2026
2604c89
remove_route_ads
fairuznadh May 30, 2026
7fd8b2a
change_hometologin
fairuznadh May 30, 2026
4070e42
delete unintended local env file
fairuznadh May 30, 2026
ad8eafb
Stabilize Gmail realtime receive on VM
May 31, 2026
dcde529
Merge pull request #4 from Doublebee1/incoming
Doublebee1 Jun 1, 2026
d291089
comment out autumnprovider
fairuznadh Jun 2, 2026
ae18e48
change protocol, host and port
fairuznadh Jun 2, 2026
72c148d
enable emailAndPassword for register
fairuznadh Jun 2, 2026
cebaf21
add register
fairuznadh Jun 2, 2026
9ca9fcb
build register page (1)
fairuznadh Jun 2, 2026
cfd8f11
revert callback_to_mail from build register page to mailview
fairuznadh Jun 2, 2026
23ad805
test
lwx270901 Jun 2, 2026
ba22765
fix mailview (1)
fairuznadh Jun 3, 2026
dfcced6
fix mailview (2)
fairuznadh Jun 3, 2026
f397202
fix mailview (3)
fairuznadh Jun 3, 2026
aff4ef3
fix mailview (4)
fairuznadh Jun 3, 2026
68983c0
show category (1)
fairuznadh Jun 3, 2026
5c8ac5b
show category (2)
fairuznadh Jun 3, 2026
01c2073
show category (3)
fairuznadh Jun 3, 2026
ee87f1e
fix show category (4)
fairuznadh Jun 3, 2026
f92d363
fix show category (5)
fairuznadh Jun 3, 2026
0171781
Fix mail label rendering and Doorman signature
Jun 4, 2026
dd49a00
Merge pull request #7 from Doublebee1/incoming
Doublebee1 Jun 4, 2026
e5368df
Merge branch 'doorman' into delete_ads
Doublebee1 Jun 4, 2026
c5332c5
Merge pull request #8 from Doublebee1/delete_ads
Doublebee1 Jun 4, 2026
afd216f
test
lwx270901 Jun 4, 2026
ebc20c8
neww
lwx270901 Jun 4, 2026
3c852c6
yong added
lwx270901 Jun 5, 2026
167dbfa
nw2
lwx270901 Jun 5, 2026
7041986
dafasdf
lwx270901 Jun 5, 2026
ca757b2
change Zero
KomaSeo Jun 7, 2026
6a001ed
Change design
KomaSeo Jun 7, 2026
9abf8ef
Fix setting URL
KomaSeo Jun 7, 2026
1fa05f2
Add affiliation
KomaSeo Jun 7, 2026
071b1c0
Add priority score and it's feedback.
KomaSeo Jun 7, 2026
1f1e15a
add category
KomaSeo Jun 7, 2026
f253e35
Sorting implemente
KomaSeo Jun 7, 2026
15cff76
Change to toggle UI refresh
KomaSeo Jun 7, 2026
2ecd7ef
add topbar
KomaSeo Jun 7, 2026
9aefeb6
add feedback
KomaSeo Jun 7, 2026
dcf8998
add top bar to setting
KomaSeo Jun 7, 2026
948ed9f
convert category management page
KomaSeo Jun 7, 2026
8049abf
add generate category button
KomaSeo Jun 7, 2026
c45f18d
remove mail generating feature
KomaSeo Jun 7, 2026
6e503f6
remvoe schedule sent
KomaSeo Jun 7, 2026
b8d68e2
add redirect
KomaSeo Jun 7, 2026
8881cc2
Merge pull request #11 from Doublebee1/front-UI
KomaSeo Jun 8, 2026
2dac5b4
Allow mail Vite host
Jun 8, 2026
86f0d67
change search engine
KomaSeo Jun 8, 2026
6717f3f
update en
KomaSeo Jun 8, 2026
2ec3e13
Merge pull request #12 from Doublebee1/front-UI
KomaSeo Jun 8, 2026
0775b45
Stabilize workflow and local auth configuration
Jun 8, 2026
8725561
priority score sync
KomaSeo Jun 8, 2026
49dd775
delete category filter
KomaSeo Jun 8, 2026
b573cc9
User information sync
KomaSeo Jun 8, 2026
33cfffa
redirect user for first time login
KomaSeo Jun 8, 2026
eeeb18b
sync suggested action
KomaSeo Jun 8, 2026
f362811
add category sync
KomaSeo Jun 8, 2026
e16b6e5
Remove label management
KomaSeo Jun 8, 2026
eb7bae2
add category is shown
KomaSeo Jun 8, 2026
699ce03
because db does not support list or categories, It cannot be removed.
KomaSeo Jun 8, 2026
6705e9a
change design of categorize
KomaSeo Jun 8, 2026
9d67546
Merge pull request #13 from Doublebee1/llm_service
KomaSeo Jun 8, 2026
ac41174
test viteconfig
KomaSeo Jun 8, 2026
187f4cc
Merge doorman into Local_Test
Jun 9, 2026
8ef3a03
Use loopback Postgres for local Hyperdrive
Jun 9, 2026
6a3db62
feedback action and classification correction
lwx270901 Jun 9, 2026
9076736
new
lwx270901 Jun 9, 2026
37a2e28
new
lwx270901 Jun 9, 2026
a53afe3
adf
lwx270901 Jun 9, 2026
f554b8d
Add new label change
lwx270901 Jun 9, 2026
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
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,5 @@ jobs:
- name: Install dependencies 📦
run: pnpm install

- name: Lint JS
run: pnpm dlx oxlint@latest --deny-warnings
# - name: Lint JS
#run: pnpm dlx oxlint@latest --deny-warnings
Comment on lines 24 to +28
2 changes: 1 addition & 1 deletion .github/workflows/sync-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FROM_BRANCH: 'staging'
TO_BRANCH: 'main'
TO_BRANCH: 'doorman'
PULL_REQUEST_TITLE: 'Deploy to production (Automated)'
CONTENT_COMPARISON: true
PULL_REQUEST_BODY: |
Expand Down
25 changes: 25 additions & 0 deletions apps/mail/app/(auth)/callback/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { getSession } from '@/lib/auth-client';
import { useEffect } from 'react';
import { useNavigate } from 'react-router';

export default function AuthCallbackPage() {
const navigate = useNavigate();

useEffect(() => {
async function checkUser() {
const session = await getSession();

if (!session.data?.user) {
navigate('/');
return;
}

// temporary: always send to signup first
navigate('/zero/signup');
}

checkUser();
}, [navigate]);

return <div>Checking your account...</div>;
}
10 changes: 5 additions & 5 deletions apps/mail/app/(auth)/login/login-client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -133,10 +133,10 @@ function LoginClientContent({ providers, isProd }: LoginClientProps) {
});

return (
<div className="flex min-h-screen w-full flex-col items-center justify-between bg-[#111111]">
<div className="flex min-h-screen w-full flex-col items-center justify-between bg-background">
<div className="animate-in slide-in-from-bottom-4 mx-auto flex max-w-[600px] grow items-center justify-center space-y-8 px-4 duration-500 sm:px-12 md:px-0">
<div className="w-full space-y-4">
<p className="text-center text-4xl font-bold text-white md:text-5xl">Login to Zero</p>
<p className="text-center text-4xl font-bold text-foreground md:text-5xl">Login to Doorman</p>

{error && (
<Alert variant="default" className="border-orange-500/40 bg-orange-500/10">
Expand Down Expand Up @@ -303,19 +303,19 @@ function LoginClientContent({ providers, isProd }: LoginClientProps) {
)}
</div>
</div>
<a href={'/'} className='text-white hover:text-gray-200'>Return home</a>
<a href={'/'} className="text-foreground/70 hover:text-foreground">Return home</a>

<footer className="w-full px-6 py-4">
<div className="mx-auto flex max-w-6xl items-center justify-center gap-6">
<a
href="/terms"
className="text-[10px] text-gray-400 hover:text-gray-200 dark:text-gray-400 dark:hover:text-gray-200"
className="text-[10px] text-muted-foreground hover:text-foreground"
>
Terms of Service
</a>
<a
href="/privacy"
className="text-[10px] text-gray-400 hover:text-gray-200 dark:text-gray-400 dark:hover:text-gray-200"
className="text-[10px] text-muted-foreground hover:text-foreground"
>
Privacy Policy
</a>
Expand Down
2 changes: 1 addition & 1 deletion apps/mail/app/(auth)/login/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export default function LoginPage() {
const { allProviders, isProd } = useLoaderData<typeof clientLoader>();

return (
<div className="flex min-h-screen w-full flex-col bg-white dark:bg-black">
<div className="flex min-h-screen w-full flex-col bg-background">
<LoginClient providers={allProviders} isProd={isProd} />
</div>
);
Expand Down
27 changes: 19 additions & 8 deletions apps/mail/app/(auth)/zero/signup/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { Input } from '@/components/ui/input';
import { useForm } from 'react-hook-form';
import { toast } from 'sonner';
import { z } from 'zod';
import { signUp } from '@/lib/auth-client';
import { useNavigate } from 'react-router';

const formSchema = z.object({
name: z.string().min(1, { message: 'Name must be at least 1 character' }),
Expand All @@ -13,6 +15,7 @@ const formSchema = z.object({
});

export default function SignupZero() {
const navigate = useNavigate();
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
Expand All @@ -21,16 +24,24 @@ export default function SignupZero() {
},
});

function onSubmit(values: z.infer<typeof formSchema>) {
// Append the @0.email suffix to the username
async function onSubmit(values: z.infer<typeof formSchema>) {
const fullEmail = `${values.email}@0.email`;

// Use the correct sonner toast API
toast.success(`Trying to signup with ${fullEmail}`, {
description: 'Signup attempt',

const result = await signUp.email({
name: values.name,
email: fullEmail,
password: values.password,
callbackURL: `${window.location.origin}/mail`,
});

// Here you would typically handle authentication with the full email

if (result.error) {
toast.error(result.error.message || 'Signup failed');
return;
}

toast.success('Account created successfully');

navigate('/mail');
}

return (
Expand Down
2 changes: 1 addition & 1 deletion apps/mail/app/(full-width)/about.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import React from 'react';

export default function AboutPage() {
return (
<div className="relative flex min-h-screen w-full flex-col overflow-auto bg-white dark:bg-[#111111]">
<div className="relative flex min-h-screen w-full flex-col overflow-auto bg-background">
<Navigation />
<div className="relative z-10 flex grow flex-col">
<div className="absolute right-4 top-6 md:left-8 md:right-auto md:top-8">
Expand Down
2 changes: 1 addition & 1 deletion apps/mail/app/(full-width)/pricing.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import Footer from '@/components/home/footer';

export default function PricingPage() {
return (
<main className="relative flex min-h-screen flex-1 flex-col overflow-x-hidden bg-[#0F0F0F]">
<main className="relative flex min-h-screen flex-1 flex-col overflow-x-hidden bg-background">
<PixelatedBackground
className="z-1 absolute left-1/2 top-[-40px] h-auto w-screen min-w-[1920px] -translate-x-1/2 object-cover"
style={{
Expand Down
2 changes: 1 addition & 1 deletion apps/mail/app/(full-width)/privacy.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export default function PrivacyPolicy() {
};

return (
<div className="relative flex min-h-screen w-full flex-col overflow-auto bg-white dark:bg-[#111111]">
<div className="relative flex min-h-screen w-full flex-col overflow-auto bg-background">
<Navigation />
<div className="relative z-10 flex grow flex-col">
<div className="absolute right-4 top-6 md:left-8 md:right-auto md:top-8">
Expand Down
2 changes: 1 addition & 1 deletion apps/mail/app/(full-width)/terms.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export default function TermsOfService() {
};

return (
<div className="relative flex min-h-screen w-full flex-col overflow-auto bg-white dark:bg-[#111111]">
<div className="relative flex min-h-screen w-full flex-col overflow-auto bg-background">
<Navigation />
<div className="relative z-10 flex grow flex-col">
{/* Back Button */}
Expand Down
76 changes: 76 additions & 0 deletions apps/mail/app/(routes)/mail/feedback/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { SettingsCard } from '@/components/settings/settings-card';
import { Textarea } from '@/components/ui/textarea';
import { Button } from '@/components/ui/button';
import { Label } from '@/components/ui/label';
import { authProxy } from '@/lib/auth-proxy';
import { useTRPC } from '@/providers/query-provider';
import { useMutation } from '@tanstack/react-query';
import { useState } from 'react';
import { m } from '@/paraglide/messages';
import { toast } from 'sonner';
import type { Route } from './+types/page';

export async function clientLoader({ request }: Route.ClientLoaderArgs) {
const session = await authProxy.api.getSession({ headers: request.headers });

if (!session) {
return Response.redirect(`${import.meta.env.VITE_PUBLIC_APP_URL}/login`);
}

return null;
}

export default function FeedbackPage() {
const trpc = useTRPC();
const [feedback, setFeedback] = useState('');
const { mutateAsync: submitFeedback, isPending } = useMutation(
trpc.mail.submitFeedback.mutationOptions(),
);

const handleSend = async () => {
const trimmedFeedback = feedback.trim();
if (!trimmedFeedback) return;

try {
await submitFeedback({
message: trimmedFeedback,
source: 'feedback-page',
});

toast.success('Thanks for your feedback.');
setFeedback('');
} catch (error) {
console.error('Failed to submit feedback:', error);
toast.error('Failed to send feedback. Please try again.');
}
};

return (
<div className="flex h-full items-start justify-center overflow-y-auto p-4 md:p-8">
<div className="bg-panelLight dark:bg-panelDark w-full max-w-2xl rounded-2xl border border-border p-6 shadow-sm md:p-8">
<SettingsCard
title={m['navigation.sidebar.feedback']()}
description="Share your thoughts, report issues, or suggest improvements."
footer={
<div className="flex justify-end">
<Button onClick={() => void handleSend()} disabled={!feedback.trim() || isPending}>
{isPending ? 'Sending...' : 'Send'}
</Button>
</div>
}
>
<div className="space-y-2">
<Label htmlFor="feedback-message">Your feedback</Label>
<Textarea
id="feedback-message"
value={feedback}
onChange={(event) => setFeedback(event.target.value)}
placeholder="Tell us what you think..."
className="min-h-[200px] resize-y"
/>
</div>
</SettingsCard>
</div>
</div>
);
}
14 changes: 11 additions & 3 deletions apps/mail/app/(routes)/mail/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
import { HotkeyProviderWrapper } from '@/components/providers/hotkey-provider-wrapper';
import { UserProfileGate } from '@/components/user-profile-gate';
import { OnboardingWrapper } from '@/components/onboarding';
import { DoormanTopBar } from '@/components/ui/doorman-top-bar';
import { AppSidebar } from '@/components/ui/app-sidebar';
import { Outlet } from 'react-router';

export default function MailLayout() {
return (
<HotkeyProviderWrapper>
<AppSidebar />
<div className="bg-sidebar dark:bg-sidebar w-full">
<Outlet />
<UserProfileGate />
<div className="flex h-screen w-full flex-col overflow-hidden">
<DoormanTopBar />
<div className="flex min-h-0 flex-1">
<AppSidebar topBarOffset />
<div className="bg-sidebar dark:bg-sidebar flex h-full min-w-0 flex-1 flex-col">
<Outlet />
</div>
</div>
</div>
<OnboardingWrapper />
</HotkeyProviderWrapper>
Expand Down
8 changes: 5 additions & 3 deletions apps/mail/app/(routes)/settings/[...settings]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,26 @@ import ConnectionsPage from '../connections/page';
import AppearancePage from '../appearance/page';
import ShortcutsPage from '../shortcuts/page';
import SecurityPage from '../security/page';
import CategoriesPage from '../categories/page';
import { m } from '@/paraglide/messages';
import GeneralPage from '../general/page';
import { useParams } from 'react-router';
import LabelsPage from '../labels/page';
import UserInformationPage from '../user-information/page';

const settingsPages: Record<string, React.ComponentType> = {
'user-information': UserInformationPage,
general: GeneralPage,
connections: ConnectionsPage,
security: SecurityPage,
appearance: AppearancePage,
shortcuts: ShortcutsPage,
notifications: NotificationsPage,
labels: LabelsPage,
categories: CategoriesPage,
};

export default function SettingsPage() {
const params = useParams();
const section = params.settings?.[0] || 'general';
const section = params.settings?.[0] || 'user-information';


const SettingsComponent = settingsPages[section];
Expand Down
Loading