Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ jobs:
AppleSwift56,
Swift56,
WebChromium,
WebNode
WebNode,
ReactNative
]

steps:
Expand Down
4 changes: 4 additions & 0 deletions templates/react-native/src/client.ts.twig
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,10 @@ class Client {
}
}

async ping(): Promise<string> {
return this.call('GET', new URL(this.config.endpoint + '/ping'));
}

async call(method: string, url: URL, headers: Headers = {}, params: Payload = {}, responseType = 'json'): Promise<any> {
method = method.toUpperCase();

Expand Down
21 changes: 21 additions & 0 deletions templates/react-native/src/models.ts.twig
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,25 @@ export namespace Models {
};
{% endif %}
{% endfor %}
{% for requestModel in spec.requestModels %}

/**
* {{ requestModel.description }}
*/
export type {{ requestModel.name | caseUcfirst }}{{ requestModel.name | getGenerics(spec, true) | raw }} = {
{% for property in requestModel.properties %}
/**
* {{ property.description | raw }}
*/
{{ property.name | removeDash }}{% if not property.required %}?{% endif %}: {{ property | getSubSchema(spec, requestModel.name) | raw }};
{% endfor %}
}
{% if requestModel.additionalProperties %}

export type Default{{ requestModel.name | caseUcfirst }}{{ requestModel.name | getGenerics(spec, true) | raw }} = {{ requestModel.name | caseUcfirst }}{{ requestModel.name | getGenerics(spec, true) | raw }} & {
[key: string]: any;
[__default]: true;
};
{% endif %}
{% endfor %}
}
6 changes: 3 additions & 3 deletions templates/react-native/src/services/template.ts.twig
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export class {{ service.name | caseUcfirst }} extends Service {
{%~ endif %}
*/
{%~ if method.parameters.all|length > 0 %}
{% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(params{% set hasRequiredParams = false %}{% for parameter in method.parameters.all %}{% if parameter.required %}{% set hasRequiredParams = true %}{% endif %}{% endfor %}{% if not hasRequiredParams %}?{% endif %}: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} {% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => void{% endif %} }): {{ method | getReturn(spec) | raw }};
{% if 'multipart/form-data' in method.consumes %}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(params{% set hasRequiredParams = false %}{% for parameter in method.parameters.all %}{% if parameter.required %}{% set hasRequiredParams = true %}{% endif %}{% endfor %}{% if not hasRequiredParams %}?{% endif %}: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %} {% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => void{% endif %} }): {{ method | getReturn(spec) | raw }};
/**
{%~ if method.description %}
* {{ method.description | replace({'\n': '\n * '}) | raw }}
Expand All @@ -58,8 +58,8 @@ export class {{ service.name | caseUcfirst }} extends Service {
* @returns {{ '{' }}{{ method | getReturn(spec) | raw }}{{ '}' }}
* @deprecated Use the object parameter style method for a better developer experience.
*/
{% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => void{% endif %}): {{ method | getReturn(spec) | raw }};
{% if method.type == 'upload'%}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(
{% if 'multipart/form-data' in method.consumes %}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}({% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => void{% endif %}): {{ method | getReturn(spec) | raw }};
{% if 'multipart/form-data' in method.consumes %}async {% endif %}{{ method.name | caseCamel }}{{ method.responseModel | getGenerics(spec) | raw }}(
{% if method.parameters.all|length > 0 %}paramsOrFirst{% if not method.parameters.all[0].required or method.parameters.all[0].nullable %}?{% endif %}: { {% for parameter in method.parameters.all %}{{ parameter.name | caseCamel | escapeKeyword }}{% if not parameter.required or parameter.nullable %}?{% endif %}: {{ parameter | getPropertyType(method) | raw }}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, onProgress?: (progress: UploadProgress) => void {% endif %} } | {{ method.parameters.all[0] | getPropertyType(method) | raw }}{% if method.parameters.all|length > 1 %},
...rest: [{% for parameter in method.parameters.all[1:] %}({{ parameter | getPropertyType(method) | raw }})?{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %},((progress: UploadProgress) => void)?{% endif %}]{% endif %}{% endif %}

Comment thread
greptile-apps[bot] marked this conversation as resolved.
Expand Down
12 changes: 7 additions & 5 deletions templates/web/src/services/realtime.ts.twig
Original file line number Diff line number Diff line change
Expand Up @@ -183,11 +183,13 @@ export class Realtime {
const connectionId = ++this.connectionId;
{% if language.name == 'ReactNative' %}
const WebSocketCtor: any = WebSocket;
const socket = (this.socket = new WebSocketCtor(url, undefined, {
headers: {
Origin: `{{ spec.title | caseLower }}-${Platform.OS}://${this.client.config.platform}`
}
}));
const socket = (this.socket = Platform.OS === 'web'
? new WebSocketCtor(url)
: new WebSocketCtor(url, undefined, {
headers: {
Origin: `{{ spec.title | caseLower }}-${Platform.OS}://${this.client.config.platform}`
}
}));
{% else %}
const socket = (this.socket = new WebSocket(url));
{% endif %}
Expand Down
45 changes: 45 additions & 0 deletions tests/ReactNativeTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

namespace Tests;

class ReactNativeTest extends Base
{
protected string $sdkName = 'react-native';
protected string $sdkPlatform = 'client';
protected string $sdkLanguage = 'reactnative';
protected string $version = '0.0.1';

protected string $language = 'react-native';
protected string $class = 'Appwrite\SDK\Language\ReactNative';

protected array $build = [
'cp tests/languages/react-native/tests.js tests/sdks/react-native/tests.js',
'cp tests/languages/react-native/index.html tests/sdks/react-native/index.html',
'cp tests/languages/react-native/browser.js tests/sdks/react-native/browser.js',
'cp tests/languages/react-native/rollup.test.config.mjs tests/sdks/react-native/rollup.test.config.mjs',
'mkdir -p tests/sdks/react-native/shims && cp tests/languages/react-native/shims/expo-file-system.js tests/sdks/react-native/shims/expo-file-system.js',
'docker run --rm -v $(pwd):/app -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.59.0-jammy sh -c "npm install && npm install --no-save react-native-web react react-dom @rollup/plugin-alias @rollup/plugin-commonjs @rollup/plugin-node-resolve @rollup/plugin-replace"',
'docker run --rm -v $(pwd):/app -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.59.0-jammy sh -c "npx rollup -c rollup.test.config.mjs"',
];

protected string $command =
'docker run --network="mockapi" --rm -v $(pwd):/app -e BROWSER=chromium -w /app/tests/sdks/react-native mcr.microsoft.com/playwright:v1.59.0-jammy node tests.js';

protected array $expectedOutput = [
...Base::PING_RESPONSE,
...Base::FOO_RESPONSES,
...Base::FOO_RESPONSES, // Object params
...Base::BAR_RESPONSES,
...Base::BAR_RESPONSES, // Object params
...Base::GENERAL_RESPONSES,
...Base::ENUM_RESPONSES,
...Base::MODEL_RESPONSES,
...Base::EXCEPTION_RESPONSES,
...Base::REALTIME_RESPONSES,
...Base::QUERY_HELPER_RESPONSES,
...Base::PERMISSION_HELPER_RESPONSES,
...Base::ID_HELPER_RESPONSES,
...Base::CHANNEL_HELPER_RESPONSES,
...Base::OPERATOR_HELPER_RESPONSES,
];
}
Loading
Loading