11<script setup>
2- import { ref } from ' vue'
2+ import { ref , onMounted } from ' vue'
3+ import initSqlJs from ' sql.js' ;
34import HelloWorld from ' ./components/HelloWorld.vue'
45import FileUploader from ' ./components/FileUploader.vue'
56import CoinList from " @/components/CoinList.vue" ;
67
78const selectedFile = ref (null )
89
9- const handleFile = (file ) => {
10- console .log (file);
11- selectedFile .value = file;
10+ const db = ref (null );
11+ const status = ref (' ' );
12+
13+ let SQL = null ;
14+
15+ onMounted (async () => {
16+ try {
17+ SQL = await initSqlJs ({
18+ locateFile : file => ` https://sql.js.org/dist/${ file} `
19+ });
20+ status .value = ' SQL.js loaded successfully' ;
21+ } catch (err) {
22+ console .error (' Failed to load SQL.js:' , err);
23+ status .value = ' Failed to load SQL.js' ;
24+ }
25+ });
26+
27+ const handleFileUpload = async (file ) => {
28+ if (! file) return ;
29+
30+ status .value = ' Loading database...' ;
31+
32+ const reader = new FileReader ();
33+
34+ reader .onload = async (e ) => {
35+ try {
36+ const arrayBuffer = e .target .result ;
37+ const uint8Array = new Uint8Array (arrayBuffer);
38+
39+ // Load database
40+ db .value = new SQL.Database (uint8Array);
41+
42+ const result = db .value .exec (` SELECT COUNT(*) FROM coins` );
43+ console .log (` Coins in database: ${ result[0 ].values [0 ][0 ]} ` );
44+
45+ status .value = ` Database loaded successfully: ${ file .name } (${ (file .size / 1024 / 1024 ).toFixed (2 )} MB)` ;
46+
47+ selectedFile .value = file;
48+ } catch (err) {
49+ console .error (' Error loading database:' , err);
50+ status .value = ' Error loading database' ;
51+ }
52+ };
53+
54+ reader .onerror = () => {
55+ status .value = ` Error reading file` ;
56+ };
57+
58+ reader .readAsArrayBuffer (file);
1259};
1360 </script >
1461
@@ -23,12 +70,13 @@ const handleFile = (file) => {
2370
2471 <main >
2572 <div v-if =" !selectedFile" class =" select-view" >
26- <FileUploader :handleFile =" handleFile " />
73+ <FileUploader :handleFile =" handleFileUpload " />
2774 <p >Your file not will be uploaded to the internet. You can disable internet connection.</p >
2875 </div >
2976 <div v-else class =" file-view" >
3077 <CoinList :file_name =" selectedFile.name" />
3178 </div >
79+ <div v-if =" status" class =" status" >{{ status }}</div >
3280 </main >
3381</template >
3482
0 commit comments