|
1 | 1 | <script lang="ts"> |
2 | 2 | import { Button, Helper, Modal, Spinner } from 'flowbite-svelte'; |
3 | 3 | import type { Page } from '$lib/types'; |
4 | | - import { showCropper, expandTextBoxBounds, type VolumeMetadata } from '$lib/anki-connect'; |
| 4 | + import { |
| 5 | + expandTextBoxBounds, |
| 6 | + extractFieldValues, |
| 7 | + getCardAgeInMin, |
| 8 | + getLastCardInfo, |
| 9 | + getModelConfig, |
| 10 | + openCreateModal, |
| 11 | + openUpdateModal, |
| 12 | + sendQuickCapture, |
| 13 | + type VolumeMetadata |
| 14 | + } from '$lib/anki-connect'; |
| 15 | + import { settings } from '$lib/settings'; |
| 16 | + import { showSnackbar } from '$lib/util'; |
5 | 17 | import { onMount } from 'svelte'; |
6 | 18 | import { textBoxPickerStore } from './text-box-picker'; |
7 | 19 |
|
8 | 20 | let open = $state(false); |
9 | 21 | let image = $state<string | undefined>(undefined); |
10 | 22 | let page = $state<Page | undefined>(undefined); |
| 23 | + let pageNumber = $state<number | undefined>(undefined); |
11 | 24 | let tags = $state<string | undefined>(undefined); |
12 | 25 | let metadata = $state<VolumeMetadata | undefined>(undefined); |
13 | 26 |
|
|
54 | 67 | open = value.open; |
55 | 68 | image = value.image; |
56 | 69 | page = value.page; |
| 70 | + pageNumber = value.pageNumber; |
57 | 71 | tags = value.tags; |
58 | 72 | metadata = value.metadata; |
59 | 73 |
|
|
72 | 86 | textBoxPickerStore.set({ open: false }); |
73 | 87 | } |
74 | 88 |
|
75 | | - function handleContinue() { |
| 89 | + async function handleContinue() { |
76 | 90 | if (selectedBlockIndex === null || !page || !image) return; |
77 | 91 |
|
78 | 92 | const zone = textBoxZones.find((z) => z.blockIndex === selectedBlockIndex); |
|
88 | 102 | const imageUrl = image; |
89 | 103 | const ankiTags = tags; |
90 | 104 | const volumeMetadata = metadata; |
| 105 | + const currentPageNumber = pageNumber; |
| 106 | + const pageFilename = page.img_path; |
91 | 107 |
|
92 | 108 | close(); |
93 | 109 |
|
94 | | - // Show the cropper with the selected text and bounds |
95 | | - showCropper(imageUrl, selectedText, selectedText, ankiTags, volumeMetadata, undefined, textBox); |
| 110 | + const cardMode = $settings.ankiConnectSettings.cardMode; |
| 111 | +
|
| 112 | + if (cardMode === 'update') { |
| 113 | + const lastCard = await getLastCardInfo(); |
| 114 | +
|
| 115 | + if (!lastCard || !lastCard.noteId) { |
| 116 | + showSnackbar('No recent card found to update'); |
| 117 | + return; |
| 118 | + } |
| 119 | +
|
| 120 | + if (!lastCard.modelName) { |
| 121 | + showSnackbar('Could not detect card note type'); |
| 122 | + return; |
| 123 | + } |
| 124 | +
|
| 125 | + const cardAge = getCardAgeInMin(lastCard.noteId); |
| 126 | + if (cardAge >= 5) { |
| 127 | + showSnackbar(`Last card is ${cardAge} minutes old (max 5 min)`); |
| 128 | + return; |
| 129 | + } |
| 130 | +
|
| 131 | + const previousValues = extractFieldValues(lastCard); |
| 132 | + const modelConfig = getModelConfig(lastCard.modelName, 'update'); |
| 133 | + const quickCapture = modelConfig?.quickCapture ?? false; |
| 134 | +
|
| 135 | + if (quickCapture) { |
| 136 | + await sendQuickCapture( |
| 137 | + 'update', |
| 138 | + imageUrl, |
| 139 | + selectedText, |
| 140 | + selectedText, |
| 141 | + volumeMetadata, |
| 142 | + textBox, |
| 143 | + previousValues, |
| 144 | + lastCard.noteId, |
| 145 | + lastCard.tags, |
| 146 | + lastCard.modelName, |
| 147 | + pageFilename |
| 148 | + ); |
| 149 | + } else { |
| 150 | + openUpdateModal( |
| 151 | + imageUrl, |
| 152 | + previousValues, |
| 153 | + lastCard.noteId, |
| 154 | + lastCard.modelName, |
| 155 | + lastCard.tags, |
| 156 | + selectedText, |
| 157 | + selectedText, |
| 158 | + ankiTags, |
| 159 | + volumeMetadata, |
| 160 | + undefined, |
| 161 | + textBox, |
| 162 | + currentPageNumber, |
| 163 | + pageFilename |
| 164 | + ); |
| 165 | + } |
| 166 | + } else { |
| 167 | + const { selectedModel } = $settings.ankiConnectSettings; |
| 168 | + const modelConfig = getModelConfig(selectedModel, 'create'); |
| 169 | + const quickCapture = modelConfig?.quickCapture ?? false; |
| 170 | +
|
| 171 | + if (quickCapture) { |
| 172 | + await sendQuickCapture( |
| 173 | + 'create', |
| 174 | + imageUrl, |
| 175 | + selectedText, |
| 176 | + selectedText, |
| 177 | + volumeMetadata, |
| 178 | + textBox, |
| 179 | + undefined, |
| 180 | + undefined, |
| 181 | + undefined, |
| 182 | + undefined, |
| 183 | + pageFilename |
| 184 | + ); |
| 185 | + } else { |
| 186 | + openCreateModal( |
| 187 | + imageUrl, |
| 188 | + selectedText, |
| 189 | + selectedText, |
| 190 | + ankiTags, |
| 191 | + volumeMetadata, |
| 192 | + undefined, |
| 193 | + textBox, |
| 194 | + currentPageNumber, |
| 195 | + pageFilename |
| 196 | + ); |
| 197 | + } |
| 198 | + } |
96 | 199 | } |
97 | 200 |
|
98 | 201 | // Handle backdrop mousedown - dismiss on mousedown outside content |
|
0 commit comments