Skip to content

Commit 2233653

Browse files
docs(vue): add context to code blocks and small changes to surrounding text
1 parent 59cef22 commit 2233653

File tree

1 file changed

+184
-37
lines changed

1 file changed

+184
-37
lines changed

docs/vue/your-first-app/3-saving-photos.md

Lines changed: 184 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -12,59 +12,206 @@ Fortunately, saving them to the filesystem only takes a few steps. Begin by open
1212

1313
The Filesystem API requires that files written to disk are passed in as base64 data, so this helper function will be used in a moment to assist with that:
1414

15-
```tsx
16-
const convertBlobToBase64 = (blob: Blob) =>
17-
new Promise((resolve, reject) => {
18-
const reader = new FileReader();
19-
reader.onerror = reject;
20-
reader.onload = () => {
21-
resolve(reader.result);
22-
};
23-
reader.readAsDataURL(blob);
15+
```typescript
16+
import { ref, onMounted, watch } from 'vue';
17+
import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera';
18+
import { Filesystem, Directory } from '@capacitor/filesystem';
19+
import { Preferences } from '@capacitor/preferences';
20+
21+
export const usePhotoGallery = () => {
22+
const photos = ref<UserPhoto[]>([]);
23+
24+
const takePhoto = async () => {
25+
// Same old code from before.
26+
};
27+
28+
// CHANGE: Add the `convertBloblToBase64` method.
29+
const convertBlobToBase64 = (blob: Blob) =>
30+
new Promise((resolve, reject) => {
31+
const reader = new FileReader();
32+
reader.onerror = reject;
33+
reader.onload = () => {
34+
resolve(reader.result);
35+
};
36+
reader.readAsDataURL(blob);
2437
});
38+
39+
return {
40+
photos,
41+
takePhoto
42+
};
43+
};
44+
45+
export interface UserPhoto {
46+
filepath: string;
47+
webviewPath?: string;
48+
}
2549
```
2650

27-
Next, add a function to save the photo to the filesystem. We pass in the `photo` object, which represents the newly captured device photo, as well as the fileName, which will provide a path for the file to be stored to.
51+
Next, we'll add a function to save the photo to the filesystem. We pass in the `photo` object, which represents the newly captured device photo, as well as the fileName, the path where the file will be stored.
2852

29-
Next we use the Capacitor [Filesystem API](https://capacitorjs.com/docs/apis/filesystem) to save the photo to the filesystem. We start by converting the photo to base64 format, then feed the data to the Filesystem’s `writeFile` function:
53+
We use the Capacitor [Filesystem API](https://capacitorjs.com/docs/apis/filesystem) to save the photo to the filesystem. Create a new method inside `usePhotoGallery` called `savePicture`. This method will first convert the photo to base64 format, then feed the data to the Filesystem’s `writeFile` function:
3054

31-
```tsx
32-
const savePicture = async (photo: Photo, fileName: string): Promise<UserPhoto> => {
33-
// Fetch the photo, read as a blob, then convert to base64 format
34-
const response = await fetch(photo.webPath!);
35-
const blob = await response.blob();
36-
const base64Data = (await convertBlobToBase64(blob)) as string;
37-
38-
const savedFile = await Filesystem.writeFile({
39-
path: fileName,
40-
data: base64Data,
41-
directory: Directory.Data,
42-
});
55+
```typescript
56+
import { ref, onMounted, watch } from 'vue';
57+
import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera';
58+
import { Filesystem, Directory } from '@capacitor/filesystem';
59+
import { Preferences } from '@capacitor/preferences';
60+
61+
export const usePhotoGallery = () => {
62+
const photos = ref<UserPhoto[]>([]);
63+
64+
const takePhoto = async () => {
65+
// Same old code from before.
66+
};
67+
68+
const convertBlobToBase64 = (blob: Blob) => {
69+
// Same old code from before.
70+
};
71+
72+
// CHANGE: Add the `savePicture` method.
73+
const savePicture = async (photo: Photo, fileName: string): Promise<UserPhoto> => {
74+
// Fetch the photo, read as a blob, then convert to base64 format
75+
const response = await fetch(photo.webPath!);
76+
const blob = await response.blob();
77+
const base64Data = (await convertBlobToBase64(blob)) as string;
78+
79+
const savedFile = await Filesystem.writeFile({
80+
path: fileName,
81+
data: base64Data,
82+
directory: Directory.Data,
83+
});
84+
85+
// Use webPath to display the new image instead of base64 since it's
86+
// already loaded into memory
87+
return {
88+
filepath: fileName,
89+
webviewPath: photo.webPath,
90+
};
91+
};
92+
93+
return {
94+
photos,
95+
takePhoto
96+
};
97+
};
98+
99+
export interface UserPhoto {
100+
filepath: string;
101+
webviewPath?: string;
102+
}
103+
```
104+
105+
Last, update the `takePhoto` function to call `savePicture`:
106+
107+
```typescript
108+
import { ref, onMounted, watch } from 'vue';
109+
import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera';
110+
import { Filesystem, Directory } from '@capacitor/filesystem';
111+
import { Preferences } from '@capacitor/preferences';
112+
113+
export const usePhotoGallery = () => {
114+
const photos = ref<UserPhoto[]>([]);
115+
116+
// CHANGE: Update the `takePhoto` method.
117+
const takePhoto = async () => {
118+
const photo = await Camera.getPhoto({
119+
resultType: CameraResultType.Uri,
120+
source: CameraSource.Camera,
121+
quality: 100,
122+
});
123+
const fileName = Date.now() + '.jpeg';
124+
// CHANGE: Update to call `savePicture` method.
125+
const savedFileImage = await savePicture(photo, fileName);
126+
127+
photos.value = [savedFileImage, ...photos.value];
128+
};
129+
130+
const convertBlobToBase64 = (blob: Blob) => {
131+
// Same old code from before.
132+
};
133+
134+
const savePicture = async (photo: Photo, fileName: string): Promise<UserPhoto> => {
135+
// Same old code from before.
136+
};
43137

44-
// Use webPath to display the new image instead of base64 since it's
45-
// already loaded into memory
46138
return {
47-
filepath: fileName,
48-
webviewPath: photo.webPath,
139+
photos,
140+
takePhoto
49141
};
50142
};
143+
144+
export interface UserPhoto {
145+
filepath: string;
146+
webviewPath?: string;
147+
}
51148
```
52149

53-
Last, update the `takePhoto` function to call `savePicture`. Once the photo has been saved, insert it into the front of reactive `photos` array:
150+
There we go! Each time a new photo is taken, it’s now automatically saved to the filesystem.
151+
152+
`usePhotoGallery.ts` should now look like this:
54153

55154
```tsx
56-
const takePhoto = async () => {
57-
const photo = await Camera.getPhoto({
58-
resultType: CameraResultType.Uri,
59-
source: CameraSource.Camera,
60-
quality: 100,
155+
import { ref, onMounted, watch } from 'vue';
156+
import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera';
157+
import { Filesystem, Directory } from '@capacitor/filesystem';
158+
import { Preferences } from '@capacitor/preferences';
159+
160+
export const usePhotoGallery = () => {
161+
const photos = ref<UserPhoto[]>([]);
162+
163+
const takePhoto = async () => {
164+
const photo = await Camera.getPhoto({
165+
resultType: CameraResultType.Uri,
166+
source: CameraSource.Camera,
167+
quality: 100,
168+
});
169+
const fileName = Date.now() + '.jpeg';
170+
const savedFileImage = await savePicture(photo, fileName);
171+
172+
photos.value = [savedFileImage, ...photos.value];
173+
};
174+
175+
const convertBlobToBase64 = (blob: Blob) =>
176+
new Promise((resolve, reject) => {
177+
const reader = new FileReader();
178+
reader.onerror = reject;
179+
reader.onload = () => {
180+
resolve(reader.result);
181+
};
182+
reader.readAsDataURL(blob);
61183
});
62184

63-
const fileName = Date.now() + '.jpeg';
64-
const savedFileImage = await savePicture(photo, fileName);
185+
const savePicture = async (photo: Photo, fileName: string): Promise<UserPhoto> => {
186+
// Fetch the photo, read as a blob, then convert to base64 format
187+
const response = await fetch(photo.webPath!);
188+
const blob = await response.blob();
189+
const base64Data = (await convertBlobToBase64(blob)) as string;
190+
191+
const savedFile = await Filesystem.writeFile({
192+
path: fileName,
193+
data: base64Data,
194+
directory: Directory.Data,
195+
});
196+
197+
// Use webPath to display the new image instead of base64 since it's
198+
// already loaded into memory
199+
return {
200+
filepath: fileName,
201+
webviewPath: photo.webPath,
202+
};
203+
};
65204

66-
photos.value = [savedFileImage, ...photos.value];
205+
return {
206+
photos,
207+
takePhoto
208+
};
67209
};
210+
211+
export interface UserPhoto {
212+
filepath: string;
213+
webviewPath?: string;
214+
}
68215
```
69216

70-
There we go! Each time a new photo is taken, it’s now automatically saved to the filesystem.
217+
Next up, we'll load and display our saved images.

0 commit comments

Comments
 (0)