update readme

Seto committed Feb 7, 2026 at 16:47 UTC 21e32e6280035841dd9f8e922b5befc5e8546f1a
3 files changed +424 -1
CONTRIBUTING.md new
+53
@@ -0,0 +1,53 @@
1 +# Contributing to NotWallet Crypto
2 +
3 +Thank you for your interest in contributing to **NotWallet Crypto**!
4 +Our vision is to build a secure, user-friendly, and privacy-focused Solana wallet—open to everyone, just like MetaMask is for Ethereum.
5 +
6 +We welcome contributions of all kinds: code, documentation, design, bug reports, feature requests, and community support.
7 +
8 +---
9 +
10 +## How to Contribute
11 +
12 +### 1. Get Started
13 +
14 +- **Read our [README](./README.md)** to understand the project’s purpose and setup.
15 +- **Check open [issues](https://github.com/TheStableFoundation/notwallet/issues)** for bugs, features, or improvements you can help with.
16 +- **Join the discussion**: Open an issue if you want to propose a new feature or discuss an idea.
17 +
18 +### 2. Code Contributions
19 +
20 +- **Fork the repository** and create your branch from `main`.
21 +- **Write clear, maintainable code** and follow the existing code style.
22 +- **Add tests** for new features or bug fixes when possible.
23 +- **Document your changes** in code comments and/or markdown files.
24 +- **Test your changes** locally before submitting.
25 +
26 +### 3. Submitting Pull Requests
27 +
28 +- Ensure your branch is up to date with `main`.
29 +- Open a pull request with a clear description of your changes and why they’re needed.
30 +- Reference any related issues in your PR description (e.g., `Closes #123`).
31 +- Be responsive to feedback and ready to make improvements.
32 +
33 +### 4. Reporting Bugs & Requesting Features
34 +
35 +- Use [GitHub Issues](https://github.com/TheStableFoundation/notwallet/issues) to report bugs or request features.
36 +- Provide as much detail as possible: steps to reproduce, screenshots, logs, or context.
37 +
38 +### 5. Community Standards
39 +
40 +- Be respectful and inclusive—everyone is welcome.
41 +- Help us keep the project a safe and friendly space.
42 +- Follow the [Code of Conduct](./CODE_OF_CONDUCT.md) (if available).
43 +
44 +---
45 +
46 +## Vision
47 +
48 +We aim to make NotWallet Crypto as trusted and widely used for Solana as MetaMask is for Ethereum.
49 +Your contributions help us get there—thank you!
50 +
51 +---
52 +
53 +**Happy building! 🚀**
README.md
+31 -1
@@ -1 +1,31 @@
1 -# Tauri Plugin tauri-plugin-ios-window
1 +<!-- LOGO -->
2 +<h1>
3 +<p align="center">
4 + <img src="https://avatars.githubusercontent.com/u/89791739?s=200&v=4" alt="Logo" width="128">
5 + <br>Tauri Plugin iOS Window
6 +</h1>
7 + <p align="center">
8 + Multi windows (or rather view controllers) for iOS.
9 + <br />
10 + <a href="README.md#about">About</a>
11 + ·
12 + <a href="README.md#license">License</a>
13 + ·
14 + <a href="./docs">Documentation</a>
15 + ·
16 + <a href="CONTRIBUTING.md">Contributing</a>
17 + </p>
18 +</p>
19 +
20 +## About
21 +
22 +A Tauri plugin for opening modal windows with WebView on iOS, perfect for OAuth flows and external authentication.
23 +
24 +
25 +## License
26 +
27 +MIT
28 +
29 +## Credits
30 +
31 +2026 [smbCloud](https://github.com/smbCloudXYZ). Built for [SplitFire AI](https://splitfire.ai).
docs/index.md new
+340
@@ -0,0 +1,340 @@
1 +# Tauri Plugin iOS Window
2 +
3 +A Tauri plugin for opening modal windows with WebView on iOS, perfect for OAuth flows and external authentication.
4 +
5 +## Features
6 +
7 +- 🪟 **Modal Presentation** - Opens as popover on iPad, modal on iPhone
8 +- 🎨 **Customizable UI** - Set custom titles, follows Apple HIG
9 +- 📊 **Progress Tracking** - Built-in loading indicator and progress bar
10 +- 🔄 **Navigation** - Back/forward swipe gestures enabled
11 +- ✨ **Native Feel** - Follows iOS Human Interface Guidelines
12 +- 🔐 **OAuth Ready** - Perfect for Sign in with Apple, OAuth flows
13 +
14 +## Installation
15 +
16 +```bash
17 +# Install the plugin
18 +npm install tauri-plugin-ios-window-api
19 +# or
20 +yarn add tauri-plugin-ios-window-api
21 +# or
22 +pnpm add tauri-plugin-ios-window-api
23 +```
24 +
25 +Add the plugin to your Tauri app's `src-tauri/Cargo.toml`:
26 +
27 +```toml
28 +[dependencies]
29 +tauri-plugin-ios-window = { git = "https://github.com/yourusername/tauri-plugin-ios-window" }
30 +```
31 +
32 +Register the plugin in your Tauri app's `src-tauri/src/lib.rs`:
33 +
34 +```rust
35 +fn run() {
36 + tauri::Builder::default()
37 + .plugin(tauri_plugin_ios_window::init())
38 + .run(tauri::generate_context!())
39 + .expect("error while running tauri application");
40 +}
41 +```
42 +
43 +## Usage
44 +
45 +### Basic Example
46 +
47 +```typescript
48 +import { open } from "tauri-plugin-ios-window-api";
49 +
50 +// Open a URL with default title
51 +await open("https://example.com");
52 +
53 +// Open with custom title
54 +await open("https://example.com", "My Custom Title");
55 +```
56 +
57 +### OAuth Flow Example (SplitFire Pattern)
58 +
59 +This example shows how to integrate with an OAuth provider like Sign in with Apple:
60 +
61 +```typescript
62 +import { open } from "tauri-plugin-ios-window-api";
63 +
64 +async function signInWithApple() {
65 + try {
66 + // Your OAuth configuration
67 + const baseUrl = "https://splitfire.ai";
68 + const redirectUri = "your-app://oauth/callback";
69 +
70 + // Build OAuth URL
71 + const oauthUrl = `${baseUrl}/synch-apple/auth?redirect_uri=${encodeURIComponent(redirectUri)}`;
72 +
73 + // Open OAuth window
74 + await open(oauthUrl, "Sign in with Apple");
75 +
76 + // Handle the callback (implement based on your needs)
77 + // Option 1: Deep link handler
78 + // Option 2: Local server listener
79 + // Option 3: Custom URL scheme
80 +
81 + } catch (error) {
82 + console.error("OAuth failed:", error);
83 + }
84 +}
85 +```
86 +
87 +### Complete OAuth Implementation
88 +
89 +```typescript
90 +import { open } from "tauri-plugin-ios-window-api";
91 +import { listen } from "@tauri-apps/api/event";
92 +
93 +async function startOAuthFlow(provider: "apple" | "spotify" | "youtube") {
94 + try {
95 + // Start local OAuth server (Rust backend)
96 + const port = await invoke("start_oauth_server");
97 +
98 + // Configure redirect
99 + const redirectUri = `http://localhost:${port}`;
100 + const baseUrl = "https://splitfire.ai";
101 + const oauthUrl = `${baseUrl}/synch-${provider}/auth?redirect_uri=${redirectUri}`;
102 +
103 + // Open OAuth window
104 + await open(oauthUrl, `Sign in with ${provider}`);
105 +
106 + // Listen for OAuth callback
107 + const unlisten = await listen("oauth-callback", (event) => {
108 + const { code, state } = event.payload;
109 +
110 + // Exchange code for access token
111 + invoke("exchange_oauth_token", { code, provider })
112 + .then((response) => {
113 + console.log("OAuth successful:", response);
114 + // Handle successful authentication
115 + })
116 + .catch((error) => {
117 + console.error("Token exchange failed:", error);
118 + });
119 + });
120 +
121 + } catch (error) {
122 + console.error("OAuth flow failed:", error);
123 + }
124 +}
125 +```
126 +
127 +## API Reference
128 +
129 +### `open(url: string, title?: string): Promise<void>`
130 +
131 +Opens a new modal window with a WebView.
132 +
133 +**Parameters:**
134 +- `url` (string, required) - The URL to open in the WebView
135 +- `title` (string, optional) - Custom title for the navigation bar. Defaults to "Sign in"
136 +
137 +**Returns:**
138 +- `Promise<void>` - Resolves when the window is presented
139 +
140 +**Example:**
141 +```typescript
142 +// Basic usage
143 +await open("https://example.com");
144 +
145 +// With custom title
146 +await open("https://appleid.apple.com", "Sign in with Apple");
147 +```
148 +
149 +### `close(): Promise<void>`
150 +
151 +Programmatically closes the currently opened window.
152 +
153 +**Parameters:**
154 +- None
155 +
156 +**Returns:**
157 +- `Promise<void>` - Resolves when the window is dismissed
158 +
159 +**Example:**
160 +```typescript
161 +// Close the window
162 +await close();
163 +
164 +// Open and auto-close after delay
165 +await open("https://example.com", "Loading...");
166 +setTimeout(async () => {
167 + await close();
168 +}, 3000);
169 +```
170 +
171 +## UI/UX Features
172 +
173 +### Navigation Bar
174 +- Clean, native iOS design
175 +- Close button on leading edge (per Apple HIG)
176 +- Centered title
177 +- Activity indicator during loading
178 +- Subtle border separator
179 +
180 +### Progress Indicator
181 +- 2px blue progress bar
182 +- Smooth animations
183 +- Auto-hides when complete
184 +- Tracks page load progress
185 +
186 +### WebView
187 +- Full-screen immersive experience
188 +- Back/forward swipe gestures
189 +- Inline media playback
190 +- Proper dark mode support
191 +- Error state handling
192 +
193 +### Modal Presentation
194 +- **iPad**: Popover (400x600)
195 +- **iPhone**: Full-screen modal
196 +- Smooth dismiss animations
197 +- Safe area aware
198 +
199 +## Platform Support
200 +
201 +- ✅ iOS (iPhone & iPad)
202 +- ⚠️ Desktop (no-op, falls through to default behavior)
203 +- ❌ Android (not supported)
204 +
205 +## Best Practices
206 +
207 +### OAuth Flows
208 +
209 +1. **Use HTTPS in production**
210 + ```typescript
211 + const baseUrl = process.env.NODE_ENV === "production"
212 + ? "https://splitfire.ai"
213 + : "https://localhost:3333";
214 + ```
215 +
216 +2. **Handle redirects properly**
217 + - Use custom URL schemes for mobile: `your-app://oauth/callback`
218 + - Use localhost for testing: `http://localhost:8080/callback`
219 + - Always encode redirect URIs
220 +
221 +3. **Security**
222 + - Use PKCE for OAuth 2.0
223 + - Validate state parameters
224 + - Store tokens securely
225 + - Use short-lived access tokens
226 +
227 +4. **Error Handling**
228 + ```typescript
229 + try {
230 + await open(oauthUrl, "Sign in");
231 + } catch (error) {
232 + // Handle network errors
233 + // Show user-friendly message
234 + // Log for debugging
235 + }
236 + ```
237 +
238 +### UI/UX
239 +
240 +1. **Use descriptive titles**
241 + ```typescript
242 + await open(url, "Sign in with Apple"); // ✅ Good
243 + await open(url, "Sign in"); // ⚠️ Generic
244 + await open(url); // ❌ Uses default
245 + ```
246 +
247 +2. **Provide feedback**
248 + - Show loading states before opening
249 + - Handle success/error after OAuth
250 + - Give users clear next steps
251 +
252 +3. **Test on both devices**
253 + - iPad (popover experience)
254 + - iPhone (modal experience)
255 +
256 +### Programmatic Closing
257 +
258 +1. **After OAuth completion**
259 + ```typescript
260 + // Listen for OAuth callback
261 + listen("oauth-callback", async (event) => {
262 + // Process OAuth response
263 + await handleOAuthToken(event.payload);
264 +
265 + // Close the window
266 + await close();
267 + });
268 + ```
269 +
270 +2. **Timeout scenarios**
271 + ```typescript
272 + // Auto-close if user doesn't complete within time limit
273 + await open(oauthUrl, "Sign in");
274 +
275 + const timeout = setTimeout(async () => {
276 + await close();
277 + showMessage("Authentication timed out");
278 + }, 60000); // 1 minute
279 +
280 + // Clear timeout if user completes
281 + listen("oauth-complete", () => clearTimeout(timeout));
282 + ```
283 +
284 +3. **Error handling**
285 + ```typescript
286 + try {
287 + await open(url, "Sign in");
288 + } catch (error) {
289 + // If window fails to open, don't try to close
290 + console.error("Failed to open:", error);
291 + return;
292 + }
293 +
294 + // Later, close if needed
295 + try {
296 + await close();
297 + } catch (error) {
298 + // Window may already be closed by user
299 + console.log("Window already closed");
300 + }
301 + ```
302 +
303 +## Example App
304 +
305 +Check out the complete example in `examples/tauri-app`:
306 +
307 +```bash
308 +cd examples/tauri-app
309 +npm install
310 +npm run tauri ios dev
311 +```
312 +
313 +## Development
314 +
315 +```bash
316 +# Clone the repository
317 +git clone https://github.com/yourusername/tauri-plugin-ios-window
318 +
319 +# Install dependencies
320 +npm install
321 +
322 +# Build the plugin
323 +npm run build
324 +
325 +# Run example
326 +cd examples/tauri-app
327 +npm run tauri ios dev
328 +```
329 +
330 +## Contributing
331 +
332 +Contributions are welcome! Please feel free to submit a Pull Request.
333 +
334 +## License
335 +
336 +MIT
337 +
338 +## Credits
339 +
340 +Built for [SplitFire](https://splitfire.ai) - OAuth pattern inspired by production usage.