free mode wip

This commit is contained in:
Thomas G. Lopes 2025-06-19 13:11:48 +01:00
parent 8887ed349d
commit bbc2739832
4 changed files with 62 additions and 16 deletions

View file

@ -84,7 +84,7 @@ Clone of [T3 Chat](https://t3.chat/)
### Final push ### Final push
- [ ] Private mode for greeting - [x] Private mode for greeting
- [ ] Free mode - [ ] Free mode
- [ ] make things prettier - [ ] make things prettier
- [ ] mobile adjustments - [ ] mobile adjustments

View file

@ -114,3 +114,41 @@ export const set = mutation({
} }
}, },
}); });
export const enable_initial = mutation({
args: {
session_token: v.string(),
},
handler: async (ctx, args) => {
const session = await ctx.runQuery(internal.betterAuth.getSession, {
sessionToken: args.session_token,
});
if (!session) {
throw new Error('Unauthorized');
}
// Check if any models are enabled
const enabledModels = await ctx.db
.query('user_enabled_models')
.withIndex('by_user', (q) => q.eq('user_id', session.userId))
.collect();
if (enabledModels.length > 0) {
return;
}
const initialModels = ['google/gemini-2.5-flash', 'deepseek/deepseek-chat-v3-0324:free'];
await Promise.all(
initialModels.map((model) =>
ctx.db.insert('user_enabled_models', {
user_id: session.userId,
provider: Provider.OpenRouter,
model_id: model,
pinned: null,
})
)
);
},
});

View file

@ -81,11 +81,7 @@
let ruleName = $derived(rule.name); let ruleName = $derived(rule.name);
let renaming = $state(false);
async function renameRule() { async function renameRule() {
renaming = true;
await ResultAsync.fromPromise( await ResultAsync.fromPromise(
client.mutation(api.user_rules.rename, { client.mutation(api.user_rules.rename, {
ruleId: rule._id, ruleId: rule._id,
@ -94,8 +90,6 @@
}), }),
(e) => e (e) => e
); );
renaming = false;
} }
const ruleNameExists = $derived.by(() => { const ruleNameExists = $derived.by(() => {
@ -111,15 +105,23 @@
<Card.Root> <Card.Root>
<Card.Header> <Card.Header>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<div class="flex items-center gap-2"> <div class="flex flex-col gap-2">
<Input bind:value={ruleName} aria-invalid={ruleNameExists} /> <Label for="rule-name">Name</Label>
<Button <div class="flex items-center gap-2">
variant="outline" <Input
onClickPromise={renameRule} bind:value={ruleName}
disabled={ruleNameExists || ruleName === rule.name} aria-invalid={ruleNameExists}
> id="rule-name"
Rename name="rule-name"
</Button> />
<Button
variant="outline"
onClickPromise={renameRule}
disabled={ruleNameExists || ruleName === rule.name}
>
Rename
</Button>
</div>
</div> </div>
<Button variant="destructive" size="icon" onclick={deleteRule} disabled={deleting}> <Button variant="destructive" size="icon" onclick={deleteRule} disabled={deleting}>
<TrashIcon class="size-4" /> <TrashIcon class="size-4" />

View file

@ -48,6 +48,12 @@
let textarea = $state<HTMLTextAreaElement>(); let textarea = $state<HTMLTextAreaElement>();
let abortController = $state<AbortController | null>(null); let abortController = $state<AbortController | null>(null);
$effect(() => {
client.mutation(api.user_enabled_models.enable_initial, {
session_token: session.current?.session.token ?? '',
});
});
const currentConversationQuery = useCachedQuery(api.conversations.getById, () => ({ const currentConversationQuery = useCachedQuery(api.conversations.getById, () => ({
conversation_id: page.params.id as Id<'conversations'>, conversation_id: page.params.id as Id<'conversations'>,
session_token: session.current?.session.token ?? '', session_token: session.current?.session.token ?? '',